---
title: "Release digest: October 12 - 19, 2026 (Week 42)"
description: "Cross-repository release digest for the week of October 12 - 19, 2026, ISO week 42 of 2026."
editUrl: "https://github.com/Cratis/.github/edit/main/release-digests/2026-10-12-to-2026-10-19.md"
---
## Version movement

| Repository | Previous version | Current version |
| --- | --- | --- |
| [AI](https://github.com/Cratis/AI) | [v7.34.1](https://github.com/Cratis/AI/releases/tag/v7.34.1) | [v7.89.0](https://github.com/Cratis/AI/releases/tag/v7.89.0) |
| [Ante](https://github.com/Cratis/Ante) | [v1.3.0](https://github.com/Cratis/Ante/releases/tag/v1.3.0) | [v1.3.2](https://github.com/Cratis/Ante/releases/tag/v1.3.2) |
| [Arc](https://github.com/Cratis/Arc) | [v22.76.0](https://github.com/Cratis/Arc/releases/tag/v22.76.0) | [v22.129.1](https://github.com/Cratis/Arc/releases/tag/v22.129.1) |
| [AuthProxy](https://github.com/Cratis/AuthProxy) | [v2.30.5](https://github.com/Cratis/AuthProxy/releases/tag/v2.30.5) | [v2.31.2](https://github.com/Cratis/AuthProxy/releases/tag/v2.31.2) |
| [Cast](https://github.com/Cratis/Cast) | First release | [v0.2.1](https://github.com/Cratis/Cast/releases/tag/v0.2.1) |
| [Chronicle](https://github.com/Cratis/Chronicle) | [v19.51.0](https://github.com/Cratis/Chronicle/releases/tag/v19.51.0) | [v19.90.1](https://github.com/Cratis/Chronicle/releases/tag/v19.90.1) |
| [Chronicle.Elixir](https://github.com/Cratis/Chronicle.Elixir) | [v3.10.2](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.10.2) | [v3.14.2](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.14.2) |
| [Chronicle.Go](https://github.com/Cratis/Chronicle.Go) | [v0.9.1](https://github.com/Cratis/Chronicle.Go/releases/tag/v0.9.1) | [v0.11.0](https://github.com/Cratis/Chronicle.Go/releases/tag/v0.11.0) |
| [Chronicle.Kotlin](https://github.com/Cratis/Chronicle.Kotlin) | [v6.13.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.13.0) | [v6.15.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.15.0) |
| [Chronicle.TypeScript](https://github.com/Cratis/Chronicle.TypeScript) | [v6.51.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.51.0) | [v6.53.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.53.1) |
| [cli](https://github.com/Cratis/cli) | [v3.53.1](https://github.com/Cratis/cli/releases/tag/v3.53.1) | [v3.89.0](https://github.com/Cratis/cli/releases/tag/v3.89.0) |
| [Components](https://github.com/Cratis/Components) | [v4.26.4](https://github.com/Cratis/Components/releases/tag/v4.26.4) | [v4.34.0](https://github.com/Cratis/Components/releases/tag/v4.34.0) |
| [Fundamentals](https://github.com/Cratis/Fundamentals) | [v7.23.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.23.0) | [v7.25.1](https://github.com/Cratis/Fundamentals/releases/tag/v7.25.1) |
| [Orleans](https://github.com/Cratis/Orleans) | [v1.16.3](https://github.com/Cratis/Orleans/releases/tag/v1.16.3) | [v1.26.0](https://github.com/Cratis/Orleans/releases/tag/v1.26.0) |
| [release-action](https://github.com/Cratis/release-action) | [v1.4.2](https://github.com/Cratis/release-action/releases/tag/v1.4.2) | [v1.4.3](https://github.com/Cratis/release-action/releases/tag/v1.4.3) |
| [Scene](https://github.com/Cratis/Scene) | [v4.21.0](https://github.com/Cratis/Scene/releases/tag/v4.21.0) | [v4.72.0](https://github.com/Cratis/Scene/releases/tag/v4.72.0) |
| [Screenplay](https://github.com/Cratis/Screenplay) | [v4.141.0](https://github.com/Cratis/Screenplay/releases/tag/v4.141.0) | [v4.229.0](https://github.com/Cratis/Screenplay/releases/tag/v4.229.0) |
| [Specifications](https://github.com/Cratis/Specifications) | [v4.1.1](https://github.com/Cratis/Specifications/releases/tag/v4.1.1) | [v4.1.2](https://github.com/Cratis/Specifications/releases/tag/v4.1.2) |
| [Stage](https://github.com/Cratis/Stage) | [v4.76.0](https://github.com/Cratis/Stage/releases/tag/v4.76.0) | [v4.178.1](https://github.com/Cratis/Stage/releases/tag/v4.178.1) |
| [Templates](https://github.com/Cratis/Templates) | [v1.7.4](https://github.com/Cratis/Templates/releases/tag/v1.7.4) | [v1.8.0](https://github.com/Cratis/Templates/releases/tag/v1.8.0) |

## Added

- **cli** ([Release v3.89.0](https://github.com/Cratis/cli/releases/tag/v3.89.0)): `cratis new` uses the Cratis templates installed under `~/.cratis/templates`: the first run downloads the latest set from NuGet, `--version` still picks another version for a single run, and without network access an already downloaded set is used. See [Template catalogue](https://github.com/Cratis/cli/blob/main/Documentation/new/templates.md). (#164)
- **cli** ([Release v3.89.0](https://github.com/Cratis/cli/releases/tag/v3.89.0)): `cratis update` also installs newer Cratis templates when they work with the installed CLI, never downgrading and never failing the update when templates cannot be refreshed; `--no-templates` skips the check. (#164)
- **Screenplay** ([Release v4.229.0](https://github.com/Cratis/Screenplay/releases/tag/v4.229.0)): The canonical corpus has a `SourcelessGivensCorpus` vector that pins how specifications treat `given` events without `for`, across four source layouts. It covers constraint outcomes and the refusal to invent an event source identity. (#579)
- **Screenplay** ([Release v4.228.0](https://github.com/Cratis/Screenplay/releases/tag/v4.228.0)): The MCP tool `propose-inline-event` folds a slice-level event that has exactly one production into an inline event on that production, the inverse of `propose-extract-inline-event`. Executable bytes, identities and diagnostics are preserved, and canonical formatting consent is required. The tool refuses whenever the move could change meaning, for example a conditional production, incomplete mappings, generations, a public or external event, cross-slice or cross-document use, handlers, opaque text, comments that would be lost, or any other reference to the event. (#343)
- **Stage** ([Release v4.178.0](https://github.com/Cratis/Stage/releases/tag/v4.178.0)): Applications rendered with classic reducers can migrate individual read models to self-reducing read models. A per-read-model override in `.cratis/stage/rendering.json` (version 2) selects the self-reducing form, and the read model then carries `[Reducer("<previous reducer full name>")]` on every render, so Chronicle keeps the existing observer instead of starting a new one. See [Migrating a classic read model](https://github.com/Cratis/Stage/blob/main/Documentation/reference/plan-from-sources.md#migrating-a-classic-read-model). (#464)
- **Stage** ([Release v4.178.0](https://github.com/Cratis/Stage/releases/tag/v4.178.0)): `ArtifactRenderPlan.RequiredRemovals` lists files a publisher must delete together with the plan's writes (path, expected SHA-256 and read model), and `ReducerMigrationEvidence.FromExistingFile` builds migration evidence from the existing reducer file. Migration is refused with `STAGE-REDUCER-001` to `STAGE-REDUCER-004` when the override, evidence, removal capability or plan scope does not allow it. (#464)
- **Stage** ([Release v4.178.0](https://github.com/Cratis/Stage/releases/tag/v4.178.0)): `CratisRendering.CheckPublication` returns `UnsafeRemovals` (`STAGE-REDUCER-005`) when a file to remove has changed since the evidence was taken, or when a migrated read model's previous reducer file would be left behind. (#464)
- **Orleans** ([Release v1.26.0](https://github.com/Cratis/Orleans/releases/tag/v1.26.0)): `IJobStopFinalization`, implemented by every job: `FinalizeStop()` finishes a stop or removal that the job's silo went away before finishing. Rehydration calls it for every stopped or removing job whose stop is not yet finished.
- **cli** ([Release v3.87.0](https://github.com/Cratis/cli/releases/tag/v3.87.0)): `cratis release-notes` shows the release notes of the CLI in the terminal: `--since <version>` lists every release after a version, `--version <version>` shows one, and `-o json` returns them for scripts. Notes for every earlier release ship inside the CLI, so it works offline. See [Release notes](https://github.com/Cratis/cli/blob/main/Documentation/reference/release-notes.md). (#153)
- **cli** ([Release v3.87.0](https://github.com/Cratis/cli/releases/tag/v3.87.0)): After `cratis update`, the CLI shows the notes of every release you skipped; when there are several it asks before opening them. (#153)
- **AI** ([Release v7.89.0](https://github.com/Cratis/AI/releases/tag/v7.89.0)): An opt-in `cratis/playwright` profile that declares a pinned, headless and isolated Playwright MCP server for exploratory browser checks. The installer and Pi do not register it yet, so each user registers it in their own MCP configuration; the profile documentation gives the command. (part of #364)
- **Screenplay** ([Release v4.227.0](https://github.com/Cratis/Screenplay/releases/tag/v4.227.0)): A `ui profile` can name a package-provided theme by its quoted display name, such as `theme "Scene Default Light"`. A quoted name that the document does not declare refers to a package theme and is not reported as unknown (`PLAY0231`); a quoted name that matches a declared theme resolves to it and is checked for compatibility. Empty, blank or unterminated quoted names report `PLAY0229`. Identifier theme names are unchanged. (#880)
- **Components** ([Release v4.34.0](https://github.com/Cratis/Components/releases/tag/v4.34.0)): The paginator range text ("1–10 of 32") can be localized: set `range(start, end, total)` on the provider's paginator messages or on `TablePaginator`'s `ariaLabels`. The English default is unchanged. (#420)
- **cli** ([Release v3.85.0](https://github.com/Cratis/cli/releases/tag/v3.85.0)): `cratis screenplay conform-namespace <model> --event-store <store> --namespace <namespace>` compares a `.play` model with what a running Chronicle namespace actually holds: registered event types, appended events and their producing commands and reactors, and the namespace's observers. It reads event metadata only (never payloads, event source ids or command values), scans up to `--max-events` (100000 by default) or a `--from`/`--to` range up to the tail captured at the start, and reports a partial scan as such. Output is Screenplay's observation report in human or JSON form; drift exits non-zero only with `--fail-on-drift`. (#200)
- **Components** ([Release v4.33.0](https://github.com/Cratis/Components/releases/tag/v4.33.0)): The dialog provider messages accept `refused`, the text announced when a confirm is refused and the dialog stays open. The default is "The action was not completed. Review the dialog and try again." (#424)
- **Components** ([Release v4.32.0](https://github.com/Cratis/Components/releases/tag/v4.32.0)): `DataTableCore`, `DataTableForQuery`, `DataTableForObservableQuery` and `DataPage` accept a `filteredEmptyMessage`, shown instead of `emptyMessage` when a search or column filter is active and no rows are shown. The defaults come from the provider's data table messages: `filteredEmpty` ("No rows on this page match the search.") when the table filters the loaded page, and `filteredEmptyServer` ("No rows match the search.") in server mode. (#423)
- **Components** ([Release v4.32.0](https://github.com/Cratis/Components/releases/tag/v4.32.0)): `DataTableForQuery`, `DataTableForObservableQuery` and `DataPage` accept `onGlobalFilterChange`, called with the search text as the user types, so an application can tell that a search is active. (#423)
- **Components** ([Release v4.31.0](https://github.com/Cratis/Components/releases/tag/v4.31.0)): `GuidField`, an opt-in command form field for `Guid` properties, exported from `@cratis/components/CommandForm`. It keeps native `Guid` values, lets the user type partial drafts, shows format and required errors, and never generates identifiers. On Arc and Arc React 22.19.1 or later an invalid draft blocks submission; on older Arc it shows the error and leaves the value empty. It is not registered by default: register it with `registerFieldTypeProvider` to use it in `AutoCommandForm`, as shown in [GuidField](https://github.com/Cratis/Components/blob/main/Documentation/CommandForm/guid-field.md). Errors you set on the field yourself are left intact. (#314)
- **Stage** ([Release v4.176.0](https://github.com/Cratis/Stage/releases/tag/v4.176.0)): Stage admits ESM v29 and v30 (Screenplay 4.226.0). `decimals <= N` rules run in the executor and the Host and render as generated validators, so a third decimal on `Money` is refused where it enters.
- **Stage** ([Release v4.176.0](https://github.com/Cratis/Stage/releases/tag/v4.176.0)): A specification can pin the generated values of a command a reaction invokes with `given generated <Command>.<property> = <value>`: the executor feeds each invocation the next pinned value, and the generated reaction specification carries it, so reactions that create records with generated ids are specified instead of left unsupported.
- **Stage** ([Release v4.176.0](https://github.com/Cratis/Stage/releases/tag/v4.176.0)): A command that appends to several event sources runs and renders like any other command.
- **Stage** ([Release v4.175.0](https://github.com/Cratis/Stage/releases/tag/v4.175.0)): The Cratis renderer renders the specification of a command that is rejected by a concept rule on one of its own literal inputs even when the command a reaction invokes carries the same concept and message. The input fails while binding, before any event is appended, so no reaction can run. Such specifications were refused with STAGE-ESM-011 ("generated CommandScenario specifications do not settle reactions yet"). (part of #503)
- **Stage** ([Release v4.174.0](https://github.com/Cratis/Stage/releases/tag/v4.174.0)): The Cratis renderer renders models whose generated C# names would collide instead of refusing them with STAGE-ESM-012. A command property named like its command or like a reserved member (such as `Handle` or `ToString`) gets a trailing `_` (for example `Text_`), and its JSON field, generated proxy property and form field become `text_`. A query named like its read model or one of its properties gets a trailing `_` on the method and proxy name, while its HTTP route keeps the original name. Only colliding names change; every escape is reported as the information diagnostic STAGE-ESM-050 naming the declaration and the emitted name. (#502)
- **Stage** ([Release v4.173.0](https://github.com/Cratis/Stage/releases/tag/v4.173.0)): Commands whose individual productions name their own event source, stream or stream id (`produces ... to <stream>`) now run in specifications and the semantic Host, and render to Arc commands that append each event to the route the model names. (#262)
- **Chronicle** ([Release v19.90.0](https://github.com/Cratis/Chronicle/releases/tag/v19.90.0)): New `MaxConcurrentPartitions` options for reactors and reducers in `ChronicleOptions` set how many partitions of one reactor or reducer the .NET client handles at the same time. The default is the processor count, capped at 8; `1` restores one-at-a-time handling. (part of #4664)
- **Stage** ([Release v4.172.0](https://github.com/Cratis/Stage/releases/tag/v4.172.0)): Live (`observable`) queries now push updates from the Stage Host and the generated and Host-served frontends: list screens update as the read model changes, including after commands from another client, without a refresh. Snapshot queries still answer once. (#366)
- **Arc** ([Release v22.127.0](https://github.com/Cratis/Arc/releases/tag/v22.127.0)): Observable queries now report metrics for active subscriptions and pushed updates, and trace each push with a `cratis.arc.query.push` span. The metric and span names are available as constants on `WellKnownTelemetryNames`. (part of #2915)
- **Stage** ([Release v4.171.0](https://github.com/Cratis/Stage/releases/tag/v4.171.0)): Rendered specifications assert that a read model is absent (`then no <ReadModel> <key>`) for scalar keys, so models with absence assertions render instead of being refused with STAGE-ESM-027. Absence on composite or other non-scalar keys is still refused with STAGE-ESM-027. (#508)
- **Arc** ([Release v22.126.0](https://github.com/Cratis/Arc/releases/tag/v22.126.0)): `ProtectedDecisionServiceProviderFactory` and `BuildProtectedDecisionServiceProvider()` build a Microsoft DI provider that Arc can certify. In a `[ProtectedDecision]` command running in a scope of that provider, discoverable validators whose constructors take `DecisionRead<T>`, the command-aware `IDecisionReads`, or freshly constructed transient collaborators are constructed per invocation and run. Previously these validators were refused. See https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/chronicle/consistency/certified-validators.md. (#2831)
- **Arc** ([Release v22.126.0](https://github.com/Cratis/Arc/releases/tag/v22.126.0)): `AddProtectedDecisionValidator<TValidator>(configure)` registers a validator whose extra rules, added in `configure`, apply to that fresh instance. Use it instead of a factory or instance registration, which protected decisions still refuse. (#2831)
- **Stage** ([Release v4.169.0](https://github.com/Cratis/Stage/releases/tag/v4.169.0)): Stage now renders read models with composite keys instead of refusing them. Projections key each instance by all of its key parts through Chronicle's typed composite keys, and `from` and `remove with` blocks and list queries with equality filters work over such read models. Single-instance queries by key parts stay refused until Chronicle supports them (`STAGE-ESM-047`). (#481)
- **Screenplay** ([Release v4.224.0](https://github.com/Cratis/Screenplay/releases/tag/v4.224.0)): `Samples/Catalog`, `Samples/Vendors`, `Samples/Billing` (the Invoicing blueprint; `Samples/Invoicing` is the living language sample), `Samples/CustomerPortal`, `Samples/Contracts`, `Samples/WorkOrders`, `Samples/Bookings`: each an application whose every screen fills a template of its blueprint (`template blueprint Cratis.Blueprint.<Name> <Template> version "^1.0"`), with the navigation declared in the layout, the blueprint's own sample-data pack as the preview data, events feeding the list, board, calendar, timeline, dashboard, inbox and profile views, and a specification for each slice.
- **Screenplay** ([Release v4.224.0](https://github.com/Cratis/Screenplay/releases/tag/v4.224.0)): The conformance vectors (golden syntax) for the seven samples and their entries in the sample list.
- **Screenplay** ([Release v4.224.0](https://github.com/Cratis/Screenplay/releases/tag/v4.224.0)): The blueprint render check (`render-blueprint-samples.sh`) renders the seven samples with the published packages.
- **AI** ([Release v7.86.0](https://github.com/Cratis/AI/releases/tag/v7.86.0)): `cratis-engineering-consolidation-guard` skill: when folding several pull requests into one, re-landing reverted work or restoring commits by cherry-pick, prove nothing was dropped — per-commit pairing by patch-id and `range-diff`, per-file content checks that catch merge resolutions which revert or lose files, and a specification-file ratchet. Ships a portable `verify-consolidation.sh` (with `--discover` and `--self-test`) and the pattern for running it as a required pull request check, with accepted losses recorded as commit trailers. (#413)
- **AI** ([Release v7.86.0](https://github.com/Cratis/AI/releases/tag/v7.86.0)): A GitHub Copilot `plugin.json` at `.cratis/ai`, so the Cratis skills can be submitted to github/awesome-copilot. Its `version` is the plugin manifest version, kept equal to the marketplace manifests by corpus verification. (#503)
- **Screenplay** ([Release v4.223.0](https://github.com/Cratis/Screenplay/releases/tag/v4.223.0)): A new MCP tool, `trace-lineage`, traces one read-model property back to its sources. It follows every projection or reducer mapping, AutoMap, join and child mapping to the event property, then to the command property or capture source that produces it, and returns the result as a paged tree. A missing mapping or producer is reported at the hop where the chain breaks, several sources appear as branches, and code the model cannot see into is marked as opaque instead of guessed. The tool is read-only and advisory. (#388)
- **Screenplay** ([Release v4.222.0](https://github.com/Cratis/Screenplay/releases/tag/v4.222.0)): The TypeScript compiler's completeness API reports privilege (PLAY0652), purpose (PLAY0602–PLAY0606) and persona (PLAY0574–PLAY0576) findings when `privilege`, `purposes`, `personas`, one of their codes or `all` is selected, matching the C# compiler, so browser and VS Code editors can show them without the native compiler. (part of #527)
- **Components** ([Release v4.30.0](https://github.com/Cratis/Components/releases/tag/v4.30.0)): `DataTableForQuery` and `DataTableForObservableQuery` accept an opt-in `serverQuery` that filters and sorts the complete server result before paging: the table's sort is sent as Arc `sortBy`/`sortDirection` (optionally renamed through `sortFields`), column filters and search text become query arguments through your `toArguments` function, rows are shown as the server returns them, and any change goes back to the first page with search debounced (300 ms by default). `DataPage` passes it through. Without `serverQuery` the tables keep filtering and sorting the loaded page only. The query must return an `IQueryable` or use MongoDB `Observe` and apply the filter arguments itself; see [Data tables](https://github.com/Cratis/Components/blob/main/Documentation/DataTables/index.md). (#178)
- **Scene** ([Release v4.71.0](https://github.com/Cratis/Scene/releases/tag/v4.71.0)): `@cratis/scene.blueprint.catalog` - catalog overview dashboard, products list, product page (variants, price history), categories list; `catalog-en` pack. Tracks #167.
- **Scene** ([Release v4.71.0](https://github.com/Cratis/Scene/releases/tag/v4.71.0)): `@cratis/scene.blueprint.vendors` - vendors list, vendor page (contacts, purchase orders, certificates), onboarding board, performance dashboard; `vendors-en`. Tracks #168.
- **Scene** ([Release v4.71.0](https://github.com/Cratis/Scene/releases/tag/v4.71.0)): `@cratis/scene.blueprint.invoicing` - receivables overview, invoices list, invoice page (lines, payments, record-payment dialog), payments list, due-date calendar; `invoicing-en`. Tracks #169.
- **Scene** ([Release v4.71.0](https://github.com/Cratis/Scene/releases/tag/v4.71.0)): `@cratis/scene.blueprint.customer-portal` - portal home, orders and order page, invoices, support inbox, profile; `customer-portal-en`. Tracks #170.
- **Scene** ([Release v4.71.0](https://github.com/Cratis/Scene/releases/tag/v4.71.0)): `@cratis/scene.blueprint.contracts` - contracts list, contract page (parties, obligations, amendments), terms timeline, needs-attention inbox; `contracts-en`. Tracks #171.
- **Scene** ([Release v4.71.0](https://github.com/Cratis/Scene/releases/tag/v4.71.0)): `@cratis/scene.blueprint.work-orders` - work orders list, work order page (tasks, parts, time), board, visit schedule; `work-orders-en`. Tracks #172.
- **Scene** ([Release v4.71.0](https://github.com/Cratis/Scene/releases/tag/v4.71.0)): `@cratis/scene.blueprint.bookings` - bookings calendar, list, booking page, resources as cards, new-booking wizard; `bookings-en`. Tracks #173.
- **Scene** ([Release v4.71.0](https://github.com/Cratis/Scene/releases/tag/v4.71.0)): Every package: navigation, thumbnails, category `Business / <Domain>`, specifications for the definition of done of every template, the screen set, the application behaviour, every forced standard state, and the Chromium audit at desktop, tablet and phone widths in both themes with colour contrast.
- **Scene** ([Release v4.71.0](https://github.com/Cratis/Scene/releases/tag/v4.71.0)): Docs `blueprints/<domain>-blueprint.md`, the table of contents and the index; the packages join the browser specifications of the JavaScript build; the root `blueprintCatalog.json` lists all fifteen domain blueprints.
- **AI** ([Release v7.85.0](https://github.com/Cratis/AI/releases/tag/v7.85.0)): A committed Screenplay model can be marked as generated evidence with `"modelFirst": { "frozen": true, "reason": "…" }` in `.cratis/ai.json`. The model-first status check then reports it as not opted in (`frozen-model`), and agents leave it alone unless a request names it explicitly. (#514)
- **AI** ([Release v7.85.0](https://github.com/Cratis/AI/releases/tag/v7.85.0)): A `process` block in `.cratis/ai.json` routes the Screenplay lifecycle to the project's own stores. `decisions` sets the decision folder and id pattern, `workItems` the backlog, `acceptance` the split between the person who confirms the model's meaning and the person who commits it, and `agents` lists project addenda that the Screenplay modeler, reviewer and renderer read after their own instructions. Addenda can only narrow what an agent does. (#514)
- **AI** ([Release v7.85.0](https://github.com/Cratis/AI/releases/tag/v7.85.0)): The P6 acceptance step supports split acceptance, recorded as `Model-Meaning-Accepted-By:` and `Model-Committed-By:` commit trailers with role and GitHub handle. (#514)
- **Chronicle** ([Release v19.88.0](https://github.com/Cratis/Chronicle/releases/tag/v19.88.0)): Fluent `FromEvery` and `FromAll` mappings can set a constant with `ToValue(...)`, matching `Set(...).ToValue(...)` for concepts, enums and `null`. (#4663)
- **Stage** ([Release v4.164.0](https://github.com/Cratis/Stage/releases/tag/v4.164.0)): Run modeled specifications with composite event values in given, appended and produced events, in both the specification executor and the semantic Host; expected events match composite members regardless of member order. (#441)
- **Arc** ([Release v22.125.0](https://github.com/Cratis/Arc/releases/tag/v22.125.0)): Composite keys of protected read models are validated through accessors the Arc source generator produces, with no reflection. Key types the generator cannot see — partial, external, derived or from experimental assemblies — can be registered with `ProtectedReadModelKeyAccessors.Register<T>(...)`. See [Protected key accessors](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/chronicle/protected-key-accessors.md). (#3392)
- **Arc** ([Release v22.125.0](https://github.com/Cratis/Arc/releases/tag/v22.125.0)): `ProtectedReadModelKeyOptions.Strict` rejects composite key types that have neither a generated accessor nor a registration, instead of falling back to reflection. Under NativeAOT this is always the behavior. (#3392)
- **Arc** ([Release v22.125.0](https://github.com/Cratis/Arc/releases/tag/v22.125.0)): Analyzer diagnostic [ARC0030](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/code-analysis/ARC0030.md) reports a composite key type the generator cannot produce an accessor for. (#3392)
- **Stage** ([Release v4.163.0](https://github.com/Cratis/Stage/releases/tag/v4.163.0)): Rendered applications and `ui profile` resolution can use the default blueprint's `DashboardShell` and `MinimalShell` layouts, which ship with Scene 4.70.1.
- **Screenplay** ([Release v4.221.0](https://github.com/Cratis/Screenplay/releases/tag/v4.221.0)): `find-modeling-smells` reports a new advisory rule, `SMELL006`, which asks about an event property that no mapping, AutoMap, reaction, condition or specification reads. (part of #393)
- **Chronicle** ([Release v19.87.0](https://github.com/Cratis/Chronicle/releases/tag/v19.87.0)): `AddCratisChronicle` overloads with a trailing `connectionStringName` parameter that choose which `ConnectionStrings` entry to read, for an Aspire resource that is not named `chronicle`. (#4917)
- **Chronicle** ([Release v19.86.0](https://github.com/Cratis/Chronicle/releases/tag/v19.86.0)): Reactor and reducer deliveries carry a delivery id, which the .NET client returns with each result. Clients that do not return it keep working: their results complete the oldest outstanding delivery for the partition. (part of #4664)
- **Stage** ([Release v4.161.0](https://github.com/Cratis/Stage/releases/tag/v4.161.0)): Behaviors, interaction actions, composition values, contributions, forms, screen directives, screens, UI profiles, command form schemas and UI syntax now report unsupported model content as typed conversion diagnostics (code, severity, construct, path and source location) instead of aborting the whole Scene conversion; the rest of the Scene still converts. New codes: `STAGE-SCENE-BEHAVIOR-*`, `STAGE-SCENE-ACTION-002`/`-003`, `STAGE-SCENE-COMPOSITION-*`, `STAGE-SCENE-CONTRIBUTION-*`, `STAGE-SCENE-FORM-*`, `STAGE-SCENE-DIRECTIVE-*`, `STAGE-SCENE-SCREEN-*`, `STAGE-SCENE-PROFILE-*` and `STAGE-SCENE-SCHEMA-*`. (#532)
- **Chronicle** ([Release v19.84.0](https://github.com/Cratis/Chronicle/releases/tag/v19.84.0)): A batch append, a unit of work and `AppendMany` can now carry one concurrency guard for each stream of the same event source, for example a guard on `REPORT / SendApprovals` and another on `REPORT / Corrections / <id>`. The kernel validates them all before writing anything, so the batch stays atomic. Events for several streams of one event source previously kept only the first stream's guard, or failed with `IncompatibleConcurrencyScopesForEventSource`. (#4818)
- **Chronicle** ([Release v19.84.0](https://github.com/Cratis/Chronicle/releases/tag/v19.84.0)): New `AppendMany` overloads on `IEventSequence` take a list of event source id and concurrency scope pairs, so one event source id can appear with several scopes. (#4818)
- **Chronicle** ([Release v19.84.0](https://github.com/Cratis/Chronicle/releases/tag/v19.84.0)): A concurrency violation now reports which guard failed (`ScopeIndex` and `Scope`). (#4818)
- **Screenplay** ([Release v4.220.0](https://github.com/Cratis/Screenplay/releases/tag/v4.220.0)): `propose-rename` can rename a composite stream id part. It renames the part declaration and every `part = …` mapping in command routes, specification routes, examples and redelivery locators. Part order and stored stream ids stay the same, and the rename is refused when the new name collides with another part of the same stream. (#575)
- **Screenplay** ([Release v4.219.0](https://github.com/Cratis/Screenplay/releases/tag/v4.219.0)): The `PLAY0516` timeline-order repair can now replace a folder glob import with an explicit, ordered list of imports when no safe move or pin fixes the order. Every document the glob reached is kept, and the reordered model is verified before it is offered. (#573)
- **Screenplay** ([Release v4.219.0](https://github.com/Cratis/Screenplay/releases/tag/v4.219.0)): The TypeScript compiler offers a quick fix for `PLAY0516`, including edits in the importing document, and the web editor shows it as a code action. (#573)
- **Screenplay** ([Release v4.219.0](https://github.com/Cratis/Screenplay/releases/tag/v4.219.0)): VS Code offers the `PLAY0516` repair as a reviewed code action, with the same preview, drift checks and recovery as the other saved-file repairs. (#573)
- **Stage** ([Release v4.158.0](https://github.com/Cratis/Stage/releases/tag/v4.158.0)): Given read-model state in a specification seeds that read model per key: the seed replaces earlier projected state for its key, later events still fold into it, other keys keep their history, and commands invoked during the run see the same seed. (part of #15)
- **Stage** ([Release v4.158.0](https://github.com/Cratis/Stage/releases/tag/v4.158.0)): Seeded read models that have no projection are returned exactly as seeded in read-model and query assertions. (part of #15)
- **Stage** ([Release v4.158.0](https://github.com/Cratis/Stage/releases/tag/v4.158.0)): Query assertions that supply equality filters run against the projected and seeded read models: filters combine with the key, omitted optional filters do not narrow the result, and rows are matched regardless of order. (#546)
- **Orleans** ([Release v1.25.0](https://github.com/Cratis/Orleans/releases/tag/v1.25.0)): `Job.OnBeforeDispatchingJobSteps(JobStepDispatchContext)`, an optional hook that runs before any step starts, both when a job starts and when it resumes. `JobStepDispatchContext.InitializationMayBeIncomplete` is `true` when the job is recovering from a crash during startup, so the job can finish or repeat its own one-time initialization (#40)
- **Orleans** ([Release v1.25.0](https://github.com/Cratis/Orleans/releases/tag/v1.25.0)): `CannotResumeJobError.MissingStepPlan`: a job saved by an earlier version while it was preparing or starting its steps cannot be resumed safely and now fails with this reason instead of being planned again (#40)
- **Orleans** ([Release v1.25.0](https://github.com/Cratis/Orleans/releases/tag/v1.25.0)): `StartJobError.InvalidStepPlan`: starting a job fails early when a step request cannot be saved and read back as JSON (#40)
- **Screenplay** ([Release v4.218.2](https://github.com/Cratis/Screenplay/releases/tag/v4.218.2)): A new warning, `PLAY0803`, reports a `matches` pattern that can backtrack exponentially in browser engines, such as `(a+)+$`, `(a|a)*` or `(a*)*`, and names the ambiguous subexpression with a simpler rewrite where one exists. The C# compiler, the TypeScript compiler, Monaco and VS Code report it identically; very large patterns are not analyzed. (#806)
- **AI** ([Release v7.84.0](https://github.com/Cratis/AI/releases/tag/v7.84.0)): `PreviewAgentTier` query shows, before `ConfigureAgent` is applied, what a proposed tier resolves to on the agent's provider or on each member of its pool: the model, where it comes from (configured, derived, borrowed or subscription alias) and whether the tier would be refused, with the reason (#759)
- **AI** ([Release v7.84.0](https://github.com/Cratis/AI/releases/tag/v7.84.0)): `PreviewProviderTierModels` query resolves every tier against a proposed provider tier mapping before `SetAIProviderTierModels` is applied; a tier left out derives from the provider's catalog, exactly as it would after applying the mapping. See [provider harnesses](https://github.com/Cratis/AI/blob/main/Documentation/provider-harnesses.md) (#759)
- **Stage** ([Release v4.157.0](https://github.com/Cratis/Stage/releases/tag/v4.157.0)): The Stage frontend runtime is published to npm as `@cratis/stage.runtime` with every Stage release, at the same version as the Stage packages, with provenance. It carries the Stage application shell, command execution through Arc proxies, data sources, navigation and Stage components, with Arc, Scene, Cratis Components and React as peer dependencies. Rendered applications still embed the runtime for now; switching them to the package follows. (part of #499)
- **AI** ([Release v7.83.0](https://github.com/Cratis/AI/releases/tag/v7.83.0)): The Screenplay modeling skills teach the explicit author-intent `PLAY0470` repair: discover repair intents, page both destination report views, choose a destination for every production, then apply. The corpus pins Screenplay 4.216.0 and its compiler contract (#784)
- **AI** ([Release v7.83.0](https://github.com/Cratis/AI/releases/tag/v7.83.0)): The streams, command-surface, model-authoring and toolchain skills teach `PLAY0802` (`ReservedStoredName`): a stored event stream named `All` or stored event source named `Default` is refused while authoring, a pin away from the reserved name is valid, and `PLAY0273` remains the binding backstop (#776)
- **Screenplay** ([Release v4.218.0](https://github.com/Cratis/Screenplay/releases/tag/v4.218.0)): The TypeScript compiler's completeness API reports conflicting screen data bindings (PLAY0530) and screen data that does not match its query (PLAY0531) when `data-bindings`, either code or `all` is selected, matching the C# compiler, so browser and VS Code editors can show them without the native compiler. (part of #527)
- **cli** ([Release v3.80.0](https://github.com/Cratis/cli/releases/tag/v3.80.0)): `cratis chronicle streams closed list` lists the closed stream scopes of an event sequence with their dimensions, origin, owning constraint, sequence number and closing time, filtered by event source id or type and event stream type or id; table, plain and JSON output. Requires Chronicle 19.39.0 or later. (#304)
- **cli** ([Release v3.80.0](https://github.com/Cratis/cli/releases/tag/v3.80.0)): `cratis chronicle streams closed reopen --reason <text>` repairs a mistaken manual close of one exact scope, after confirmation (`--yes` to skip); the kernel records the reason and actor as a `StreamScopeReopened` event and refuses closures owned by a closing event. (#304)
- **Stage** ([Release v4.155.0](https://github.com/Cratis/Stage/releases/tag/v4.155.0)): Execute `AllGreaterThan` and `AllGreaterThanOrEqual` collection validation rules in modeled specifications and the semantic Host, with rule-specific refusals for unsupported operands or collection types. (#523)
- **Screenplay** ([Release v4.217.0](https://github.com/Cratis/Screenplay/releases/tag/v4.217.0)): `GenerationFixturesCorpus.V21R2` and `GenerationFixturesCorpus.SourceFormsV21R2`: an additive ESM v21 generation fixture revision whose `TenantOrderId` generation body is portable, compilable C#. `GenerationFixturesCorpus.V21` and `SourceForms` stay byte-identical, and both revisions have the same canonical ESM bytes, semantic revision and specification outcomes. Consumers that render the fixture should switch to `V21R2`. (#836)
- **AI** ([Release v7.82.0](https://github.com/Cratis/AI/releases/tag/v7.82.0)): Codex can run the Cratis store-mutation and pull-request shell guards through a native `PreToolUse` hook. Adapter failures deny the command; file and patch writes, Stop and session hooks, and installation through `cratis ai install` are not covered yet. (part of #401)
- **Screenplay** ([Release v4.216.0](https://github.com/Cratis/Screenplay/releases/tag/v4.216.0)): `propose-repair` accepts a `destinationIntent` (version 1) for PLAY0470. The intent names one explicit `for` expression and route confirmation for every event production of the command. Existing explicit destinations are confirmed, never retargeted, and nothing is guessed or fixed in bulk. See [MCP authoring tools](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/mcp/authoring-tools.md). (#397)
- **Screenplay** ([Release v4.216.0](https://github.com/Cratis/Screenplay/releases/tag/v4.216.0)): `read-workspace` view `repair-intents` lists PLAY0470 commands with every production a host must collect a destination for. Repair capabilities advertise the repair under `intentActions`, separately from the existing no-input repairs. (#397)
- **Screenplay** ([Release v4.216.0](https://github.com/Cratis/Screenplay/releases/tag/v4.216.0)): `read-proposal` views `production-destinations` and `production-destination-identities` page the retained routing report. The report states that no executable baseline existed, so it makes no routing-preservation claim. (#397)
- **cli** ([Release v3.79.0](https://github.com/Cratis/cli/releases/tag/v3.79.0)): `cratis chronicle observers retry-failed-partitions <OBSERVER_ID>` retries every failed partition of an observer in one operation. The kernel recovers a bounded batch at a time; the command returns once recovery is started and reports how many partitions were failed. Requires Chronicle 19.80.0 or later.
- **AI** ([Release v7.81.0](https://github.com/Cratis/AI/releases/tag/v7.81.0)): Changes to the instruction corpus, harness adapters and distribution manifests are routed to `@Cratis/core` for review through CODEOWNERS. (#755)
- **AI** ([Release v7.81.0](https://github.com/Cratis/AI/releases/tag/v7.81.0)): Verification warns about package sources, registry URLs, install commands, MCP server launch commands and dependency declarations that a change adds to instruction files, with file and line. The warning flags supply-chain changes for human review and never fails the build. (#755)
- **Screenplay** ([Release v4.215.0](https://github.com/Cratis/Screenplay/releases/tag/v4.215.0)): `ObservationComparison.Compare` compares a model with a host-supplied `ObservationSnapshot` and returns an `ObservationReport`. The snapshot holds registered event types and generations, append counts, command and reaction edges attributed by causation, and registered consumers. The report gives typed findings (Drift, Informational, Unknown or Excluded), the coverage behind them and per-slice evidence. Absence is never reported as drift when coverage is partial, conditional or opaque. Productions are reported as Unknown with a stated reason. See [Observation comparison](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/observation-comparison.md). (#294)
- **Screenplay** ([Release v4.215.0](https://github.com/Cratis/Screenplay/releases/tag/v4.215.0)): `ObservationIdentityMap.FromModel` maps events by their stored name and generation and commands by unique name; hosts add reactor and other target-specific identifiers with `With`. (#294)
- **Screenplay** ([Release v4.215.0](https://github.com/Cratis/Screenplay/releases/tag/v4.215.0)): `ObservationReportJson` writes the report as stable JSON, so every host reports the same result. (#294)
- **Stage** ([Release v4.154.0](https://github.com/Cratis/Stage/releases/tag/v4.154.0)): Semantic specification runs (the SpecRunner semantic engine and the Host's specification endpoint) execute specifications that fire application, startup and shutdown triggers and that advance the clock through interval and schedule reactions, matching the Screenplay reference evaluator. Live Host runs and rendered applications still refuse these triggers. (part of #343)
- **Arc** ([Release v22.122.0](https://github.com/Cratis/Arc/releases/tag/v22.122.0)): The Screenplay generator states exact collection values in specification fixtures: collection expressions, arrays, `List<T>` initializers and `Array.Empty<T>()` whose elements are all constants or concept values. A collection with a spread, a computed element, or a set or sorted target still leaves the scenario out with SP0039. (#3383)
- **Arc** ([Release v22.122.0](https://github.com/Cratis/Arc/releases/tag/v22.122.0)): The Screenplay generator reads exact collection checks in event assertions, `e.Tags.SequenceEqual(...)` and `!e.Tags.Any()` for an empty collection, so a scenario whose event carries a collection can state the whole event. (#3383)
- **Stage** ([Release v4.151.0](https://github.com/Cratis/Stage/releases/tag/v4.151.0)): Opt-in render-around: set `CratisPlanOptions.Refusals` to `ArtifactRefusalMode.RenderAround` (carried as the `cratis-render:refusals` profile input) to render the application while dropping only specifications refused with `STAGE-ESM-011` or `STAGE-ESM-024`. Any other refusal keeps the whole plan refused. (part of #500)
- **Stage** ([Release v4.151.0](https://github.com/Cratis/Stage/releases/tag/v4.151.0)): `ArtifactRenderPlan.Outcome` (`Complete`, `Partial`, `Refused`) and `ArtifactRenderPlan.Refusals` list every dropped specification with its codes; `CratisPlanResult` exposes both. A partial plan keeps its error diagnostics, so `Success` stays false and consumers must check `Outcome` to use it. A new information diagnostic `STAGE-PLAN-007` reports how many specifications were rendered around. (part of #500)
- **Screenplay** ([Release v4.214.0](https://github.com/Cratis/Screenplay/releases/tag/v4.214.0)): Model comparison reports changes to stored enum numbers: `ModelDifference.Enumerations` lists each enum member whose number changed (for example after inserting or reordering members of an unnumbered enum), was removed, had its number reused by another member, or was renamed while keeping its explicit number. Each change says whether an event stores the enum and whether it breaks the stored contract. See [decision 0094](https://github.com/Cratis/Screenplay/blob/main/decisions/0094-report-enum-numeric-identity-changes-in-model-comparison.md). (#667)
- **Screenplay** ([Release v4.214.0](https://github.com/Cratis/Screenplay/releases/tag/v4.214.0)): The MCP `semantic-diff` and `read-proposal view=semantic-diff` list these changes as `enum-*` items in the `members` section, with `beforeNumber`, `afterNumber`, their numbering and `stored`. Other items are unchanged. (#667)
- **Screenplay** ([Release v4.214.0](https://github.com/Cratis/Screenplay/releases/tag/v4.214.0)): An enum with duplicate member names or numbers is reported as not comparable instead of being compared. (#667)
- **AI** ([Release v7.77.0](https://github.com/Cratis/AI/releases/tag/v7.77.0)): The always-loaded rules state that the user's instructions take precedence over guidelines in a skill. This never overrides safety rules or hooks. (#754)
- **AI** ([Release v7.77.0](https://github.com/Cratis/AI/releases/tag/v7.77.0)): The skill-authoring lint warns when two skills' `Use when` triggers overlap strongly (token Jaccard similarity of 0.4 or higher). The warning is advisory and never fails verification. (#754)
- **AI** ([Release v7.77.0](https://github.com/Cratis/AI/releases/tag/v7.77.0)): The rules now carry three safeguards that previously lived only in skills, so a competing skill can no longer drop them: never copy secrets or personal values into models, notes, state or briefs, or use real data in examples; legacy extraction uses Git read-only; and committed or applied EF Core migrations are append-only. (#754)
- **Stage** ([Release v4.149.0](https://github.com/Cratis/Stage/releases/tag/v4.149.0)): Screenplay conversion can now report unsupported model content as typed diagnostics instead of throwing. New overloads on `ProjectionConverter`, `ReadModelConverter`, `SliceConverter` and `ArrangementConverter`, plus `ScreenplayEventModelVisitor.Convert`, collect `ConversionDiagnostic` entries (code, severity, construct, path and source location, convertible to a Screenplay `Diagnostic`) and convert the rest of the model. The existing overloads keep throwing as before. (#531)
- **Stage** ([Release v4.149.0](https://github.com/Cratis/Stage/releases/tag/v4.149.0)): Diagnostic codes `STAGE-PROJECTION-001` to `STAGE-PROJECTION-008` and `STAGE-SCENE-ARRANGEMENT-001` to `STAGE-SCENE-ARRANGEMENT-004`, documented in the [Stage rendering reference](https://github.com/Cratis/Stage/blob/main/Documentation/reference/stage-rendering.md). (#531)
- **Arc** ([Release v22.120.0](https://github.com/Cratis/Arc/releases/tag/v22.120.0)): `[ExplicitOffset]` accepts concepts over `DateTimeOffset` and `DateTime`, refusing values without an explicit offset exactly as for the primitive types. Concepts over `DateOnly` are refused with a configuration error, because a calendar date has no offset. Requires Arc's default JSON options. See [Require explicit date-time offsets](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/commands/input-binding.md). (#3350)
- **Arc** ([Release v22.120.0](https://github.com/Cratis/Arc/releases/tag/v22.120.0)): Generated Screenplay models include date comparisons on concept-backed `DateOnly`, `DateTime` and `DateTimeOffset` command properties and validator rules and concept-wrapped date literals; both sides must resolve to the same date type. (#3350)
- **Arc** ([Release v22.119.0](https://github.com/Cratis/Arc/releases/tag/v22.119.0)): `ArcOptions.QueryHealth` (`QueryHealthOptions` with `RequireAuthentication` and `Roles`, bound from `Cratis:Arc:QueryHealth`) controls who may observe query health. (#2873)
- **Chronicle** ([Release v19.82.2](https://github.com/Cratis/Chronicle/releases/tag/v19.82.2)): Event sequences report how far their constraint indexes lag behind the log as a metric, alongside metrics for repairs and unknown append outcomes. (#4895)
- **AI** ([Release v7.75.0](https://github.com/Cratis/AI/releases/tag/v7.75.0)): Quality gates accept `timeoutSeconds` and `timeoutHint`. A gate that runs past its deadline is stopped together with its child processes. It is reported as a named NOT VERIFIED failure that suggests a narrower command to run instead. The shipped backend-specs gate has a 120-second deadline. (#753)
- **Scene** ([Release v4.70.0](https://github.com/Cratis/Scene/releases/tag/v4.70.0)): The `core:toolbarItem` descriptor describes `presentation`: what the item shows (`mode`: icon and text, icon only, text only) and a `placement` hint, as an open object, so an editor's generic Object editor can author the hints the toolbar already reads and a host or theme styles by (part of Cratis/StudioIssues#631)
- **Chronicle** ([Release v19.82.0](https://github.com/Cratis/Chronicle/releases/tag/v19.82.0)): `ReadModelScenario<T>.ProcessAppendedEvents(IEnumerable<AppendedEvent>)` folds appended events with their original `EventContext`. Projections and reducers see each event's real sequence number and occurred time, so decisions that compare revisions behave as they do against the event store. Events from several event sources are folded in sequence-number order with the same key resolution as `ProcessEventsFor`. (#5034)
- **Arc** ([Release v22.117.0](https://github.com/Cratis/Arc/releases/tag/v22.117.0)): `IOccurrenceCommandExecutor` in Arc's Chronicle integration runs a command for an `OccurrenceContext` under an effect name. It records an effect receipt atomically with the command's events, so a redelivered occurrence returns the recorded outcome without running the handler again. Validation, rule and constraint refusals are recorded as final; authorization failures, concurrency conflicts and exceptions are left unrecorded, so a later attempt can retry them. Kernels without effect-receipt support are refused. See [Executing commands for occurrences](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/chronicle/commands/occurrence-commands.md). (#3288)
- **Chronicle** ([Release v19.81.0](https://github.com/Cratis/Chronicle/releases/tag/v19.81.0)): `IUnitOfWork.RefuseImmediateAppends()` refuses every immediate append in the current flow before anything is sent, while transactional appends still enroll in the unit. Use it when a unit of work must commit atomically with other state, such as an effect receipt, so a retry never repeats an append that escaped the unit. The returned frame owns completion when the unit has no other owner; inside an ASP.NET unit of work or with read protection enforced, completion stays with the existing owner. Read admission is unchanged. See [Effect receipts](https://github.com/Cratis/Chronicle/blob/main/Documentation/occurrences/effect-receipts.mdx). (#5019)
- **Chronicle** ([Release v19.80.0](https://github.com/Cratis/Chronicle/releases/tag/v19.80.0)): Stopping or resuming a job now answers whether the job took the request and why not (`StopJobResponse` and `ResumeJobResponse` with an `Accepted` flag and a `JobCommandRefusal`), through the contracts, the .NET client (`IJobs.Stop` and `IJobs.Resume` return a `JobCommandResult`) and the Workbench, which reports a refusal as an error. The proto changes are additive. (part of #4991)
- **Chronicle** ([Release v19.80.0](https://github.com/Cratis/Chronicle/releases/tag/v19.80.0)): `RetryFailedPartitions` command and gRPC operation that retries every failed partition of an observer through per-partition jobs started a bounded batch at a time, without reopening a concluded replay job. (part of #4991)
- **Scene** ([Release v4.69.0](https://github.com/Cratis/Scene/releases/tag/v4.69.0)): Preview regions for a design host: `identity`, `shell`, `menu`, `content` and `accent` are marked with `data-scene-region`, `ScenePreviewHost` reports `onRegionHover` and `onRegionActivate`, `regions.regionRect` measures a drawn region in the preview's own pixels, `describeRegions` says which regions each mode draws and the fallback, and the designer contract gains rule N9 (#193)
- **Scene** ([Release v4.69.0](https://github.com/Cratis/Scene/releases/tag/v4.69.0)): Profile identity: a name, a logo (initials, one of eight icons or an inline image) and whether the name shows, resolved by `resolveProfileIdentity` and drawn by the default shell in every menu mode (#194)
- **Scene** ([Release v4.69.0](https://github.com/Cratis/Scene/releases/tag/v4.69.0)): Profile appearance: `corners` (sharp, default, round) and `font` from a licensed font catalog with a sample line, resolved by `resolveAppearance`, with the new `text.fontFamily` token read by the default blueprint and the PrimeReact bridge (#195)
- **Scene** ([Release v4.69.0](https://github.com/Cratis/Scene/releases/tag/v4.69.0)): Typed `navigationMode` and `menuTheme` shell options with eight modes and three menu themes, the behavior of each mode and the touch regime, the legacy `slim-plus` string mapped without rewriting stored profiles, and a default menu mode per shell with the status line for a shell switch (#196)
- **Scene** ([Release v4.69.0](https://github.com/Cratis/Scene/releases/tag/v4.69.0)): Profile problems with a severity, a section and a one-click fix: theme needs a package, accent too light, own shell has no value, logo image missing and Reveal needs hover, with `applyProfileFix` and a contrast function that grades an accent against white (#197)
- **Scene** ([Release v4.69.0](https://github.com/Cratis/Scene/releases/tag/v4.69.0)): The package list answers for a designer: rows with reasons and locks, what can be added, moves, removal that never silently changes the theme, and choosing a blueprint or a theme (#198)
- **Scene** ([Release v4.69.0](https://github.com/Cratis/Scene/releases/tag/v4.69.0)): Picker metadata: Cratis Default, Dashboard and Minimal shell cards with wireframes checked by `verify-blueprints`, theme cards with the package selecting one adds, the colour scheme switch, eight menu mode schematics, the version rule with its status chip, and the value of my own shell (#199)
- **Scene** ([Release v4.69.0](https://github.com/Cratis/Scene/releases/tag/v4.69.0)): Sample data pack descriptions with columns and a status classification for pills, a description of the generic pack, and the rule that production builds never include sample data (#200)
- **Scene** ([Release v4.69.0](https://github.com/Cratis/Scene/releases/tag/v4.69.0)): Documentation for every new rule in the designer contract, with the decisions and the questions that remain open, and an updated `scene-ui-profile` skill and rules (#201)
- **Screenplay** ([Release v4.212.0](https://github.com/Cratis/Screenplay/releases/tag/v4.212.0)): `open-workspace` returns `applicationIdentity`, so you can build a typed `parts` target for a model note from names. (#784)
- **Stage** ([Release v4.144.0](https://github.com/Cratis/Stage/releases/tag/v4.144.0)): Rendered backend pins (Cratis, Arc, Chronicle, Specifications and the test packages) come from Stage's own central package versions, so a package update moves what generated applications pin without a separate edit; the daily package update also moves the `@cratis/*` frontend pins and the framework name catalog. (#493)
- **Orleans** ([Release v1.23.0](https://github.com/Cratis/Orleans/releases/tag/v1.23.0)): Bounded jobs: `JobsOptions.MaxActiveStepsPerJob` (or `Job.MaxActiveSteps`) keeps a sliding window of active steps and starts the next one as each step reaches an outcome. A resumed job rebuilds its window from storage. Off by default.
- **Orleans** ([Release v1.23.0](https://github.com/Cratis/Orleans/releases/tag/v1.23.0)): Step attempts: `JobsOptions.MaxStepAttempts`, `StepRetryBackoff` and `MaxStepRetryBackoff`, with `Job.ShouldRetryStep` deciding per failure. A failed attempt is scheduled again by the job with exponential backoff and counts as a failure only when its attempts run out. Default is one attempt.
- **Orleans** ([Release v1.23.0](https://github.com/Cratis/Orleans/releases/tag/v1.23.0)): `IJobsManager.RetryFailedSteps(jobId)` and `Job.CanRetryFailedSteps` run the failed steps of a job that completed with failures again. Opt-in per job type; resuming such a job is unchanged.
- **Orleans** ([Release v1.23.0](https://github.com/Cratis/Orleans/releases/tag/v1.23.0)): Optional step leases: `JobsOptions.StepLeaseTimeout` makes running steps record a heartbeat. The watchdog restarts a step only when its owner silo has left the cluster and its lease has expired; steps from older releases are left alone for one lease period.
- **Orleans** ([Release v1.23.0](https://github.com/Cratis/Orleans/releases/tag/v1.23.0)): `IJobStepStorage.CountByStatus(jobId)` as a default interface member, implemented for MongoDB, SQL and in-memory storage. Persisted steps gain an optional `Attempt` and `Lease`; existing data reads as attempt 1 with no lease.
- **Orleans** ([Release v1.23.0](https://github.com/Cratis/Orleans/releases/tag/v1.23.0)): `JobsOptions.JobWatchdogInterval`, `StepDeliveryMaxAttempts`, `StepDeliveryRetryDelay` and `MaxStepDeliveryRetryDelay`.
- **Arc** ([Release v22.116.0](https://github.com/Cratis/Arc/releases/tag/v22.116.0)): The new `IsSnapshot` property on `ObservableQueryEmissionContext` tells an emission guard that it is admitting a one-shot snapshot result rather than a stream emission. (#2955)
- **Arc** ([Release v22.116.0](https://github.com/Cratis/Arc/releases/tag/v22.116.0)): `IEndpointFallbackAuthorization` evaluates the host's default authorization for a request. Arc Core requires an authenticated caller when authentication handlers are registered. ASP.NET Core hosts evaluate the configured `FallbackPolicy`. (#2952)
- **Stage** ([Release v4.143.0](https://github.com/Cratis/Stage/releases/tag/v4.143.0)): `CratisRendering.ResolveProfileInputs(scene, approvedPackages)` resolves every ui profile with the Scene engine's planner and returns a `CratisProfileInputFinding` for each profile input the target cannot honor: an unknown package, a missing layout, packages that cannot be used together, a missing theme, an invalid root template and an unresolved blueprint template reference. The findings carry stable `STAGE-PROFILE-001` to `STAGE-PROFILE-006` codes. (Cratis/Screenplay#722)
- **Chronicle** ([Release v19.79.0](https://github.com/Cratis/Chronicle/releases/tag/v19.79.0)): Projection registrations now carry the client's software version. The .NET client sends `ChronicleOptions.SoftwareVersion`, which defaults to the entry assembly's version and can be set with the `Cratis:Chronicle:SoftwareVersion` configuration key (`Cratis__Chronicle__SoftwareVersion`). The client logs a warning at startup while the version is the default `1.0.0`. An older kernel ignores the version and registers as before, so the guard takes effect once the kernel runs this release. See [the registration lifecycle](https://github.com/Cratis/Chronicle/blob/main/Documentation/projections/registration-lifecycle.md). (#5012)
- **Arc** ([Release v22.114.0](https://github.com/Cratis/Arc/releases/tag/v22.114.0)): Generated Screenplay models now include `==` and `!=` comparisons between Uuid values, Guid-backed concepts and proven canonical Uuid literals in command guards and protected read paths at ESM v28. The generator refuses unsupported operands, such as optional values, type-changing casts and constructors whose forwarding cannot be proven, and withholds them below ESM v28. (#3344)
- **Stage** ([Release v4.141.0](https://github.com/Cratis/Stage/releases/tag/v4.141.0)): The Cratis renderer renders Date and DateTime comparisons in command `require` clauses, `produces when` conditions and property validation rules. Dates are compared as calendar days (`DateOnly`) and DateTimes as UTC instants (`DateTimeOffset`), as the reference evaluator compares them. Each compared DateTime command property carries Arc's `ExplicitOffset` marker, so input without an offset or `Z` is refused. (#473)
- **Stage** ([Release v4.141.0](https://github.com/Cratis/Stage/releases/tag/v4.141.0)): A compared DateTime property typed through a concept is bound as a `DateTimeOffset` and converted to the concept where an event, rule or response uses it, until Arc accepts concept-wrapped dates (Cratis/Arc#3350).
- **AI** ([Release v7.72.0](https://github.com/Cratis/AI/releases/tag/v7.72.0)): Inspect each provider's effective tier model through `ProviderTierResolution.ResolveTiersFor`, also available as `ResolveTiersFor` from `@cratis/ai`. Results identify stored, derived, borrowed and subscription-alias models, or explain why a tier cannot be served. (part of #345)
- **Scene** ([Release v4.68.3](https://github.com/Cratis/Scene/releases/tag/v4.68.3)): A specification that renders the MasterDetail, Dashboard and ProfileSettings templates through the effective package set `resolvePackageHost` resolves for a UI profile listing `Cratis.Blueprint.Default` - the profile the live-Stage / generated-React vector uses (Cratis/Stage#504): no findings, every shipped template offered to a template browser as usable, the same components as the registry the browser audit renders with, and the vector's slot contents present by id.
- **Scene** ([Release v4.68.3](https://github.com/Cratis/Scene/releases/tag/v4.68.3)): Documentation in `blueprints/template-set.md`: configuring a template from the screen that uses it (exposure and `instance` contribution, what the shipped templates expose), and how Studio's template browser, the Stage and the vector share one package set.
- **Chronicle** ([Release v19.78.0](https://github.com/Cratis/Chronicle/releases/tag/v19.78.0)): `EventStoreForTesting` and `Defaults` in `Cratis.Chronicle.Testing` have new constructors that take an `EventStoreName` and an `EventStoreNamespaceName`, so scenarios that need their own identity no longer share `testing`/`default`. `ReadModelScenario`, `ReactorScenario` and `OccurrenceScenario` built from such a `Defaults` use its identity too, and reactors see it in their event context. The existing constructors keep `testing`/`default`. (#5018)
- **Orleans** ([Release v1.22.0](https://github.com/Cratis/Orleans/releases/tag/v1.22.0)): `step.BeginTestRun()` lets a specification run a job step's `PerformStep` under a real run, without a running job: callbacks posted through `TryInvokeOnActivation` are admitted and run, one at a time, on a stand-in activation scheduler. `JobStepTestRun<TState>.Perform(state)` returns what the step returned, `Stop()` cancels the work while admission stays open, `CloseAdmission()` refuses callbacks, and `IsOnActivation` tells a spec whether code runs on the activation. A test run records and delivers nothing. `JobStepAlreadyHasALiveRun` and `JobStepTestRunWasSuperseded` report misuse. See [Testing your job steps](https://github.com/Cratis/Orleans/blob/main/Documentation/concepts/jobs.md#testing-your-job-steps). (#85)
- **Screenplay** ([Release v4.208.0](https://github.com/Cratis/Screenplay/releases/tag/v4.208.0)): `PLAY0268` (not admitted by the executable model) carries a `subject` argument naming the innermost declaration that contains the refused construct, and an `issue` argument when the refusal cites a tracking issue. See [decision 0086](https://github.com/Cratis/Screenplay/blob/main/decisions/0086-give-diagnostics-named-typed-arguments-declared-per-code.md) and the [diagnostics reference](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/diagnostics.md). (#838)
- **Screenplay** ([Release v4.208.0](https://github.com/Cratis/Screenplay/releases/tag/v4.208.0)): `PLAY0367`, `PLAY0699` and `PLAY0787` (match patterns) carry the owning command or concept as `subject`, the `property`, the `pattern` and, for the first two, the `offset` in the pattern; the C# and TypeScript compilers report the same arguments. (#838)
- **Scene** ([Release v4.68.1](https://github.com/Cratis/Scene/releases/tag/v4.68.1)): A real-Chromium accessibility audit of every screen template the default blueprint ships (business, foundation, state, support, auth, status, nesting chain): axe-core WCAG 2.0/2.1/2.2 A and AA including colour contrast and target size, no horizontal overflow, and landmark structure (one `main`, no duplicate/nested landmarks, unique names, all content in a landmark, a level-one heading) - in every data state, at desktop/tablet/phone widths, in the light and dark theme (1,000+ browser specifications), against the registry of a host with the blueprint's dependencies (`core`, PrimeReact with a theme preset, the blueprint). It runs in the JavaScript Build workflow's existing browser step, so a regression fails the Scene CI.
- **Scene** ([Release v4.68.1](https://github.com/Cratis/Scene/releases/tag/v4.68.1)): A control specification that breaks the page it just judged (pale text, a second `main`, content outside a landmark, two tiny adjacent buttons) and expects each finding, so a clean audit is never vacuous.
- **Scene** ([Release v4.68.1](https://github.com/Cratis/Scene/releases/tag/v4.68.1)): Documentation in `blueprints/template-set.md` ("In a real browser").
- **Orleans** ([Release v1.21.0](https://github.com/Cratis/Orleans/releases/tag/v1.21.0)): `IJobAdmission` lets a job's owner allow or refuse a job's execution. Register it with `siloBuilder.AddJobAdmission<T>()` on every silo that can host the owner's job types. `MayRun(JobAdmissionRequest, CancellationToken)` receives the job's key, id, type and request; every registered admission must allow, and with none registered every job runs. See [Admit or refuse a job's execution](https://github.com/Cratis/Orleans/blob/main/Documentation/concepts/jobs.md). (#81)
- **Orleans** ([Release v1.21.0](https://github.com/Cratis/Orleans/releases/tag/v1.21.0)): `StartJobError.NotAdmitted` is returned when the owner refuses a job's start, and `CannotResumeJobError.NotAdmitted` when it refuses a resume. `IJobsManager.Resume` returns `false` for a refused job. (#81)
- **Screenplay** ([Release v4.207.0](https://github.com/Cratis/Screenplay/releases/tag/v4.207.0)): The protected command read diagnostics PLAY0781–PLAY0785 carry typed arguments, so tools can read why a read could not be protected instead of parsing message text. They identify the command and the read, and PLAY0781 adds the read model and a `reason` keyword (`reducer`, `join`, `no-removal`, `key-type`, …). Every refused read gets its own diagnostic, and messages are unchanged. See [diagnostics](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/diagnostics.md). (#851)
- **Scene** ([Release v4.68.0](https://github.com/Cratis/Scene/releases/tag/v4.68.0)): `applyShellSwitch(document, plan, templates?)` (`@cratis/scene.engine`) and `ShellSwitchApplier.Apply` (C#, `Cratis.Scene.Engine.Shell`) apply a `planShellSwitch` plan as a pure function over the document: the content of a moved outlet is appended to the target outlet in order, dropped content is removed, kept outlets are untouched. A screen template that fits a moved outlet fits the new outlet instead (a name qualified with the old shell's is requalified with the new shell's, and a dropped outlet leaves the template placed explicitly), so the screens built from it move with it. The result carries the review list of what changed (screen or template, outlet, action, target, element count, a sentence with real names). A plan with blockers is not applied.
- **Scene** ([Release v4.68.0](https://github.com/Cratis/Scene/releases/tag/v4.68.0)): `templatePlacement` / `ShellPlacement.PlacementOf` expose where a screen template's chain lands in the shell; `outletsUsedBy` now uses it.
- **Scene** ([Release v4.68.0](https://github.com/Cratis/Scene/releases/tag/v4.68.0)): `shell-switch-apply-fixtures.json`, asserted by both engines: keep, same shell, an outlet nobody uses, primary following to a differently named primary outlet, moving into an occupied primary outlet, mapping, several outlets into one, dropping, a template that fits the lost outlet (moved, mapped, dropped), qualified templates (moved, requalified), a nested template chain and a blocked plan.
- **Scene** ([Release v4.68.0](https://github.com/Cratis/Scene/releases/tag/v4.68.0)): Documentation in `blueprints/root-template.md` ("Applying the switch").
- **Arc** ([Release v22.112.0](https://github.com/Cratis/Arc/releases/tag/v22.112.0)): When a command's effective read protection is `On` (from the command, an inherited base, the assembly or the `CratisReadProtection` MSBuild property), the generator writes its keyed read-model reads, the `require` conditions over them and the event mappings from them as ESM v25 output under the `command reads protected` preamble. This covers nullable `[LookUpBy]` reads guarded by a leading null check, non-nullable reads, and guards in `Provide` and `Handle` (including `OneOf` and `Result` returns). See [Generating a Screenplay](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/generating-a-screenplay.md). (#3298)
- **Arc** ([Release v22.112.0](https://github.com/Cratis/Arc/releases/tag/v22.112.0)): A read Screenplay does not admit (for example a view without a removal, a stream-scoped read model, an ambiguous key or a nullable read without a null check) is left in code and reported with the new `SP0079` diagnostic and its reason, instead of being written as an unprotected read.
- **Stage** ([Release v4.138.0](https://github.com/Cratis/Stage/releases/tag/v4.138.0)): The Cratis renderer renders protected command reads. Each command with `reads` gets `[ReadProtection(On)]`, a nullable read-model `Handle` parameter per read looked up with `[LookUpBy]`, the reference "`<View> '<key>' does not exist.`" rejection, and all of its requirements evaluated in `Handle` after the reads. Read paths in `require` and produced-event mappings render, and generated specifications run protected commands in decision mode. (part of #440)
- **Stage** ([Release v4.138.0](https://github.com/Cratis/Stage/releases/tag/v4.138.0)): Command specifications whose command triggers exactly one invoke-only reaction are rendered as a command half and a reaction half instead of being refused; a rejected one is rendered only when the triggering command cannot reject on its own. (part of #440)
- **Stage** ([Release v4.138.0](https://github.com/Cratis/Stage/releases/tag/v4.138.0)): A new reference page, [Protected reads rendering](https://github.com/Cratis/Stage/blob/main/Documentation/reference/protected-reads-rendering.md), describes the rendered shape and where a rendered application differs from the reference. (part of #440)
- **AI** ([Release v7.69.0](https://github.com/Cratis/AI/releases/tag/v7.69.0)): The Screenplay skills teach Uuid `==` and `!=` in command `require` and `produces when` conditions (ESM v28), with an executable authorization example: concepts and identities over Uuid compare when both sides are the same concept, a bare Uuid compares with any Uuid concept, protected read paths are allowed in `require`, and literals must be canonical lowercase hyphenated Uuids. They also list what stays refused (ordering, different concepts, optional operands, Uuid validation and concept rules, read paths in `produces when`). The compiler is pinned to Screenplay 4.205.0. (#746)
- **Chronicle** ([Release v19.77.0](https://github.com/Cratis/Chronicle/releases/tag/v19.77.0)): Typed triggers: a record marked `[Trigger("id")]` is registered with its JSON payload schema, and `IEventStore.Occurrences.Record(trigger, idempotencyId)` records it once per idempotency id. See https://github.com/Cratis/Chronicle/blob/main/Documentation/occurrences/triggers-and-handlers.mdx. (part of #4911)
- **Chronicle** ([Release v19.77.0](https://github.com/Cratis/Chronicle/releases/tag/v19.77.0)): `IOccurrenceHandler<TTrigger>` handlers are discovered like reactors and run under fenced leases: the client claims due occurrences, renews the lease while the handler runs, completes or fails it, and backs off according to the kernel's retry settings. `OccurrenceContext` carries the occurrence id, attempt, epoch and the `EffectKey` to send to external systems. (part of #4911)
- **Chronicle** ([Release v19.77.0](https://github.com/Cratis/Chronicle/releases/tag/v19.77.0)): Effect receipts in the unit of work: `IUnitOfWork.UseEffectReceipt(key)` writes the receipt in the same storage transaction as the events, also when the unit appends no events but holds protected reads, and a repeated effect returns the stored outcome instead of appending again. Against a kernel without the `effect-receipts` capability the unit fails with `EffectReceiptsNotSupported` rather than appending without a receipt. See https://github.com/Cratis/Chronicle/blob/main/Documentation/occurrences/effect-receipts.mdx. (part of #4911)
- **Chronicle** ([Release v19.77.0](https://github.com/Cratis/Chronicle/releases/tag/v19.77.0)): Lifecycle hooks: the built-in `Startup` and `Shutdown` triggers fire once per logical activation (`ChronicleOptions.ActivationId`) or once per process (`ActivationScope.PerProcess`), for the application or for every namespace (`LifecycleScope.AllNamespaces`). `IOccurrences.EndActivation` records the shutdown of a logical activation. ASP.NET Core and generic hosts register the lifecycle service automatically. See https://github.com/Cratis/Chronicle/blob/main/Documentation/occurrences/lifecycle.mdx. (part of #4911)
- **Chronicle** ([Release v19.77.0](https://github.com/Cratis/Chronicle/releases/tag/v19.77.0)): The kernel records an all-namespaces lifecycle occurrence as a durable fan-out intent over a fixed namespace snapshot, so a crash part-way through completes after restart without duplicates. (part of #4911)
- **Chronicle** ([Release v19.77.0](https://github.com/Cratis/Chronicle/releases/tag/v19.77.0)): Testing: `EventStoreForTesting` and the scenarios gain `Occurrences`, `Capabilities` (current, old or unknown kernel), a deterministic `ScenarioTime`, a reply-dropping interceptor for commit-then-lose-the-reply cases, `OccurrenceContextBuilder` and `OccurrenceScenario<THandler>` for driving a handler step by step. See https://github.com/Cratis/Chronicle/blob/main/Documentation/occurrences/testing.mdx. (part of #4911)
- **Screenplay** ([Release v4.206.0](https://github.com/Cratis/Screenplay/releases/tag/v4.206.0)): `SemanticEvaluator.Decide` returns a `SemanticDecision` with its `Boundary`, its `Dependencies` (a `SemanticDecisionDependencies` of read keys and event contracts) and a `Commit` that can be called again against a later world; a read-only request is refused with a Contract rejection. See [decision 0089](https://github.com/Cratis/Screenplay/blob/main/decisions/0089-expose-the-reference-evaluators-decide-commit-split-to-hosts.md). (#833)
- **Screenplay** ([Release v4.206.0](https://github.com/Cratis/Screenplay/releases/tag/v4.206.0)): `SemanticEvaluator.ExtendWorld` extends an established world with facts that already hold in the log, giving the same world as establishing all facts at once. (#833)
- **Screenplay** ([Release v4.206.0](https://github.com/Cratis/Screenplay/releases/tag/v4.206.0)): `Cratis.Screenplay.CanonicalCorpus` publishes `ProtectedCommandReadRaceVectors`: 16 race cases with their model, run only through the public API, so a host can prove it matches the reference. (#833)
- **Screenplay** ([Release v4.206.0](https://github.com/Cratis/Screenplay/releases/tag/v4.206.0)): The host loop is documented: decide, extend, commit, settle reactions, then write the whole settled batch guarded on the world it was settled against, and when a retry is allowed. (#833)
- **Orleans** ([Release v1.20.0](https://github.com/Cratis/Orleans/releases/tag/v1.20.0)): `IJobs.StopAndDrain(key, jobId, timeout)` stops a job and waits until its steps are drained. It answers `Drained` once no step code runs for the job, each step's outcome and final checkpoint are persisted, and `OnStepCompletedOrStopped` and `OnStopped` have finished; otherwise `TimedOut` (call again to continue), `Completed`, `NotFound` or `UnknownJobType`. Pass `TimeSpan.Zero` to poll without blocking. This adds a member to `IJobs`, so a hand-written `IJobs` implementation must add it. See [Jobs](https://github.com/Cratis/Orleans/blob/main/Documentation/concepts/jobs.md). (part of #81)
- **Orleans** ([Release v1.20.0](https://github.com/Cratis/Orleans/releases/tag/v1.20.0)): `IJobDrain` lets a job grain be drained directly, and `IJobStepDrain` is the protocol the job uses to drain its steps. (part of #81)
- **AI** ([Release v7.68.0](https://github.com/Cratis/AI/releases/tag/v7.68.0)): The Screenplay skills explain warning `PLAY0690`: a reducer instance is always keyed by the event-source id of the events it reduces, so a reducer-backed view looked up `by` another identity type, or fed by producers with different identity types, is reported. They show the fix (a projection keyed on each `from`, or a join) and what the check does not compare. (#702)
- **AI** ([Release v7.68.0](https://github.com/Cratis/AI/releases/tag/v7.68.0)): The toolchain and modeling-lifecycle skills teach the `screenplay.json` validation gate at the model root: the standalone `screenplay` tool and `cratis screenplay validate` read checks, warnings as errors, scope and open-questions mode from it, `--print-gate` shows the effective gate, and a refused gate file counts as "could not run". (#691)
- **Screenplay** ([Release v4.205.0](https://github.com/Cratis/Screenplay/releases/tag/v4.205.0)): Command `require` and `produces when` conditions accept `==` and `!=` between Uuid values, including concepts and identities over Uuid, protected read paths in `require`, and canonical Uuid literals, as ESM v28. When both sides are concepts or identities they must be the same concept. Non-canonical literals are refused with PLAY0273; ordering, Uuid validation rules and Uuid concept rules stay refused. See [decision 0090](https://github.com/Cratis/Screenplay/blob/main/decisions/0090-admit-uuid-equality-in-command-conditions.md). (#844)
- **Arc** ([Release v22.111.0](https://github.com/Cratis/Arc/releases/tag/v22.111.0)): The Screenplay generator reads chronological comparisons of `DateOnly`, `DateTime` and `DateTimeOffset` properties in command guards (`require` / `produces when`) and literal comparisons in command validation rules as ESM v26 date ordering. Literals are written in Screenplay's canonical form: `yyyy-MM-dd` for dates, UTC with seven fractional digits and `Z` for date-times. Comparisons Screenplay does not admit (offset-less date-time literals, mixing dates with date-times, clock values such as `DateTime.Now`, date rules on concepts, date ordering in reactions, property-to-property validation rules) are reported with the property named instead of being emitted. When `MaximumExecutableModelVersion` is below v26, date comparisons are withheld and reported. See [Generating a Screenplay](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/generating-a-screenplay.md). (part of #3339)
- **Chronicle** ([Release v19.76.0](https://github.com/Cratis/Chronicle/releases/tag/v19.76.0)): A concurrency violation now names the event that caused it: `ConcurrencyViolation` and the `DecisionConflict` values returned by `GetDecisionConflicts` carry `ConflictingEventTypeId` and `ConflictingEventSequenceNumber` for the first event that matched the guard after the position it expected. Both are null when connected to a kernel that does not report them (#4926)
- **Chronicle** ([Release v19.76.0](https://github.com/Cratis/Chronicle/releases/tag/v19.76.0)): `IUnitOfWork.SuspendReadRegions()` lets a host that runs nested invocations under read protection suspend the read regions the nested invocation inherited, and restore them when the returned scope is disposed (#4953)
- **Arc** ([Release v22.110.0](https://github.com/Cratis/Arc/releases/tag/v22.110.0)): `[property: ExplicitOffset]` on a `DateTimeOffset` or `DateTime` command property (nullable too) refuses date-time input that has no offset or `Z`, with the validation message `DateTime command property '<member>' requires an explicit offset or Z.` A `DateTimeOffset` keeps its offset and a `DateTime` is converted to UTC. The accepted spellings match Screenplay's date comparison contract (ESM v26). See [Command input binding](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/commands/input-binding.md). (part of #3339)
- **Arc** ([Release v22.110.0](https://github.com/Cratis/Arc/releases/tag/v22.110.0)): `IResourceFreeRequirement` marks an ASP.NET authorization requirement that never reads the command, so its policy also runs when the body cannot be bound. Built-in role, claim, name and authenticated-user requirements count as resource-free already. (#3341)
- **Chronicle** ([Release v19.75.0](https://github.com/Cratis/Chronicle/releases/tag/v19.75.0)): `DecisionReadRefusalReason.DefinitionMissing` separates "the kernel has no definition for this read model or its projection" from `DefinitionMismatch`, and the refusal message now names what differs.
- **AI** ([Release v7.67.0](https://github.com/Cratis/AI/releases/tag/v7.67.0)): The Screenplay skills teach composite read-model keys: a read model with two or more `key` properties, projection root `from` and `remove with` blocks with a `key` block naming every part, list queries narrowed by equality filters, an optional single-instance query with a `by` block naming every part, and specifications that state every part. They also cover the constructs that stay refused on such a read model (joins, children, `every`, `all`, `nested`, `variant`, reducers, protected command reads by parts) and how to choose between a composite key and a composite-typed single key. The compiler is pinned to Screenplay 4.204.0. (#743)
- **AI** ([Release v7.67.0](https://github.com/Cratis/AI/releases/tag/v7.67.0)): Hosts that execute Screenplay commands themselves are pointed to Screenplay's public `SemanticDateComparisons` API for chronological Date and DateTime checks.
- **cli** ([Release v3.73.0](https://github.com/Cratis/cli/releases/tag/v3.73.0)): `cratis render` renders a new application's reducers as self-reducing read models: the read-model record holds its static `Reduce` methods, with no separate `IReducerFor<T>` class. A destination without a render ownership manifest is a new application; the choice is saved in the managed `.cratis/stage/rendering.json` and kept on every later render, including `--scope`, `--workspace` and `--check`. Existing applications keep separate reducer classes and unchanged output. An edited, missing or unreadable reducer configuration is refused (`CLI-RENDER-021`, `CLI-RENDER-022`, `CLI-RENDER-023`) and nothing is written; changing the convention of an existing application is not supported. See [Reducer rendering convention](https://github.com/Cratis/cli/blob/main/Documentation/reference/screenplay.md#reducer-rendering-convention). (#376)
- **Components** ([Release v4.29.0](https://github.com/Cratis/Components/releases/tag/v4.29.0)): `Property.schemaKeywords` and `Property.itemSchemaKeywords` carry the standard JSON Schema keywords the schema editor does not model, for the property and for its array `items`. Hosts that own the properties in the tree layout carry them through like `vendorKeywords`. (#426)
- **Orleans** ([Release v1.19.0](https://github.com/Cratis/Orleans/releases/tag/v1.19.0)): `JobStep.TryInvokeOnActivation` lets step work run a callback on its own activation, also while the activation is deactivating. Use it instead of calling the step's own grain reference, for example to save a checkpoint. It returns `ActivationCallbackRejected` (`NoRun`, `StaleRun`, `Closed`, `Cancelled`) when the run is gone or the step is stopping. See [Jobs](https://github.com/Cratis/Orleans/blob/main/Documentation/concepts/jobs.md).
- **Orleans** ([Release v1.19.0](https://github.com/Cratis/Orleans/releases/tag/v1.19.0)): `JobsOptions.StepStopTimeout` (default 10 seconds) bounds how long stopping a step waits for its work, and `JobStepError.StopTimedOut` reports that the work had not settled in time. The step still reports its stop exactly once when the work settles.
- **Stage** ([Release v4.135.0](https://github.com/Cratis/Stage/releases/tag/v4.135.0)): Stage now accepts Screenplay models compiled to executable model version 26. The specification runner and the host compare `Date` values as calendar dates and `DateTime` values as instants at tick precision in `require`, `produces when` and validation rules, so `require to >= from` works across time zones, matching Screenplay. (part of #473)
- **Stage** ([Release v4.135.0](https://github.com/Cratis/Stage/releases/tag/v4.135.0)): The specification runner and the host reject a `DateTime` command value without an offset or `Z` when it takes part in such a comparison, after authorization and before any rule runs. (part of #473)
- **Screenplay** ([Release v4.204.0](https://github.com/Cratis/Screenplay/releases/tag/v4.204.0)): Read models with two or more `key` properties bind and execute: projections key root `from` blocks with a `key` block naming every part, list queries narrow them with equality filters, and an optional single-instance query looks one up with a `by` block naming every part. Models that use them select ESM v27; every other model keeps its version and bytes. See [decision 0088](https://github.com/Cratis/Screenplay/blob/main/decisions/0088-admit-composite-read-model-keys-into-the-executable-model.md). (#599)
- **Screenplay** ([Release v4.204.0](https://github.com/Cratis/Screenplay/releases/tag/v4.204.0)): `remove with` accepts a `key` block with one `part = expr` line per key part, so a composite-keyed instance can be removed and later recreated. (#599)
- **Screenplay** ([Release v4.204.0](https://github.com/Cratis/Screenplay/releases/tag/v4.204.0)): Specifications state every key part in `given readmodel`, `then readmodel` and `then no readmodel`, and query arguments supply every `by` part; a missing part is reported as PLAY0661 and an unknown or ill-typed part as PLAY0662. (#599)
- **cli** ([Release v3.71.0](https://github.com/Cratis/cli/releases/tag/v3.71.0)): `CLI-RENDER-020`: a `template blueprint <Package> <Template>` reference to a template the approved blueprint's manifest does not list - no such template, a version outside the pin, or a blueprint that is not approved - stops `cratis render`, and `cratis run` before Docker starts, naming the blueprint and the template. The resolution is Scene's own template resolver, run by Stage's render planner over the approved package set.
- **cli** ([Release v3.71.0](https://github.com/Cratis/cli/releases/tag/v3.71.0)): A specification that checks a screen naming a template the blueprint does not ship while another one it does ship is accepted.
- **Screenplay** ([Release v4.203.0](https://github.com/Cratis/Screenplay/releases/tag/v4.203.0)): Hosts that execute commands themselves can now apply the reference evaluator's exact Date and DateTime comparison semantics through public .NET APIs instead of copying them. `SemanticDateComparisons` provides `Participants`, `TryParseInstant`, `Compare`, `Check` and `CheckInputs`, and `SemanticConditionEvaluator.Evaluate` evaluates `require` and `produces when` conditions, including protected read operands. See [Check command date comparisons](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/date-comparison-checks.md). (#842)
- **Stage** ([Release v4.132.0](https://github.com/Cratis/Stage/releases/tag/v4.132.0)): A specification that only projects facts - events given as history, optionally one more appended with `when append`, then `then readmodel` - renders as a generated read-model scenario (`STAGE-ESM-011` no longer refuses the 37 `Listing...` specifications of the samples). An append an event reaction or constraint governs is still refused, and so is an instance no given event reaches, because the generated scenario could not prove it.
- **Stage** ([Release v4.132.0](https://github.com/Cratis/Stage/releases/tag/v4.132.0)): A root projection block keyed by a constant (`key "global"`) renders as `UsingConstantKey`, with its `summaryId = "global"` mapping, so a one-row summary projection (`SalesFigures`, `SupportFigures`, `InventoryFigures`) renders.
- **Stage** ([Release v4.132.0](https://github.com/Cratis/Stage/releases/tag/v4.132.0)): `RenderFindingKind.TemplateReferenceUnresolved`: a `template blueprint <Package> <Template>` reference the approved blueprint's manifest does not list is reported with the blueprint and template named, through Scene's own resolver (Cratis/Scene#182). It is no longer possible to render a screen that silently has no template.
- **Stage** ([Release v4.132.0](https://github.com/Cratis/Stage/releases/tag/v4.132.0)): `when_planning_the_domain_blueprint_samples` plans each sample (kept in `Verification/live-blueprints/models`, the Screenplay samples) as authored; `when_executing_projected_fact_specifications` builds and runs the generated application of a model using all of the above, and `when_refusing_unprovable_projected_facts` pins what stays refused.
- **AI** ([Release v7.66.0](https://github.com/Cratis/AI/releases/tag/v7.66.0)): The Screenplay skills teach the `ui profile` shell: `root template` (an own layout or application-scope screen template, or `blueprint <B> <Name>` with a `version` pin), shell `option` lines, `appearance` (`color scheme`, `accent`) and `new screens use template`. `cratis-screenplay-ui-composition` carries compiled worked examples, the PLAY0788 to PLAY0799 error and fix table and a legacy `layout` negative example (PLAY0791, with its quick fix). The toolchain diagnostics and diagnostic-arguments references list the new codes, and `cratis-screenplay-model-authoring` teaches the new `ui-profiles` MCP read tool (44 tools) and the typed nodes that edit the shell. (#733)
- **Components** ([Release v4.28.0](https://github.com/Cratis/Components/releases/tag/v4.28.0)): `SchemaEditor` tree layout: a "Generated" toggle that marks a property with `x-generated: true`. Hosts offer it with `allowGeneratedProperty` (a flag or a per-property predicate), or with `onSetGeneratedProperty` in controlled mode. Its labels can be overridden through `labels`, and it is styled through the `generated` part. (#425)
- **Components** ([Release v4.28.0](https://github.com/Cratis/Components/releases/tag/v4.28.0)): A generated property shows a read-only marker when the toggle is not offered, for example in `readOnly` mode. Schemas that already contain `x-generated: true` show this marker without any host change. (#425)
- **Components** ([Release v4.28.0](https://github.com/Cratis/Components/releases/tag/v4.28.0)): `Property.isGenerated`, `Property.vendorKeywords`, `Property.itemVendorKeywords` and the `GENERATED_KEYWORD` constant. (#425)
- **Chronicle** ([Release v19.74.0](https://github.com/Cratis/Chronicle/releases/tag/v19.74.0)): `storage.connectionResolution` resolves the connection for every event store, namespace and read model database, on MongoDB and SQL alike, using Arc's connection resolution contract: `Template` and `Http` resolvers from configuration, or `Custom` when hosting the kernel in-process. A resolved connection string or database is used as given, without deriving a name or recording a `DatabaseNames` binding. The cluster database stays `connectionDetails`. (#4948)
- **Chronicle** ([Release v19.74.0](https://github.com/Cratis/Chronicle/releases/tag/v19.74.0)): The `Http` resolver calls a language-neutral REST endpoint, the same for every storage type and specified at https://github.com/Cratis/Arc/blob/main/Documentation/connection-resolution-contract.md. Chronicle sends `kind`, `eventStore` and `namespace` as its scope. (part of #4948)
- **Chronicle** ([Release v19.74.0](https://github.com/Cratis/Chronicle/releases/tag/v19.74.0)): Schema changes connect for the `Schema` purpose and data access for `Runtime`, so migrations can run as a different database user than the one reading and writing data. This covers creating databases and schemas, migrations, table migrations and the replay table swap. (#4949)
- **Chronicle** ([Release v19.74.0](https://github.com/Cratis/Chronicle/releases/tag/v19.74.0)): `storage.createIfMissing`: set it to `false` and a missing database or schema fails with `DatabaseDoesNotExist` or `SchemaDoesNotExist` instead of being created. (#4947)
- **Chronicle** ([Release v19.74.0](https://github.com/Cratis/Chronicle/releases/tag/v19.74.0)): `storage.schema` keeps Chronicle's SQL tables in a schema of your choice. On PostgreSQL it is put first on the search path. On SQL Server the database user's default schema must match, or migration fails with `DefaultSchemaMismatch`. (#4946)
- **Chronicle** ([Release v19.74.0](https://github.com/Cratis/Chronicle/releases/tag/v19.74.0)): MongoDB storage resolves the server, database name and identity of the event store, namespace and read model databases. Access tokens are used as MONGODB-OIDC credentials. (#4950)
- **Chronicle** ([Release v19.74.0](https://github.com/Cratis/Chronicle/releases/tag/v19.74.0)): Documentation for storage connection resolution, including a database-per-tenant setup with Entra managed identities: https://github.com/Cratis/Chronicle/blob/main/Documentation/hosting/configuration/storage-connection-resolution.md (#4951) (#4945)
- **Screenplay** ([Release v4.202.0](https://github.com/Cratis/Screenplay/releases/tag/v4.202.0)): `BrowserHarness/render-blueprint-samples.sh` renders all eight domain blueprint samples with the installed `cratis` and the approved package set of each blueprint's published npm package (`render-blueprint-samples.cjs` writes the set from the manifest the package publishes), and fails when one does not render.
- **Screenplay** ([Release v4.202.0](https://github.com/Cratis/Screenplay/releases/tag/v4.202.0)): `.cratis/ai/rules/project/samples.md` documents it.
- **AI** ([Release v7.64.0](https://github.com/Cratis/AI/releases/tag/v7.64.0)): The Screenplay skills teach chronological `Date` and `DateTime` comparisons (ESM v26): `==`, `!=`, `>`, `>=`, `<` and `<=` between same-primitive values in `require`, `produces when` and command or property validation rules. They cover `DateTime` compared as a UTC instant, the Validation rejection for a `DateTime` input without an offset, PLAY0273 for offset-less or unparsable literals, and the forms that stay PLAY0268 (`today`, `$context` operands, mixed `Date`/`DateTime`, concept rules and reaction `where`). Stage guidance says Stage refuses ESM v26 with STAGE-ESM-016. (#735)
- **Scene** ([Release v4.66.0](https://github.com/Cratis/Scene/releases/tag/v4.66.0)): Four cases in the shared `template-applicability-fixtures.json` (a manifest-only blueprint resolves a screen template, a dialog template and a layout it lists, and diagnoses one it does not), asserted by both engines.
- **Stage** ([Release v4.129.0](https://github.com/Cratis/Stage/releases/tag/v4.129.0)): The specification runner and the host now run protected command reads (`command reads protected`, Screenplay 4.193.0): a command whose required read does not exist is rejected with "<view> '<key>' does not exist." before anything else runs, and `require` conditions and produced-event values can use the read's properties, matching Screenplay's own evaluation. Rendering protected reads is still refused with STAGE-ESM-044. (part of #440)
- **Scene** ([Release v4.65.0](https://github.com/Cratis/Scene/releases/tag/v4.65.0)): `CrmActivityCreateForm` and `CrmActivityEditForm` screen templates (the foundation `FormScreen` for an activity, create with Save and new, edit showing the record), with their thumbnails and the `crm.activities.new` / `crm.activities.edit` ready-to-use screens. The blueprint now has twenty screen templates and five dialog templates.
- **Scene** ([Release v4.65.0](https://github.com/Cratis/Scene/releases/tag/v4.65.0)): `ActivitySections` and `ActivityRecord` shapes in both sample-data packs (`crm-nordic-smb`, `crm-enterprise-en`), so each new form is answered by the data of either pack.
- **AI** ([Release v7.63.0](https://github.com/Cratis/AI/releases/tag/v7.63.0)): Atomic reaction batches (`reaction batches atomic`, ESM v22): when to declare them, what one batch covers, the rollback and budget rules, and that new models start with them. (#717)
- **AI** ([Release v7.63.0](https://github.com/Cratis/AI/releases/tag/v7.63.0)): Described command handlers (ESM v23): the payload-only result contract, PLAY0695–PLAY0698, and how specifications and Stage treat a pending handler. (#722)
- **AI** ([Release v7.63.0](https://github.com/Cratis/AI/releases/tag/v7.63.0)): First-class text rules `contains`, `starts with` and `ends with` on properties (ESM v24), the PLAY0787 repair for legacy text-rule patterns, and the `PortableMatchPattern.Check` / `checkPortableMatchPattern` APIs. (#724)
- **AI** ([Release v7.63.0](https://github.com/Cratis/AI/releases/tag/v7.63.0)): Protected command reads (`command reads protected`, ESM v25): which reads qualify, `read.property` paths in `require` and produced events, absence and concurrent-change rejection, and PLAY0780–PLAY0786. (#720)
- **AI** ([Release v7.63.0](https://github.com/Cratis/AI/releases/tag/v7.63.0)): Reading the typed `arguments` of compiler diagnostics instead of parsing message text, with the codes that carry them and how to tolerate older responses. (#728)
- **AI** ([Release v7.63.0](https://github.com/Cratis/AI/releases/tag/v7.63.0)): Mapping `$eventSourceId` or `$eventContext.eventSourceId` into an invoked command from a reaction. (#734)
- **AI** ([Release v7.63.0](https://github.com/Cratis/AI/releases/tag/v7.63.0)): Captures over public events in specifications (PLAY0700, PLAY0701) and the PLAY0694 warning for a directionless Translate slice that reacts to its own capture. (#712)
- **AI** ([Release v7.63.0](https://github.com/Cratis/AI/releases/tag/v7.63.0)): Added-only first observations in record captures. (#716)
- **AI** ([Release v7.63.0](https://github.com/Cratis/AI/releases/tag/v7.63.0)): MCP generation details: `generation.arguments`, exact support counts and entropy, `derivedPattern`, and per-rule proof status with witnesses and repairs. (#698)
- **AI** ([Release v7.63.0](https://github.com/Cratis/AI/releases/tag/v7.63.0)): Generated values: `generate pattern` with optional checksums, `generate random` ranges and `generate rule`, rule proofs (PLAY0688, PLAY0689), `validate checksum`, the target-neutral generation context, and the `GenerationStrategyCatalog`, `SemanticConceptCheck.Check` and `SemanticValidationRules.Check` APIs for tool authors. Fundamentals 7.25.0 `GenerateValue.Pattern`, `Integer` and `HasValidChecksum` in the concept skill. (part of #576)
- **Stage** ([Release v4.128.0](https://github.com/Cratis/Stage/releases/tag/v4.128.0)): A new application can choose to have its reducers rendered as self-reducing read models, the default that Chronicle's documentation recommends. In that form, the read model record holds its queries and its static `Reduce` methods together, with no separate `IReducerFor<T>` class.
- **Stage** ([Release v4.128.0](https://github.com/Cratis/Stage/releases/tag/v4.128.0)): **Opting in:** `CreateNewApplicationProfile` selects the self-reducing form and persists the choice with the application. On later renders, `ReducerConventionInput.Read` loads it back and `WithReducerConvention` passes it to Stage.
- **Stage** ([Release v4.128.0](https://github.com/Cratis/Stage/releases/tag/v4.128.0)): **Existing applications:** anything that doesn't select the self-reducing form keeps today's separate reducer classes with unchanged output. Moving an existing application to self-reducing read models is not available yet.
- **Cast** ([Release v0.2.0](https://github.com/Cratis/Cast/releases/tag/v0.2.0)): Directory member pages render the full profile of Core and Partner members from their `/cast.json`, and a profile from public GitHub data for everyone else, each with the terminal, command palette, themes and a printable `/<login>/cv/` (#10)
- **Cast** ([Release v0.2.0](https://github.com/Cratis/Cast/releases/tag/v0.2.0)): `/cast.json` version 2 carries the complete, render-ready profile, with a published JSON Schema (`cast-json.schema.json`) and a format guide so sites not built with Cast can produce it (#10)
- **Cast** ([Release v0.2.0](https://github.com/Cratis/Cast/releases/tag/v0.2.0)): An optional `profile` field in the registry points the directory at a member's `cast.json` when it does not live at `<site>/cast.json` (#10)
- **Scene** ([Release v4.64.0](https://github.com/Cratis/Scene/releases/tag/v4.64.0)): `planShellSwitch` (TypeScript) / `ShellSwitchPlanner.Plan` (C#): the pre-flight of switching the application's shell. Default mapping by outlet name, the current primary outlet and `content` following to the new shell's primary outlet; every outlet of the current shell (and any a screen uses that it lacks) gets a `move` (`keep`, `primary`, `unused`, `unresolved`, and the user's `moveToPrimary` / `mapTo` / `drop` passed back as remaps). An outlet that needs a decision is a blocker with `profileSlotUnplaced` and a message naming the screens and outlets; the candidate's own problems (`rootTemplateUnknown`, `rootTemplateVersionNotSatisfied`, `rootTemplateNotApplicable`, `rootTemplateMissingContentSlot`, `rootTemplateCycle`) block too; the blueprint to add and warnings are listed.
- **Scene** ([Release v4.64.0](https://github.com/Cratis/Scene/releases/tag/v4.64.0)): `findProfileBlockers` (TypeScript) / `ProfileBlockers.Find` (C#): the rules Studio kept in `findProfileBlockers` (missing packages, version conflicts, dependency cycles, unusable shell, incompatible theme, unavailable default screen template, layouts, screen templates, dialog templates and slots the screens still use), moved into the engine with messages that name what they are about. Studio keeps only the presentation (REN2).
- **Scene** ([Release v4.64.0](https://github.com/Cratis/Scene/releases/tag/v4.64.0)): `describeUiProfile` / `UiProfileNodeKind`: component descriptors, in the existing format, for the nodes of a UI profile (Application, Shell with `root.options.*`, Theme with colour scheme and accent, Packages, Sample data), with the choices the application supplies; a theme the packages do not support stays on offer with the reason.
- **Scene** ([Release v4.64.0](https://github.com/Cratis/Scene/releases/tag/v4.64.0)): `placeableScreenTemplates` / `ShellPlacement` (shared by the resolver and the planner), Engine-owned codes `ShellOutletAction` and `ProfileBlockerCode`.
- **Scene** ([Release v4.64.0](https://github.com/Cratis/Scene/releases/tag/v4.64.0)): Shared corpora `shell-switch-fixtures.json` (27 cases) and `profile-blockers-fixtures.json` (20 cases), each asserted byte-for-byte by C# (`for_ShellSwitchPlanner`, `for_ProfileBlockers`) and TypeScript (`for_planShellSwitch`, `for_findProfileBlockers`), including a regression vector that no message carries an id or an unsubstituted placeholder (the `{subject}` defect).
- **Scene** ([Release v4.64.0](https://github.com/Cratis/Scene/releases/tag/v4.64.0)): Tests: `for_describeUiProfile` (18).
- **Scene** ([Release v4.64.0](https://github.com/Cratis/Scene/releases/tag/v4.64.0)): Docs: "Switching the shell", "What stops a profile from being applied" and "Describing the profile for a designer" in `blueprints/root-template.md`.
- **Screenplay** ([Release v4.199.0](https://github.com/Cratis/Screenplay/releases/tag/v4.199.0)): Chronological ordering of `Date` and `DateTime` with `==`, `!=`, `>`, `>=`, `<` and `<=` in `require` and `produces when` conditions (a command property against a command property or a literal) and in command and property validation rules (against a literal). Both sides must have the same primitive. `DateTime` values are compared as UTC instants at tick precision, so one instant written with different offsets is equal. Models that use it select ESM v26; every other model keeps its version and bytes. See [decision 0087](https://github.com/Cratis/Screenplay/blob/main/decisions/0087-admit-chronological-date-and-datetime-ordering-in-command-conditions.md). (#803)
- **Screenplay** ([Release v4.199.0](https://github.com/Cratis/Screenplay/releases/tag/v4.199.0)): A `DateTime` command input that takes part in a date comparison must carry an offset or `Z`; without one the command is rejected with a Validation outcome before any rule runs. (#803)
- **Screenplay** ([Release v4.199.0](https://github.com/Cratis/Screenplay/releases/tag/v4.199.0)): A `DateTime` literal without an offset, or a date literal that does not parse, is reported as PLAY0273. Date ordering with `$context` operands, `today`, protected read paths, mixed `Date` and `DateTime`, on concept rules or in reaction `where` stays refused with PLAY0268. (#803)
- **Arc** ([Release v22.109.0](https://github.com/Cratis/Arc/releases/tag/v22.109.0)): `Cratis.Arc.Connections`: a connection resolution contract (`IConnectionResolver`, `ConnectionRequest`, `ResolvedConnection`, `ConnectionIdentity`, `ConnectionPurpose`). Every part of a resolved connection is optional, so a resolver can answer for the connection string, the database, the schema, the identity, or any combination. (#3314)
- **Arc** ([Release v22.109.0](https://github.com/Cratis/Arc/releases/tag/v22.109.0)): Built-in `Default`, `Template`, `Http` and `Custom` resolvers, with a `Connection` slot and an `Identity` slot that use the same shape and are applied in order. Resolutions are cached in memory per request, honor `expiresAt`, and are dropped when a login fails. (#3314)
- **Arc** ([Release v22.109.0](https://github.com/Cratis/Arc/releases/tag/v22.109.0)): `ArcOptions.ConnectionResolution`, configurable in code or under `Cratis:Arc:ConnectionResolution`, resolves connections for MongoDB and Entity Framework Core alike. An integration's own `ConnectionResolution` replaces it for that integration. (#3314)
- **Arc** ([Release v22.109.0](https://github.com/Cratis/Arc/releases/tag/v22.109.0)): `ConnectionPurposeScope.Begin(ConnectionPurpose.Schema)` so migrations can connect with a different identity than data access. (#3314)
- **Arc** ([Release v22.109.0](https://github.com/Cratis/Arc/releases/tag/v22.109.0)): `MongoDBOptions.ConnectionResolution`, configurable in code or under `Cratis:MongoDB:ConnectionResolution`. A resolved user name and password becomes a SCRAM credential, and a resolved access token becomes a MONGODB-OIDC credential that refreshes through the resolver. (#3315)
- **Arc** ([Release v22.109.0](https://github.com/Cratis/Arc/releases/tag/v22.109.0)): `EntityFrameworkCoreOptions.ConnectionResolution`. Arc-registered contexts resolve the connection for the current tenant and purpose every time it opens, so pooled contexts stay correct across tenants. Access tokens become `SqlConnection.AccessToken` on SQL Server and the password on PostgreSQL. (#3316)
- **Arc** ([Release v22.109.0](https://github.com/Cratis/Arc/releases/tag/v22.109.0)): A language-neutral REST specification, with an OpenAPI description, of the endpoint the `Http` resolver calls: https://github.com/Cratis/Arc/blob/main/Documentation/connection-resolution-contract.md (part of #3317)
- **Arc** ([Release v22.109.0](https://github.com/Cratis/Arc/releases/tag/v22.109.0)): Documentation for connection resolution, with how-to pages for MongoDB and Entity Framework Core: https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/tenancy/connection-resolution.md (#3317) (#3313)
- **Arc** ([Release v22.108.0](https://github.com/Cratis/Arc/releases/tag/v22.108.0)): A documentation snippet of a protected command for the Cratis documentation site (#3324)
- **Stage** ([Release v4.127.0](https://github.com/Cratis/Stage/releases/tag/v4.127.0)): Stage now accepts Screenplay models compiled to executable model version 25 (Screenplay 4.193.0) wherever an equivalent earlier model was accepted. (part of #440)
- **cli** ([Release v3.69.0](https://github.com/Cratis/cli/releases/tag/v3.69.0)): A spec checks a `ui profile` naming `Cratis.Blueprint.Crm`: refused with `CLI-RENDER-007` until approved, accepted once approved with the manifest the package publishes (with its `blueprint` and `sampleData` members).
- **Scene** ([Release v4.63.0](https://github.com/Cratis/Scene/releases/tag/v4.63.0)): `migrateLegacyProfile(legacy, library)` (TypeScript, `@cratis/scene.engine`) and `ProfileMigrator.Migrate(legacy, library)` (C#, `Cratis.Scene.Engine.Profiles`): one pure function that turns a legacy profile - the blueprint (`shell`) and `layout` name plus the Studio-only `navigationMode`, `colorScheme`, `accent` and `defaultScreenTemplate` - into the new shape: `root` (blueprint reference pinned to `^major.minor`, or own reference), `root.options.navigationMode`, `appearance`, `defaults.newScreenTemplate`.
- **Scene** ([Release v4.63.0](https://github.com/Cratis/Scene/releases/tag/v4.63.0)): Idempotent: a migrated profile comes back unchanged (`changed: false`) with or without the legacy fields; a value already in the new shape wins. Once a root exists the legacy `layout` is dropped (readers accept both shapes, writers emit the new one).
- **Scene** ([Release v4.63.0](https://github.com/Cratis/Scene/releases/tag/v4.63.0)): Six engine-owned diagnostics for what cannot be mapped, with real names: `legacyLayoutUnknown`, `legacyShellNotInstalled`, `legacyShellHasNoLayout`, `legacyColorSchemeUnknown`, `legacyNavigationModeWithoutRoot`, `legacyDefaultScreenTemplateUnknown`.
- **Scene** ([Release v4.63.0](https://github.com/Cratis/Scene/releases/tag/v4.63.0)): Shared corpus `profile-migration-fixtures.json` (29 permutations incl. idempotence) asserted by `for_ProfileMigrator` (C#) and `for_migrateLegacyProfile` (TS) with identical profiles (canonical JSON) and identical diagnostics.
- **Scene** ([Release v4.63.0](https://github.com/Cratis/Scene/releases/tag/v4.63.0)): Docs: "Migrating a legacy profile" and the compatibility rules in `blueprints/root-template.md`.
- **Cast** ([Release v0.1.0](https://github.com/Cratis/Cast/releases/tag/v0.1.0)): `@cratis/cast`, an Astro integration that turns one `cast.yaml` into a complete profile site with a career replay, live public GitHub data, writing, talks, projects, a printable `/cv`, a terminal, a command palette and light and dark themes (#1)
- **Cast** ([Release v0.1.0](https://github.com/Cratis/Cast/releases/tag/v0.1.0)): `@cratis/create-cast`, run with `npm create @cratis/cast`, scaffolds a site prefilled from your public GitHub profile, with an hourly GitHub Pages deploy workflow (#1)
- **Cast** ([Release v0.1.0](https://github.com/Cratis/Cast/releases/tag/v0.1.0)): Cast badges: Core and Partner come only from the reviewed registry in this repository, Contributor is earned from merged public pull requests in the Cratis organization, and every badge links to its verification page in the directory (#1)
- **Cast** ([Release v0.1.0](https://github.com/Cratis/Cast/releases/tag/v0.1.0)): Every Cast site publishes `/cast.json`, a JSON Resume `/resume.json` and `/llms.txt`, so people, directories and AI agents read the same profile (#1)
- **Cast** ([Release v0.1.0](https://github.com/Cratis/Cast/releases/tag/v0.1.0)): The Cast directory for https://cast.cratis.io, with Core, Partner and Contributor sections, a verification page and embeddable badge for every member, and a guide to joining (#1)
- **Scene** ([Release v4.62.0](https://github.com/Cratis/Scene/releases/tag/v4.62.0)): `for_effectiveShell/when_composing_with_a_root_template` (blueprint shell, per-screen layout ignored, FullPage opt-out, unknown root falls back with a diagnostic, root screen template with its own primary outlet, legacy profile).
- **Scene** ([Release v4.61.0](https://github.com/Cratis/Scene/releases/tag/v4.61.0)): `TemplateRole.Root` and `TemplateMetadata.role` / `.primaryOutlet` (C# + TS + shape contract). A screen template with the root role is an application shell like a layout: offered only at the `Application` scope, never fits a slot, never a dialog template. `ApplicableTemplates(Application)` returns layouts and root screen templates; the template-applicability corpus has 6 new vectors and a root screen template in the library.
- **Scene** ([Release v4.61.0](https://github.com/Cratis/Scene/releases/tag/v4.61.0)): `resolveEffectiveShell` (TS, `@cratis/scene.engine`) and `ShellResolver.Resolve` (C#, `Cratis.Scene.Engine.Shell`) returning `EffectiveShell` (reference, template, kind, source, package + version, pin evaluation, outlets, primary outlet, options, diagnostics). Order: `profile.root` -> legacy `profile.layout` -> first installed blueprint default -> built-in Bare (single `content` outlet).
- **Scene** ([Release v4.61.0](https://github.com/Cratis/Scene/releases/tag/v4.61.0)): Diagnostics `rootTemplateUnknown`, `rootTemplateVersionNotSatisfied`, `rootTemplateNotApplicable`, `rootTemplateMissingContentSlot`, `rootTemplateCycle`, `rootTemplateBlueprintNotInstalled`, `profileThemeIncompatible`, `profilePackageMissing`, `profileSlotUnplaced`, each with a fixture vector and a message with real names.
- **Scene** ([Release v4.61.0](https://github.com/Cratis/Scene/releases/tag/v4.61.0)): Shared corpus `effective-shell-fixtures.json` (own, blueprint, pinned, drifted, unknown, legacy, none; 31 cases) asserted byte-for-byte by C# (`for_ShellResolver`) and TS (`for_resolveEffectiveShell`).
- **Scene** ([Release v4.61.0](https://github.com/Cratis/Scene/releases/tag/v4.61.0)): `blueprintCatalog.json` entries describe a shell's `outlets`, `primaryOutlet` and `role`.
- **Scene** ([Release v4.61.0](https://github.com/Cratis/Scene/releases/tag/v4.61.0)): Docs: `blueprints/root-template.md` (resolution order, root role, diagnostics table, catalog).
- **Chronicle** ([Release v19.73.0](https://github.com/Cratis/Chronicle/releases/tag/v19.73.0)): `IEventStore.RemoveNamespace` in the .NET client and a `RemoveNamespace` gRPC command remove a namespace: its observers are unsubscribed and removed (which unregisters the reminders that used to bring the namespace back at the next start), the MongoDB event store namespace database is dropped, the namespace is forgotten and a `NamespaceRemoved` event is appended to the system event sequence. The default namespace cannot be removed, removing an unknown namespace does nothing and an interrupted removal can be repeated (#4942).
- **Chronicle** ([Release v19.73.0](https://github.com/Cratis/Chronicle/releases/tag/v19.73.0)): `IEventStoreStorage.DropNamespace` lets a storage provider drop the data of a removed namespace; the SQL and in-memory providers keep their data for now.
- **AuthProxy** ([Release v2.31.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.31.0)): `Session:CookieDomain` shares the session cookie with every host under a parent domain, for example `.example.com`. Sign-out deletes it for the whole domain, and the stale host-only copy that an earlier deployment left in a browser is deleted on sign-in, on sign-out, when the cookie arrives twice and when it cannot be read. (#194)
- **AuthProxy** ([Release v2.31.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.31.0)): `Session:CookieName` renames the session cookie, so two AuthProxy deployments under one domain do not read each other's sessions. The default stays `.Cratis.AuthProxy.Auth.v2`.
- **AuthProxy** ([Release v2.31.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.31.0)): `SignIn:CallbackHost` runs every OAuth or OIDC handshake on one host. A sign-in or sign-out that starts elsewhere is sent there and returns to the original address, so the provider needs one callback and one post-logout address. It requires `Session:CookieDomain`.
- **AuthProxy** ([Release v2.31.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.31.0)): A sign-in may return to an absolute address only when `SignIn:CallbackHost` is set, and only for an origin of a declared service host, a configured frontend, the lobby or `Logout:AllowedRedirectOrigins` that lies inside the cookie domain, on the scheme the request arrived on. Anything else is reduced to a path on the host it started on. Sign-out uses the same list.
- **AuthProxy** ([Release v2.31.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.31.0)): Aspire: `WithHosts`, `WithPathPrefix`, `WithSessionCookieDomain`, `WithSessionCookieName` and `WithSignInCallbackHost`.
- **AuthProxy** ([Release v2.31.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.31.0)): A startup warning when `Session:CookieDomain` is set while `AllowedHosts` accepts every host, and when the cookie name uses the `__Secure-` prefix.
- **AuthProxy** ([Release v2.31.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.31.0)): A how-to, [One proxy, several hosts](https://github.com/Cratis/AuthProxy/blob/main/Documentation/configuration/one-proxy-several-hosts.md), with the migration from several instances.
- **Screenplay** ([Release v4.196.0](https://github.com/Cratis/Screenplay/releases/tag/v4.196.0)): `Samples/Orders`: an application whose four screens fill the `OrdersList`, `OrderPage`, `OrdersFulfilmentBoard` and `OrdersDeliveryCalendar` templates and whose quick-create fills `OrdersQuickCreateOrder`, with the navigation declared in the layout, five specifications and a README.
- **Screenplay** ([Release v4.196.0](https://github.com/Cratis/Screenplay/releases/tag/v4.196.0)): The `orders-sample` conformance vector (golden syntax) and its entry in the sample list.
- **Scene** ([Release v4.59.0](https://github.com/Cratis/Scene/releases/tag/v4.59.0)): `@cratis/scene.blueprint.orders`: the orders list, the order page (key facts, lines, shipments, activity), the fulfilment board, the delivery calendar (the foundation `calendarGrid`) and the new-order quick-create dialog, with navigation, thumbnails, the `orders-en` sample-data pack and the `Business / Orders` category.
- **Scene** ([Release v4.59.0](https://github.com/Cratis/Scene/releases/tag/v4.59.0)): Specifications for the definition of done of every template, the screen set, the application behaviour, every forced standard state, and the Chromium audit at desktop, tablet and phone widths in both themes with colour contrast.
- **Scene** ([Release v4.59.0](https://github.com/Cratis/Scene/releases/tag/v4.59.0)): Docs `blueprints/orders-blueprint.md`, the table of contents and the index; the Orders package joins the browser specifications of the JavaScript build.
- **Chronicle** ([Release v19.72.0](https://github.com/Cratis/Chronicle/releases/tag/v19.72.0)): Analyzer CHR0065 warns when a read model has a method that is plainly meant to fold an event into it but will never be discovered as a self-reducer. This catches a fold whose name is not `Reduce` (for example `Reducer` or `reduce`) and a fold that is not `static`. Previously such a read model never folded and nothing said why. The diagnostic names the reason and shows the expected `Reduce` signature, and also recognizes historical event generations and event types that inherit `[EventType]`. See [CHR0065](https://github.com/Cratis/Chronicle/blob/main/Documentation/code-analysis/CHR0065.mdx). (#4962)
- **Stage** ([Release v4.125.0](https://github.com/Cratis/Stage/releases/tag/v4.125.0)): The Stage ships `PrimeReact` and `Cratis.Blueprint.Default` in the catalog a `ui profile` is resolved against, next to `core`, `scene.web` and `Cratis.Components`. A domain blueprint (`@cratis/scene.blueprint.crm`, `.ticketing`, `.approvals`, `.inventory`, `.hr`, `.project-tracker`, `.administration`) now only needs approving itself. The declarations are generated from the real package manifests (`shippedPackages.spec.ts` fails when `Rendering.Cratis/Shipped/ShippedPackages.json` is stale), and `core:*` component names resolve.
- **Stage** ([Release v4.125.0](https://github.com/Cratis/Stage/releases/tag/v4.125.0)): A live Stage and a generated React application load the screen and dialog templates of the approved blueprints, so `template blueprint <Package> <Template>` renders the blueprint's template. A live Stage maps `@cratis/scene.blueprint.default`, `@cratis/scene.engine` and `@cratis/scene.model` to its own instances, as it does for React.
- **Stage** ([Release v4.125.0](https://github.com/Cratis/Stage/releases/tag/v4.125.0)): `Verification/live-blueprints` runs the Stage image against all seven published blueprints at 4.53.1 (approved set made from the published manifest as written) and asserts in a browser that every screen the blueprint's templates build mounts with content, with no load diagnostics and no sample data served. It is a new step of the `live-custom-packages` CI job.
- **Screenplay** ([Release v4.195.0](https://github.com/Cratis/Screenplay/releases/tag/v4.195.0)): `Calendar` feature under `TimeOff` in `Samples/Hr`: a `TeamCalendarEvents` read model projected from `TimeOffRequestRegistered`, a screen on the `HrTeamCalendar` template, a specification, and a *Team calendar* entry in the sidebar.
- **Screenplay** ([Release v4.195.0](https://github.com/Cratis/Screenplay/releases/tag/v4.195.0)): `Timeline` feature in `Samples/Projects`: a `ProjectTimelineItems` read model projected from `ProjectRegistered`, a screen on the `ProjectTimeline` template, a specification, and a *Timeline* entry in the sidebar.
- **Screenplay** ([Release v4.195.0](https://github.com/Cratis/Screenplay/releases/tag/v4.195.0)): The golden syntax of both samples regenerated for the conformance vectors `hr-sample` and `projects-sample`; the sample READMEs describe the new features.
- **Scene** ([Release v4.57.0](https://github.com/Cratis/Scene/releases/tag/v4.57.0)): `RootTemplate(Template: TemplateReference, Options)`, `ProfileAppearance(ColorScheme?, Accent?)`, `ProfileDefaults(NewScreenTemplate?)` and the `ColorScheme` enum (`Light`, `Dark`, `System`), and the optional members `UiProfile.Root`, `.Appearance`, `.Defaults` - in C# (`Cratis.Scene.Model`) and mirrored in TypeScript (`@cratis/scene.model`). The root template reuses the existing `TemplateReference` (own or blueprint, id, blueprint, version pin).
- **Scene** ([Release v4.57.0](https://github.com/Cratis/Scene/releases/tag/v4.57.0)): `UiProfileJson` (C# `Cratis.Scene.Engine.Profiles`) and `parseUiProfile`/`serializeUiProfile` (TypeScript engine): lenient reading, one canonical writing, byte-identical in both languages.
- **Scene** ([Release v4.57.0](https://github.com/Cratis/Scene/releases/tag/v4.57.0)): Shared fixture corpus `ui-profile-fixtures.json` (own, blueprint + pin, options, legacy layout only, nothing new, appearance, defaults, everything, lenient enum case, non-ASCII, unknown members) run by both toolchains; `scene-model-shape.json` extended for the new types and enum.
- **Scene** ([Release v4.57.0](https://github.com/Cratis/Scene/releases/tag/v4.57.0)): Documentation: new `blueprints/root-template.md`, `layouts.md` links to it.
- **Screenplay** ([Release v4.194.0](https://github.com/Cratis/Screenplay/releases/tag/v4.194.0)): `Diagnostic.Arguments` carries the subjects of a diagnostic as named values: text, keyword, index or declaration path. Each code declares its arguments, with their kinds and meanings, in the diagnostic catalog and the published contract. The names, kinds and meanings are permanent. Sixteen codes carry arguments in this release, among them PLAY0524 (an incomplete specification step), which names the specification, the step role and position, the missing property and its type, and the example or case. MCP and the `screenplay` tool include the arguments in their JSON output. See [Diagnostics](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/diagnostics.md). (#804)
- **Stage** ([Release v4.124.0](https://github.com/Cratis/Stage/releases/tag/v4.124.0)): Stage now accepts Screenplay models compiled to executable model version 24 (Screenplay 4.188.0), including the text validation rules `contains`, `not contains`, `starts with` and `ends with`. Generated validators, the specification runner and the host check them exactly as Screenplay does: case-sensitive, and an absent value passes. (#448)
- **Scene** ([Release v4.56.0](https://github.com/Cratis/Scene/releases/tag/v4.56.0)): `ProjectTimeline` screen template and the `projects.timeline` screen in `@cratis/scene.blueprint.project-tracker`: every project as a bar in a lane for its owner with progress, two milestones and dependencies, built on the foundation `timelineGrid`; the scale is kept in the address and on a phone the schedule is the table.
- **Scene** ([Release v4.56.0](https://github.com/Cratis/Scene/releases/tag/v4.56.0)): Timeline items and columns, and the day the schedule counts from, in the `project-tracker-en` sample-data pack.
- **Scene** ([Release v4.56.0](https://github.com/Cratis/Scene/releases/tag/v4.56.0)): A `Timeline` entry in the navigation, a thumbnail, and the docs in `blueprints/project-tracker-blueprint.md` (the not-in-delivery note is removed).
- **Scene** ([Release v4.55.0](https://github.com/Cratis/Scene/releases/tag/v4.55.0)): `HrTeamCalendar` screen template and the `hr.timeoff.calendar` screen in `@cratis/scene.blueprint.hr`: who is away and when on a month, a week or as an agenda, built on the foundation `calendarGrid`; a filter by person or kind of leave; the people away listed beside it; one column on a phone.
- **Scene** ([Release v4.55.0](https://github.com/Cratis/Scene/releases/tag/v4.55.0)): Calendar events, columns and filter fields in the `hr-nordic` sample-data pack, made from its time-off requests (a declined request is left out).
- **Scene** ([Release v4.55.0](https://github.com/Cratis/Scene/releases/tag/v4.55.0)): A `Team calendar` entry beneath Time off in the navigation, a thumbnail, and the docs in `blueprints/hr-blueprint.md` (the not-in-delivery note is removed).
- **AI** ([Release v7.61.0](https://github.com/Cratis/AI/releases/tag/v7.61.0)): The `cratis/engineering` profile now tells agents to claim an issue when they start work on it: for a numbered issue in a known repository with nobody assigned, the agent assigns the current `gh` user, and it never replaces or adds to an existing assignee.
- **Scene** ([Release v4.54.0](https://github.com/Cratis/Scene/releases/tag/v4.54.0)): Components in `@cratis/scene.blueprint.default`: `calendarGrid` (month, week, agenda; keyboard; the busy day listed in full; day and view in the address), `timelineGrid` (Gantt-style lanes with progress, milestones, dependencies and conflicts told in words; a table alternative) and `inboxList` (grouped by day, unread told in words, filter and category in the address, keyboard, mark read or unread).
- **Scene** ([Release v4.54.0](https://github.com/Cratis/Scene/releases/tag/v4.54.0)): Foundation screen templates: `CalendarScreen`, `TimelineScreen`, `InboxScreen`, `SettingsScreen`, `ProfileScreen`, `ReportViewer` and `ImportWizard`, each with a thumbnail and preview data from the foundation sample-data pack.
- **Scene** ([Release v4.54.0](https://github.com/Cratis/Scene/releases/tag/v4.54.0)): The template types `Calendar`, `Timeline`, `Inbox`, `Settings`, `Profile`, `Report` and `Import` in the type vocabulary of both the TypeScript and the C# engine, with the shared verification fixture.
- **Scene** ([Release v4.54.0](https://github.com/Cratis/Scene/releases/tag/v4.54.0)): Specifications: behaviour of each component, definition of done and preview of each template, and the Chromium audit of every new component at desktop, tablet and phone widths in both themes.
- **Scene** ([Release v4.54.0](https://github.com/Cratis/Scene/releases/tag/v4.54.0)): Docs: `blueprints/foundation-components.md` and `blueprints/foundation-templates.md`.
- **Screenplay** ([Release v4.193.0](https://github.com/Cratis/Screenplay/releases/tag/v4.193.0)): Application-root `command reads protected` preamble opts a model into protected command reads, bound as ESM v25. Declare it once in the root document; imported commands inherit it. See [Commands](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/commands.md) and [decision 0085](https://github.com/Cratis/Screenplay/blob/main/decisions/0085-admit-protected-command-reads-through-an-explicit-preamble.md). (#129)
- **Screenplay** ([Release v4.193.0](https://github.com/Cratis/Screenplay/releases/tag/v4.193.0)): Under the preamble, `read.property` paths qualify single-level read-model values in `require` conditions and in produced-event mappings. (#802)
- **Screenplay** ([Release v4.193.0](https://github.com/Cratis/Screenplay/releases/tag/v4.193.0)): The reference evaluator rejects a command with `Validation` when a required read-model instance is absent, and with `Conflict` (`DecisionStateChanged`) when a matching fact is appended between decision and commit. (#129)
- **Screenplay** ([Release v4.193.0](https://github.com/Cratis/Screenplay/releases/tag/v4.193.0)): Diagnostics `PLAY0780` to `PLAY0785` report a misplaced or duplicate preamble, a read that cannot be protected (with its closed reason), a read without a key, reads combined with `concurrency`, and unknown or ambiguous read paths. (#129)
- **Screenplay** ([Release v4.193.0](https://github.com/Cratis/Screenplay/releases/tag/v4.193.0)): Informational `PLAY0786` on eligible legacy models, with a typed workspace and MCP repair that previews inserting the preamble for individual review before apply. (#129)
- **Screenplay** ([Release v4.193.0](https://github.com/Cratis/Screenplay/releases/tag/v4.193.0)): Syntax, highlighting, completion and diagnostics for the preamble in the TypeScript compiler, the Monaco editor and the VS Code extension. (#129)
- **Screenplay** ([Release v4.192.0](https://github.com/Cratis/Screenplay/releases/tag/v4.192.0)): A runnable application shell vector. `ScreenCompositionCorpus.V1` publishes `screen-shell-navigation-runnable`: the shell constructs (a topbar and sidebar that inherit, extend and override per module, item targets and slots, a toolbar button that starts a State Change slice, a sample data pack the ui profile selects) with the queries, projections and screens the generated backend needs. The structure-only `screen-shell-navigation-positive` case is not a backend model - `cratis render` answers `PLAY0268` and `PLAY0269` for it - so the CLI leg reads this case; both stay in the corpus.
- **Screenplay** ([Release v4.192.0](https://github.com/Cratis/Screenplay/releases/tag/v4.192.0)): `BrowserHarness/screen-shell-cli-render.sh`, also a `shell-cli` step of `run-public-acceptance.sh`: it renders the case, from the published corpus package when `SCREENPLAY_CORPUS_PACKAGE_VERSION` is set, with the installed public `cratis` (3.67.0 or later, which bundles Stage 4.119.1) and requires the module navigation targets and the toolbar slice in `scene.json` and no sample data anywhere in the generated application.
- **Orleans** ([Release v1.18.0](https://github.com/Cratis/Orleans/releases/tag/v1.18.0)): `IJobs`, a service for starting, stopping and deleting jobs without routing generic job types through the shared jobs manager: `Start<TJob, TRequest>(key, [jobId,] request)` starts the job from the calling silo, so it is placed only on silos that know its type, and the job stays recoverable. See [Jobs](https://github.com/Cratis/Orleans/blob/main/Documentation/concepts/jobs.md). (#76)
- **Orleans** ([Release v1.18.0](https://github.com/Cratis/Orleans/releases/tag/v1.18.0)): `IJobs.Stop` returns a `StopJobResult` and `IJobs.Delete` a `DeleteJobResult`: stopped or deleted, not found, `UnknownJobType` when the stored job belongs to a release this silo does not have, or refused with the job's own error. A job is never reported as stopped or deleted unless it was. (#76)
- **Orleans** ([Release v1.18.0](https://github.com/Cratis/Orleans/releases/tag/v1.18.0)): `IJobStorage.GetJobType(jobId)` reads a stored job's type without reading its request, in MongoDB, SQL and in-memory storage. Custom stores keep compiling through a default implementation. (#76)
- **Orleans** ([Release v1.17.0](https://github.com/Cratis/Orleans/releases/tag/v1.17.0)): `IJobsManagerKeys`: implement it to list the job scopes and namespaces your host runs jobs in (for example event store × tenant namespaces), so recovery can find every interrupted job. Without one, recovery covers only the scopes this silo has used and logs a startup warning. See [Jobs](https://github.com/Cratis/Orleans/blob/main/Documentation/concepts/jobs.md). (#63)
- **Orleans** ([Release v1.17.0](https://github.com/Cratis/Orleans/releases/tag/v1.17.0)): `AddCratisOrleansJobsRecovery()` on `ISiloBuilder` registers job recovery for silos not set up through `AddCratisOrleans` (such as `TestCluster` silos). (#63)
- **AI** ([Release v7.60.0](https://github.com/Cratis/AI/releases/tag/v7.60.0)): A MongoDB rule (`mongodb.md`): query with `Builders<T>`, `Find` and `Aggregate` pipelines instead of `AsQueryable()`, which fails at request time with `Expression not supported` for anything the driver cannot translate. It is registered with the backend developer and code reviewer agents and the rule index.
- **AI** ([Release v7.60.0](https://github.com/Cratis/AI/releases/tag/v7.60.0)): Guidance in `cratis-arc-query-paging` for paging MongoDB without LINQ: return `collection.Observe(<FilterDefinition>)` and let Arc apply the client's sort, page and size. Sorting resolves the BSON element name, so concept-typed members sort by their stored value, and ties break on `_id`.
- **AI** ([Release v7.60.0](https://github.com/Cratis/AI/releases/tag/v7.60.0)): An eval and a trigger for a paged MongoDB query that fails with `Expression not supported`.
- **Stage** ([Release v4.122.0](https://github.com/Cratis/Stage/releases/tag/v4.122.0)): Stage now accepts Screenplay models compiled to executable model version 23 (Screenplay 4.182.0) wherever an equivalent earlier model was accepted. (part of #316)
- **AI** ([Release v7.59.0](https://github.com/Cratis/AI/releases/tag/v7.59.0)): A shell step in `Source/Verification/screens-smoke/screens-smoke.sh`: it installs the CLI pinned as `shellCli` (3.67.0, the first release that bundles Stage 4.119.1), renders `screens-smoke/shell/application.play` - a sidebar and topbar that inherit, extend and override per module, item targets and slots, a toolbar button that starts a State Change slice and a sample data pack - and requires the module navigation targets and the toolbar slice in `scene.json` and no sample data anywhere in the generated application.
- **AI** ([Release v7.59.0](https://github.com/Cratis/AI/releases/tag/v7.59.0)): A `Shell CLI` row in the screens release vector of `Documentation/compatibility.md`; the screens authoring spec compares it with the `shellCli` pin the way it already does for the Smoke CLI.
- **Screenplay** ([Release v4.191.0](https://github.com/Cratis/Screenplay/releases/tag/v4.191.0)): `GenerationStrategyCatalog` in `Cratis.Screenplay.Semantics` lists every generation strategy and what it accepts:
- **Screenplay** ([Release v4.191.0](https://github.com/Cratis/Screenplay/releases/tag/v4.191.0)): the ESM kind, primitives and the version that introduced it;
- **Screenplay** ([Release v4.191.0](https://github.com/Cratis/Screenplay/releases/tag/v4.191.0)): whether it is admitted or reserved, and whether it needs an implementation;
- **Screenplay** ([Release v4.191.0](https://github.com/Cratis/Screenplay/releases/tag/v4.191.0)): its fixed entropy;
- **Screenplay** ([Release v4.191.0](https://github.com/Cratis/Screenplay/releases/tag/v4.191.0)): each option's placement, kind, limits, choices, default and conditions.
- **Screenplay** ([Release v4.191.0](https://github.com/Cratis/Screenplay/releases/tag/v4.191.0)): `SemanticConceptCheck.Check` checks one concept, given as syntax or from an executable model, and returns:
- **Screenplay** ([Release v4.191.0](https://github.com/Cratis/Screenplay/releases/tag/v4.191.0)): its findings, each pointing at the generation, an option or a rule rather than a source location;
- **Screenplay** ([Release v4.191.0](https://github.com/Cratis/Screenplay/releases/tag/v4.191.0)): its rule proofs;
- **Screenplay** ([Release v4.191.0](https://github.com/Cratis/Screenplay/releases/tag/v4.191.0)): its generation support and entropy;
- **Screenplay** ([Release v4.191.0](https://github.com/Cratis/Screenplay/releases/tag/v4.191.0)): the ESM version it requires.
- **cli** ([Release v3.68.0](https://github.com/Cratis/cli/releases/tag/v3.68.0)): A spec evaluates every `plan.*` assertion the canonical corpus pins for its application shell vector (`screen-shell-navigation-positive`, Stage `Desktop` plan) - topbar and sidebar regions at application level and in three modules (inherit, extend, override), hierarchical items with target and slot, toolbar buttons that invoke State Change slices, blueprint template references, slice kinds, and no served sample data - against the Scene the CLI hands to its renderer for that document. A path the corpus adds is refused until the CLI understands it. (part of #367)
- **AI** ([Release v7.58.0](https://github.com/Cratis/AI/releases/tag/v7.58.0)): A `cratis-screenplay-ui-composition` reference, `references/application-shell.md`, built on the canonical `screen-shell-navigation-positive` vector: how a module inherits, extends or overrides a topbar or sidebar region, item targets, slots and sub-items, why a module's own items may only target that module (`PLAY0750`) and what that means when a region switches from inherit to override, toolbar `button` lines that start a State Change slice (`PLAY0762` for anything else), blueprint references with a version range and the profile listing the blueprint, categories, and the sample data pack chosen once in the `ui profile`. Every example compiles with `--warnaserror`, and four refusal blocks assert `PLAY0750`, `PLAY0747`, `PLAY0762`, `PLAY0721` and `PLAY0722` through `expect` fences.
- **AI** ([Release v7.58.0](https://github.com/Cratis/AI/releases/tag/v7.58.0)): A section in the skill with the same rules in short form and a checklist row; `cratis-screenplay-model-authoring` gains the MCP edit loop for the shell (read the typed nodes, propose, stale revision, apply, reopen) in `references/screen-authoring-workflow.md`, and the model-authoring and read-surface routing tables name the new constructs.
- **AI** ([Release v7.58.0](https://github.com/Cratis/AI/releases/tag/v7.58.0)): Two evaluation tasks (module navigation modes with slice buttons; blueprint template with sample data), three trigger queries folded into the existing ones, and verification assertions for the reference.
- **Scene** ([Release v4.53.0](https://github.com/Cratis/Scene/releases/tag/v4.53.0)): `@cratis/scene.blueprint.approvals`, a blueprint package (domain `approvals`, category `Business / Approvals`): seven screen templates, two dialog templates and seven ready-to-use screens.
- **Scene** ([Release v4.53.0](https://github.com/Cratis/Scene/releases/tag/v4.53.0)): `ApprovalInbox`: the requests waiting for the signed-in person as cards (the foundation list's Cards variant) with **Approve, Reject and Request changes as buttons on each card**; a decision opens `DecisionDialog`.
- **Scene** ([Release v4.53.0](https://github.com/Cratis/Scene/releases/tag/v4.53.0)): `MyRequests` (draft, submitted, approved, rejected as chips, and a New request button), `AllRequests` and `RequestTypes` (the request types an organisation offers, for administrators).
- **Scene** ([Release v4.53.0](https://github.com/Cratis/Scene/releases/tag/v4.53.0)): `NewRequestWizard`: request type, details, attachments (a file uploader), then review and submit, on the foundation `WizardScreen`.
- **Scene** ([Release v4.53.0](https://github.com/Cratis/Scene/releases/tag/v4.53.0)): `RequestPage`: summary, the **approval chain** (`approvalChainStepper`), the request's fields, attachments and the comments as the page's activity, and the decision buttons.
- **Scene** ([Release v4.53.0](https://github.com/Cratis/Scene/releases/tag/v4.53.0)): `RequestTypeEditForm`, and dialogs `DecisionDialog` (a confirmation with the decision and a comment) and `RequestTypeQuickCreate`.
- **Scene** ([Release v4.53.0](https://github.com/Cratis/Scene/releases/tag/v4.53.0)): Each template carries its `scopes`, so a template picker offers it only where it fits.
- **Scene** ([Release v4.53.0](https://github.com/Cratis/Scene/releases/tag/v4.53.0)): Navigation: a topbar naming the `approvals` module and the module's sidebar (Inbox, My requests, All requests, Templates), the application structure and `approvalsApplication()`.
- **Scene** ([Release v4.53.0](https://github.com/Cratis/Scene/releases/tag/v4.53.0)): Sample-data packs `approvals-general` (en-GB, GBP) and `approvals-nordic` (nb-NO, NOK) answering the same shapes, with five request types as presets (Leave, Expense, Purchase, Travel, Invoice approval).
- **Scene** ([Release v4.53.0](https://github.com/Cratis/Scene/releases/tag/v4.53.0)): Specifications: definition of done per template and package, screen set consistency, applicability by level, every screen previewed in both packs with no accessibility violation, standard states forced on seven screens, the behaviors of the application (decide from the inbox, start and step through the wizard, open a request and its chain, edit a request type), and a Chromium audit of every screen and dialog at desktop, tablet and phone widths in light and dark themes (56 specs, in CI).
- **Scene** ([Release v4.53.0](https://github.com/Cratis/Scene/releases/tag/v4.53.0)): Docs: `blueprints/approvals-blueprint.md`.
- **Screenplay** ([Release v4.190.0](https://github.com/Cratis/Screenplay/releases/tag/v4.190.0)): `Samples/Approvals/approvals.play`: requests and approvals - an inbox of decision cards, my requests, a new-request wizard, a request page with its approval chain, every request and an administrator's request types - in one file of 6 slices, each with a specification (6 of 6 pass under `screenplay test`). Every screen fills a template of the blueprint (`template blueprint Cratis.Blueprint.Approvals ApprovalInbox version "^1.0"`); the decision dialog and the wizard give their `actions` slot the command they issue; the layout declares the topbar and sidebar; the `ui profile` activates the blueprint's English pack with `active blueprint approvals-general`. It compiles with no error and no warning.
- **Screenplay** ([Release v4.190.0](https://github.com/Cratis/Screenplay/releases/tag/v4.190.0)): The conformance manifest lists the sample (`approvals-sample`) with its golden syntax, so the TypeScript and C# compilers are held to the same tree for it.
- **Screenplay** ([Release v4.190.0](https://github.com/Cratis/Screenplay/releases/tag/v4.190.0)): Docs: `Samples/Approvals/README.md`, the samples table and the samples rule.
- **Scene** ([Release v4.52.0](https://github.com/Cratis/Scene/releases/tag/v4.52.0)): `dataList` accepts `rowActionStyle` (`menu`, the default, or `buttons`). With `buttons` each row action is a button of its own in the row or card, named for its request ("Approve: Leave: Isla Morgan"), publishes the same `action` output as the menu, and follows the action permission rule (disabled buttons say why on hover, hidden ones are not drawn).
- **Scene** ([Release v4.52.0](https://github.com/Cratis/Scene/releases/tag/v4.52.0)): Docs: `blueprints/foundation-components.md` (Deciding from a list).
- **Screenplay** ([Release v4.189.0](https://github.com/Cratis/Screenplay/releases/tag/v4.189.0)): `Samples/Inventory` (warehouse: items, an item gallery, locations, movements, check in and out, suppliers, a dashboard), `Samples/Hr` (directory, org chart, time off with balances, onboarding), `Samples/Projects` (projects, my tasks, a board by status and by person, a task side sheet) and `Samples/Administration` (users, roles and permissions, settings, audit log). Each is one file with a persona and policy, the layout's topbar and sidebar navigation, a `ui profile` that activates the blueprint's pack (`active blueprint inventory-warehouse`, `hr-nordic`, `project-tracker-en`, `admin-default`) and Given/When/Then specifications for every slice (`screenplay test` passes). They compile with no error and no warning under `--warnaserror`.
- **Screenplay** ([Release v4.189.0](https://github.com/Cratis/Screenplay/releases/tag/v4.189.0)): The conformance manifest lists the four samples with their golden syntax, so the TypeScript and C# compilers are held to the same tree for them (`SCREENPLAY_REGENERATE_SYNTAX_VECTORS=1`).
- **Screenplay** ([Release v4.189.0](https://github.com/Cratis/Screenplay/releases/tag/v4.189.0)): Docs: a README for each sample, the samples table and the samples rule.
- **Scene** ([Release v4.51.0](https://github.com/Cratis/Scene/releases/tag/v4.51.0)): `@cratis/scene.blueprint.ticketing`, a blueprint package (domain `ticketing`, category `Business / Ticketing`): nine screen templates, six dialog templates and nine ready-to-use screens.
- **Scene** ([Release v4.51.0](https://github.com/Cratis/Scene/releases/tag/v4.51.0)): `SupportDashboard`: open tickets, overdue and the average first response; open tickets by priority and by assignee; the overdue tickets; my next steps.
- **Scene** ([Release v4.51.0](https://github.com/Cratis/Scene/releases/tag/v4.51.0)): `TicketQueue` (id, subject, requester, priority and status chips, assignee, age; saved views Unassigned, Mine and Overdue), `MyTickets` and `CustomerList`.
- **Scene** ([Release v4.51.0](https://github.com/Cratis/Scene/releases/tag/v4.51.0)): `TicketBoard`: a column for each status with a card for each ticket.
- **Scene** ([Release v4.51.0](https://github.com/Cratis/Scene/releases/tag/v4.51.0)): `TicketPage`: the conversation as the page's activity, the properties in the aside, and the quick actions Assign, Change status, Escalate and Merge, each opening its dialog.
- **Scene** ([Release v4.51.0](https://github.com/Cratis/Scene/releases/tag/v4.51.0)): `TicketCreateForm` and the public-facing `TicketPortalForm` (full-page layout, no application chrome, a notice about what happens next, only what a customer can say).
- **Scene** ([Release v4.51.0](https://github.com/Cratis/Scene/releases/tag/v4.51.0)): `KnowledgeBase`: a search box and a tree of categories and articles beside the chosen article; a navigation stack on a phone.
- **Scene** ([Release v4.51.0](https://github.com/Cratis/Scene/releases/tag/v4.51.0)): Dialogs `TicketQuickCreate`, `CustomerQuickCreate`, `AssignTicket`, `ChangeTicketStatus`, `EscalateTicket` and `MergeTickets`.
- **Scene** ([Release v4.51.0](https://github.com/Cratis/Scene/releases/tag/v4.51.0)): Navigation: a topbar naming the `support` module and the module's sidebar (Dashboard, Queue with List and Board, My tickets, Customers, Knowledge base), the application structure and `ticketingApplication()`.
- **Scene** ([Release v4.51.0](https://github.com/Cratis/Scene/releases/tag/v4.51.0)): Sample-data packs `ticketing-helpdesk` (en-GB) and `ticketing-service-desk-de` (de-DE) answering the same shapes.
- **Scene** ([Release v4.51.0](https://github.com/Cratis/Scene/releases/tag/v4.51.0)): Specifications: definition of done per template and package, screen set consistency, applicability by level, every screen previewed in both packs with no accessibility violation, standard states forced on seven screens, the behaviors of the application (quick create, open a ticket, the four quick actions, board moves, the portal form without chrome), and a Chromium audit of every screen and dialog at desktop, tablet and phone widths in light and dark themes (92 specs, in CI).
- **Scene** ([Release v4.51.0](https://github.com/Cratis/Scene/releases/tag/v4.51.0)): Docs: `blueprints/ticketing-blueprint.md`.
- **Screenplay** ([Release v4.188.0](https://github.com/Cratis/Screenplay/releases/tag/v4.188.0)): Canonical application shell vector. `ScreenCompositionCorpus.V1` publishes `screen-shell-navigation-positive`: an application with a sidebar and a topbar at application level and in three modules (inherit, extend, override), hierarchical items with target and slot, toolbar buttons that invoke State Change slices, blueprint template references and a sample data pack the ui profile selects. Seven rejection vectors pin the diagnostics of the shell rules (`PLAY0710`, `PLAY0714`, `PLAY0721`, `PLAY0722`, `PLAY0744`, `PLAY0747`-`PLAY0749`, `PLAY0761`, `PLAY0762`) five MCP edit expectations that name the transcripts editing each construct, and a `Desktop` Stage plan pinning what the published Stage image `cratis/stage:4.119.1` serves for the document (navigation, toolbar buttons, blueprint references; no sample data).
- **Screenplay** ([Release v4.188.0](https://github.com/Cratis/Screenplay/releases/tag/v4.188.0)): Revision-checked MCP transcripts for navigation regions, toolbar buttons and blueprint template references: read the typed nodes, propose, refuse a stale revision, apply, reopen. Switching a module's region mode, copying the application's items (retargeted to the module, `PLAY0750` otherwise), adding and removing sub-items, pointing a button at a State Change slice (`PLAY0762` for anything else) and changing a template version range are all ordinary `propose-ast` edits. See [Author the application shell](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/mcp/authoring-tools.md#author-the-application-shell).
- **Screenplay** ([Release v4.188.0](https://github.com/Cratis/Screenplay/releases/tag/v4.188.0)): The MCP `syntax-schema` describes every new kind (`NavigationRegionSyntax`, `NavigationItemSyntax`, `NavigationTargetSyntax`, `NavigationLogoSyntax`, `ToolbarButtonSyntax`, template references, sample data), asserted by the transcript spec.
- **Screenplay** ([Release v4.188.0](https://github.com/Cratis/Screenplay/releases/tag/v4.188.0)): The shared TypeScript conformance vectors hold the whole shell document and module and feature template assignments, so both compilers accept what the C# compiler accepts.
- **Scene** ([Release v4.50.0](https://github.com/Cratis/Scene/releases/tag/v4.50.0)): `@cratis/scene.blueprint.administration`, a blueprint package (domain `administration`, category `Business / Administration`) built only on the foundation set's public templates and components: five screen templates, two quick-create dialogs and five ready-to-use screens.
- **Scene** ([Release v4.50.0](https://github.com/Cratis/Scene/releases/tag/v4.50.0)): `AdministrationUserList`: name, email, role, status and last active; filters; row actions; **Invite user**.
- **Scene** ([Release v4.50.0](https://github.com/Cratis/Scene/releases/tag/v4.50.0)): `AdministrationUserPage`: profile, role assignments and sessions (a session can be signed out), key facts and account history.
- **Scene** ([Release v4.50.0](https://github.com/Cratis/Scene/releases/tag/v4.50.0)): `AdministrationRoles`: the roles on the left; on the right the permission matrix of the chosen role (uses `focusRole` from #145), every role side by side while none is chosen; the chosen role lives in the address.
- **Scene** ([Release v4.50.0](https://github.com/Cratis/Scene/releases/tag/v4.50.0)): `AdministrationSettings`: the foundation form in Settings mode - general, branding and notifications, each section with its own Save.
- **Scene** ([Release v4.50.0](https://github.com/Cratis/Scene/releases/tag/v4.50.0)): `AdministrationAuditLog`: time, actor, action and target, read only, with filters and **Export**.
- **Scene** ([Release v4.50.0](https://github.com/Cratis/Scene/releases/tag/v4.50.0)): Dialogs `AdministrationInviteUser` and `AdministrationQuickCreateRole`.
- **Scene** ([Release v4.50.0](https://github.com/Cratis/Scene/releases/tag/v4.50.0)): Navigation: a topbar naming the `admin` module and the module's sidebar (Users, Roles, Settings, Audit log), the application structure and `administrationApplication()`.
- **Scene** ([Release v4.50.0](https://github.com/Cratis/Scene/releases/tag/v4.50.0)): Sample-data pack `admin-default` (en-GB): twelve users in three states, five roles with grants over ten permissions in four groups, twelve audit entries, an organization's settings.
- **Scene** ([Release v4.50.0](https://github.com/Cratis/Scene/releases/tag/v4.50.0)): Specifications as for every blueprint, including a Chromium audit of every screen and dialog at desktop, tablet and phone widths in the light and dark themes.
- **Scene** ([Release v4.50.0](https://github.com/Cratis/Scene/releases/tag/v4.50.0)): Docs: `blueprints/administration-blueprint.md`.
- **Screenplay** ([Release v4.187.0](https://github.com/Cratis/Screenplay/releases/tag/v4.187.0)): `Samples/Ticketing/ticketing.play`: a support team's help desk - dashboard, queue, board, ticket page, customers, knowledge base and a public portal form - in one file of 12 slices, each with a specification (12 of 12 pass under `screenplay test`). Every screen fills a template of the blueprint (`template blueprint Cratis.Blueprint.Ticketing TicketQueue version "^1.0"`); the four quick actions of the ticket page fill the blueprint's dialog templates and issue their commands; the board's `toolbar` slot issues the status change; the layout declares the topbar and sidebar with Board nested under Queue; the `ui profile` activates the blueprint's English pack with `active blueprint ticketing-helpdesk`. It compiles with no error and no warning.
- **Screenplay** ([Release v4.187.0](https://github.com/Cratis/Screenplay/releases/tag/v4.187.0)): The conformance manifest lists the sample (`ticketing-sample`) with its golden syntax, so the TypeScript and C# compilers are held to the same tree for it.
- **Screenplay** ([Release v4.187.0](https://github.com/Cratis/Screenplay/releases/tag/v4.187.0)): Docs: `Samples/Ticketing/README.md`, the samples table and the samples rule.
- **Scene** ([Release v4.49.0](https://github.com/Cratis/Scene/releases/tag/v4.49.0)): `@cratis/scene.blueprint.project-tracker`, a blueprint package (domain `project-tracker`, category `Business / Project tracker`) built only on the foundation set's public templates and components: five screen templates, three dialog templates and five ready-to-use screens.
- **Scene** ([Release v4.49.0](https://github.com/Cratis/Scene/releases/tag/v4.49.0)): `ProjectList`: each project as a card with owner, a progress bar, due date and status.
- **Scene** ([Release v4.49.0](https://github.com/Cratis/Scene/releases/tag/v4.49.0)): `ProjectPage`: status, progress, open tasks and days left as key facts, the project's fields, its task list (choosing a task opens it in a side sheet), members and activity.
- **Scene** ([Release v4.49.0](https://github.com/Cratis/Scene/releases/tag/v4.49.0)): `ProjectMyTasks`: the user's tasks grouped by when they are due.
- **Scene** ([Release v4.49.0](https://github.com/Cratis/Scene/releases/tag/v4.49.0)): `ProjectTaskBoard` and `ProjectTaskLanes`: a column for each status; the second with a lane for each assignee (uses the swimlane option from #142).
- **Scene** ([Release v4.49.0](https://github.com/Cratis/Scene/releases/tag/v4.49.0)): Dialogs `ProjectQuickCreateProject`, `ProjectQuickCreateTask` and `ProjectTaskSheet`, a side sheet that shows one task with its subtasks and conversation.
- **Scene** ([Release v4.49.0](https://github.com/Cratis/Scene/releases/tag/v4.49.0)): Navigation: a topbar naming the `projects` module and the module's sidebar (Projects, My tasks, Board with By status and By person), the application structure and `projectTrackerApplication()`.
- **Scene** ([Release v4.49.0](https://github.com/Cratis/Scene/releases/tag/v4.49.0)): Sample-data pack `project-tracker-en` (en-GB): eight projects, twenty-two tasks, members, a task with subtasks and a conversation.
- **Scene** ([Release v4.49.0](https://github.com/Cratis/Scene/releases/tag/v4.49.0)): Specifications as for every blueprint, including a Chromium audit of every screen and dialog at desktop, tablet and phone widths in the light and dark themes.
- **Scene** ([Release v4.49.0](https://github.com/Cratis/Scene/releases/tag/v4.49.0)): Docs: `blueprints/project-tracker-blueprint.md`.
- **Scene** ([Release v4.48.0](https://github.com/Cratis/Scene/releases/tag/v4.48.0)): `@cratis/scene.blueprint.hr`, a blueprint package (domain `hr`, category `Business / HR`) built only on the foundation set's public templates and components: seven screen templates, two quick-create dialogs and seven ready-to-use screens.
- **Scene** ([Release v4.48.0](https://github.com/Cratis/Scene/releases/tag/v4.48.0)): `HrEmployeeDirectory`: each person as a card with photo, name, title, department and contact; filters by department, location, status and manager.
- **Scene** ([Release v4.48.0](https://github.com/Cratis/Scene/releases/tag/v4.48.0)): `HrEmployeePage`: time-off balance as key facts, personal and job information, documents and time-off requests as related lists, history and open tasks.
- **Scene** ([Release v4.48.0](https://github.com/Cratis/Scene/releases/tag/v4.48.0)): `HrOrgChart`: the company as a tree of who reports to whom, with titles and report counts; the chosen person lives in the address.
- **Scene** ([Release v4.48.0](https://github.com/Cratis/Scene/releases/tag/v4.48.0)): `HrTimeOffList` (approve or decline one row or many, **Request time off**), `HrTimeOffBalanceList` (entitlement, taken and left with a progress bar of how much is used, read only).
- **Scene** ([Release v4.48.0](https://github.com/Cratis/Scene/releases/tag/v4.48.0)): `HrOnboardingList` (new hires with a progress bar of their checklist) and `HrOnboardingChecklist` (sections of tasks, each with an owner and a due date).
- **Scene** ([Release v4.48.0](https://github.com/Cratis/Scene/releases/tag/v4.48.0)): Dialogs `HrRequestTimeOff` and `HrQuickCreateEmployee`.
- **Scene** ([Release v4.48.0](https://github.com/Cratis/Scene/releases/tag/v4.48.0)): Navigation: a topbar naming the `hr` module and the module's sidebar (Directory, Org chart, Time off with Requests and Balances, Onboarding), the application structure and `hrApplication()`.
- **Scene** ([Release v4.48.0](https://github.com/Cratis/Scene/releases/tag/v4.48.0)): Sample-data pack `hr-nordic` (nb-NO, NOK): sixteen people in six departments with a reporting line, twelve time-off requests, balances, five new hires and a three-part onboarding checklist.
- **Scene** ([Release v4.48.0](https://github.com/Cratis/Scene/releases/tag/v4.48.0)): Specifications as for every blueprint: definition of done per template and package, screen set agreeing with the manifest, structure and navigation, applicability by level, every screen previewed without an accessibility violation, every standard state forced, the behaviors of the application, and a Chromium audit of every screen and dialog at desktop, tablet and phone widths in the light and dark themes.
- **Scene** ([Release v4.48.0](https://github.com/Cratis/Scene/releases/tag/v4.48.0)): Docs: `blueprints/hr-blueprint.md`.
- **cli** ([Release v3.67.0](https://github.com/Cratis/cli/releases/tag/v3.67.0)): `cratis run` reports compiler errors about the application shell - a navigation item that targets nothing or a slot no layout declares (`PLAY0747`-`PLAY0750`), a toolbar button that names a slice that is not a State Change slice (`PLAY0762`), a sample data selection no pack satisfies (`PLAY0714`) - with their code and `file(line,column)` location and exit code 5, before it starts Docker. (part of #367)
- **cli** ([Release v3.67.0](https://github.com/Cratis/cli/releases/tag/v3.67.0)): The CLI's CI runs an application shell fixture (`Integration/Cli/Shell`: three modules that inherit, override and extend the sidebar, a toolbar button that opens a State Change slice as a task dialog, a sample data pack) through `cratis run` on a live Stage and through `cratis render`, a build and a launch, and drives both with one browser scenario: topbar and sidebar per module, active module and feature, dialog fields from the command schema, cancel posts nothing, submit posts the command, deep link and back navigation, no sample row in anything that ships. (part of #367)
- **cli** ([Release v3.67.0](https://github.com/Cratis/cli/releases/tag/v3.67.0)): Documentation for the application shell in the `run` and `screenplay` references. (part of #367)
- **Scene** ([Release v4.47.0](https://github.com/Cratis/Scene/releases/tag/v4.47.0)): `kanbanBoard` `swimlane: assignee`: the board is laid out in a lane for each person (in the order they first appear in the cards, the unassigned last), each across the same columns. A card moves between columns within its lane by dragging or by its Move-to menu; each column's count and total are for its lane, the over-the-limit warning counts every lane. Lane headings are one level above the columns' so the outline stays in order.
- **Scene** ([Release v4.47.0](https://github.com/Cratis/Scene/releases/tag/v4.47.0)): Docs: `blueprints/foundation-components.md` (Boards).
- **Scene** ([Release v4.46.0](https://github.com/Cratis/Scene/releases/tag/v4.46.0)): `@cratis/scene.blueprint.inventory`, a blueprint package (domain `inventory`, category `Business / Inventory`) that depends on the foundation set only through its public templates and components: eight screen templates, three quick-create dialogs and eight ready-to-use screens.
- **Scene** ([Release v4.46.0](https://github.com/Cratis/Scene/releases/tag/v4.46.0)): `InventoryDashboard`: low stock count, stock value and movements this week; top movers; recent movements; items to reorder.
- **Scene** ([Release v4.46.0](https://github.com/Cratis/Scene/releases/tag/v4.46.0)): `InventoryItemList` (sku, name, category, location, quantity, status; low stock tinted and marked in words; filters; choosing a row opens the item) and `InventoryItemGallery` (the same items as cards with their picture).
- **Scene** ([Release v4.46.0](https://github.com/Cratis/Scene/releases/tag/v4.46.0)): `InventoryItemPage`: key facts, the item's fields and supplier, stock by location and movement history as related lists, cycle counts; Adjust stock and Check out.
- **Scene** ([Release v4.46.0](https://github.com/Cratis/Scene/releases/tag/v4.46.0)): `InventoryLocations`: the location tree beside what is stored in the chosen location and beneath it; the choice lives in the address.
- **Scene** ([Release v4.46.0](https://github.com/Cratis/Scene/releases/tag/v4.46.0)): `InventoryMovementList` (read only), `InventorySupplierList` and `InventoryCheckInOut`, a mobile-first single-column form to scan or search an item and check it in or out.
- **Scene** ([Release v4.46.0](https://github.com/Cratis/Scene/releases/tag/v4.46.0)): Dialogs `InventoryAdjustStock` (item, quantity change, reason), `InventoryQuickCreateItem` and `InventoryQuickCreateSupplier`.
- **Scene** ([Release v4.46.0](https://github.com/Cratis/Scene/releases/tag/v4.46.0)): Each template carries its `scopes`, so a template picker offers it only where it fits and hides the blueprint where nothing applies.
- **Scene** ([Release v4.46.0](https://github.com/Cratis/Scene/releases/tag/v4.46.0)): Navigation: a topbar naming the `inventory` module and the module's sidebar (Dashboard, Items with Table and Gallery, Locations, Movements, Suppliers), the application structure and `inventoryApplication()`.
- **Scene** ([Release v4.46.0](https://github.com/Cratis/Scene/releases/tag/v4.46.0)): Sample-data pack `inventory-warehouse` (en-GB, GBP): sixteen items, fourteen movements, five suppliers and a three-level tree of locations.
- **Scene** ([Release v4.46.0](https://github.com/Cratis/Scene/releases/tag/v4.46.0)): Specifications for the definition of done per template and package, the screen set agreeing with the manifest, structure and navigation, applicability by level, every screen previewed with no accessibility violation, every standard state forced, the behaviors of the application, and a Chromium audit of every screen and dialog at desktop, tablet and phone widths in the light and dark themes.
- **Scene** ([Release v4.46.0](https://github.com/Cratis/Scene/releases/tag/v4.46.0)): Docs: `blueprints/inventory-blueprint.md`.
- **Screenplay** ([Release v4.186.0](https://github.com/Cratis/Screenplay/releases/tag/v4.186.0)): `Samples/Crm/crm.play`: a sales team's CRM - leads, contacts, companies, deals with a pipeline and a grouped list, activities and a dashboard - in one file of 18 slices, each with a specification. Every screen fills a template of the blueprint (`template blueprint Crm CrmLeadList version "^1.0"`), the layout declares the topbar and sidebar with Deals holding the Pipeline and the List, and the `ui profile` activates the blueprint's Nordic pack with `active blueprint crm-nordic-smb`. It compiles with no error and no warning, also under `--check all`.
- **Screenplay** ([Release v4.186.0](https://github.com/Cratis/Screenplay/releases/tag/v4.186.0)): The conformance manifest lists the sample (`crm-sample`) with its golden syntax, so the TypeScript and C# compilers are held to the same tree for it.
- **Screenplay** ([Release v4.186.0](https://github.com/Cratis/Screenplay/releases/tag/v4.186.0)): Docs: `Samples/Crm/README.md`, the samples table and the samples rule.
- **Scene** ([Release v4.45.0](https://github.com/Cratis/Scene/releases/tag/v4.45.0)): `dataList` `imageField`: each card shows the row's picture (initials when it has none), decorative because the title names the row.
- **Scene** ([Release v4.45.0](https://github.com/Cratis/Scene/releases/tag/v4.45.0)): `dataList` column `kind: progress`: a 0-100 value drawn as a progress bar named by its column with the figure in words.
- **Scene** ([Release v4.45.0](https://github.com/Cratis/Scene/releases/tag/v4.45.0)): `dataList` `toneField`: tints a row by its tone; pairs with a status column so colour is never the only cue.
- **Scene** ([Release v4.45.0](https://github.com/Cratis/Scene/releases/tag/v4.45.0)): `orgTree` `urlKey`: the chosen node is kept in the address (a refresh restores it).
- **Scene** ([Release v4.45.0](https://github.com/Cratis/Scene/releases/tag/v4.45.0)): Docs: `blueprints/foundation-components.md` (Lists of records).
- **Scene** ([Release v4.44.0](https://github.com/Cratis/Scene/releases/tag/v4.44.0)): `@cratis/scene.blueprint.crm`, a blueprint package (domain `crm`, category `Business / CRM`) that depends on the foundation set only through its public templates and components: eighteen screen templates, five dialog templates and eighteen ready-to-use screens.
- **Scene** ([Release v4.44.0](https://github.com/Cratis/Scene/releases/tag/v4.44.0)): `CrmDashboard`: open pipeline value, won this month and conversion rate; leads by source and deals by stage as a funnel; deals closing soon; my tasks.
- **Scene** ([Release v4.44.0](https://github.com/Cratis/Scene/releases/tag/v4.44.0)): `CrmLeadList`, `CrmContactList`, `CrmCompanyList`, `CrmActivityList`: name, company, owner, status and last contact; filters by owner, status, source and created date; row actions edit, assign, convert (leads) and delete; choosing a contact or company opens its page.
- **Scene** ([Release v4.44.0](https://github.com/Cratis/Scene/releases/tag/v4.44.0)): `CrmDealPipeline` (a column for each stage with the stage's value in its header, a card for each deal) and `CrmDealList` (the same deals grouped by stage with subtotals).
- **Scene** ([Release v4.44.0](https://github.com/Cratis/Scene/releases/tag/v4.44.0)): `CrmContactPage`, `CrmCompanyPage`, `CrmDealPage`: key facts, tabs, the record, related lists, activity and next steps.
- **Scene** ([Release v4.44.0](https://github.com/Cratis/Scene/releases/tag/v4.44.0)): `Crm<Entity>CreateForm` and `Crm<Entity>EditForm` for leads, contacts, companies and deals, and `CrmQuickCreate<Entity>` dialogs for those and activities.
- **Scene** ([Release v4.44.0](https://github.com/Cratis/Scene/releases/tag/v4.44.0)): Each template carries its `scopes`, so a template picker offers it only where it fits and hides the blueprint where nothing applies.
- **Scene** ([Release v4.44.0](https://github.com/Cratis/Scene/releases/tag/v4.44.0)): Navigation of the application: a topbar naming the `crm` module and the module's sidebar (Dashboard, Leads, Contacts, Companies, Deals with Pipeline and List, Activities), the application structure, and `crmApplication()` that assembles the document.
- **Scene** ([Release v4.44.0](https://github.com/Cratis/Scene/releases/tag/v4.44.0)): Sample-data packs `crm-enterprise-en` (en-GB, GBP) and `crm-nordic-smb` (nb-NO, NOK) answering the same shapes; the pack's one-row `CrmSettings` shape gives every figure and date its locale and currency.
- **Scene** ([Release v4.44.0](https://github.com/Cratis/Scene/releases/tag/v4.44.0)): Specifications for the definition of done per template and package, the screen set agreeing with the manifest, structure and navigation, applicability by level, every screen previewed in both packs with no accessibility violation, every standard state forced on the main screens, the behaviors of the application (open a quick-create dialog, choose a row, edit, move a deal between stages), and a Chromium audit of every screen and dialog at desktop, tablet and phone widths in the light and dark themes.
- **Scene** ([Release v4.44.0](https://github.com/Cratis/Scene/releases/tag/v4.44.0)): Docs: `blueprints/crm-blueprint.md`.
- **Scene** ([Release v4.43.0](https://github.com/Cratis/Scene/releases/tag/v4.43.0)): `kanbanBoard` can total a numeric card field in each column header: name the field in `totalField` (a deal's `amount`) and `format` (`currency` with a `currency` code, `percent`, `compact` or a plain number); the totals are formatted in the element's `locale` and follow a card as it is moved, by dragging or by its Move-to menu.
- **Scene** ([Release v4.43.0](https://github.com/Cratis/Scene/releases/tag/v4.43.0)): Docs: `blueprints/foundation-components.md` (Boards).
- **Screenplay** ([Release v4.185.0](https://github.com/Cratis/Screenplay/releases/tag/v4.185.0)): `SemanticValidationRules.Check` in `Cratis.Screenplay.Semantics` checks a value against one rule, against every rule of a concept, or against a type, walking composites and collections. Each `SemanticRuleCheck` says whether the rule was satisfied, failed or could not be evaluated, and carries the rule, its message and, for `matches`, the pattern check. It is the same implementation the reference evaluator uses: absent values pass every rule except not-empty, text compares ordinally, numbers compare as exact decimals, and Studio text-rule patterns evaluate as their first-class rule. See [Check values against validation rules](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/value-rule-checks.md). (#811)
- **Screenplay** ([Release v4.184.0](https://github.com/Cratis/Screenplay/releases/tag/v4.184.0)): Concept and command rules `contains "x"`, `not contains "x"`, `starts with "x"` and `ends with "x"` on text values. They compare UTF-16 code units ordinally, an absent value passes, and they are written to the executable model in a new ESM version; models that do not use them keep their bytes and version. See [Commands](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/commands.md). (#810)
- **Screenplay** ([Release v4.184.0](https://github.com/Cratis/Screenplay/releases/tag/v4.184.0)): Public pattern admission checks `PortableMatchPattern.Check(pattern)` in .NET and `checkPortableMatchPattern(pattern)` in `@cratis/screenplay-compiler`. They report whether a `matches` pattern is admitted, deprecated, refused or invalid, with the diagnostic code, the construct and its offset, a suggestion, and the first-class replacement for a Studio pattern. (#810)
- **Stage** ([Release v4.119.0](https://github.com/Cratis/Stage/releases/tag/v4.119.0)): Concepts with an ESM v21 `generate pattern` (optionally with a checksum) or `generate random a..b` strategy now render: generated applications create values with Cratis.Fundamentals `GenerateValue.Pattern` and `GenerateValue.Integer`, dated patterns take their date from the generation context at run time, and Stage's executor and Host check pinned specification values against the pattern or range with the same semantics as Screenplay. (part of #414)
- **Arc** ([Release v22.107.0](https://github.com/Cratis/Arc/releases/tag/v22.107.0)): Screenplay generation recovers pattern and signed integer random strategies, checksum validation, and self-contained C# generation rules using `Now`, `Tenant`, and `GenerateValue` context overloads. (#3116)
- **Arc** ([Release v22.107.0](https://github.com/Cratis/Arc/releases/tag/v22.107.0)): Generated-value pins are checked against recovered generation contracts, while executable model version caps retain unsupported validation in source rather than silently dropping it.
- **Stage** ([Release v4.118.0](https://github.com/Cratis/Stage/releases/tag/v4.118.0)): Concepts with an ESM v21 `validate checksum` rule (Luhn, Mod11 or Mod97) now render: the generated concept validator checks the checksum with Cratis.Fundamentals, and Stage's executor and Host evaluate the rule with the same semantics as Screenplay. Pinned specification values that fail the checksum are refused when the model is admitted. (part of #414)
- **Screenplay** ([Release v4.182.0](https://github.com/Cratis/Screenplay/releases/tag/v4.182.0)): A command can declare a pending `handler implementation` intent with ordered `hint`s beside unconditional `produces`. The body owns only the event payload values. Which events, their order, destinations, tags, generated values, the response, authorization and validation stay declarative, and event-property mappings become non-normative hints, so required event properties may be left unmapped. See [Commands](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/commands.md). (#782)
- **Screenplay** ([Release v4.182.0](https://github.com/Cratis/Screenplay/releases/tag/v4.182.0)): The executable semantic model version 23 carries a described command's handler requirement (`handler { requirementId, resultVersion }`), and the requirements sidecar reports it as a Pending CommandHandler requirement with its hints and provisional/ambiguous flags. Models without a described command keep their previous version and bytes, and consumers that do not admit version 23 refuse the model rather than dropping the described logic. (#782)
- **Screenplay** ([Release v4.182.0](https://github.com/Cratis/Screenplay/releases/tag/v4.182.0)): Diagnostics PLAY0695 (a command is described but not implemented), PLAY0696 (a described command has no productions or only a response), PLAY0697 (conditional productions under a pending intent) and PLAY0698 (a pending intent next to another handler, in both compilers). (#782)
- **Screenplay** ([Release v4.182.0](https://github.com/Cratis/Screenplay/releases/tag/v4.182.0)): Reference execution reports a specification that reaches a described command's body as Unsupported (`ImplementationBody`), naming the command and its requirement, directly and through reactions. Authorization and validation outcomes are evaluated as before. (#782)
- **Screenplay** ([Release v4.182.0](https://github.com/Cratis/Screenplay/releases/tag/v4.182.0)): The MCP `handler-intents` and `implementation-requirements` views report pending requirements with their hints and flags, and whether each described command is admitted. (#782)
- **Arc** ([Release v22.106.0](https://github.com/Cratis/Arc/releases/tag/v22.106.0)): Read protection modes `Off`, `Measure` and `On`, set with `[assembly: ReadProtection(...)]`, `[ReadProtection(...)]` on a command or the MSBuild property `<CratisReadProtection>`. `ReadProtection:MaximumMode` lowers the mode at runtime and logs a warning at startup (#3268)
- **Arc** ([Release v22.106.0](https://github.com/Cratis/Arc/releases/tag/v22.106.0)): Under `On`, read-model parameters of `Handle()` and of a `CommandValidator<T>` constructor are read fresh from the event log and guard the command's append. If one changed before the commit, nothing from the command is written and the caller gets a 400 saying which read model changed and to submit again (#3268)
- **Arc** ([Release v22.106.0](https://github.com/Cratis/Arc/releases/tag/v22.106.0)): `[Unprotected("why")]` marks a read-model parameter, type or method body as context that does not guard the write (#3268)
- **Arc** ([Release v22.106.0](https://github.com/Cratis/Arc/releases/tag/v22.106.0)): `[LookUpBy(nameof(Command.Property))]` names the command property that is the key of a read-model parameter when it is not the event source id (#3268)
- **Arc** ([Release v22.106.0](https://github.com/Cratis/Arc/releases/tag/v22.106.0)): Under `On`, reads that cannot be protected are refused with a message that says why and what to do instead, including raw collection reads, filtered or constructor-dependent reducers, immediate appends and shared validator instances (#3268)
- **Arc** ([Release v22.106.0](https://github.com/Cratis/Arc/releases/tag/v22.106.0)): `Measure` leaves behaviour unchanged and reports which reads `On` would guard, refuse or find changed, through startup warnings, periodic log summaries and telemetry (#3268)
- **Arc** ([Release v22.106.0](https://github.com/Cratis/Arc/releases/tag/v22.106.0)): Read models declared with `[EventStream<TSource>(stream)]` can be plain parameters of a command or validator: Arc reads them from the stream the command's route points to, so a monthly limit is guarded by that month only (#3306)
- **Arc** ([Release v22.106.0](https://github.com/Cratis/Arc/releases/tag/v22.106.0)): Analyzers ARCCHR0024, ARCCHR0028 and ARCCHR0033 to ARCCHR0038 report reads that cannot be protected, aggregates and reads on the same source, unprotected method bodies, early aggregate commits, unproven exact scopes, read-model streams that are not on the command route and stream guards that widen (#3268) (#3306)
- **Arc** ([Release v22.106.0](https://github.com/Cratis/Arc/releases/tag/v22.106.0)): A guide to keeping command decisions correct: choosing a mechanism, getting started, adopting with Measure, protected and advisory reads, validators, refusals, how guards are derived, and scenarios from a single entity to per-stream limits and processes (#3268)
- **Stage** ([Release v4.116.0](https://github.com/Cratis/Stage/releases/tag/v4.116.0)): `ArtifactImplementationGap`, `ArtifactImplementationStub`, `ArtifactImplementationContext` and `ArtifactImplementationBodyLocator` describe a gap, its requirement id, role, hints, and each typed stub with its file, signature, body location and acceptance specifications. (part of #316)
- **Stage** ([Release v4.116.0](https://github.com/Cratis/Stage/releases/tag/v4.116.0)): `ArtifactRenderPlan.ImplementationGaps`, forwarded through `CratisPlanResult`. A plan with gaps includes them in its digest; a plan without gaps keeps its existing digest. (part of #316)
- **Stage** ([Release v4.116.0](https://github.com/Cratis/Stage/releases/tag/v4.116.0)): `ImplementationGapMode` (`Refuse` or `Stub`) on `CratisPlanOptions` and `CratisRenderingOptions`. It defaults to `Refuse` and has no effect until a target supports stubs. (part of #316)
- **Scene** ([Release v4.42.0](https://github.com/Cratis/Scene/releases/tag/v4.42.0)): Dialog templates in `@cratis/scene.blueprint.default`, category `Foundation / Dialog`: `QuickCreateDialog` (six fields at most, Cancel and Create), `LookupDialog` (search and a list, single or multiple selection), `SideSheet` (a drawer from the inline end hosting a form or record) and `FilterDialog` (the filter builder; fills the page on a phone). `ConfirmDialog` now lists the consequences, takes a `danger` tone and names its verb on the confirming button; `FormDialog` and `DetailDialog` gain the same frame.
- **Scene** ([Release v4.42.0](https://github.com/Cratis/Scene/releases/tag/v4.42.0)): Auth and state screens fitting the full-page layout, categories `Foundation / Auth` and `Foundation / State`: `LoginScreen` (logo, form, identity-provider slot, live-region error area, help link), `NotFoundScreen`, `ForbiddenScreen` (binds no data, so nothing leaks) and `ErrorScreen` (retry and the support reference id).
- **Scene** ([Release v4.42.0](https://github.com/Cratis/Scene/releases/tag/v4.42.0)): Foundation components: `dialogFrame` (heading, message, consequences, close button; gives the host's dialog element its accessible name, focus on open, a Tab trap, Escape, focus restored on close, placement `center`/`side`/`full`, a phone filling the page, RTL mirroring), `actionButton` (permission rule enabled/disabled/hidden, behaviors, danger emphasis) and `notice` (a live-region message); a `password` field type and a `saveAndNew` switch on the form.
- **Scene** ([Release v4.42.0](https://github.com/Cratis/Scene/releases/tag/v4.42.0)): Cancel and Close carry a `CloseDialog` action as data, so the same document closes the dialog in Scene, Stage and the preview.
- **Scene** ([Release v4.42.0](https://github.com/Cratis/Scene/releases/tag/v4.42.0)): `GalleryDialogPreview`, stories for each dialog state, sample-data pack shapes for the dialogs and screens, thumbnails for every template.
- **Scene** ([Release v4.42.0](https://github.com/Cratis/Scene/releases/tag/v4.42.0)): `verifyTemplateDefinitionOfDone` now also takes a dialog template.
- **Scene** ([Release v4.42.0](https://github.com/Cratis/Scene/releases/tag/v4.42.0)): Docs: `blueprints/foundation-templates.md` (dialogs, auth and state screens, aliases), `foundation-components.md`, `template-set.md`, `pattern-coverage.md`.
- **Stage** ([Release v4.115.0](https://github.com/Cratis/Stage/releases/tag/v4.115.0)): Stage admits ESM v21 models. Concepts that use `generate pattern`, `generate random` or `generate rule` are refused with `STAGE-ESM-028`, naming the strategy, until Stage renders them. (part of #414)
- **Stage** ([Release v4.115.0](https://github.com/Cratis/Stage/releases/tag/v4.115.0)): `validate checksum` rules are refused with the new code `STAGE-ESM-042` until Stage renders them. (part of #414)
- **Scene** ([Release v4.41.0](https://github.com/Cratis/Scene/releases/tag/v4.41.0)): Eight foundation screen templates in `@cratis/scene.blueprint.default` under `foundation/templates`, category `Foundation / <type>`: `WorkspaceScreen` (`moduleNav`, `moduleContent`), `DashboardScreen`, `ListScreen` (header, toolbar, filters, list, bulkBar, footer), `BoardScreen`, `MasterDetailScreen` (fits the qualified slot `WorkspaceScreen.moduleContent`, offers the `master-detail.detail` outlet), `RecordPage` (tabs, related, activity, aside), `FormScreen` and `WizardScreen`. Each fits the `AppShell` `content` slot (or its container's qualified slot), so any of them is placed in the shell without per-template shell code; each carries a compact arrangement (list to cards, master/detail to a stack, section rail to tabs), the five standard states through the foundation components, permission rules on action controls, address-reflected filters/sort/page/selection/step, and a keyboard alternative on the board.
- **Scene** ([Release v4.41.0](https://github.com/Cratis/Scene/releases/tag/v4.41.0)): Preview data is the sample-data pack `sampleData/foundation-en.json` (templates only declare query bindings), a thumbnail for each in `thumbnails/`, and the pack and thumbnails ship in the package.
- **Scene** ([Release v4.41.0](https://github.com/Cratis/Scene/releases/tag/v4.41.0)): `verifyTemplateDefinitionOfDone` in `@cratis/scene.engine`: the Part B 6 per-template checklist (metadata, type, category, one-sentence description, thumbnail in the package, every slot arranged and none undeclared, placed by the slot resolver, no inline sample rows, every bound query answered by the pack), with specs and used for each foundation template.
- **Scene** ([Release v4.41.0](https://github.com/Cratis/Scene/releases/tag/v4.41.0)): Gallery screens for the eight templates (breadcrumbs, nesting through the workspace for the qualified slot), the preview host takes a sample-data pack and forced state.
- **Scene** ([Release v4.41.0](https://github.com/Cratis/Scene/releases/tag/v4.41.0)): Docs: `blueprints/foundation-templates.md`, `template-set.md` and `pattern-coverage.md` (Board, Record page and Wizard no longer deferred).
- **Scene** ([Release v4.40.0](https://github.com/Cratis/Scene/releases/tag/v4.40.0)): `dataList`: the records of a collection as a table, as cards, or grouped with subtotals, with search, sort, paging, selection (one or many), row actions and a filter (the filter builder's value). Search, sort, page and selection live in the address under a `urlKey` prefix, so a shared link or a refresh restores the list. Sorting cycles ascending, descending, none, and the header says so in words and in `aria-sort`. A table becomes cards on a phone, with nothing hidden. Real table elements: a screen reader announces row and column. Cells are text, number, currency, date (all locale-formatted) or status (tone + icon + text).
- **Scene** ([Release v4.40.0](https://github.com/Cratis/Scene/releases/tag/v4.40.0)): `tabSet` (the ARIA tabs pattern, the active tab in the address, the content of tab `overview` is the slot `overview`) and `subNavigation` (a module's sections as tabs or a left rail, `aria-current`, a deep link restores the section).
- **Scene** ([Release v4.40.0](https://github.com/Cratis/Scene/releases/tag/v4.40.0)): `bulkBar`: appears only while records are selected, says how many politely, offers bulk actions with permission rules, clears the selection.
- **Scene** ([Release v4.40.0](https://github.com/Cratis/Scene/releases/tag/v4.40.0)): `globalSearch` (a `search` landmark; text is the output and can live in the address; Escape clears) and `notificationsButton` (the unread count said in words, the badge hidden from assistive technology).
- **Scene** ([Release v4.40.0](https://github.com/Cratis/Scene/releases/tag/v4.40.0)): `kanbanBoard`: columns mapped to a status with cards that move by dragging **and** by each card's own "Move to" menu (the keyboard and screen-reader path), every move announced, per-column limits that say "Over the limit" in words, collapsible columns, read-only without the move permission; a card whose column is gone is shown in the first column rather than lost.
- **Scene** ([Release v4.40.0](https://github.com/Cratis/Scene/releases/tag/v4.40.0)): `wizardProgress`: linear steps, Back/Next/Finish and Save draft; Next is blocked while the step is not valid; the last step is the review; completed steps are revisitable but a step cannot be opened before those ahead are done; the current step (address) and completed steps (session) survive a refresh and a refresh cannot land past a step that was not done. Storage access is guarded, so a sandboxed frame loses only the memory (the Chromium audit caught this).
- **Scene** ([Release v4.40.0](https://github.com/Cratis/Scene/releases/tag/v4.40.0)): `formScreenBody`: titled sections in a 1-3 column grid with eleven field types (text, number, currency, date, select, multi-select, lookup, toggle, file, rich text, address), inline validation on blur and a summary on submit that takes focus, server errors mapped onto fields (an error for an unknown field becomes a general one, never lost), required marked by asterisk **and** word, four modes (create, edit, read-only, settings with a save per section), a sticky action bar, and an unsaved-changes guard (`beforeunload` + Discard). It collapses to one column on a phone.
- **Scene** ([Release v4.40.0](https://github.com/Cratis/Scene/releases/tag/v4.40.0)): Shared: `useUrlState` (state that lives in the address without
- **cli** ([Release v3.66.0](https://github.com/Cratis/cli/releases/tag/v3.66.0)): `cratis render` admits Screenplay ESM v20: validation rules on generated concepts render with both the concept's `New()` factory and its validator. Specifications using such a concept must pin its generated value; a pin that fails the rules is refused with `STAGE-ESM-011`, and warning or information rules on generated concepts with `STAGE-ESM-038`. ESM v21 is still refused with `CLI-RENDER-004`. (#372)
- **cli** ([Release v3.66.0](https://github.com/Cratis/cli/releases/tag/v3.66.0)): When Stage's default `eventmodel` engine refuses a model only for capabilities the semantic engine runs, `cratis run` without `--engine` restarts once on `semantic` and says so. An explicit `--engine` never switches; refusal suggestions give the exact `cratis run <path> --engine semantic` command with your other options. (part of #324)
- **cli** ([Release v3.66.0](https://github.com/Cratis/cli/releases/tag/v3.66.0)): `cratis run` refusals are grouped by kind into **Fix your model**, **Not supported by this engine yet** and **Ignored by this engine**, with counts and the first three locations; `--verbose` lists every issue, and JSON output keeps every issue plus the groups. (part of #324)
- **cli** ([Release v3.66.0](https://github.com/Cratis/cli/releases/tag/v3.66.0)): `cratis run` shows the compiler notes Stage reports as ignored: a one-line count when the session is ready (listed with `--verbose`), grouped under **Ignored by this engine** on a refusal, and as a raw `notes` array in JSON output.
- **Scene** ([Release v4.39.0](https://github.com/Cratis/Scene/releases/tag/v4.39.0)): **Manifest** (`ScenePackage.blueprint`, C# `ScenePackage.Blueprint`): `BlueprintMetadata` - `domain`, `description`, `thumbnail`, `screenSet` (named `BlueprintScreen`s with template, parent, order and icon, i.e. the navigation) and `defaultSampleData`. Sample-data packs stay the existing `sampleData` references. `TemplateMetadata.thumbnail` for each template. There is deliberately no second version on the blueprint: the package `version` is the blueprint's version. The shared `scene-model-shape.json` keeps C# and TypeScript in step.
- **Scene** ([Release v4.39.0](https://github.com/Cratis/Scene/releases/tag/v4.39.0)): **`verifyBlueprintPackage`** (C# `BlueprintVerification.Verify`), the definition of done: manifest kind and version; domain slug, description (at most 200 characters), thumbnail path and presence in the package; a non-empty screen set with unique names, titles, existing templates, parents in the set, no ancestor cycle and every screen provided; sample data present, references valid and in the package, a declared default when there are several; every template with display name, description, type from the vocabulary, a `Business / <domain>` category and a thumbnail, on top of the provenance `describeTemplateCatalog` already checks; every screen template placed by the slot resolver (unplaced, ambiguous and self-nested are reported); a dependency on the foundation set. A package with no `blueprint` block (a foundation blueprint) is held to the template, placement and sample-data rules only, or to all of them with `requireBlueprintMetadata`.
- **Scene** ([Release v4.39.0](https://github.com/Cratis/Scene/releases/tag/v4.39.0)): **Version pin semantics**: `evaluateBlueprintPin` (C# `BlueprintVersionPin.Evaluate`) decides Current / UpdateAvailable / UpdateBlockedByPin / NotSatisfied / Invalid for a reference's pinned range against the installed and latest versions; `defaultBlueprintPin` is the caret range of the installed version. `compareVersions` / `PackageVersionRange.CompareVersions` are new in both engines.
- **Scene** ([Release v4.39.0](https://github.com/Cratis/Scene/releases/tag/v4.39.0)): **Gallery data**: `describeBlueprintCatalog` (C# `BlueprintCatalog.Describe`) and the `BlueprintCatalogFile` shape (`blueprintCatalog.json`): per domain blueprint its description, thumbnail, version, license, dependencies, screen set in navigation order, templates with type, category and thumbnail, and sample-data packs with the default marked. Every domain blueprint ships its entry; the repository root `blueprintCatalog.json` collects them.
- **Scene** ([Release v4.39.0](https://github.com/Cratis/Scene/releases/tag/v4.39.0)): **`blueprint-verification-fixtures.json`**, a shared corpus (27 verification cases, 5 catalog cases, 17 pin cases, 8 version comparisons) asserted by `Engine.Specs/for_Blueprints` (C#) and `engine/for_blueprints` (TypeScript), plus a specification that fails when a rule has no case.
- **Scene** ([Release v4.39.0](https://github.com/Cratis/Scene/releases/tag/v4.39.0)): **Scaffold**: `yarn new-
- **Scene** ([Release v4.38.0](https://github.com/Cratis/Scene/releases/tag/v4.38.0)): `SceneNavigationModel.moduleOf(screen)`: the host says which module a screen belongs to. Absent, the first segment of the qualified id decides, as before.
- **Scene** ([Release v4.37.0](https://github.com/Cratis/Scene/releases/tag/v4.37.0)): `approvalChainStepper`: the steps a request goes through, who decides each and where it stands. The chain applies its own rules, so a request page needs none: a rejection stops the chain and the steps after it read "Not reached"; with no step marked current the first undecided step is the current one; only one step is current. The overall outcome is stated, every step says its state in words as well as by icon and color, the current step carries `aria-current="step"`, and the list reads vertically on a phone.
- **Scene** ([Release v4.37.0](https://github.com/Cratis/Scene/releases/tag/v4.37.0)): `orgTree`: an organization as an expandable tree built from flat rows (`id`, `label`, `title`, `parentId`) as a query returns them - someone whose manager is missing becomes a root and a reporting cycle is cut instead of looping. It follows the ARIA tree pattern with one tab stop and the full keyboard set, says how many reports each person has in words, and publishes the selected id as `value`.
- **Scene** ([Release v4.37.0](https://github.com/Cratis/Scene/releases/tag/v4.37.0)): `permissionMatrix`: roles across, permissions down (optionally grouped), a checkbox where they meet, named "Grant *permission* to *role*"; every header is a real header cell. Grants of a role or permission that does not exist are ignored; changes are published as `value`. Without the edit permission each cell says "Allowed" or "Not allowed" in words and by icon. Wide matrices scroll in a keyboard-focusable region with the permission column kept in view.
- **Scene** ([Release v4.37.0](https://github.com/Cratis/Scene/releases/tag/v4.37.0)): Descriptors, categories, stories (every state, light and dark, a rejected chain, a read-only matrix), docs, and specifications for the chain rules, the tree building and the grant handling.
- **Scene** ([Release v4.37.0](https://github.com/Cratis/Scene/releases/tag/v4.37.0)): CI: the JavaScript build now installs Chromium and runs `yarn workspace @cratis/scene.blueprint.default test:browser`, which audits every foundation component in every state at desktop, tablet and phone widths in the light and dark themes with colour contrast and page overflow (Part B 6), so a regression fails the build.
- **Scene** ([Release v4.36.0](https://github.com/Cratis/Scene/releases/tag/v4.36.0)): `checklistSection`: sections of tasks with owner and due date, a labelled progress bar per section ("2 of 5 complete" is read, not only seen), "Overdue" said in words for an open task past its due day, ticking publishes the done task ids as `value`; read-only without the edit permission.
- **Scene** ([Release v4.36.0](https://github.com/Cratis/Scene/releases/tag/v4.36.0)): `activityFeed`: what happened to a record, grouped under a heading for each calendar day in a chosen time zone (newest first, or `order: ascending`), each entry naming its kind in words as well as by icon; times and days formatted for the locale. The application supplies the content; the component only lays it out.
- **Scene** ([Release v4.36.0](https://github.com/Cratis/Scene/releases/tag/v4.36.0)): `avatarStack`: overlapping avatars with initials or a picture, a "+N" chip announced as "N more", the stack labelled "N people".
- **Scene** ([Release v4.36.0](https://github.com/Cratis/Scene/releases/tag/v4.36.0)): `fileUploader`: a drop zone and a labelled button over a real file input (keyboard and screen-reader operable), checked against `accept`, `maxSizeMb` and `multiple` before anything is sent, with the reason for each refusal announced. The selection is published as `value`. Sending goes through the host's `FileUploaderHandlerProvider` - the same `(files, serverUrl) => Promise<void>` signature the PrimeReact `fileUpload` uses, so one host function serves both - with uploading, done and failed (with retry) states in words.
- **Scene** ([Release v4.36.0](https://github.com/Cratis/Scene/releases/tag/v4.36.0)): Descriptors, categories, stories (every state, light and dark), docs, specifications for each model (reading, grouping, overdue, selection checking) and each control, and the Chromium audit on desktop, tablet and phone in both themes.
- **Scene** ([Release v4.35.0](https://github.com/Cratis/Scene/releases/tag/v4.35.0)): `ApplicationHost.scope(navigation, children)`: what a host provides around everything that renders - the screen on the page and the dialog over it - inside the navigation providers.
- **Scene** ([Release v4.35.0](https://github.com/Cratis/Scene/releases/tag/v4.35.0)): `ApplicationHost.renderDialogTemplate(template, content, navigation)`: the host draws a dialog template the document declares, in place of the plain one; called inside `scope`.
- **Scene** ([Release v4.35.0](https://github.com/Cratis/Scene/releases/tag/v4.35.0)): What a host draws through `renderScreen` and `renderDialogTemplate` runs as part of the application, so a hook it uses runs under the providers `scope` put in place.
- **Scene** ([Release v4.33.0](https://github.com/Cratis/Scene/releases/tag/v4.33.0)): `chartWrapper`: line, bar, stacked bar, donut and funnel charts drawn as scalable vector graphics from the theme tokens (no chart library, so it renders in Stage, Scene and Studio alike). The drawing is hidden from assistive technology and followed by a table of the same numbers ("Chart data"); series are told apart by marker shape, dash and hatch as well as color; the chart draws at the width it is shown at, so labels keep their size on a phone. The scale, donut and funnel arithmetic are pure functions with their own specifications.
- **Scene** ([Release v4.33.0](https://github.com/Cratis/Scene/releases/tag/v4.33.0)): `filterBuilder`: field/operator/value conditions joined by AND or OR in groups nested three deep, operators by field type. The filter is published as the `value` output (`{ operator, conditions, groups }`); a bound-in `filter` is read back with conditions on unknown fields dropped and operators repaired. Read-only without the edit permission.
- **Scene** ([Release v4.33.0](https://github.com/Cratis/Scene/releases/tag/v4.33.0)): `columnChooser`: show/hide and reorder columns with buttons (no drag-and-drop needed), locked columns, Escape closes and returns focus. Publishes the ordered visible ids as `value`.
- **Scene** ([Release v4.33.0](https://github.com/Cratis/Scene/releases/tag/v4.33.0)): `savedViewsMenu`: the ARIA menu pattern (arrows, Home/End, Enter, Escape, focus returns to the button), the chosen view as `value`, and "Save current view" / "Manage views" on the `action` output, each with its own enabled/disabled/hidden permission rule.
- **Scene** ([Release v4.33.0](https://github.com/Cratis/Scene/releases/tag/v4.33.0)): Descriptors, categories, stories (every state, light and dark, every chart kind), docs in `blueprints/foundation-components.md`.
- **Scene** ([Release v4.33.0](https://github.com/Cratis/Scene/releases/tag/v4.33.0)): Chromium audit extended to the new components, including every disclosure open, on desktop, tablet and phone in both themes.
- **Scene** ([Release v4.32.0](https://github.com/Cratis/Scene/releases/tag/v4.32.0)): Foundation components in `@cratis/scene.blueprint.default` under `foundation/`: `emptyState`, `statCard`, `trendChip` and `statusChip`, registered, categorised (CMP1: Feedback / Data display), described with property descriptors (data properties accept a query result, a data context or a component output - they declare a shape, never values) and iconed.
- **Scene** ([Release v4.32.0](https://github.com/Cratis/Scene/releases/tag/v4.32.0)): The five standard states of Part B 1.4 as one frame, `FoundationFrame`: a skeleton while loading (announced, `prefers-reduced-motion` respected), an explanation with the primary action when empty, a message with a retry on error, what is missing and none of the data when the user has no permission, and the loaded part with the failed regions named when partial. A `state` property forces a state for previews; otherwise the state follows `loading`, `error`, `forbidden` and `failedRegions` and whether the component has data.
- **Scene** ([Release v4.32.0](https://github.com/Cratis/Scene/releases/tag/v4.32.0)): Cross-cutting rules of Part B 1.5 in shared helpers: every text a component says comes from a strings table merged with the element's `strings` (localization), numbers, currency and dates are formatted with `Intl` for the element's `locale`, direction-sensitive CSS uses logical properties (right to left), `density` comfortable/compact, and every action control takes an enabled/disabled/hidden permission rule (`ActionButton`; disabled stays visible and says why).
- **Scene** ([Release v4.32.0](https://github.com/Cratis/Scene/releases/tag/v4.32.0)): Theme tokens `status.{success,warning,danger,info}{Color,Background}` in both shipped themes, and the foundation section of the stylesheet, built only from theme tokens and one spacing scale.
- **Scene** ([Release v4.32.0](https://github.com/Cratis/Scene/releases/tag/v4.32.0)): `FoundationStates` and Storybook stories showing every state in the light and dark themes (and right to left).
- **Scene** ([Release v4.32.0](https://github.com/Cratis/Scene/releases/tag/v4.32.0)): Specifications: every component in every state audited with axe-core (WCAG 2.2 AA), no data leaked in the no-permission state, state derivation, strings, locale, right to left, permission rules, and a stylesheet scan that fails on a hard-coded color or spacing. `yarn test:browser` runs a Chromium audit at desktop, tablet and phone widths in both themes with colour contrast enabled (it found and fixed a contrast failure on the trend comparison).
- **Scene** ([Release v4.32.0](https://github.com/Cratis/Scene/releases/tag/v4.32.0)): Docs: `blueprints/foundation-components.md`, status tokens in `blueprints/theme-tokens.md`.
- **Screenplay** ([Release v4.181.0](https://github.com/Cratis/Screenplay/releases/tag/v4.181.0)): A model can declare `reaction batches atomic`: each trigger occurrence's direct `produces`, and each selected refusal branch's `produces`, then append all or none, so a rejected production admits none of the batch's facts, matching how Chronicle appends a reactor's returned events; invoked commands stay separate, and earlier batches and commands are kept when a later one fails (#769)
- **Screenplay** ([Release v4.181.0](https://github.com/Cratis/Screenplay/releases/tag/v4.181.0)): Executable model version 22 carries the declaration as `reactionProductionMode: "atomic"`; models without it keep per-fact production and their version, bytes and outcomes (#769)
- **Screenplay** ([Release v4.181.0](https://github.com/Cratis/Screenplay/releases/tag/v4.181.0)): `PLAY0693` reports a duplicate or conflicting `reaction batches` declaration (#769)
- **Scene** ([Release v4.31.0](https://github.com/Cratis/Scene/releases/tag/v4.31.0)): `ScenePreviewHost({ document, structure, navigation, target, sampleData, registry, invoker, ... })`: a module target renders the application shell with the module's effective navigation and its first feature, a feature target that feature in the shell, a State Change slice target its task dialog over a minimal host page (the feature's own page when it has one), a State View slice target its data fragment. Navigation keeps to an in-memory history, so a preview never touches the hosting page's address, and going to another module swaps the effective navigation (`effectiveNavigation`, not re-implemented). It reports `onBreadcrumbChange` (`Sales › Orders`) and calls `onExit` on Escape when no dialog is open - the strip itself is the embedding application's.
- **Scene** ([Release v4.31.0](https://github.com/Cratis/Scene/releases/tag/v4.31.0)): Read-only and never blank (PRV8): `diagnosePreview` judges the model with the engine's own validators and returns `PreviewProblem` entries (`code`, `severity`, `message`, `nodeId`). Errors (`targetNotFound`, `moduleWithoutFeatures`, `sliceNotPreviewable`, `screenMissing`, `layoutMissing`, `templateMissing`, `templateUnplaced`) replace the render with a problem list; warnings (`structureInvalid`, `navigationInvalid`, `toolbarInvalid`, `sampleDataInvalid`, `sliceFragmentMissing`) are reported and the preview renders. `onProblems` and `onSelectProblem` are the host's hooks.
- **Scene** ([Release v4.31.0](https://github.com/Cratis/Scene/releases/tag/v4.31.0)): Dry run (PRV5): a submitted dialog validates and sends nothing; a toast says "Command would be sent" with the payload in an expandable detail. A real `invoker` can be passed instead.
- **Scene** ([Release v4.31.0](https://github.com/Cratis/Scene/releases/tag/v4.31.0)): Sample data (PRV6): `createPreviewSampleData` asks `resolveSampleData` - bound pack, the application profile's active pack, the blueprint's default pack, generated data - for the queries the document binds and the commands its slices accept; `sessionActivePack` is the strip's session-only override of the profile's choice. The same seed gives the same rows.
- **Scene** ([Release v4.31.0](https://github.com/Cratis/Scene/releases/tag/v4.31.0)): One composition for preview and Stage (PRV9, REN2): `composeApplicationScreen` (shell, chrome, the screen inside its template chain with every arrangement applied, name resolution, effective configuration), `composeOutletScreen`, `composeDialog`, `collectDestinations`, `previewProfile`, and `ApplicationHost`, which runs it - shell, nested outlets, navigation regions, routes and dialogs. A host decides only what is its own through `CompositionOptions` and `renderScreen`. The template wrapper (`Scene:template`) and the flow arrangement view Stage kept to itself now live here, so Stage can delete its copies.
- **Scene** ([Release v4.31.0](https://github.com/Cratis/Scene/releases/tag/v4.31.0)): `SliceCommandField.initialValue`: a task dialog's field can start with a value - a preview fills it from the active sample data pack.
- **Scene** ([Release v4.31.0](https://github.com/Cratis/Scene/releases/tag/v4.31.0)): Docs: `Documentation/blueprints/previ
- **Stage** ([Release v4.113.0](https://github.com/Cratis/Stage/releases/tag/v4.113.0)): `GET /stage/status` returns an optional `notes` list with the compiler's information and warning diagnostics (code, message, source and severity), so clients can show what the engine ignored without treating it as a failure. (#430)
- **Chronicle** ([Release v19.71.0](https://github.com/Cratis/Chronicle/releases/tag/v19.71.0)): Declare a source-keyed, implicitly passive read model with `[EventStream<TSource>(stream)]`, read its stream instance through `IReadModels`, and protect decisions within the declared route. (#4932)
- **Chronicle** ([Release v19.71.0](https://github.com/Cratis/Chronicle/releases/tag/v19.71.0)): CHR0064 identifies invalid stream declarations and attribute misuse, with a monthly-withdrawal guide showing guarded decisions and plain queries. (#4932)
- **Arc** ([Release v22.102.0](https://github.com/Cratis/Arc/releases/tag/v22.102.0)): The Screenplay generator now recovers per-production `for` and `stream` routes for commands that return `EventForEventSourceId` wrappers, as single results, collections, tuples, or mixed with plain events, so each production keeps its own event source and stream in the generated model instead of the command's default route. Wrappers whose destination cannot be proven (for example copies made with `with`) are withheld and keep reporting SP0051 or SP0054. See [Generating a Screenplay](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/generating-a-screenplay.md). (#3299)
- **Stage** ([Release v4.111.0](https://github.com/Cratis/Stage/releases/tag/v4.111.0)): Stage converts Screenplay's `sample data` packs and a `ui profile`'s `sample data` selection to Scene's sample data model. A pack becomes a `SampleDataPack` owned by the user, with a lower-case hyphenated id derived from its name (`NordicDemo` becomes `nordic-demo`), its title, locale and rows with the authored literals; the profile's active pack, shape mappings and read model bindings are carried as the profile's `SampleDataSelection`. `active blueprint <id>` keeps the blueprint's id as written and is resolved by the build. Sample data is design and preview time only and never reaches a production build. (#406)
- **Stage** ([Release v4.111.0](https://github.com/Cratis/Stage/releases/tag/v4.111.0)): The render plan reports Scene's own sample data validation as `SampleDataInvalid` findings, for example two pack names that derive the same id or an invalid locale. See the [render plan findings](https://github.com/Cratis/Stage/blob/main/Documentation/reference/render-plans.md#findings).
- **Stage** ([Release v4.111.0](https://github.com/Cratis/Stage/releases/tag/v4.111.0)): The Billing sample declares a pack and selects it once in the desktop profile.
- **Stage** ([Release v4.110.0](https://github.com/Cratis/Stage/releases/tag/v4.110.0)): Stage converts a Screenplay application's `navigation topbar|sidebar` regions to Scene's navigation model: the application's regions and logo from the layout, and each module's `inherits`/`extends`/`overrides` region, with item targets, slots, icons and sub-items. A document without regions serializes exactly as before. (part of #406)
- **Stage** ([Release v4.110.0](https://github.com/Cratis/Stage/releases/tag/v4.110.0)): Toolbar `button`s become toolbar items that carry the slice, emphasis and icon the Scene engine reads, with the slice written as its qualified id.
- **Stage** ([Release v4.110.0](https://github.com/Cratis/Stage/releases/tag/v4.110.0)): Template assignments, own and blueprint with their version range, are carried as Scene template references, and the slice kinds of a `scopes slice` template travel in its metadata.
- **Stage** ([Release v4.110.0](https://github.com/Cratis/Stage/releases/tag/v4.110.0)): The render plan reports Scene's own structure, navigation and toolbar validation as findings - `StructureInvalid`, `NavigationInvalid` and `ToolbarButtonInvalid` - for example a navigation target that does not exist, or a toolbar button that names a State View slice. See the [render plan findings](https://github.com/Cratis/Stage/blob/main/Documentation/reference/render-plans.md#findings).
- **AI** ([Release v7.57.0](https://github.com/Cratis/AI/releases/tag/v7.57.0)): Guidance for decision reads: `Chronicle.decide/2`, `DecisionReads.get/2`, `get_detached/2` and `admit/2`, the `DecisionConflict` retry, and which read model shapes cannot be guarded.
- **AI** ([Release v7.57.0](https://github.com/Cratis/AI/releases/tag/v7.57.0)): Guidance for `ConcurrencyScope` builders, `at_tail/2`, `expecting_no_matching_event/1` and the `concurrency: [default: :optimistic]` client option.
- **AI** ([Release v7.57.0](https://github.com/Cratis/AI/releases/tag/v7.57.0)): Guidance for `Chronicle.Testing` (`Case`, assertions, `wait_for_observers/1`, `Integration.setup_isolated_client/2`) and what the in-memory kernel does not model.
- **AI** ([Release v7.57.0](https://github.com/Cratis/AI/releases/tag/v7.57.0)): Guidance for captures, standalone constraint modules, `remove_constraint/2` and `ConstraintViolation.details/1`.
- **AI** ([Release v7.57.0](https://github.com/Cratis/AI/releases/tag/v7.57.0)): Guidance for the discovery report, `:drift_policy`, id pinning, `mix chronicle.discover`, `generation_for:`, `strict_validation` and pinned generation delivery.
- **AI** ([Release v7.57.0](https://github.com/Cratis/AI/releases/tag/v7.57.0)): Guidance for `children` collections (one-line form, `removed_with_join/2`, `clear_with/2`, unique nested ids), read model `subscribe/2` and `observe_stream/2`, `Chronicle.Projections` `query/2`, `preview/2` and `wait_for/3`, `Chronicle.Patterns`, prepared events, and OpenTelemetry and `:telemetry` events.
- **AI** ([Release v7.57.0](https://github.com/Cratis/AI/releases/tag/v7.57.0)): An evaluation task for decision reads and a trigger query for in-memory testing.
- **Fundamentals** ([Release v7.25.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.25.0)): `GenerateValue.Pattern(pattern, checksum)` and `GenerateValue.Pattern(pattern, context, checksum)` generate a value from a pattern such as `ORD-[A-HJ-NP-Z2-9]{4}-#{4,6}` or `INV-{yyyy}-#{7}`. Every distinct value the pattern allows is equally likely, date segments come from `context.Now` in UTC, and an optional `Checksum` (`Luhn`, `Mod11`, `Mod97`) appends check digits; `Mod11` never produces the excluded check value 10. See [Patterns](https://github.com/Cratis/Fundamentals/blob/main/Documentation/csharp/generating-values/patterns.md). (part of #1176)
- **Fundamentals** ([Release v7.25.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.25.0)): `GenerateValue.Integer(minimum, maximum)` draws an unbiased number from an inclusive `long` range, including the full `long` range. (part of #1176)
- **Fundamentals** ([Release v7.25.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.25.0)): `GenerateValue.HasValidChecksum(value, checksum)` checks that a value ends with the correct Luhn, mod 11 or ISO 7064 MOD 97-10 check digits. (part of #1176)
- **AI** ([Release v7.56.3](https://github.com/Cratis/AI/releases/tag/v7.56.3)): The Arc command skill teaches `ICommandExceptionMapper` for turning an integration's exceptions into a `CommandResult`, including declining, rollback and correlation behavior. (#710)
- **Screenplay** ([Release v4.180.0](https://github.com/Cratis/Screenplay/releases/tag/v4.180.0)): Top-level `sample data <Name>` block: optional `title`, optional BCP 47 `locale`, and `shape <ReadModel>` blocks of `row` blocks with `<field> = <literal>` lines (string, number, `true`, `false`, `null`). Design and preview time only: binding reports it as deferred (`PLAY0269`), it adds nothing to the executable model or ESM output and is never part of a production build.
- **Screenplay** ([Release v4.180.0](https://github.com/Cratis/Screenplay/releases/tag/v4.180.0)): The `ui profile` gains an optional `sample data` block: `active <Pack>` or `active blueprint <id>`, the rare `shape <Shape> maps to <ReadModel>` and `bind <ReadModel> to <Pack>`. The active pack is chosen once, there, for the whole application; there is no per-screen, per-slice or per-component selector (decision 0081, which supersedes the spec's per-screen placement).
- **Screenplay** ([Release v4.180.0](https://github.com/Cratis/Screenplay/releases/tag/v4.180.0)): Diagnostics `PLAY0702`-`PLAY0715`: invalid or duplicate pack, repeated title, locale, shape, field or selection line, a shape naming no read model (warning), a field that is not a property of the read model, a literal that does not fit the property type, an active, mapped or bound pack or read model the document does not declare.
- **Screenplay** ([Release v4.180.0](https://github.com/Cratis/Screenplay/releases/tag/v4.180.0)): The canonical printer, the syntax walker and index, the folder merge, the typed JSON schema, the contract catalogue (`sample` construct, admission probe), the MCP `read-ast`/`propose-ast` typed nodes (`SampleDataPackSyntax`, `SampleDataSelectionSyntax`, `SampleDataSetSyntax`, `SampleDataRowSyntax`, `SampleDataFieldSyntax`, ...) and the canonical screen composition corpus all carry sample data.
- **Screenplay** ([Release v4.180.0](https://github.com/Cratis/Screenplay/releases/tag/v4.180.0)): Monaco (highlighting, hover, completion in the root, the pack, its shapes and the profile block) and the VS Code grammar and spelling dictionary know the new words; the TypeScript compiler skips the block whole.
- **Screenplay** ([Release v4.180.0](https://github.com/Cratis/Screenplay/releases/tag/v4.180.0)): Documentation page `sample-data.md` (grammar, `ui-profile.md`, `diagnostics.md`), the Invoicing sample and decision 0081.
- **Screenplay** ([Release v4.179.0](https://github.com/Cratis/Screenplay/releases/tag/v4.179.0)): Toolbar buttons that invoke State Change slices. A screen `toolbar` accepts `button <id> title "<text>" [slice <Module>.<Feature>.<Slice>] [emphasis primary|secondary|quiet] [icon <name>]` beside its `item` entries - the Screenplay form of Scene's `ToolbarButton`. The slice names the command and the dialog that opens over the page, so the button needs no command of its own. `slice` is a dotted path or any unambiguous suffix; the title is a quoted string or a `$strings.<key>` token. See [Toolbar buttons](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/screens.md#toolbar-buttons).
- **Screenplay** ([Release v4.179.0](https://github.com/Cratis/Screenplay/releases/tag/v4.179.0)): Diagnostics `PLAY0760`-`PLAY0765`: a malformed button line, a slice the document does not declare, a slice that is not a State Change slice (a button invokes State Change slices only), a button without a slice (warning), an ambiguous slice reference, and a duplicate id. They mirror Scene's `toolbarButtonSliceNotFound`, `toolbarButtonSliceNotStateChange` and `toolbarButtonSliceEmpty`.
- **Screenplay** ([Release v4.179.0](https://github.com/Cratis/Screenplay/releases/tag/v4.179.0)): The syntax tree carries `ToolbarButtonSyntax` on `ScreenToolbarSyntax.Buttons`; it is omitted from the JSON when empty, so existing documents keep their bytes. The printer round-trips every button, and the TypeScript compiler reads buttons into the same tree with a shared conformance vector (`toolbar-buttons`).
- **Screenplay** ([Release v4.179.0](https://github.com/Cratis/Screenplay/releases/tag/v4.179.0)): Monaco and VS Code highlight, document and complete buttons; the Invoicing sample uses them.
- **Chronicle.Go** ([Release v0.11.0](https://github.com/Cratis/Chronicle.Go/releases/tag/v0.11.0)): `reactors.StartAtTail()` option. The first time Chronicle sees the reactor, it begins at the tail of the event sequence and observes only what is appended afterwards. A reactor that already has a position keeps it, and an explicit replay still replays from the beginning. See https://github.com/Cratis/Chronicle.Go/blob/main/Documentation/reactors.md#skipping-history-on-first-registration. (part of Cratis/Direct#1875)
- **Chronicle.Go** ([Release v0.11.0](https://github.com/Cratis/Chronicle.Go/releases/tag/v0.11.0)): Generated contracts for the new Chronicle `occurrences` service.
- **Chronicle.Kotlin** ([Release v6.15.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.15.0)): `@StartAtTail` annotation for reactor classes. The first time Chronicle sees the reactor, it begins at the tail of the event sequence and observes only what is appended afterwards. A reactor that already has a position keeps it. See https://github.com/Cratis/Chronicle.Kotlin/blob/main/Documentation/reference/annotations.md#startattail. (part of Cratis/Direct#1875)
- **Chronicle.TypeScript** ([Release v6.53.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.53.0)): `@startAtTail()` class decorator for reactors. The first time Chronicle sees the reactor, it begins at the tail of the event sequence and observes only what is appended afterwards. A reactor that already has a position keeps it. See https://github.com/Cratis/Chronicle.TypeScript/blob/main/Documentation/reactors.md#start-at-the-tail. (part of Cratis/Direct#1875)
- **Chronicle.Elixir** ([Release v3.14.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.14.0)): `start_at_tail: true` option on `use Chronicle.Reactors.Reactor`. The first time Chronicle sees the reactor, it begins at the tail of the event sequence and observes only what is appended afterwards. A reactor that already has a position keeps it. See https://github.com/Cratis/Chronicle.Elixir/blob/main/Documentation/reactors.md#starting-at-the-tail. (part of Cratis/Direct#1875)
- **Screenplay** ([Release v4.178.0](https://github.com/Cratis/Screenplay/releases/tag/v4.178.0)): Navigation regions in the language. A `layout` declares the application's `navigation topbar` and `navigation sidebar` with an optional `logo image "<path>" title "<text>"` and `item <id> title "<text>" [icon <name>] [target <Module>[.<Feature>]] [slot <name>]` lines; sidebar items nest sub-items. A `module` declares only what it changes: `navigation sidebar extends`, `navigation topbar overrides`, or `inherits` (the default when absent). The blocks are the Screenplay form of Scene's `NavigationModel`; `contribute to Navigation` stays valid and independent. See the new [Navigation regions](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/navigation.md) page.
- **Screenplay** ([Release v4.178.0](https://github.com/Cratis/Screenplay/releases/tag/v4.178.0)): Diagnostics `PLAY0740`-`PLAY0752` for malformed blocks and items, duplicate regions, application-only logos, modes where they are not allowed, topbar sub-items, and the findings that mirror Scene's `navDuplicateId`, `navTargetMissing`, `navSlotUnknown`, `navTargetOutOfScope` and `navModuleWithoutFeatures`, plus a warning for an override without items.
- **Screenplay** ([Release v4.178.0](https://github.com/Cratis/Screenplay/releases/tag/v4.178.0)): The syntax tree carries `NavigationRegionSyntax`, `NavigationItemSyntax`, `NavigationTargetSyntax` and `NavigationLogoSyntax` on `LayoutSyntax.Navigation` and `ModuleSyntax.Navigation`. They are omitted from the JSON when empty, so existing documents keep their bytes. The printer round-trips every item, id, icon, slot, target and mode; the executable model reports the blocks as deferred (`PLAY0269`).
- **Screenplay** ([Release v4.178.0](https://github.com/Cratis/Screenplay/releases/tag/v4.178.0)): Monaco and VS Code highlight, document and complete the new words and blocks; the Invoicing sample uses them.
- **Screenplay** ([Release v4.177.0](https://github.com/Cratis/Screenplay/releases/tag/v4.177.0)): `template blueprint <Blueprint> <Name> [version "<range>"]` references a template a blueprint package ships, beside the own `template <Name>`. It is valid wherever `template` is: as a module, feature or slice assignment and inside a screen. The optional `version` is the semver range of the blueprint the author accepts - Scene's subset (`*`, an exact version, `^`, `~`, `>=`, `>`, `<=`, `<`), the same one Scene's `TemplateReference.version` and `resolveTemplateReference` use. `PLAY0721` reports a range Scene cannot read; `PLAY0722` reports a blueprint no `ui profile` lists under `packages` (checked only when a profile declares packages). Version drift and unknown blueprint templates are reported where the blueprint is installed (Scene `TemplateReferenceResolver`), because the compiler cannot see a package's catalog.
- **Screenplay** ([Release v4.177.0](https://github.com/Cratis/Screenplay/releases/tag/v4.177.0)): `scopes slice statechange`, `scopes slice stateview` and `scopes slice statechange|stateview` narrow a slice-scoped template to slice kinds - Scene's `TemplateMetadata.sliceKinds`. Using a restricted template on an excluded slice kind, or on an automation or translate slice (which present nothing), is `PLAY0631`. The conformance vector `when_checking_template_applicability_against_the_scene_vectors` restates the cases of Scene's shared `template-applicability-fixtures.json` (`ApplicableTemplates`) as Screenplay source.
- **Screenplay** ([Release v4.177.0](https://github.com/Cratis/Screenplay/releases/tag/v4.177.0)): `PLAY0720` (warning): a `layout`, `screen template` or `dialog template` without a `category`. A blueprint package build treats warnings as errors, so there it fails; an own template only warns. (#761)
- **Screenplay** ([Release v4.177.0](https://github.com/Cratis/Screenplay/releases/tag/v4.177.0)): The new members round-trip through the C# and TypeScript compilers, the printer (including comments on `category`), the syntax schema and the MCP contract; keywords, hover documentation and diagnostics reach Monaco and the VS Code grammar; the TypeScript compiler and C# are held to the same `template-references` conformance vector. (#761)
- **Chronicle** ([Release v19.70.0](https://github.com/Cratis/Chronicle/releases/tag/v19.70.0)): `[StartAtTail]` attribute for .NET reactors. The first time Chronicle sees the reactor, it begins at the tail of the event sequence and observes only what is appended afterwards. A reactor that already has a position keeps it, so the attribute is safe to leave in place. See https://github.com/Cratis/Chronicle/blob/main/Documentation/reactors/start-at-tail.mdx. (part of Cratis/Direct#1875)
- **Chronicle** ([Release v19.70.0](https://github.com/Cratis/Chronicle/releases/tag/v19.70.0)): Optional `StartAtTail` field on the reactor definition in the gRPC contract. Clients that do not send it behave as before.
- **Stage** ([Release v4.109.0](https://github.com/Cratis/Stage/releases/tag/v4.109.0)): Stage admits ESM v20 models: a concept that declares `generate` may carry validation rules, and the rendered concept has both its `New()` factory and its `ConceptValidator`. ESM v21 is still refused. (#393)
- **Stage** ([Release v4.109.0](https://github.com/Cratis/Stage/releases/tag/v4.109.0)): A rendered specification that uses a rule-bearing generated concept must pin its generated value, and a pinned value that fails the concept's rules is refused with `STAGE-ESM-011`. (#393)
- **Stage** ([Release v4.109.0](https://github.com/Cratis/Stage/releases/tag/v4.109.0)): A generated concept rule with warning or information severity is refused with `STAGE-ESM-038`, because the rendered application only rejects error-severity failures. (#393)
- **Scene** ([Release v4.30.0](https://github.com/Cratis/Scene/releases/tag/v4.30.0)): `SliceInvoker` (`invoke(sliceId, payload, command)` returning an `InvocationResult` with `succeeded`, `validationErrors`, `message`, `payload`, `dryRun`), `SliceInvokerProvider` and `useSliceInvoker`. Without a provider the command is announced as `cratis.scene.command`, as a toolbar action always was (`createAnnouncingInvoker`).
- **Scene** ([Release v4.30.0](https://github.com/Cratis/Scene/releases/tag/v4.30.0)): `createDryRunInvoker({ onInvoked, validate })`: validates, sends nothing and returns a result carrying the would-be payload, for the Studio preview's toast (PRV5).
- **Scene** ([Release v4.30.0](https://github.com/Cratis/Scene/releases/tag/v4.30.0)): `SliceDialogView` and the `core:sliceDialog` component: a modal card with the button title, the subtitle `State Change · <Slice>`, a labelled field per command property, `Cancel` and a submit button labelled with the title. The first field takes focus, Tab stays inside, Escape cancels and focus returns to the button. Required fields are checked before invoking, and the validation errors an invoker reports are shown against their fields (`aria-invalid`, `aria-describedby`) or for the whole form. Success closes the dialog and signals the result.
- **Scene** ([Release v4.30.0](https://github.com/Cratis/Scene/releases/tag/v4.30.0)): `SliceCommandFieldsProvider`: the host tells the dialog a command's fields, so `@cratis/scene.react` stays free of Arc and transport imports.
- **Scene** ([Release v4.30.0](https://github.com/Cratis/Scene/releases/tag/v4.30.0)): `core:toolbarItem` resolves its slice against the navigation model, opens the dialog `sliceDialogFor` picked through the navigation host (`sliceDialogDestination`; an authored `dialogs` template wins over the built-in dialog), carries its `emphasis` as `data-scene-emphasis` and `scene-toolbar-button-<emphasis>`, and shows a warning badge for a button without a slice only when the host asks (`SliceInvokerProvider warnEmptySlices`, implied by a dry-run invoker). Without a navigation model it announces the command as before.
- **Scene** ([Release v4.30.0](https://github.com/Cratis/Scene/releases/tag/v4.30.0)): `SceneNavigationHost` carries the dialog's parameters (`currentDialogParameters`) and names the dialog after its title.
- **Scene** ([Release v4.30.0](https://github.com/Cratis/Scene/releases/tag/v4.30.0)): `blueprint.default` styles the primary, secondary and quiet buttons, the warning badge and the dialog over its scrim, and has a Storybook story.
- **Scene** ([Release v4.30.0](https://github.com/Cratis/Scene/releases/tag/v4.30.0)): Docs: "Running a slice button: the task dialog and the `sliceInvoker`" in `blueprints/application-hierarchy.md`.
- **Scene** ([Release v4.29.0](https://github.com/Cratis/Scene/releases/tag/v4.29.0)): `NavigationRegionView` in `@cratis/scene.react`, driven by `effectiveNavigation(...)` for the module of the screen on the page, so a module swap recomputes the items in place without remounting the `nav`. A sidebar nests, collapses and expands the parents of the active item (`expand='all'` shows everything); a topbar is flat.
- **Scene** ([Release v4.29.0](https://github.com/Cratis/Scene/releases/tag/v4.29.0)): Active state follows the navigation host: an item is active (`aria-current`, `data-active`) when the screen it opens is shown in the slot it renders into, so items rendering into different slots are active at once.
- **Scene** ([Release v4.29.0](https://github.com/Cratis/Scene/releases/tag/v4.29.0)): Render-into-slot: activating an item calls `navigate` with `navigationItemDestination(item)` (module/feature identity, screen, slot as `outlet`). `navigationDestinations(...)` lists every destination so deep links resolve.
- **Scene** ([Release v4.29.0](https://github.com/Cratis/Scene/releases/tag/v4.29.0)): `SceneNavigationHost` takes `navigationModel` (structure, navigation, `screenFor`, `isVisible`) and a `frame` that wraps the primary outlet in chrome that stays mounted across navigation; `SceneNavigationModelProvider` does the same without a host.
- **Scene** ([Release v4.29.0](https://github.com/Cratis/Scene/releases/tag/v4.29.0)): Hooks for the layers around it: `isVisible(item)` hides items (never disables), items carry `data-origin` / `data-read-only`, and `renderAdornment(item)` lets Studio draw the lock of an inherited item. No design chrome is rendered.
- **Scene** ([Release v4.29.0](https://github.com/Cratis/Scene/releases/tag/v4.29.0)): Keyboard: roving tab stop, arrows (left/right in a topbar, up/down in a sidebar), Home/End, and right/left to expand/collapse a sidebar parent.
- **Scene** ([Release v4.29.0](https://github.com/Cratis/Scene/releases/tag/v4.29.0)): `blueprint.default` `Topbar` and `Sidebar` show the region as the shell menu (the `layout-menu` classes, with the active underline and pill of the specification) when a navigation model is in scope and the element has no `menu` / `content` slot of its own; `regionNavigation: false` opts out. A Storybook story shows the hierarchical sidebar and two slots.
- **Scene** ([Release v4.29.0](https://github.com/Cratis/Scene/releases/tag/v4.29.0)): Docs: "Rendering the regions" in `blueprints/navigation-regions.md`.
- **Screenplay** ([Release v4.176.0](https://github.com/Cratis/Screenplay/releases/tag/v4.176.0)): Warning PLAY0694 when a Translate slice without `direction` has a reaction (without a `from` route) to an event that a capture in the same slice appends, including appends in capture children and nested scopes. The message names the events and tells you to keep the capture in the Translate slice and move the reaction to an Automation slice; there is no automatic repair. Ordinary compilation is unaffected, but builds that treat warnings as errors (for example `--warnaserror`) fail on such models until the slice is split. Both compilers and the editors report it. See [decision 0079](https://github.com/Cratis/Screenplay/blob/main/decisions/0079-warn-when-a-directionless-translate-slice-reacts-to-its-own-capture.md) and [PLAY0694](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/diagnostics.md). (#760)
- **Chronicle** ([Release v19.69.0](https://github.com/Cratis/Chronicle/releases/tag/v19.69.0)): Kernel occurrence queue: triggers register with a JSON payload schema, `RecordOccurrence` stores each occurrence once per idempotency id (`Recorded`, `AlreadyRecorded`, `OccurrenceIdConflict`, `OccurrencePayloadInvalid`), and workers claim, renew, complete and fail occurrences under leases fenced by an epoch. A superseded worker gets `OccurrenceLeaseLost`; a repeated completion gets `AlreadyCompleted`. (part of #4911)
- **Chronicle** ([Release v19.69.0](https://github.com/Cratis/Chronicle/releases/tag/v19.69.0)): Failed occurrences back off and are quarantined after the configured maximum attempts without blocking later occurrences; `RetryQuarantinedOccurrence` re-arms one and records the authenticated principal. Retry settings live in the new `Occurrences` configuration section, documented at https://github.com/Cratis/Chronicle/blob/main/Documentation/configuration/chronicle-options.mdx. (part of #4911)
- **Chronicle** ([Release v19.69.0](https://github.com/Cratis/Chronicle/releases/tag/v19.69.0)): A disconnected client's leases expire, and occurrence queues resume after a kernel restart. `GetOccurrence` and `ObserveOccurrences` report state, attempts, lease, last error, next attempt and the receipts written for an occurrence, with their namespace. (part of #4911)
- **Chronicle** ([Release v19.69.0](https://github.com/Cratis/Chronicle/releases/tag/v19.69.0)): Effect receipts: every append command (`Append`, `AppendMany`, `AppendManyForEventSources` and their named-tag variants) accepts an optional effect receipt that is written in the same storage transaction as the events. A repeated effect returns `EffectAlreadyRecorded` with the stored outcome and response and appends nothing. A zero-event append with concurrency scopes records a `NoEvents` receipt only when the scopes hold. `RecordEffectReceipt` records a `NoEvents` or `Refused` outcome on its own, and `GetEffectReceipt` reads one back. An unknown commit result is settled by lookup, or fails retryably with `EffectReceiptUnsettled`. See https://github.com/Cratis/Chronicle/blob/main/Documentation/concepts/effect-receipts.md. (part of #4911)
- **Chronicle** ([Release v19.69.0](https://github.com/Cratis/Chronicle/releases/tag/v19.69.0)): The kernel advertises the `occurrences` and `effect-receipts` capabilities, and the new `Occurrences` gRPC service is part of the generated Kotlin, TypeScript and Elixir contracts. (part of #4911)
- **Scene** ([Release v4.28.0](https://github.com/Cratis/Scene/releases/tag/v4.28.0)): `ToolbarButton` (`id`, `title`, `slice`, `emphasis`, `icon`, `target`), `Toolbar` and `ToolbarEmphasis` (`primary`, `secondary`, `quiet`) in `Cratis.Scene.Model.Toolbar` and `@cratis/scene.model`, mirrored in `scene-model-shape.json`. A spec button is a `core:toolbarItem` with `kind: Action` plus `slice` and `emphasis`.
- **Scene** ([Release v4.28.0](https://github.com/Cratis/Scene/releases/tag/v4.28.0)): `validateToolbarButtons` / `ToolbarButtonValidation.Validate` with `toolbarButtonSliceNotFound` and `toolbarButtonSliceNotStateChange` (errors) and `toolbarButtonSliceEmpty` (warning for a button without a slice).
- **Scene** ([Release v4.28.0](https://github.com/Cratis/Scene/releases/tag/v4.28.0)): `sliceDialogFor` / `SliceDialogs.For` and `resolveToolbarButton` / `ToolbarButtons.Resolve`: a slice-backed button resolves to its command and task dialog - the slice's own `dialogTemplate`, else the default `FormDialog` - so the dialog is decided once, in Scene.
- **Scene** ([Release v4.28.0](https://github.com/Cratis/Scene/releases/tag/v4.28.0)): `toolbarButtonFromItem` / `ToolbarButtons.FromItem` read a button from a `core:toolbarItem`'s properties, and `normalizeToolbarButton` converts a hand-authored `kind: Action` + `target` command to the one state change slice that accepts it. A command no single slice accepts stays a legacy button and still validates.
- **Scene** ([Release v4.28.0](https://github.com/Cratis/Scene/releases/tag/v4.28.0)): `SliceNode.command` and `SliceNode.dialogTemplate`, and `ApplicationStructureIndex.findSlicesByCommand`.
- **Scene** ([Release v4.28.0](https://github.com/Cratis/Scene/releases/tag/v4.28.0)): The `core:toolbarItem` descriptor: title, `slice` (editor `slice`, kinds `StateChange`), `emphasis` (enum chips), `icon` and the legacy `target`.
- **Scene** ([Release v4.28.0](https://github.com/Cratis/Scene/releases/tag/v4.28.0)): `toolbar-slice-fixtures.json` (state change ok, state view and automation rejected, missing slice, empty slice warning, dialog template resolution, conversion from a `target` command, reading buttons from items) asserted by both `Engine.Specs/for_ToolbarButtonValidation` and `engine/for_validateToolbarButtons`.
- **Scene** ([Release v4.28.0](https://github.com/Cratis/Scene/releases/tag/v4.28.0)): The toolbar section of `blueprints/application-hierarchy.md` documents the button, validation, resolution and compatibility.
- **Screenplay** ([Release v4.174.0](https://github.com/Cratis/Screenplay/releases/tag/v4.174.0)): `RuleConsistency.Check(SemanticConcept concept, int? utcAssessmentYear = null)` returns the compiler's proof status for each validation rule of a generated concept, in rule order, from a deserialized executable model. A renderer can let a concept whose rules are all Proven use unpinned generation and keep requiring pinned fixtures only for Unproven rules. The status is deliberately not serialized: it is derived from the concept and the UTC assessment year. See [proof status for renderers](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/generated-values/strategies.md#proof-status-for-renderers). (#775)
- **Scene** ([Release v4.27.0](https://github.com/Cratis/Scene/releases/tag/v4.27.0)): `NavigationModel`, `ApplicationNavigation`, `ModuleNavigation`, `NavigationRegion` (`topbar`/`sidebar`, `inherit`/`extend`/`override`), `NavItem` (`id`, `title`, `icon`, `target`, `slot`, `children`) and `ApplicationLogo` in `Cratis.Scene.Model.Navigation` and `@cratis/scene.model`, mirrored in `scene-model-shape.json`.
- **Scene** ([Release v4.27.0](https://github.com/Cratis/Scene/releases/tag/v4.27.0)): `effectiveNavigation` / `EffectiveNavigation.Resolve`: the ordered items of a region for the application or a module, each with `origin` (application | module), `readOnly`, a `reason` and its target resolved against the application structure (a module target goes to the module's first feature), plus the region's effective `mode` and `sources` tag (`defined here`, `inherited`, `Application + Sales`, `Sales only`). Sub-items are sidebar-only.
- **Scene** ([Release v4.27.0](https://github.com/Cratis/Scene/releases/tag/v4.27.0)): Edit helpers `switchRegionMode` (inherit clears the module items; inherit → override with `copy` copies the application items first), `addNavItem` (adding to an inheriting region switches it to extend first; sub-items under a parent) and `setApplicationLogo` (refused for a module), with `applyNavigationEdits`.
- **Scene** ([Release v4.27.0](https://github.com/Cratis/Scene/releases/tag/v4.27.0)): `diagnoseNavigationRegions` and the new diagnostic codes `navTargetMissing`, `navSlotUnknown`, `navDuplicateId`, `navModuleWithoutFeatures` and `navTargetOutOfScope`; `diagnoseNavigation` runs them when its graph carries `structure` and `navigation`.
- **Scene** ([Release v4.27.0](https://github.com/Cratis/Scene/releases/tag/v4.27.0)): The `replace` collection operation and `InstanceContribution.replaceOwnerItems`: an instance can hide the items it inherits so only its own remain. It is how `override` is expressed in the exposure model. Without `replace` exposed the contribution is ignored and reported, and the server check refuses a document that sets it.
- **Scene** ([Release v4.27.0](https://github.com/Cratis/Scene/releases/tag/v4.27.0)): Shared fixtures `navigation-inheritance-fixtures.json` and `navigation-targets-fixtures.json`, the new codes in `navigation-diagnostic-fixtures.json` and two server cases in `document-change-fixtures.json`, asserted by both the C# and the TypeScript engines.
- **Scene** ([Release v4.27.0](https://github.com/Cratis/Scene/releases/tag/v4.27.0)): The documentation page `blueprints/navigation-regions.md`; the exposure and navigation diagnostics pages are extended.
- **Scene** ([Release v4.26.0](https://github.com/Cratis/Scene/releases/tag/v4.26.0)): Sample-data model in C# and TypeScript (and `scene-model-shape.json`): `SampleDataPack`, `SampleShape`, `SampleShapeField`, `SampleFieldKind`, `SampleDataSelection` and `ScenePackage.sampleData` (a Blueprint package ships its packs as `sampleData/*.json`).
- **Scene** ([Release v4.26.0](https://github.com/Cratis/Scene/releases/tag/v4.26.0)): `UiProfile.sampleData` selects the active pack once for the whole application (own or from a blueprint), plus the rare shape-to-read-model mappings and per-read-model bindings. There is no per-screen, slice or component selector; the preview strip's choice is the session-only `sessionActivePack` of the resolve context.
- **Scene** ([Release v4.26.0](https://github.com/Cratis/Scene/releases/tag/v4.26.0)): `resolveSampleData` / `SampleDataResolver.Resolve` implement the resolution order bound pack, UI profile active pack (or session override), blueprint default pack, generated data; nothing resolves unless `isDesignOrPreview` is true, so a Stage production build gets no sample data.
- **Scene** ([Release v4.26.0](https://github.com/Cratis/Scene/releases/tag/v4.26.0)): `generateSample` / `SampleDataGenerator.Generate`: a seeded xoshiro128** generator typed by field kind (ids, names, companies, emails, phones, cities, text, numbers, amounts, booleans, dates, enums), honouring nullability, `min`/`max` and pack locale (`en-GB`, `en-US`, `nb-NO`, `sv-SE`, `de-DE`), byte-identical in both engines for a seed.
- **Scene** ([Release v4.26.0](https://github.com/Cratis/Scene/releases/tag/v4.26.0)): `validateSampleDataPack`, `validateSampleDataSelection`, `validateSampleDataPackages` and `describeSampleDataCatalog` (C#: `SampleDataValidation`, `SampleDataCatalogs`) check what blueprint packages ship and build the selector content (generated, own, then each blueprint's group).
- **Scene** ([Release v4.26.0](https://github.com/Cratis/Scene/releases/tag/v4.26.0)): `findDescriptorSampleRowLiterals` / `findTemplateSampleRowLiterals` detect row literals in component descriptors and templates; `verify-package-contents.js` fails when sample data is packed outside `sampleData/`.
- **Scene** ([Release v4.26.0](https://github.com/Cratis/Scene/releases/tag/v4.26.0)): `sample-data-resolution-fixtures.json`, asserted independently by `Engine.Specs/for_SampleData` and `engine/for_sampleData`, and the documentation page `blueprints/sample-data.md`.
- **Scene** ([Release v4.25.0](https://github.com/Cratis/Scene/releases/tag/v4.25.0)): `ApplicableTemplates.Compute` / `applicableTemplates(library, target)`: own templates by category, then only the blueprints that have at least one applicable template (TPL2). A target is a scope, an optional slice kind, the container whose slots the template must fit, and the chain of templates already chosen above (no loops, TPL6). It composes `TemplateApplicability` and `ScreenTemplateResolver` with the per-level defaults of spec 4.2; explicit `scopes`/`sliceKinds` override and category never implies a scope. `ApplicableTemplates.Validate` / `validate*ForTarget` give the reason a template does not apply.
- **Scene** ([Release v4.25.0](https://github.com/Cratis/Scene/releases/tag/v4.25.0)): `TemplateReference` (`source` Own | Blueprint, `id`, `blueprint`, `version` semver range, default `^<installed>`) and `TemplateReferenceResolver.Resolve` / `resolveTemplateReference` with `Resolved`, `Malformed`, `UnknownBlueprint`, `VersionNotSatisfied` (drift) and `UnknownTemplate`.
- **Scene** ([Release v4.25.0](https://github.com/Cratis/Scene/releases/tag/v4.25.0)): `TemplateMetadata.sliceKinds` (reusing `SliceKind` from the application structure) narrows which slice kinds a template applies to.
- **Scene** ([Release v4.25.0](https://github.com/Cratis/Scene/releases/tag/v4.25.0)): Catalog entries carry `warnings`.
- **Scene** ([Release v4.24.0](https://github.com/Cratis/Scene/releases/tag/v4.24.0)): `ComponentDescriptor` gains `category`, `icon` (an `IconReference`), `badge`, `keywords` and `designMode`. `ComponentCategory` holds the eight categories of the spec (Navigation, Data display, Input, Actions, Layout, Feedback, Overlay, Forms); a package may add its own.
- **Scene** ([Release v4.24.0](https://github.com/Cratis/Scene/releases/tag/v4.24.0)): `ComponentDesignModeDescriptor` declares, as data, where a component's items are (`itemsPath`, a `Collection` property), the "add" affordances and the floating item toolbar. `availability` and `readOnlyReason` are rule names, never functions; every edit is an ordinary collection edit, so undo/redo and the dirty state need nothing of their own. `navigationDesignMode()` and `toolbarDesignMode()` build the actions of spec DM3.
- **Scene** ([Release v4.24.0](https://github.com/Cratis/Scene/releases/tag/v4.24.0)): The property-editor vocabulary (`PropertyEditorKind`: `text`, `number`, `boolean`, `enum`, `select`, `color`, `icon`, `list`, `reference`, `navigationTarget`, `renderingSlot`, `slice`, `inheritanceMode`, `template`, `sampleData`, `field`, `columnList`, plus the structured kinds that already existed) and `PropertyDescriptor.editorOptions` (`multiline`, `placeholder`, `unit`, `step`, `kinds`, `reference` filter, `fieldKinds`, `tokensOnly`).
- **Scene** ([Release v4.24.0](https://github.com/Cratis/Scene/releases/tag/v4.24.0)): Engine rules shared by every host: `validateComponentDescriptors` (`componentCategoryMissing` error, `componentCategoryUnknown` warning, `componentDesignModeInvalid`, `propertyEditorOptionsInvalid`), `matchComponentQuery` (the picker filter: name/keyword substring, category by word start, highlight ranges, keyword hint), `rankFrequentlyUsedComponents` (top 6, count then recency) and `componentBadge`. All are asserted against the shared corpus `component-metadata-fixtures.json`.
- **Scene** ([Release v4.24.0](https://github.com/Cratis/Scene/releases/tag/v4.24.0)): Every component of the core, Cratis.Components, PrimeReact and both blueprint packages (164 components) now has a descriptor with category, icon, keywords and display name; Topbar, Sidebar, Toolbar and the navigation bar declare a design mode. `validateComponentMetadata(bundle)` checks a bundle (CMP1) and is run by a specification in each package and by a repository-level specification (`registry.conformance`) that enumerates all package registries.
- **Scene** ([Release v4.24.0](https://github.com/Cratis/Scene/releases/tag/v4.24.0)): The third-party fixture `Acme.Inspections` declares a category, icon, keywords and design mode using only public packages; documentation in `Documentation/editing/descriptors.md` and `design-time-extensions.md`.
- **Scene** ([Release v4.23.0](https://github.com/Cratis/Scene/releases/tag/v4.23.0)): `ApplicationStructure`, `ModuleNode`, `FeatureNode`, `SliceNode` and `SliceKind` (`StateChange`, `StateView`, `Automation`) in `Cratis.Scene.Model.Structure` and `@cratis/scene.model`, mirrored in `scene-model-shape.json`. The structure is a reference input supplied by the host (Stage's converter, Studio); it is not persisted in a scene document.
- **Scene** ([Release v4.23.0](https://github.com/Cratis/Scene/releases/tag/v4.23.0)): `ApplicationStructureIndex` in `Cratis.Scene.Engine.Structure` and `engine/structure`: `findModule`, `findFeature`, `firstFeature`/`firstFeatureId`, `findSlice`, `kindOf`, `findFeaturesByName` and the diagnostics `structureDuplicateId` and `structureAmbiguousName`. Pure, no DOM.
- **Scene** ([Release v4.23.0](https://github.com/Cratis/Scene/releases/tag/v4.23.0)): `application-structure-fixtures.json` (qualified lookup, nested features, first feature, module without features, unknown/wrongly typed ids, same-named features in different modules, duplicate ids, ambiguous names) asserted by both `Engine.Specs/for_ApplicationStructureIndex` and `engine/for_applicationStructureIndex`.
- **Scene** ([Release v4.23.0](https://github.com/Cratis/Scene/releases/tag/v4.23.0)): The documentation page `blueprints/application-structure.md` explains the input and who supplies it.
- **Stage** ([Release v4.107.0](https://github.com/Cratis/Stage/releases/tag/v4.107.0)): The scaffold emits a `<Project>.Specs` project next to the web project. It compiles the generated slice specifications in place, so slice files keep their paths, and runs them with `dotnet test`. (part of #401)
- **Stage** ([Release v4.107.0](https://github.com/Cratis/Stage/releases/tag/v4.107.0)): The scaffold enables central package management: `Directory.Packages.props` pins every package version and the projects reference packages without versions. (part of #401)
- **Stage** ([Release v4.107.0](https://github.com/Cratis/Stage/releases/tag/v4.107.0)): The scaffold's `Directory.Build.props` sets nullable reference types, the latest C# version, warnings as errors and code-style enforcement for every project, and an `.editorconfig` that allows specification-style names in specifications. NuGet's machine-dependent restore warnings (`NU1507`, `NU1900`–`NU1904`) stay warnings. (part of #401)
- **Stage** ([Release v4.107.0](https://github.com/Cratis/Stage/releases/tag/v4.107.0)): The scaffold adds a `README.md` with run instructions for Chronicle, the backend, the frontend and the specifications. (part of #401)
- **Chronicle** ([Release v19.68.0](https://github.com/Cratis/Chronicle/releases/tag/v19.68.0)): Read protection for units of work: an enforcing unit owned by one invocation, protected decision reads that enrol before they return (`IDecisionReads.GetFor`), guards on every public read and append entry point, owner-only completion, read allowances for advisory reads, and the append conditions a commit sends (`GetAppendConditions`) (#4888)
- **Chronicle** ([Release v19.68.0](https://github.com/Cratis/Chronicle/releases/tag/v19.68.0)): Protected decision reads of reducers and self-reducing read models, folding with the handler's declared event generation; filtered reducers and reducers with constructor dependencies are refused (#4888)
- **Chronicle** ([Release v19.68.0](https://github.com/Cratis/Chronicle/releases/tag/v19.68.0)): `CHR0062` reports an event source definition or stream whose concurrency leaves out `EventSourceId`, with a code fix (#4888)
- **Chronicle** ([Release v19.68.0](https://github.com/Cratis/Chronicle/releases/tag/v19.68.0)): `CHR0063` reports an explicit concurrency scope for one stream passed to an append routed to another stream of the same event source (#4899)
- **Chronicle** ([Release v19.68.0](https://github.com/Cratis/Chronicle/releases/tag/v19.68.0)): A documentation page on read protection, and decision read documentation for reducers, pinned delivery and detached reads under read protection (#4888)
- **Arc** ([Release v22.101.0](https://github.com/Cratis/Arc/releases/tag/v22.101.0)): The Screenplay generator recovers a generated concept's validator rules together with its built-in generation strategy, using Screenplay ESM v20. Generated values, identities, responses, mappings and pins are no longer withheld just because the concept has a `ConceptValidator`.
- **Arc** ([Release v22.101.0](https://github.com/Cratis/Arc/releases/tag/v22.101.0)): Rules the compiler proves against the strategy are emitted.
- **Arc** ([Release v22.101.0](https://github.com/Cratis/Arc/releases/tag/v22.101.0)): Rules it cannot decide are kept and reported as `SP0078`.
- **Arc** ([Release v22.101.0](https://github.com/Cratis/Arc/releases/tag/v22.101.0)): A refuted rule withholds that concept's generation and is reported as `SP0073` with a counterexample.
- **Arc** ([Release v22.101.0](https://github.com/Cratis/Arc/releases/tag/v22.101.0)): Below an ESM v20 version cap, the generation is withheld but the rules are kept.
- **Screenplay** ([Release v4.172.0](https://github.com/Cratis/Screenplay/releases/tag/v4.172.0)): Concepts can generate values from a `pattern` with digits, letters, ASCII classes, bounded repeats and UTC date segments (`{yyyy}`, `{yy}`, `{MM}`, `{dd}`), optionally followed by a `checksum luhn`, `mod11` or `mod97` check digit; generation draws uniformly from the exact set of values the pattern and checksum can produce, and a pattern whose set is empty for any date in the next hundred years, or too large to count, is a binding error (`PLAY0692`, `PLAY0691`) (part of #616)
- **Screenplay** ([Release v4.172.0](https://github.com/Cratis/Screenplay/releases/tag/v4.172.0)): Int concepts can generate a `random <min>..<max>` value, and `generate rule Name` names a value generator implemented in code, which receives the current time and tenant (part of #616)
- **Screenplay** ([Release v4.172.0](https://github.com/Cratis/Screenplay/releases/tag/v4.172.0)): `validate checksum luhn|mod11|mod97` checks a String concept's check digits, and is proven to hold for values the matching `checksum` strategy generates (part of #616)
- **Screenplay** ([Release v4.172.0](https://github.com/Cratis/Screenplay/releases/tag/v4.172.0)): Rules on concepts with these strategies are proven like the other strategies' rules, including length and `min`/`max` against `random`, and specification fixtures are checked against the pattern, its date segments (using `given clock`) and the checksum (part of #616)
- **Screenplay** ([Release v4.172.0](https://github.com/Cratis/Screenplay/releases/tag/v4.172.0)): Executable model version 21 carries these strategies and checksum validations; models without them keep their version, bytes and outcomes (part of #616)
- **AI** ([Release v7.56.1](https://github.com/Cratis/AI/releases/tag/v7.56.1)): The agent worker result contract is published as a JSON Schema, a sample payload and a checker under [Source/AgentHarnesses/contracts](https://github.com/Cratis/AI/tree/main/Source/AgentHarnesses/contracts), so the harness and Studio test against the same artifact. (#711)
- **cli** ([Release v3.65.0](https://github.com/Cratis/cli/releases/tag/v3.65.0)): `cratis screenplay validate` reads the validation gate a repository declares in `screenplay.json` at the model root: the `checks`, `warningsAsErrors`, `scope` and `openQuestions` the standalone `screenplay` tool also reads, through the same Screenplay library. A command-line option overrides only its own setting, and a missing file keeps today's defaults. An invalid or unreadable file is refused with its location and exit 1 before anything compiles. See [the screenplay.json reference](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/tool.md). (#347)
- **cli** ([Release v3.65.0](https://github.com/Cratis/cli/releases/tag/v3.65.0)): `cratis screenplay validate --print-gate` prints the effective gate and where each value came from without compiling, `--no-gate-file` ignores the file for one run, and the JSON result carries a `gate` object in the same shape as the standalone tool's. (#347)
- **cli** ([Release v3.65.0](https://github.com/Cratis/cli/releases/tag/v3.65.0)): `cratis render` accepts Screenplay ESM v18 models: a specification that queries with an out-of-rule key or filter value and expects `then error` renders as a specification asserting the query's validation failure. Shapes Stage cannot reproduce exactly are refused with Stage diagnostics; ESM v20 models are still refused with `CLI-RENDER-004`.
- **Screenplay** ([Release v4.171.0](https://github.com/Cratis/Screenplay/releases/tag/v4.171.0)): A specification drives a capture over events by presenting the consumed event itself: `given <Event>` and `when append <Event>` for an event a capture reads `from`. The capture keeps one state per key, folding earlier events in order, and appends what its rules map: the first event for a key counts as added, an event that changes nothing appends nothing, and `when <field>` and transitions hold only on a change. `for` on such a fixture is optional. See [capturing from public events](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/captures.md) and decision [0077](https://github.com/Cratis/Screenplay/blob/main/decisions/0077-present-consumed-public-events-to-captures-over-events.md). (#483)
- **Stage** ([Release v4.106.0](https://github.com/Cratis/Stage/releases/tag/v4.106.0)): Stage admits Screenplay ESM v18. A specification that queries with an out-of-rule key or filter value and expects `then error` renders as a companion specification asserting the query's validation failure, and Stage's semantic runs and the Stage Host reproduce the reference's `Validation` rejection. (#370)
- **cli** ([Release v3.64.0](https://github.com/Cratis/cli/releases/tag/v3.64.0)): `cratis run --engine <eventmodel|semantic>` starts the Stage sandbox on the chosen runtime engine. `semantic` runs the Screenplay executable model, enforcing validation, requirements, authorization, conditional production and constraints, and running models with named event sources and streams. Without the option, Stage's default engine runs as before. (#368)
- **Chronicle** ([Release v19.67.0](https://github.com/Cratis/Chronicle/releases/tag/v19.67.0)): Kernel storage for application occurrences in MongoDB, SQL and InMemory. A replayed ingress id is recognized, and a mismatched payload is refused. (part of #4911)
- **Chronicle** ([Release v19.67.0](https://github.com/Cratis/Chronicle/releases/tag/v19.67.0)): Kernel storage for fenced occurrence leases. A worker whose lease epoch has been superseded can no longer renew, complete or fail the occurrence. (part of #4911)
- **Chronicle** ([Release v19.67.0](https://github.com/Cratis/Chronicle/releases/tag/v19.67.0)): Kernel storage for schedule definitions and cursors. The start time is written together with the first registration, and each cursor moves forward in versioned, atomic turns. (part of #4911)
- **Chronicle** ([Release v19.67.0](https://github.com/Cratis/Chronicle/releases/tag/v19.67.0)): Effect receipts stored in the same transaction as the events they cover, in every provider, including receipts for batches without events. (part of #4911)
- **Chronicle** ([Release v19.67.0](https://github.com/Cratis/Chronicle/releases/tag/v19.67.0)): SQL migrations that create the occurrence, schedule and receipt tables when the kernel upgrades. (part of #4911)
- **AI** ([Release v7.56.0](https://github.com/Cratis/AI/releases/tag/v7.56.0)): The Stage sandbox skill describes an optional behavior walk after V3: a domain expert walks each persona's commands and screens on Stage's semantic engine and records what changes, producing findings for the model owner (actions that change nothing visible, screens nothing feeds, work queues that never empty, refusals the model lacks) without changing code or the model. (#682)
- **AI** ([Release v7.56.0](https://github.com/Cratis/AI/releases/tag/v7.56.0)): The legacy-extraction skill explains when Arc's Screenplay generator states literal-row specifications as one case table and why it otherwise reports `SP0076`. Requires Arc.Screenplay 22.99.0. (#707)
- **Arc** ([Release v22.100.0](https://github.com/Cratis/Arc/releases/tag/v22.100.0)): The fresh-identifier guard now also covers events written directly through the command's unit of work: `IUnitOfWork.AddEvent`, `AddEventWithNamedTags` and `AddEvents`, and `eventLog.Transactional.Append`, `AppendMany` and their named-tag variants. It covers nested commands too. Writing to an occupied generated identifier fails with `ConcurrencyViolation` and `GeneratedIdentifierCollision`, and the whole unit of work is rolled back. See [Fresh identifiers](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/chronicle/commands/fresh-identifiers.md). (#3245)
- **Arc** ([Release v22.100.0](https://github.com/Cratis/Arc/releases/tag/v22.100.0)): `ICommandExceptionMapper` lets an integration turn an exception thrown while a command runs into a `CommandResult`. Mappers are discovered by convention. (#3245)
- **Stage** ([Release v4.105.0](https://github.com/Cratis/Stage/releases/tag/v4.105.0)): A slice that declares screens now gets its own `Screens.scene.json` in its folder, listing that slice as its source, so a consumer such as Studio's slice Preview can show a slice's screens. The application's `scene.json` is assembled from the same fragments and stays byte-identical. Slice- and feature-scoped plans emit the selected slices' fragments, byte-identical to an application plan, and leave out the application-wide Scene files with an informational diagnostic, so a scoped write never leaves them partial. Screen ownership supplied by a caller is checked against the compiled model: an owner that doesn't declare the screen, or a stale screen payload, fails planning. (#400)
- **Chronicle** ([Release v19.66.0](https://github.com/Cratis/Chronicle/releases/tag/v19.66.0)): Event store subscriptions can now opt in to forward every event into the target inbox in the generation the target application declared. This applies to live forwarding, catch-up, replay and partition retries. Opt in with `WithGenerationDelivery(EventGenerationDelivery.Pinned)` on the .NET subscription builder; typed registrations send their declared generation, and `WithEventType(eventTypeId, generation)` names one explicitly. The kernel stores those generations with the subscription and selects, decrypts and, when needed, migrates each event to that generation before appending it to the inbox. Subscriptions that do not opt in are unchanged. See [explicit subscriptions](https://github.com/Cratis/Chronicle/blob/main/Documentation/subscriptions/explicit-subscriptions.mdx) (part of #4710)
- **Arc** ([Release v22.99.0](https://github.com/Cratis/Arc/releases/tag/v22.99.0)): The Screenplay generator states a scenario run over a fixed set of literal cases once, as a Screenplay case table. An abstract base specification with primary-constructor parameters and body-less concrete rows (`class Ada() : Registering("Ada")`) becomes one specification with typed `parameter` lines and one `case` row per concrete class. Rows are folded only when substituting each row's values into the base reproduces that row's steps, outcomes and caller exactly; otherwise every row is stated individually as before and Information `SP0076` names why. See [Generating a Screenplay](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/generating-a-screenplay.md). (#3197)
- **Chronicle.Elixir** ([Release v3.13.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.13.0)): Decision reads for the dynamic consistency boundary. `Chronicle.ReadModels.DecisionReads` `get/2`, `get_detached/2`, `admit/2` and their stream-scoped variants enroll a read into the unit of work, and `Chronicle.decide/2` commits it, returning `{:error, %Chronicle.ReadModels.DecisionConflict{}}` when a concurrent append invalidated the read. Passive reducers can be read this way too. See [Dynamic Consistency Boundary](https://github.com/Cratis/Chronicle.Elixir/blob/main/Documentation/dynamic-consistency-boundary.md). (#140)
- **Chronicle.Elixir** ([Release v3.13.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.13.0)): `Chronicle.Testing`: an in-memory kernel with concurrency and constraint checks, in-process reactors and reducers, `wait_for_observers/1`, `assert_appended`/`refute_appended`, `Chronicle.Testing.Case`, an isolated-store helper for integration specs, and `Chronicle.Behaviour` so the `Chronicle` facade can be mocked with Mox. See [Testing](https://github.com/Cratis/Chronicle.Elixir/blob/main/Documentation/testing.md). (#149)
- **Chronicle.Elixir** ([Release v3.13.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.13.0)): Captures: `use Chronicle.Captures.Capture` declares a capture that compiles to Capture Declaration Language, with compile-time errors for a missing source, key or append condition. `Chronicle.Captures` registers, starts, stops, lists and validates captures, and the client registers them through `captures:` or `otp_app:` discovery. (#148)
- **Chronicle.Elixir** ([Release v3.13.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.13.0)): Discovery report and artifact identity drift: `Chronicle.Client.discovery_report/1`, `identity_drift/1`, a `drift_policy: :ignore | :warn | :fail` option (default `:warn`, never fails startup), a one-time warning for reactor, reducer and projection ids defaulted from the module name, and `mix chronicle.discover`. (#147)
- **Chronicle.Elixir** ([Release v3.13.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.13.0)): Standalone constraint modules with `use Chronicle.Events.Constraint`, registered through `constraints:` or discovery, plus `remove_constraint/2` with per-value removal properties, `:scope` and `:event_sequences` on `unique_event_type`, violation message callbacks, and `Chronicle.Events.ConstraintViolation.details/1`. (#143)
- **Chronicle.Elixir** ([Release v3.13.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.13.0)): Projections: a one-line `children` form, `removed_with_join/2`, `clear_with/2`, a default `:on` for joins inside `children`, and compile-time errors for a root `join` without `:on`, a duplicate property target and an unknown field. (#127)
- **Chronicle.Elixir** ([Release v3.13.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.13.0)): Read models: shared, self-reconnecting subscriptions with `Chronicle.ReadModels.subscribe/2` and `unsubscribe/1`, `:filter` and `:sort` on `observe/2`, `observe_stream/2`, and `Chronicle.Projections.query/2`, `preview/2` and `wait_for/3`. (#144)
- **Chronicle.Elixir** ([Release v3.13.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.13.0)): `ConcurrencyScope` pipe helpers (`with_sequence_number/2`, `with_event_types/2`, `with_event_stream_id/2` and more) and `at_tail/2`, and an opt-in client-wide `concurrency: [default: :optimistic, check_first_append: true]` strategy. (#134)
- **Chronicle.Elixir** ([Release v3.13.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.13.0)): Prepared events with `EventLog.prepare/2` and `append_prepared/3`, `get_metadata_at/2`
- **AI** ([Release v7.55.0](https://github.com/Cratis/AI/releases/tag/v7.55.0)): `cratis-screenplay-modeling-lifecycle` ships `scripts/model-first-status.mjs`, which decides whether a repository is opted in to model-first work: it reports the model root, why it is or is not opted in, drafts and model changes in progress, with exit 0 when opted in, 1 when not and 2 when it cannot decide, plus `--json`, `--root` and a self-test. Test and specification fixtures, samples and documentation `.play` files do not opt a repository in. (#677)
- **AI** ([Release v7.54.0](https://github.com/Cratis/AI/releases/tag/v7.54.0)): Event modeling skill: a section and a reference on event log hygiene (no ticks, signal events, "last looked" timestamps, telemetry or non-answers; orchestrate with jobs, state machines, reminders, command operations or `ICommandPipeline`), zero repeats, `…Changed` naming, and measuring the log for identical consecutive events.
- **AI** ([Release v7.54.0](https://github.com/Cratis/AI/releases/tag/v7.54.0)): Event modeling skill: a reference for rolling out a release that removes or reshapes many event types (scale to zero, backup, dry run with fuses, wipe the whole schema registry, BSON `NumberLong`, replay verification).
- **AI** ([Release v7.54.0](https://github.com/Cratis/AI/releases/tag/v7.54.0)): Glossary entries for observation command and signal event.
- **Screenplay** ([Release v4.170.0](https://github.com/Cratis/Screenplay/releases/tag/v4.170.0)): `PLAY0690` warns when a reducer-backed read model cannot be keyed the way it is queried: a single-instance query looks the view up `by` a type that is not the event-source identity type of the events the reducer observes, or the reducer observes events whose producers have different identity types. Reducer instances are keyed by each event's event-source id, so the warning points to a projection with property keys, or a join, instead (part of #132)
- **Screenplay** ([Release v4.170.0](https://github.com/Cratis/Screenplay/releases/tag/v4.170.0)): The warning compares declared identity types only where every producer is known (commands with `for`, implicit or generated identifiers, and reactions with an explicit `for`), applies the reducer's `from` filters first, and stays silent for events from reactions without `for`, captures, seeds, code or other applications; `screenplay check`, MCP diagnostics and the editor host report it, and `--warnaserror` turns it into an error (part of #132)
- **AI** ([Release v7.53.0](https://github.com/Cratis/AI/releases/tag/v7.53.0)): Every skill now has trigger evaluations (should-trigger requests and near misses that name the sibling skill that should win) and output evaluations with checkable assertions, covering the 70 skills that had none; the list of unevaluated skills is empty, so new skills cannot ship without evaluations. (#676)
- **AI** ([Release v7.53.0](https://github.com/Cratis/AI/releases/tag/v7.53.0)): The legacy-extraction skill explains when Arc's Screenplay generator writes `then denied` for a specification asserting `ShouldNotBeAuthorized()`, and why it otherwise withholds the specification with `SP0039`. Requires Arc.Screenplay 22.98.0. (#699)
- **Screenplay** ([Release v4.168.0](https://github.com/Cratis/Screenplay/releases/tag/v4.168.0)): `screenplay_declaration_details` describes a generated concept's rules: `generation.derivedPattern` is the anchored regular expression the strategy provably produces (or null with `derivedPatternUnknownReason`), and `generation.rules` lists every validation rule in authored order with its proof status (`proven`, `refuted` with a witness value, or `unproven` with a reason), plus `diagnosticCode` and `repair` when the compiler reported PLAY0688 or PLAY0689 at that rule. The proofs come from the same rule-consistency check the compiler uses. See [declaration details](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/mcp/reference.md). (part of #618)
- **Screenplay** ([Release v4.167.0](https://github.com/Cratis/Screenplay/releases/tag/v4.167.0)): The canonical corpus publishes the reference clock's schedule behavior as a versioned JSON fixture, `clock-schedules.v1.json`: the rules for epoch-counted intervals and daily, weekly and monthly UTC schedules, and boundary vectors with their expected due instants, including starts before the epoch, offset normalization, months without a 31st, 29 February in leap and non-leap years, the last calendar day and the occurrence limit (#754)
- **Screenplay** ([Release v4.167.0](https://github.com/Cratis/Screenplay/releases/tag/v4.167.0)): `ClockScheduleVectors` in `Cratis.Screenplay.CanonicalCorpus` exposes the fixture bytes with its version and SHA-256, so a consumer can pin it by hash; the file can also be fetched from the repository at the release tag (#754)
- **AI** ([Release v7.52.0](https://github.com/Cratis/AI/releases/tag/v7.52.0)): `cratis-multi-service-architecture`: designing several Cratis services with their own event stores on one Chronicle kernel: store and namespace boundaries, public contract events through the outbox, the three ways a consumer subscribes, at-least-once delivery and consumer idempotency, personal data across stores, Arc per service, and what the products do not provide. (#693)
- **AI** ([Release v7.52.0](https://github.com/Cratis/AI/releases/tag/v7.52.0)): `cratis-multi-service-local-orchestration`: running several services from one repository with a contracts project, a .NET Aspire AppHost using `Cratis.Chronicle.Aspire`, or Docker Compose, with explicit connection strings, ports, health checks, startup order and per-store `cratis` CLI contexts. (#693)
- **AI** ([Release v7.52.0](https://github.com/Cratis/AI/releases/tag/v7.52.0)): The Screenplay boundaries skill explains how to model several services: one model folder per service, public events, foreign event copies, directed Translate slices and what Stage renders today. (#693)
- **AI** ([Release v7.52.0](https://github.com/Cratis/AI/releases/tag/v7.52.0)): Screenplay `then no events` and `when redelivered` specifications (ESM v17). (#668)
- **AI** ([Release v7.52.0](https://github.com/Cratis/AI/releases/tag/v7.52.0)): Query argument validation against concept rules and `then error` after a query (ESM v18). (#684)
- **AI** ([Release v7.52.0](https://github.com/Cratis/AI/releases/tag/v7.52.0)): Reaction refusal branches and `$refusal` values (ESM v19). (#681)
- **AI** ([Release v7.52.0](https://github.com/Cratis/AI/releases/tag/v7.52.0)): One origin per capture and the `PLAY0687` error. (#663)
- **AI** ([Release v7.52.0](https://github.com/Cratis/AI/releases/tag/v7.52.0)): The Screenplay MCP proposal summary, authoring diagnostic counts and exact-source proposals. (#666)
- **Arc** ([Release v22.98.0](https://github.com/Cratis/Arc/releases/tag/v22.98.0)): The Screenplay generator states a command specification asserting `result.ShouldNotBeAuthorized()` as `then denied` when the denial is explained by the stated authorization: the command has an emitted `authorize` gate with exactly recovered roles or policies, the scenario has an exactly recovered `given caller`, the pinned Screenplay reference runner denies that caller, and no other outcome is asserted. See [Generating a Screenplay](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/generating-a-screenplay.md). (#3185)
- **Screenplay** ([Release v4.165.0](https://github.com/Cratis/Screenplay/releases/tag/v4.165.0)): A repository can declare its Screenplay validation gate in a committed `screenplay.json` at the model root: the `checks`, `warningsAsErrors`, `scope` and `openQuestions` the `screenplay` check command runs, so scripts and CI no longer repeat the options. The model root is the nearest folder at or above the target that holds `screenplay.json` or `.screenplay/`. A command-line option overrides only its own value, `--no-gate-file` ignores the file for one run, and a file with an unknown key or check name is refused with its location rather than ignored. See [decision 0076](https://github.com/Cratis/Screenplay/blob/main/decisions/0076-declare-the-validation-gate-in-a-model-root-file.md) and the [`screenplay-v1` JSON schema](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/screenplay-v1.schema.json). (#739)
- **Screenplay** ([Release v4.165.0](https://github.com/Cratis/Screenplay/releases/tag/v4.165.0)): The `screenplay` check command gains `--format json`, which writes one JSON report with the diagnostics, open questions and the effective gate, and `--print-gate`, which prints the effective gate and where each value came from without compiling. (#739)
- **Screenplay** ([Release v4.165.0](https://github.com/Cratis/Screenplay/releases/tag/v4.165.0)): `ScreenplayValidationGate.Read`, `ValidationGateRoot.Resolve` and `ValidationGateResolver.Resolve` in `Cratis.Screenplay` let other tools read and apply the same gate. (#739)
- **cli** ([Release v3.63.0](https://github.com/Cratis/cli/releases/tag/v3.63.0)): `cratis render` accepts Screenplay ESM v17 models: `then no events` renders for commands and single production-only reactions, and `when redelivered <Event> to <Reaction>` renders for a single named reaction trigger with event productions or one supported command invocation. Fan-out, deeper cascades and other shapes Stage cannot render yet are refused with `STAGE-ESM-011`. (#365)
- **cli** ([Release v3.63.0](https://github.com/Cratis/cli/releases/tag/v3.63.0)): `cratis render` accepts Screenplay ESM v19 models: reaction invocations can declare `on refused`, `on refused by validation`, `on refused by constraint [Name]` and `on refused by authorization` branches that `produce` events from `$refusal.reason`, `$refusal.constraint` and `$refusal.message` or `acknowledge` the refusal. Shapes Stage cannot reproduce exactly are refused with `STAGE-ESM-039`. Models newer than v19 are refused with `CLI-RENDER-004`. (#365)
- **Arc** ([Release v22.97.0](https://github.com/Cratis/Arc/releases/tag/v22.97.0)): The Screenplay generator extracts reactors that handle command refusals with `Invoke.Command(...).OnRefused(...)` and `Acknowledge(...)` into `invokes … on refused [by validation | authorization | constraint …]` branches. Branches appear in declaration order. Branches that produce events map `CommandRefusal.Message` to `$refusal.message`, and the constraint name to `$refusal.constraint` under constraint selectors. A reactor whose callbacks cannot be proven pure, or whose output is capped below ESM v19, keeps its `file` reference and reports `SP0071`. (#3094)
- **Arc** ([Release v22.97.0](https://github.com/Cratis/Arc/releases/tag/v22.97.0)): New analyzer `ARCCHR0027` warns when an `OnRefused` branch returns something the runtime rejects, such as a command, a non-event object or an empty collection. See [ARCCHR0027](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/chronicle/code-analysis/ARCCHR0027.md). (#3094)
- **Screenplay** ([Release v4.164.0](https://github.com/Cratis/Screenplay/releases/tag/v4.164.0)): Concepts that declare `generate` can carry validation rules: the compiler proves each rule against the generation strategy, binds a proven rule silently, reports a rule the strategy can break as `PLAY0688` with an example value that breaks it, and reports a rule it cannot decide as a `PLAY0689` warning with the reason (part of #616)
- **Screenplay** ([Release v4.164.0](https://github.com/Cratis/Screenplay/releases/tag/v4.164.0)): Length, `not empty`, `equal`, `not equal` and `matches` rules are decided exactly for the regular-expression subset described in the generated-values documentation; `matches` is proven only for patterns a backtracking regex engine matches without ambiguity, so a proven rule never times out on a generated value (part of #616)
- **Screenplay** ([Release v4.164.0](https://github.com/Cratis/Screenplay/releases/tag/v4.164.0)): Generated and specification fixtures are checked against their concept's rules as well as the strategy's shape; a fixture that breaks a rule is a contract violation (part of #616)
- **Screenplay** ([Release v4.164.0](https://github.com/Cratis/Screenplay/releases/tag/v4.164.0)): A repair replaces a refuted rule with the `matches` pattern derived from the strategy (part of #616)
- **Screenplay** ([Release v4.164.0](https://github.com/Cratis/Screenplay/releases/tag/v4.164.0)): Executable model version 20 carries rules on generated concepts; models without them keep their version, bytes and outcomes (part of #616)
- **Chronicle** ([Release v19.65.0](https://github.com/Cratis/Chronicle/releases/tag/v19.65.0)): `RegistrationOutcome.IsRegistering` says that the .NET client is registering its artifacts again, after a reconnect or a manual `RegisterAll`. The other members still describe the previous run, so `HasRun` and `IsSuccess` keep their meaning. (#4875)
- **Screenplay** ([Release v4.163.0](https://github.com/Cratis/Screenplay/releases/tag/v4.163.0)): `ScreenplayWorkspace.Rehome(documents, RehomeScope.Subset)` re-homes a workspace's identities onto a document set that holds only part of its model, such as the features a host has generated so far. Every declaration the documents contain keeps its semantic ID and its event contract ID, revision and origin; assignments for left-out declarations are dropped, so `ScreenplayModelRoot.Open` and `screenplay baseline admit`/`check` accept the state. Declarations the workspace does not know and documents that do not compile on their own are still refused. `Rehome(documents)` keeps its behaviour. See [Call these from your own tooling](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/tool.md#call-these-from-your-own-tooling). (#749)
- **Stage** ([Release v4.103.0](https://github.com/Cratis/Stage/releases/tag/v4.103.0)): Rendered specifications now cover `when redelivered <Event> to <Reaction>` for a single named reaction trigger with productions, or with one supported command invocation. The generated scenario records the givens with Chronicle's `History` and redelivers the located occurrence with its original sequence number, correlation and stream routing, so the input is never appended again. Fan-out, deeper cascades, constraints, read-model or query expectations, and redelivery combined with refusal branches are still refused with `STAGE-ESM-011`, which names the reason. (#371)
- **Arc** ([Release v22.96.0](https://github.com/Cratis/Arc/releases/tag/v22.96.0)): The Screenplay generator reads the application's react-router route table (`<Routes>`/`<Route path element>` declarations, or `createBrowserRouter`, `createHashRouter` and `createMemoryRouter` calls with literal route objects) and states navigation between screens: a menu item's `navigate('/literal')` becomes `item <name> navigate to <Screen>`, and a `CommandDialog` `onSuccess` navigation becomes the action's `navigate to <Screen>`. Required route parameters such as `:id` are bound with `parameter id from literal "42"`, and a screen in another slice is referenced by its qualified name. See [Generating a Screenplay](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/generating-a-screenplay.md). (#3203)
- **Arc** ([Release v22.96.0](https://github.com/Cratis/Arc/releases/tag/v22.96.0)): Navigation is stated only when the destination is proven: the route table is the application's root table (it renders or creates the router, or it is the only file declaring routes), and exactly one known route can match the literal path. Ambiguous, computed, lazy, wildcard and nested route tables, `<Link to>`, relative navigation and navigation with options stay reported with SP0028. (#3203)
- **Stage** ([Release v4.102.0](https://github.com/Cratis/Stage/releases/tag/v4.102.0)): Stage accepts Screenplay ESM v19 models. A reaction's invocation can declare ordered `on refused` branches (any, validation, constraint, a named constraint, or authorization) that acknowledge the refusal or produce events from `$refusal.reason`, `$refusal.constraint` and `$refusal.message`. Rendered reactors use Arc's `OnRefused`/`Acknowledge`. Stage's semantic runs and the Stage Host settle them as Screenplay does: the first matching branch handles the refusal and stops the rest of that trigger, and a bare `on refused` never catches authorization. (#214)
- **Stage** ([Release v4.102.0](https://github.com/Cratis/Stage/releases/tag/v4.102.0)): Refusal branches Stage can't reproduce exactly fail with `STAGE-ESM-039`, which names the reason. That covers several refusing triggers on the same event, `$refusal.message` from a command with localized messages, and `$refusal.constraint` when several constraints can fail together. (#214)
- **Screenplay** ([Release v4.162.0](https://github.com/Cratis/Screenplay/releases/tag/v4.162.0)): `ScreenplayWorkspace.Rehome` re-homes a workspace's identities onto a different document split of the same model, so a host that writes its model to a repository in its own folder layout can produce a `.screenplay/identities.json` that `ScreenplayModelRoot.Open` and `screenplay baseline admit`/`check` accept. Every semantic ID and event contract ID, revision and origin is kept; re-homing refuses added or removed declarations, source that does not compile, and any document set a model root could not hold and discover again. See [Call these from your own tooling](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/tool.md#call-these-from-your-own-tooling). (#747)
- **Screenplay** ([Release v4.162.0](https://github.com/Cratis/Screenplay/releases/tag/v4.162.0)): `ModelRootDocumentKeys.For` returns the stable document key model-root discovery assigns to a path. (#747)
- **Screenplay** ([Release v4.161.0](https://github.com/Cratis/Screenplay/releases/tag/v4.161.0)): `then error` after `when query` (or after `then query … arguments` in a specification with no action) asserts that the query was rejected with a validation error, for example a lookup by an invoice number its concept's rules refuse. The form is admitted in executable semantic model version 18, and only models that use it select that version. (#682)
- **Arc** ([Release v22.95.0](https://github.com/Cratis/Arc/releases/tag/v22.95.0)): When a command appends to an event source whose id was generated by a `[GeneratedValue]` parameter in the same invocation, the append requires the whole event source to be empty. If it already has events, the command fails with `ConcurrencyViolation` and `ReasonDetail` `GeneratedIdentifierCollision`, and `Handle()` is not run again. This covers returned events (including `EventForEventSourceId`, `(id, event)` tuples and `EventsWithConcurrencyScopes`) and aggregates. See [Fresh identifiers](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/chronicle/commands/fresh-identifiers.md). (#3129)
- **Arc** ([Release v22.95.0](https://github.com/Cratis/Arc/releases/tag/v22.95.0)): `[GeneratedValue(Freshness = GeneratedValueFreshness.Unguarded)]` opts a generated value out of the guard. (#3129)
- **Chronicle** ([Release v19.64.0](https://github.com/Cratis/Chronicle/releases/tag/v19.64.0)): The .NET client declares the global seeds it discovers from `ICanSeedEvents` as its program's authoritative set, keyed by `ChronicleOptions.ProgramIdentifier`, or by the entry assembly name when that is not set. Removing a seeder, or moving its seeds into `ForNamespace(...)`, therefore stops them reaching namespaces created afterwards. Events already appended stay where they are. See [seeding with C#](https://github.com/Cratis/Chronicle/blob/main/Documentation/event-seeding/seeding-with-csharp.mdx) (#4869)
- **AI** ([Release v7.51.0](https://github.com/Cratis/AI/releases/tag/v7.51.0)): An authoring rule for skills, rules, agents and prompts that loads when one of them is being written or reviewed: what a skill is, how a description routes (what it does, when to use it, what it is not for), size targets and progressive disclosure, timeless text, instruction style, one source of truth, MCP tool naming, scripts for deterministic steps, evaluations, what belongs in always-on files, and a review checklist. Harnesses without path-scoped rules find it through `general.md`. (part of #674)
- **AI** ([Release v7.51.0](https://github.com/Cratis/AI/releases/tag/v7.51.0)): Verification checks that every skill description says when to use the skill and is written without "I" or "you", that every file in a skill is reachable from its `SKILL.md`, that `general.md` stays within 200 lines, and that every skill either has evaluations or is listed as unevaluated with a reason; new skills cannot be added to that list. (part of #674)
- **AI** ([Release v7.51.0](https://github.com/Cratis/AI/releases/tag/v7.51.0)): Warnings, ahead of a later switch to failures, for descriptions without a "Not for" boundary or with process words, skills close to the size cap, time words, versions and issue references in rules, agents and prompts, and provenance pages in skills. (part of #674)
- **Arc** ([Release v22.94.0](https://github.com/Cratis/Arc/releases/tag/v22.94.0)): The Screenplay generator now writes a screen's `action`, toolbar `item … action` and `data … via query` references to commands and queries of another slice, qualified with the shortest slice scope that names exactly one declaration (for example `action Authors.Registration.RegisterAuthor`). The owning slice is found through the component's import. See [Generating a Screenplay](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/generating-a-screenplay.md). (#3204)
- **Arc** ([Release v22.93.0](https://github.com/Cratis/Arc/releases/tag/v22.93.0)): Analyzer ARCCHR0023 reports a read model parameter that Arc cannot match to a single command property by its key type (#3251)
- **Arc** ([Release v22.93.0](https://github.com/Cratis/Arc/releases/tag/v22.93.0)): Analyzer ARCCHR0025 reports a command with no event source key that injects a read model. The read model is looked up by a newly generated id on every call and is never found (#3251)
- **Arc** ([Release v22.93.0](https://github.com/Cratis/Arc/releases/tag/v22.93.0)): Analyzer ARCCHR0026 reports a command or command validator that reads a Chronicle-backed read model through `IMongoCollection<T>` (#3251)
- **Chronicle** ([Release v19.63.0](https://github.com/Cratis/Chronicle/releases/tag/v19.63.0)): `[ReactorSideEffect]` marks a type as a reactor side-effect return type, so analyzer CHR0054 accepts reactor handlers that return it synchronously, or return an array or `IEnumerable<T>` of it. Hosts that register an `IReactorSideEffectHandler` for their own return types, such as Arc's command invocations, put it on those types. The marker only informs the analyzer; a registered handler still processes the value. See [CHR0054](https://github.com/Cratis/Chronicle/blob/main/Documentation/code-analysis/CHR0054.mdx) (#4882)
- **Stage** ([Release v4.101.0](https://github.com/Cratis/Stage/releases/tag/v4.101.0)): Stage accepts Screenplay ESM v17 models. Stage's semantic specification runs execute `when redelivered <Event> to <Reaction>`: the given event is delivered again to the named reaction only, without being appended again, and what follows is settled. They also execute `then no events` for commands, reactions and appends. (part of #371)
- **Stage** ([Release v4.101.0](https://github.com/Cratis/Stage/releases/tag/v4.101.0)): Rendered command specifications and single production-only reaction specifications with `then no events` assert that nothing was appended or produced. Rendered redelivery, fan-out, deeper cascades and appends with no observer are refused with `STAGE-ESM-011`, which names the reason; rendering redelivery needs https://github.com/Cratis/Chronicle/issues/4873. (part of #371)
- **Arc** ([Release v22.92.0](https://github.com/Cratis/Arc/releases/tag/v22.92.0)): `IAsyncCommandExecutionScope`: a command execution scope can now await work in `BeginAsync`. It runs after the command context is built and before filters and validators. Validate-only calls do not run execution scopes (#3257)
- **Arc** ([Release v22.92.0](https://github.com/Cratis/Arc/releases/tag/v22.92.0)): `CommandScenario` can simulate a competing append with `AppendConcurrently` in commands that do not use decision reads (#3257)
- **Stage** ([Release v4.100.0](https://github.com/Cratis/Stage/releases/tag/v4.100.0)): Unique constraints now render on generated text values (`uuid`, `uuidv7`, `ulid`, `typeid`, `nanoid` and `bytes` concepts backed by String). A collision rejects the command with the named constraint violation, as in Screenplay. Each new attempt generates a fresh value; nothing is retried automatically. Specifications that assert a collision pin the generated values involved. (#377)
- **Chronicle** ([Release v19.62.2](https://github.com/Cratis/Chronicle/releases/tag/v19.62.2)): Observers report when their position moves past a live event with no evidence that it was delivered: the `chronicle-observer-events-suspected-skipped` counter and a rate-limited warning log name the observer, partition, sequence number and reason. Failed queue dispatches to an observer are counted by `chronicle-appended-events-queue-events-possibly-undelivered`. Delivery behaviour is unchanged; the troubleshooting guide explains how to investigate and recover a suspected skip (#4820)
- **Chronicle** ([Release v19.62.0](https://github.com/Cratis/Chronicle/releases/tag/v19.62.0)): Units of work accept enrollment contributors: `IUnitOfWork.AddEnrollmentContributor(IUnitOfWorkEnrollmentContributor)` returns a handle that removes the contributor when disposed. A contributor states the concurrency scope an event source must carry before any event for it is staged, through `AddEvent`, `AddEventWithNamedTags`, `AddEvents` and every `eventLog.Transactional` append. Equal scopes merge; a conflicting scope is rejected with `ConflictingEnrollmentScope` and nothing from that call is staged. This lets a host such as Arc guard appends that user code makes directly on the unit of work. See [Transactions](https://github.com/Cratis/Chronicle/blob/main/Documentation/events/transactions.mdx). (#4861)
- **Stage** ([Release v4.98.2](https://github.com/Cratis/Stage/releases/tag/v4.98.2)): A guide, [Generated values](https://github.com/Cratis/Stage/blob/main/Documentation/guides/generated-values.md), that follows a small shop model from `.play` to rendered code and runtime. It covers choosing a strategy and when not to generate a value, and every snippet comes from Stage's real output. The generated-values rendering reference links to it. (part of #175)
- **Screenplay** ([Release v4.160.0](https://github.com/Cratis/Screenplay/releases/tag/v4.160.0)): Reaction refusal branches are executable: `invokes <Command>` can carry ordered `on refused [by validation | by constraint [Name] | by authorization]` branches that `produces` events or `acknowledge`; the first matching branch wins, a bare `on refused` covers validation and constraint refusals but never authorization, and a handled refusal stops the trigger's remaining invocations while other reactions continue (#433)
- **Screenplay** ([Release v4.160.0](https://github.com/Cratis/Screenplay/releases/tag/v4.160.0)): `$refusal.reason`, `$refusal.constraint` and `$refusal.message` can be mapped in branch productions: the refusal kind, the first violated constraint's name, and the error messages joined with a newline exactly as authored (#433)
- **Screenplay** ([Release v4.160.0](https://github.com/Cratis/Screenplay/releases/tag/v4.160.0)): Executable model version 19 carries refusal branches as `onRefused` on invocations and refusal values as `refusal` expressions, written only when used; models without them keep their version, bytes and outcomes (#433)
- **Screenplay** ([Release v4.160.0](https://github.com/Cratis/Screenplay/releases/tag/v4.160.0)): The Invoicing sample records a refused payment reconciliation as `PaymentReconciliationRefused` (#433)
- **AI** ([Release v7.50.0](https://github.com/Cratis/AI/releases/tag/v7.50.0)): Legacy extraction keeps its analysis history, where each feature lives in the code and the decisions that span a feature as committed model notes, with open assumptions as anchored questions, so re-runs and drift checks have a baseline after the working area is gone; line-level code locations stay in the evidence file, and a client can keep evidence out of the repository. (part of #672)
- **AI** ([Release v7.50.0](https://github.com/Cratis/AI/releases/tag/v7.50.0)): Legacy extraction maps how the existing system realizes each slice today, with targeted ways to read the code for it, and adds pass discipline and question wording for expert interviews. (part of #672)
- **AI** ([Release v7.50.0](https://github.com/Cratis/AI/releases/tag/v7.50.0)): Model review explains an existing feature or walks a planned change through the model, and the Screenplay Reviewer has a walkthrough mode. (part of #672)
- **AI** ([Release v7.50.0](https://github.com/Cratis/AI/releases/tag/v7.50.0)): Discovery reads documents with certainty marks and exact numbers, keeps source documents unchanged, records suspected source typos with their locator, and can produce a read-only blueprint summary for people who don't read models. (part of #672)
- **AI** ([Release v7.50.0](https://github.com/Cratis/AI/releases/tag/v7.50.0)): Method skills add story order when declaring slices, decision state with one field per fact a scenario branches on, guidance for choosing a durable process or a plain automation, and further slicing, scenario and stream-design checks. (part of #672)
- **AI** ([Release v7.50.0](https://github.com/Cratis/AI/releases/tag/v7.50.0)): Delivery guidance covers redelivery against commands that refuse duplicates, temporal and fan-out cases for automations, reading all of a command's scenarios together, frontend slice isolation, query-isolation specifications, append-only committed migrations and authenticated webhook captures with a published inbound contract. (part of #672)
- **AI** ([Release v7.50.0](https://github.com/Cratis/AI/releases/tag/v7.50.0)): The quality gate reports which slices a change touches, as advisory output that never fails the gate. (part of #672)
- **AI** ([Release v7.50.0](https://github.com/Cratis/AI/releases/tag/v7.50.0)): Hand-written code changed since it was last verified is investigated per delivery, with findings routed to restoring the code or to a model change request. (part of #672)
- **Chronicle** ([Release v19.61.0](https://github.com/Cratis/Chronicle/releases/tag/v19.61.0)): `ReactorScenario` can redeliver a recorded occurrence with its original context. `Given.ForEventSource(id).History(...)` (also after `OnStream(...)`) records events without invoking the reactor and returns a `RecordedOccurrence` with the event and its `EventContext`; `scenario.Redeliver(occurrence)` delivers it again with the same sequence number, correlation, occurred time and stream routing, so a `ReactorDelivery` parameter sees the same identity as for the original delivery. Observer filters, read-model seeding and produced-event recording behave as for `Events(...)`, for class-based and fluent reactor scenarios. See [Reactor scenarios](https://github.com/Cratis/Chronicle/blob/main/Documentation/testing/reactors/scenario.mdx). (#4873)
- **Chronicle** ([Release v19.60.0](https://github.com/Cratis/Chronicle/releases/tag/v19.60.0)): Webhooks can opt in to receive every event in the generation they subscribed to, on live delivery, catch-up, replay and partition retries alike. Opt in with `WithGenerationDelivery(EventGenerationDelivery.Pinned)` on the .NET webhook builder, or set `GenerationDelivery` to `Pinned` when registering webhooks directly. The kernel records each subscribed event type's generation with the webhook and selects, decrypts and, when needed, migrates the event to that generation before posting it; the payload envelope is unchanged. Webhooks that do not opt in are unchanged. See [webhooks](https://github.com/Cratis/Chronicle/blob/main/Documentation/webhooks/index.mdx) (part of #4710)
- **Screenplay** ([Release v4.159.0](https://github.com/Cratis/Screenplay/releases/tag/v4.159.0)): `ScreenplayModelRoot.Open` and `ScreenplayModelRoot.OpenForReleaseBaselineCheck` in `Cratis.Screenplay` open a model root read-only with its persisted identities and release baseline, or return a typed failure such as `PendingOperation`, `PersistedIdentitiesRequired`, `IdentityStateConflict`, `MetadataPermissions` or `UnreadableModelRoot`. Renderers and tools can now assess a release baseline on exactly the model they compile, through the same code the MCP server and `screenplay baseline check` use. See [Call these from your own tooling](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/tool.md#call-these-from-your-own-tooling). (#740) (#741)
- **Screenplay** ([Release v4.159.0](https://github.com/Cratis/Screenplay/releases/tag/v4.159.0)): `PersistedIdentityStateSerializer` reads and writes `.screenplay/identities.json`, so consumers no longer need to copy its format. (#741)
- **cli** ([Release v3.61.0](https://github.com/Cratis/cli/releases/tag/v3.61.0)): `cratis render` (publish, `--check` and `--scope`) reports Stage's release-baseline warnings when a render would change (`STAGE-BASELINE-001`) or drop (`STAGE-BASELINE-002`) an event revision admitted to the model's release baseline, or when the baseline cannot be read (`STAGE-BASELINE-003`) or checked (`STAGE-BASELINE-004`). The warnings cover the whole application, also for scoped renders, and never change the exit code, the written artifacts or the receipt; keep `cratis screenplay baseline check` as the gate in CI. See [Release-baseline warnings](https://github.com/Cratis/cli/blob/main/Documentation/reference/screenplay.md#release-baseline-warnings). (#356)
- **cli** ([Release v3.61.0](https://github.com/Cratis/cli/releases/tag/v3.61.0)): `cratis render --workspace <FILE> --baseline <FILE>` selects the release baseline for workspace input; without it, render uses `.screenplay/release-baseline.json` beside the workspace file. PATH input reads the baseline from the model root's `.screenplay/` folder. (#356)
- **AI** ([Release v7.49.0](https://github.com/Cratis/AI/releases/tag/v7.49.0)): Legacy extraction reads tests as evidence for rules, error messages, permissions and example data, and re-runs read only what changed since each feature was last analyzed, which also checks that an agreed freeze held. (part of #672)
- **AI** ([Release v7.49.0](https://github.com/Cratis/AI/releases/tag/v7.49.0)): Legacy extraction works breadth first: a whole-system outline, then one feature per pass with a detail budget, steered by the domain expert; features not yet extracted are listed in the loss report. (part of #672)
- **AI** ([Release v7.49.0](https://github.com/Cratis/AI/releases/tag/v7.49.0)): The extraction evidence keeps a decision trail, a code-term to business-term glossary and where each feature lives in the code, and covers generic engines, reference data, event order and outbound outcomes. Experts verify through plain-language retellings and a keep, change, new or remove view per slice. (part of #672)
- **AI** ([Release v7.49.0](https://github.com/Cratis/AI/releases/tag/v7.49.0)): Discovery marks how certain each item taken from a document is, keeps numbers and dates exact, and records contradictions as questions. (part of #672)
- **AI** ([Release v7.49.0](https://github.com/Cratis/AI/releases/tag/v7.49.0)): Command cards name the values each rule reads, field lineage is checked while editing, and a business-rule test decides which rejections and duplicates earn a specification. (part of #672)
- **AI** ([Release v7.49.0](https://github.com/Cratis/AI/releases/tag/v7.49.0)): Model review offers an optional stressor analysis and a trace of one piece of information through the whole model. (part of #672)
- **AI** ([Release v7.49.0](https://github.com/Cratis/AI/releases/tag/v7.49.0)): Render and gap-fill checks hand-written code that changed since it was last verified against the accepted model, and keeps a per-slice record of where each declaration lives in code. (part of #672)
- **AI** ([Release v7.49.0](https://github.com/Cratis/AI/releases/tag/v7.49.0)): The Slice Implementer looks for an existing realization before writing one, mirrors the nearest delivered slice, and records non-behavioral assumptions instead of stopping on them; slice specifications explain how to turn a `.play` specification into C# specs. (part of #672)
- **AI** ([Release v7.49.0](https://github.com/Cratis/AI/releases/tag/v7.49.0)): The write guard hook stops agents from editing their own settings, `.mcp.json`, hook configuration and, in repositories with an installed corpus, the managed `.cratis/ai` files and installed adapters. (part of #672)
- **Stage** ([Release v4.98.0](https://github.com/Cratis/Stage/releases/tag/v4.98.0)): A conditional production renders as a guarded event in the generated command handler. The condition is evaluated over the command's values and generated values, and productions whose condition does not hold are skipped. When every production is skipped, the command is accepted without appending. (#360)
- **Stage** ([Release v4.98.0](https://github.com/Cratis/Stage/releases/tag/v4.98.0)): Freshness guards on generated event sources (ESM v15) apply only to productions that are taken, so a skipped production never causes a false concurrency rejection. (#360)
- **Stage** ([Release v4.98.0](https://github.com/Cratis/Stage/releases/tag/v4.98.0)): The Stage Host and the spec runner execute only taken productions, matching Screenplay's reference evaluation. (#360)
- **Stage** ([Release v4.98.0](https://github.com/Cratis/Stage/releases/tag/v4.98.0)): A state-change slice may declare several commands; each renders with its own record, validator and response, alongside the slice's shared events and read models. (#360)
- **cli** ([Release v3.60.0](https://github.com/Cratis/cli/releases/tag/v3.60.0)): `cratis screenplay baseline check [ROOT]` and `cratis screenplay baseline admit [ROOT] --release <LABEL> [--from-esm <FILE>]` check a model against its committed release baseline and admit a release into it, using Screenplay's own baseline rules. They exit 0 when clean or admitted, 1 on violations and 2 when they could not run, so a CI job can gate on `check` and a release job can run `admit --release $TAG`. See the [Screenplay command reference](https://github.com/Cratis/cli/blob/main/Documentation/reference/screenplay.md). (#351)
- **cli** ([Release v3.60.0](https://github.com/Cratis/cli/releases/tag/v3.60.0)): `cratis screenplay validate --open-questions report|fail` reads the model's open questions from its notes. `report` prints them and keeps the validation result; `fail` exits 5 while an open question remains, and unreadable notes exit 1. (Cratis/Screenplay#694)
- **cli** ([Release v3.60.0](https://github.com/Cratis/cli/releases/tag/v3.60.0)): `cratis render` admits ESM v16: an event's `id` pin keeps its stored event type name when you rename the event. (#353)
- **Arc** ([Release v22.90.0](https://github.com/Cratis/Arc/releases/tag/v22.90.0)): Arc.Chronicle recognizes Chronicle self-reducing read models, so injecting one into a command, validator or `Provide()` reads it through Chronicle, including personal-data release, instead of falling back to reading MongoDB directly. Requires Chronicle 19.58.0 or later in the application. (#3233)
- **Arc** ([Release v22.90.0](https://github.com/Cratis/Arc/releases/tag/v22.90.0)): Screenplay recognizes self-reducing read models as reducer-built, including reducers whose event parameter is an interface or base class, and reports when it cannot list every observed event. (#3233)
- **Stage** ([Release v4.97.0](https://github.com/Cratis/Stage/releases/tag/v4.97.0)): `StageReleaseBaseline.Check` builds a `ReleaseBaselineAssessment` from a Screenplay workspace or a compilation and a release baseline, using Screenplay's own baseline comparison. `SemanticModelLoader` reads `.screenplay/release-baseline.json` from the model root (it never writes it) and exposes the result as `ReleaseBaseline`. Callers that already hold an assessment pass it on `ArtifactRenderRequest.ReleaseBaseline` or through `PlanFrom`. (#375)
- **Stage** ([Release v4.97.0](https://github.com/Cratis/Stage/releases/tag/v4.97.0)): Render plans that carry an assessment report warnings for the whole application, whatever the render scope: `STAGE-BASELINE-001` when an admitted event revision changed, `STAGE-BASELINE-002` when it is missing, `STAGE-BASELINE-003` when the baseline cannot be read or belongs to another application, and `STAGE-BASELINE-004` when the check could not run or was made for a different model revision. A plan with only these warnings still succeeds with the same artifacts. Without an assessment, plans are unchanged. (#375)
- **Stage** ([Release v4.97.0](https://github.com/Cratis/Stage/releases/tag/v4.97.0)): The rendering guides explain where the baseline comes from, how these warnings relate to the `screenplay baseline check` gate and to the publication check, and that callers that pass only an executable model get no baseline warnings. (#375)
- **Components** ([Release v4.27.0](https://github.com/Cratis/Components/releases/tag/v4.27.0)): `TablePaginator` can show numbered page links with an ellipsis between *previous* and *next* (for example ‹ 1 2 [3] 4 5 … 12 ›). Turn it on with `pageLinks` (or `pageLinks={{ siblings, boundaries }}` to choose how many pages show around the current one and at each end); it is off by default, so existing tables render as before. The current page carries `aria-current="page"`, and the `info` text («2 / 4») is not shown while page links are on. (#421)
- **Components** ([Release v4.27.0](https://github.com/Cratis/Components/releases/tag/v4.27.0)): `DataPage`, `DataTableForQuery` and `DataTableForObservableQuery` pass `pageLinks` through to their paginator. (#421)
- **Components** ([Release v4.27.0](https://github.com/Cratis/Components/releases/tag/v4.27.0)): New paginator parts `pages`, `page` and `ellipsis` for styling through `pt`, and new paginator messages `page(n)` (the accessible name of each page button, «Page 3» by default) and `pages` (the name of the page list), so the labels can be localized (for example «Side 3»). (#421)
- **Components** ([Release v4.27.0](https://github.com/Cratis/Components/releases/tag/v4.27.0)): `paginatorPages(page, pageCount, siblings, boundaries)` and `PaginatorPageItem` are exported, for apps that render their own pager with the same page window. (#421)
- **Screenplay** ([Release v4.157.0](https://github.com/Cratis/Screenplay/releases/tag/v4.157.0)): `then no events` is executable: it asserts that the action produced no new facts, including everything its reactions appended, and after `when append` it asserts that no reaction appended anything (part of #433)
- **Screenplay** ([Release v4.157.0](https://github.com/Cratis/Screenplay/releases/tag/v4.157.0)): `when redelivered <Event> to <Reaction>` is executable: the located given event is delivered again to the named reaction only, without appending it again, and the ordinary cascade settles; an unhandled refused invocation stays assertable with `then error` (part of #433)
- **Screenplay** ([Release v4.157.0](https://github.com/Cratis/Screenplay/releases/tag/v4.157.0)): Executable model version 17 carries both forms as `thenNoEvents` and `whenRedelivered` members, written only when used; models without them keep their version, bytes and outcomes (part of #433)
- **Arc** ([Release v22.89.0](https://github.com/Cratis/Arc/releases/tag/v22.89.0)): The Screenplay generator recovers event source and stream model names from Stage-rendered `{Model}EventSource` classes and from directly referenced stream constants, and states a differing stored name with `id`. (#3218)
- **Arc** ([Release v22.89.0](https://github.com/Cratis/Arc/releases/tag/v22.89.0)): Reactions that append through an explicit `EventForEventSourceId` destination, including list accumulator bodies, become reaction productions with their route when the route is provable. (#3218)
- **Stage** ([Release v4.96.0](https://github.com/Cratis/Stage/releases/tag/v4.96.0)): Events with a stored name that differs from their model name (`id "Original"` in the model, carried as `storedName` in ESM v16) render as `[EventType("Original")]`, while the generated class follows the current name. Unpinned events and models below v16 render exactly as before. The Host registers, appends and rebuilds these events under the stored name. (#372)
- **Stage** ([Release v4.96.0](https://github.com/Cratis/Stage/releases/tag/v4.96.0)): `CratisRendering.CheckPublication` refuses a plan that would change the Chronicle `[EventType]` id of an existing event class in the destination, or whose existing id cannot be read. The new outcome is `CratisPublicationCheck.ChangesEventTypeIds`, which lists each change and reports `STAGE-EVENT-002`. Publishers that switch over `CratisPublicationCheck` must handle this new case. For scoped plans the aggregate policy layout check still runs first, so publishers that refuse only `RequiresApplicationScope` keep refusing those plans. `cratis render` adopts the new refusal in Cratis/cli#354. (#372)
- **Stage** ([Release v4.96.0](https://github.com/Cratis/Stage/releases/tag/v4.96.0)): A plan where two events would get the same Chronicle event type id, for example a pinned `id "RecordedEvent"` beside an unpinned `Recorded_event`, fails with `STAGE-ESM-012`. (#372)
- **Stage** ([Release v4.96.0](https://github.com/Cratis/Stage/releases/tag/v4.96.0)): Protected observable list queries now render their success specifications with Arc's `QueryScenario` and its default Chronicle read models. Scoped projections and protected snapshot list successes are still refused with `STAGE-ESM-011`. (part of #278)
- **Chronicle** ([Release v19.59.4](https://github.com/Cratis/Chronicle/releases/tag/v19.59.4)): `Cratis:Chronicle:Shutdown:DrainTimeout` (environment variable `Cratis__Chronicle__Shutdown__DrainTimeout`) (default 8 seconds) bounds how long the kernel spends finishing in-flight observer work when it stops; the effective budget is capped below the host shutdown timeout and logged at startup (#4790)
- **Stage** ([Release v4.95.0](https://github.com/Cratis/Stage/releases/tag/v4.95.0)): Command specifications with a `given clock` now render and run instead of being refused as unsupported time. The rendered specification fixes Arc's scenario clock to the stated instant, and Stage's semantic specification runs use it as the command's occurrence. So `$context.occurred` values can be asserted exactly, and generated time-ordered values are checked against that instant. The clock must be a whole number of milliseconds and no earlier than 1970. `when clock`, clocks on reaction specifications, and query-only and direct-append specifications are still refused. (#381)
- **AI** ([Release v7.48.0](https://github.com/Cratis/AI/releases/tag/v7.48.0)): A shared reference on choosing how a rule holds, reached from the decision-read, command, validation, constraint, read-model, reducer and Screenplay consistency skills. It contains:
- **AI** ([Release v7.48.0](https://github.com/Cratis/AI/releases/tag/v7.48.0)): routing steps and a decision matrix by rule shape, with what never to use and what is too much
- **AI** ([Release v7.48.0](https://github.com/Cratis/AI/releases/tag/v7.48.0)): plain reads by backing, and constraint limits
- **AI** ([Release v7.48.0](https://github.com/Cratis/AI/releases/tag/v7.48.0)): Arc and Chronicle traps, costs, and a checklist for generated code (#661)
- **AI** ([Release v7.48.0](https://github.com/Cratis/AI/releases/tag/v7.48.0)): Evaluation cases for the common traps (#661):
- **AI** ([Release v7.48.0](https://github.com/Cratis/AI/releases/tag/v7.48.0)): a plain or passive read used as a guard
- **AI** ([Release v7.48.0](https://github.com/Cratis/AI/releases/tag/v7.48.0)): a validator used as a guard
- **AI** ([Release v7.48.0](https://github.com/Cratis/AI/releases/tag/v7.48.0)): `concurrency: true`
- **AI** ([Release v7.48.0](https://github.com/Cratis/AI/releases/tag/v7.48.0)): rules that span two keys
- **AI** ([Release v7.48.0](https://github.com/Cratis/AI/releases/tag/v7.48.0)): uniqueness through a constraint
- **AI** ([Release v7.48.0](https://github.com/Cratis/AI/releases/tag/v7.48.0)): refused decision-read shapes
- **AI** ([Release v7.48.0](https://github.com/Cratis/AI/releases/tag/v7.48.0)): unit-of-work commit timing in ASP.NET Core
- **AI** ([Release v7.48.0](https://github.com/Cratis/AI/releases/tag/v7.48.0)): when not to use decision reads
- **Screenplay** ([Release v4.154.0](https://github.com/Cratis/Screenplay/releases/tag/v4.154.0)): `ReleaseBaselineCommands.Check(root)` and `ReleaseBaselineCommands.Admit(root, release, fromEsmPath)` in `Cratis.Screenplay.Mcp` run the same baseline check and journaled admission as `screenplay baseline check|admit` and return a `ReleaseBaselineOutcome` with the exit code, violations, refusal reason, and the admitted entry count and baseline revision. (#720)
- **Screenplay** ([Release v4.154.0](https://github.com/Cratis/Screenplay/releases/tag/v4.154.0)): `ModelNoteQuestions.Read(root, scope)` returns the open questions that `screenplay check --open-questions` reports, including orphaned questions and absent or unreadable notes, with `GetExitCode(failOnOpenQuestions)` for report and fail modes. (#694)
- **Arc** ([Release v22.88.0](https://github.com/Cratis/Arc/releases/tag/v22.88.0)): `Invoke.Command(command)` returns a command invocation from a reactor, with `.OnRefused(Refused.X, refusal => …)` branches that append the returned events and `.Acknowledge(Refused.X)` to record that a refusal was handled. The first matching branch wins, and a handled refusal stops the remaining invocations of that reactor call (#3058)
- **Arc** ([Release v22.88.0](https://github.com/Cratis/Arc/releases/tag/v22.88.0)): `Refused.ByValidation`, `Refused.ByConstraint(name)`, `Refused.ByAnyConstraint`, `Refused.ByAuthorization` and `Refused.Any` select refusals; `Refused.Any` covers validation and constraint refusals but not authorization (#3058)
- **Arc** ([Release v22.88.0](https://github.com/Cratis/Arc/releases/tag/v22.88.0)): `CommandResult.GetRefusal()` classifies a refused command as a validation, constraint (with all violated constraint names) or authorization refusal. Concurrency conflicts, exceptions, authorization configuration failures and framework failures are not refusals, so they still fail the observer and are retried (#3058)
- **Arc** ([Release v22.88.0](https://github.com/Cratis/Arc/releases/tag/v22.88.0)): Decision record https://github.com/Cratis/Arc/blob/main/decisions/0010-declarative-reactor-command-refusals.md describes the contract (#3058)
- **Stage** ([Release v4.93.0](https://github.com/Cratis/Stage/releases/tag/v4.93.0)): Stage's semantic specification runs (SpecRunner `--engine semantic` and `POST /stage/semantic/specifications/run`) now execute `every` and `all` projection blocks whose mappings set event-source identities, with the same results as the Screenplay reference runner. Literal, empty and child-scoped blocks are still reported as unsupported. (part of #15)
- **AI** ([Release v7.46.0](https://github.com/Cratis/AI/releases/tag/v7.46.0)): "Choosing a strategy" and "When not to" sections in the Fundamentals concept, Arc command, Screenplay command-surface, model-authoring, specifications, legacy-extraction and Stage rendering skills, built on a shared shop example: `CustomerId` (`cus_` + ULID), `OrderId` (TypeID, time from the generation context), `InviteCode` (NanoID) and `ApiKey` (32 random bytes kept as a secret). Each skill shows only what its product releases; context-based and secret generation in Screenplay are marked as not yet available (part of #576)
- **AI** ([Release v7.46.0](https://github.com/Cratis/AI/releases/tag/v7.46.0)): Guidance for recovering generated values from legacy code, gated on the Arc.Screenplay adapter version the CLI bundles (part of #576)
- **AI** ([Release v7.46.0](https://github.com/Cratis/AI/releases/tag/v7.46.0)): Evaluations for choosing a strategy, refusing generation for a gapless invoice number, writing a pinned Screenplay specification and recovering legacy generation (part of #576)
- **Chronicle** ([Release v19.59.0](https://github.com/Cratis/Chronicle/releases/tag/v19.59.0)): `EventScenario.ReadModels` reads and observes the read models built from the scenario's own events: projections, including children and joins, and reducers. Tools that build on an `EventScenario` can now call `GetInstanceById`, `GetInstances` and `Observe<T>()` over the same store they appended to, instead of the shared default store, where model-bound children failed with "Could not resolve parent key". See [event scenarios](https://github.com/Cratis/Chronicle/blob/main/Documentation/testing/events/scenario.mdx) (#4816)
- **Screenplay** ([Release v4.153.0](https://github.com/Cratis/Screenplay/releases/tag/v4.153.0)): `screenplay baseline admit <root> --release <label>` records every current and historical event revision with its resolved stored shape in `.screenplay/release-baseline.json`, a committed sidecar with a published JSON schema. `--from-esm <file>` admits from the canonical model a release shipped. Admission only ever adds entries, refuses a changed revision, and never runs implicitly. (#686)
- **Screenplay** ([Release v4.153.0](https://github.com/Cratis/Screenplay/releases/tag/v4.153.0)): `screenplay baseline check <root>` exits 1 when a baselined revision changed or is missing and 2 when the baseline is unreadable, so CI can gate edits made outside the MCP tools. (#686)
- **Screenplay** ([Release v4.153.0](https://github.com/Cratis/Screenplay/releases/tag/v4.153.0)): MCP: `screenplay_list_release_baseline` pages the admitted revisions with their current status, `read-proposal view=release-baseline` shows a proposal's effect on them, and `open-workspace` and `workspace-state` report the baseline's status, revision and violations. (#686)
- **Screenplay** ([Release v4.152.0](https://github.com/Cratis/Screenplay/releases/tag/v4.152.0)): ESM v16: an event contract carries `storedName` when its `id` pin differs from its name. Models with such a pin select v16, and consumers must explicitly admit v16; earlier strict readers refuse it. A pin equal to the event name changes nothing and keeps the model's version and bytes. (#704)
- **Chronicle** ([Release v19.58.0](https://github.com/Cratis/Chronicle/releases/tag/v19.58.0)): Self-reducing read models: a class that does not implement `IReducer` and declares `public static Reduce(TEvent @event, TSelf? current[, EventContext context])` returning `TSelf` or `Task<TSelf>` is discovered as a reducer for itself. No marker attribute or new registration API is needed; `[Reducer]`, `[Passive]`, event-sequence, event-store, tag and route attributes on the model configure it, and the existing `RegisterReducer<T>()` and `RegisterReducer(Type)` accept these models. (#4731)
- **Chronicle** ([Release v19.58.0](https://github.com/Cratis/Chronicle/releases/tag/v19.58.0)): Optional static replay hooks on a self-reducing read model: `BeginReplay`, `EndReplay`, `BeginReplayPartition(Partition)` and `EndReplayPartition(Partition)` returning `Task`, with trailing services resolved from the notification's scope and no model instance created. (#4731)
- **Chronicle** ([Release v19.58.0](https://github.com/Cratis/Chronicle/releases/tag/v19.58.0)): Analyzers for self-reducing read models: `CHR0058` warns about near-miss `Reduce` signatures, `CHR0059` reports malformed replay hooks, `CHR0060` reports equally specific `Reduce` methods, and `CHR0061` reports a model that is also maintained by a projection or another reducer. (#4731)
- **Chronicle.Go** ([Release v0.10.0](https://github.com/Cratis/Chronicle.Go/releases/tag/v0.10.0)): `FastForward` on the observation service and its `FastForwardResult`. Requires Chronicle 19.56.0 or later.
- **cli** ([Release v3.58.0](https://github.com/Cratis/cli/releases/tag/v3.58.0)): `cratis chronicle observers fast-forward <observer-id>`: skips every event the observer has not yet handled and discards its failed partitions. Requires Chronicle 19.56.0 or later.
- **cli** ([Release v3.58.0](https://github.com/Cratis/cli/releases/tag/v3.58.0)): A fast forward action (W) on the observers view of the TUI workbench.
- **Chronicle.TypeScript** ([Release v6.52.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.52.0)): `observers.fastForward(observerId)` and the `FastForwardResult` it returns. Requires Chronicle 19.56.0 or later.
- **Chronicle.Kotlin** ([Release v6.14.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.14.0)): `store.observers.fastForward(...)` by identifier or by reactor/reducer class, the `FastForwardResult` it returns, and a Java bridge. Requires Chronicle 19.56.0 or later.
- **Chronicle.Elixir** ([Release v3.12.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.12.0)): `Chronicle.Observers.fast_forward/2` and the `FastForwardResult` it returns. Requires Chronicle 19.56.0 or later.
- **Chronicle** ([Release v19.56.0](https://github.com/Cratis/Chronicle/releases/tag/v19.56.0)): Fast forward for observers: an observer can be moved to the tail of its event sequence, skipping every event it has not yet handled. Its failed partitions are discarded and the state it already built is kept.
- **Chronicle** ([Release v19.56.0](https://github.com/Cratis/Chronicle/releases/tag/v19.56.0)): A Fast forward action in the Workbench observers view.
- **Chronicle** ([Release v19.56.0](https://github.com/Cratis/Chronicle/releases/tag/v19.56.0)): `FastForward` on the .NET `IReactors`, `IReducers` and `IProjections`, and `Observers.FastForward` on the gRPC contract.
- **Chronicle.Elixir** ([Release v3.11.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.11.0)): `Chronicle.Events.EventContext`, shared by reactors and reducers: the causing identity (`caused_by`, with `on_behalf_of`), `causation`, `correlation_id`, `tags`, `hash`, `subject`, event type, event stream and `replaying?`. It is still a map, so existing pattern matches keep working. (#125)
- **Chronicle.Elixir** ([Release v3.11.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.11.0)): `delivery_id` in the reactor context: a stable identity of one delivery of an event to a reactor, the same on every redelivery, built like the .NET `ReactorDelivery.Id` for idempotency keys. (#137)
- **Chronicle.Elixir** ([Release v3.11.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.11.0)): Reactor replay control: `once_only: true` registers a reactor as not replayable, `once_only: [Event]` skips those events while replaying, and an optional `handle_replay/2` handles replayed events. (#136)
- **Chronicle.Elixir** ([Release v3.11.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.11.0)): `get_for_event_source/3` and `get_from_sequence_number/2` accept `decode: true` and return `Chronicle.Events.AppendedEvent` structs holding the event struct, its context, the raw payload and redaction details. (#130)
- **Chronicle.Elixir** ([Release v3.11.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.11.0)): `append_with_result/3` and `append_many_with_result/3` return the assigned sequence numbers and structured constraint and concurrency violations, plus `wait_for_completion/2`. (part of #133)
- **Chronicle.Elixir** ([Release v3.11.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.11.0)): `ConcurrencyScope.expecting_no_matching_event/1` for creation-only guards. (part of #134)
- **Chronicle.Elixir** ([Release v3.11.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.11.0)): `Chronicle.Compliance.allow_new_encryption_key_for/2`. (part of #135)
- **Chronicle.Elixir** ([Release v3.11.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.11.0)): Event type options `subject:`, `tags:`, `tombstone:`, `public:` and `compensation_for:`; the declared subject is resolved on append. (part of #138) (part of #146)
- **Chronicle.Elixir** ([Release v3.11.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.11.0)): `children` blocks in read models and projections for child collections (nested, with `from`, `join`, `removed_with`), and `clear:` to set a scalar back to no value. (part of #127)
- **Chronicle.Elixir** ([Release v3.11.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.11.0)): `closes_stream` declarations on event types, unique constraint `mode: :per_value`, and `Chronicle.EventSequences.Streams` to list, close, reopen and check closed stream scopes, read event metadata and verify stored content. (part of #142) (part of #143)
- **Chronicle.Elixir** ([Release v3.11.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.11.0)): `Chronicle.ReadModels.query/2` options `:filter` and `:sort`, evaluated by the client with a `:max_scan` limit. (part of #126)
- **Chronicle.Elixir** ([Release v3.11.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.11.0)): `Chronicle.ReadModels.observe/2` for collections and `Chronicle.ReadModels.Reactor` for reacting to read model changes. (part of #144)
- **Chronicle.Elixir** ([Release v3.11.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.11.0)): `Chronicle.Middleware` for reactors and reducers, configured globally or per module. (part of #145)
- **Chronicle.Elixir** ([Release v3.11.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.11.0)): `Chronicle.Observers.retry_partition/3`, `clear_partition_quarantine/3` and `clear_observer_quarantine/2`. (part of #141)
- **Chronicle.Elixir** ([Release v3.11.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.11.0)): `Chronicle.Client.registration_status/1`, `await_registration/2` and a `:registration` option for backoff, jitter and maximum attempts; an invalid definition now fails once instead of retrying forever. (part of #131)
- **Chronicle.Elixir** ([Release v3.11.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.11.0)): Operations: `observer_lag:` publishes a `[:chronicle, :observer, :lag]` telemetry event per observer, and `watc
- **Screenplay** ([Release v4.150.0](https://github.com/Cratis/Screenplay/releases/tag/v4.150.0)): A warning, PLAY0686, on an event `id` pin: the pin is not yet carried to renderers, so generated code stores the event under its new name. `screenplay_propose_rename` reports the same caveat for event renames, and the VS Code extension and Monaco editor show it. (part of #704)
- **Arc** ([Release v22.87.0](https://github.com/Cratis/Arc/releases/tag/v22.87.0)): `QueryScenario` can run observable queries backed by Chronicle read models: a query returning `IReadModels.Observe<T>(filter)` emits the read models built from the scenario's given events and given read models, and emits again when a command in the scenario appends events (#3221) (part of #3154)
- **Arc** ([Release v22.87.0](https://github.com/Cratis/Arc/releases/tag/v22.87.0)): A given read model whose key cannot be read from the instance cannot be observed, and `Observe` fails with `PinnedReadModelCannotBeObserved` explaining how to seed it instead (part of #3154)
- **AI** ([Release v7.43.0](https://github.com/Cratis/AI/releases/tag/v7.43.0)): The Screenplay model-authoring skill teaches the MCP surface for concept generation strategies: reading a concept's `generation` summary from `screenplay_declaration_details` (strategy, modifiers, entropy, collision estimate and whether it is executable), setting or removing `generate` through typed proposals, and the PLAY0683/PLAY0684 repairs that raise entropy or add a unique constraint. The `cratis screenplay mcp` bundled in CLI 3.57.0 does not have this surface yet (#645)
- **AI** ([Release v7.42.0](https://github.com/Cratis/AI/releases/tag/v7.42.0)): `cratis-cleanup-worktrees.sh` removes linked worktrees and local branches only when their work is verifiably on the default branch (merged, merged with upstream gone, or a merged PR at the same commit). It never forces and reports what it kept and why.
- **AI** ([Release v7.42.0](https://github.com/Cratis/AI/releases/tag/v7.42.0)): Claude Code and Pi run it after delivering commands such as `gh pr merge` and at session start, so orphans from earlier sessions are collected.
- **Chronicle** ([Release v19.55.0](https://github.com/Cratis/Chronicle/releases/tag/v19.55.0)): `Workbench:BasePath` (`Cratis__Chronicle__Workbench__BasePath`) serves the Workbench page, its assets and the API it calls under a path prefix, for a reverse proxy that routes by path. It works whether the proxy strips the prefix or passes it through. See https://github.com/Cratis/Chronicle/blob/main/Documentation/hosting/configuration/workbench.md (#4822)
- **Chronicle** ([Release v19.55.0](https://github.com/Cratis/Chronicle/releases/tag/v19.55.0)): `MaxReceiveMessageSize` and `MaxSendMessageSize` on the kernel, set through `Cratis__Chronicle__MaxReceiveMessageSize` and `Cratis__Chronicle__MaxSendMessageSize`.
- **AI** ([Release v7.41.0](https://github.com/Cratis/AI/releases/tag/v7.41.0)): Concept generation strategies (ESM v15): UUID, UUIDv7, ULID, TypeID, NanoID and bytes, with their encodings, entropy diagnostics (PLAY0683/PLAY0684), strict fixtures and generated-value freshness, and what Stage 4.89.1 renders of them (#643)
- **AI** ([Release v7.41.0](https://github.com/Cratis/AI/releases/tag/v7.41.0)): Response names in UI continuations: a form's `on submit` and `execute ... on success` can use the command's returned names, with the scoping rules and PLAY0685; rendered applications do not bind them yet (Cratis/Scene#53) (#642)
- **Screenplay** ([Release v4.149.0](https://github.com/Cratis/Screenplay/releases/tag/v4.149.0)): `screenplay_declaration_details` returns a `generation` object for concepts that declare `generate`: the strategy, its modifiers, the exact entropy in bits, the number of values at a 1% collision probability, and whether the compiler admits it (`admitted`, `refused` with the diagnostic codes, or `notAssessed` with a reason). Setting, changing and removing `generate` go through the existing typed proposals and report the compiler's refusals. (part of #618)
- **Screenplay** ([Release v4.149.0](https://github.com/Cratis/Screenplay/releases/tag/v4.149.0)): Two repairs for low-entropy generation through `screenplay_propose_repair`: raise a `nanoid` size or `bytes` count to at least 64 random bits (PLAY0683, PLAY0684), and add a unique constraint for the generated property (PLAY0683). `screenplay_repair_capabilities` lists them. (part of #618)
- **Chronicle.Kotlin** ([Release v6.13.1](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.13.1)): `maxReceiveMessageSize` on `ChronicleOptions`, and `withMaxReceiveMessageSize()` to change it. Pass `null` to keep grpc-java's own default.
- **Chronicle.TypeScript** ([Release v6.51.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.51.1)): `maxReceiveMessageSize` and `maxSendMessageSize` on `ChronicleOptions` and its factory methods. Pass `null` to keep gRPC's own default.
- **Stage** ([Release v4.91.0](https://github.com/Cratis/Stage/releases/tag/v4.91.0)): Screenplay `all` projection blocks whose mappings set event-source identities now render as Chronicle `FromAll`, including for events of unrelated types and event sources. `all` blocks with literal mappings (Cratis/Chronicle#4663) or with no mappings still fail with `STAGE-ESM-017`. (part of #117)
- **Stage** ([Release v4.90.0](https://github.com/Cratis/Stage/releases/tag/v4.90.0)): An `observable` collection query renders as an Arc observable query returning `ISubject<IEnumerable<T>>` from Chronicle's `IReadModels.Observe`. A `by` key and ESM v14 equality filters become the observation's filter, and a missing required text filter is still refused. (#278)
- **Stage** ([Release v4.90.0](https://github.com/Cratis/Stage/releases/tag/v4.90.0)): A snapshot collection query renders as a one-time query returning the current list, with or without a `by` key and equality filters. (#278)
- **Arc** ([Release v22.86.0](https://github.com/Cratis/Arc/releases/tag/v22.86.0)): The Screenplay generator states a concept's generation strategy from its `New()` factory: `GenerateValue.UuidV7()` and `Guid.CreateVersion7()` become `generate uuidv7`, `Ulid()` becomes `generate ulid`, `TypeId("p")` becomes `generate typeid "p"`, `NanoId(size, alphabet)` becomes `generate nanoid` with its size and alphabet, `Bytes(count, encoding)` becomes `generate bytes` with its encoding, and `RandomNumberGenerator.GetHexString(n, lowercase)` becomes `generate bytes n/2 hex` with its case. Plain UUID factories keep no `generate` line (part of #3116)
- **Arc** ([Release v22.86.0](https://github.com/Cratis/Arc/releases/tag/v22.86.0)): `[GeneratedValue]` parameters of concepts with a recovered strategy, including string-backed concepts, become `generated` properties, and scenarios can pin them with text values that match the strategy's shape (part of #3116)
- **Stage** ([Release v4.89.0](https://github.com/Cratis/Stage/releases/tag/v4.89.0)): A reaction `from <Source>` renders `[EventSourceType("<Source>")]` on its reactor, and `from <Source>.<Stream>` renders `[FromEventSource<TSource>("<Stream>")]`, the same attributes filtered reducers use. Events the reaction produces stay unrouted. (#297)
- **Stage** ([Release v4.89.0](https://github.com/Cratis/Stage/releases/tag/v4.89.0)): Rendered `when append` reaction specifications take the filter into account. An append the filter excludes is refused with `STAGE-ESM-011` instead of rendering a specification that cannot pass, and a filtered-out sibling reaction no longer counts as fan-out. (#297)
- **Stage** ([Release v4.87.0](https://github.com/Cratis/Stage/releases/tag/v4.87.0)): Concepts with a v15 generation strategy render `New()` with the matching Fundamentals `GenerateValue` factory, including `prefix` and `case` modifiers on String-backed concepts. (#357)
- **Stage** ([Release v4.87.0](https://github.com/Cratis/Stage/releases/tag/v4.87.0)): At v15, a command that produces facts on a generated event source guards it with a `BeforeFirst` concurrency scope, so a source that already has facts rejects the whole command with `ConcurrencyViolation`. This matches Screenplay's freshness rule; earlier facts without a destination never make a source stale. (#357)
- **Stage** ([Release v4.87.0](https://github.com/Cratis/Stage/releases/tag/v4.87.0)): The Stage Host generates values with the concept's strategy and reports the freshness rejection as a concurrency violation. The specification executor checks v15 fixture shapes and freshness with the reference messages. (#357)
- **Chronicle** ([Release v19.54.0](https://github.com/Cratis/Chronicle/releases/tag/v19.54.0)): `IReadModels.Observe<T>()` returns an `ISubject<IEnumerable<T>>` that emits the whole read-model collection and emits again whenever it changes, on MongoDB, SQL and in-memory storage. It uses Chronicle's own collection naming and keys, so read models need no `Id` property, and personal data arrives decrypted. Pass a filter expression to observe a subset. Return it from an observable query to keep a list current. See [observing read models](https://github.com/Cratis/Chronicle/blob/main/Documentation/read-models/observing-read-models.mdx) (#4759)
- **Chronicle** ([Release v19.54.0](https://github.com/Cratis/Chronicle/releases/tag/v19.54.0)): The testing services support `IReadModels.Observe<T>()` too: they rebuild the read models from the scenario's events and emit again after each append (#4759)
- **Stage** ([Release v4.86.0](https://github.com/Cratis/Stage/releases/tag/v4.86.0)): A reaction with `runs as` renders its Chronicle reactor with Arc's `[ExecuteCommandsAsSystem(roles)]`, so the commands it invokes run as the system with exactly the declared roles. (#292)
- **Stage** ([Release v4.86.0](https://github.com/Cratis/Stage/releases/tag/v4.86.0)): A `when append` specification whose appended event fires one reaction renders as a Chronicle `ReactorScenario` chained into an Arc `CommandScenario`. It asserts the events the reaction produces (payload, destination and an exact count) or the invoked command's outcome. The invoked command runs under the identity declared on the reactor itself, and the specification's caller is not forwarded. (part of #207)
- **Arc** ([Release v22.85.0](https://github.com/Cratis/Arc/releases/tag/v22.85.0)): The Screenplay generator states a collection query parameter as a `filter <name> <Type>` line when the query provably compares it for equality with the same-named read-model property: in LINQ `Where` and MongoDB `Find`/`Where` chains, Arc's observable `Observe` queries, and Entity Framework Core chains awaited through `ToListAsync`, `ToArrayAsync` or `AsAsyncEnumerable`. A nullable parameter whose comparison is skipped when it is null becomes an `optional` filter. Models with filters bind as Screenplay ESM v14 (#3196)
- **Arc** ([Release v22.85.0](https://github.com/Cratis/Arc/releases/tag/v22.85.0)): Query parameters that are not provable equality filters (other names, `!=`, ranges, `Contains`, computed values, repeated comparisons) stay out of the model and are reported with `SP0019`, and a `MaximumExecutableModelVersion` below v14 withholds filters with a located `SP0019` (#3196)
- **Screenplay** ([Release v4.148.0](https://github.com/Cratis/Screenplay/releases/tag/v4.148.0)): Names returned by a command can be used in a form's `on submit` and in the `on success` continuation of `execute`: `with … from`, the `on submit navigate to … by` shorthand, `set … to` and message operands resolve a bare name to the command's response once it is not a form field or behavior parameter (#303) (part of #300)
- **Screenplay** ([Release v4.148.0](https://github.com/Cratis/Screenplay/releases/tag/v4.148.0)): PLAY0685 reports a returned name used under the returning command's `on failure`, where the command returned nothing; an outer command's successful response stays available there (part of #300)
- **Screenplay** ([Release v4.148.0](https://github.com/Cratis/Screenplay/releases/tag/v4.148.0)): Editor completion and hover for returned names inside `on submit` and `on success` (part of #300)
- **Arc** ([Release v22.83.0](https://github.com/Cratis/Arc/releases/tag/v22.83.0)): A `[GeneratedValue]` parameter whose concept implements `IGeneratableInContext<T>` from Cratis Fundamentals 7.24 is created with a `GenerationContext` holding the command's received time and the current tenant (the default tenant maps to `GenerationContext.DefaultTenant`). When a concept implements both `IGeneratable<T>` and `IGeneratableInContext<T>`, the context form is used. A command without a received time fails instead of falling back to the system clock (#3165)
- **Arc** ([Release v22.83.0](https://github.com/Cratis/Arc/releases/tag/v22.83.0)): `CommandScenario.Clock(DateTimeOffset)` and `CommandScenario.Tenant(TenantId)` fix the time and tenant a scenario's commands run with, including nested commands. Set `Clock` before the first `Execute` or `Validate` and `Tenant` before the first `Execute`; later changes throw (#3165)
- **Arc** ([Release v22.83.0](https://github.com/Cratis/Arc/releases/tag/v22.83.0)): `ARC0027` warns when a generated parameter's type implements both generation interfaces, since Arc only calls the context form (#3165)
- **Arc** ([Release v22.83.0](https://github.com/Cratis/Arc/releases/tag/v22.83.0)): `ARC0028` reports a generatable concept created inside `Handle` (`X.New()` or `GenerateValue.*`) and offers a code fix that moves it to a `[GeneratedValue]` parameter, so scenarios can pin the value (#3165)
- **Arc** ([Release v22.83.0](https://github.com/Cratis/Arc/releases/tag/v22.83.0)): `ARCCHR0022` warns when a command injects an aggregate keyed by the command's event source while appending its events to a generated event source (#3165)
- **Stage** ([Release v4.85.0](https://github.com/Cratis/Stage/releases/tag/v4.85.0)): The Stage Host (Play and the spec runner) now protects personal-data and secret concept values in its own event store, as rendered applications do. Chronicle encrypts them at rest and releases them on read, and personal data can be erased through Chronicle's key deletion keyed by the event source. Events stored before this release stay in plain text. (#346)
- **Stage** ([Release v4.84.0](https://github.com/Cratis/Stage/releases/tag/v4.84.0)): Equality filters render on observable collection queries, with or without a `by` key. Required filters become non-nullable query parameters and are refused when missing. Optional filters default to `null` and narrow only when supplied. All filters and the key combine with AND. (#348)
- **Stage** ([Release v4.84.0](https://github.com/Cratis/Stage/releases/tag/v4.84.0)): The semantic Stage Host passes query filters to Screenplay's reference evaluator, which applies them to live queries. (#348)
- **Stage** ([Release v4.84.0](https://github.com/Cratis/Stage/releases/tag/v4.84.0)): Generated query specifications pass filter values by name and assert the number of returned rows for filtered queries. (#348)
- **Screenplay** ([Release v4.147.0](https://github.com/Cratis/Screenplay/releases/tag/v4.147.0)): A concept can declare `generate uuid`, `uuidv7`, `ulid`, `typeid "<prefix>"`, `nanoid [size]` or `bytes <count> base64url|hex|base32`, with the `prefix`, `case` and `alphabet` modifiers; `generated` properties now accept any generatable concept, not only `Uuid` concepts (part of #616)
- **Screenplay** ([Release v4.147.0](https://github.com/Cratis/Screenplay/releases/tag/v4.147.0)): Concepts with a declared strategy bind into the executable model as ESM v15, as an optional `generation` member on the concept; models without one, including an unmodified `generate uuid` on a `Uuid` concept, keep their exact executable-model bytes and revision (part of #616)
- **Screenplay** ([Release v4.147.0](https://github.com/Cratis/Screenplay/releases/tag/v4.147.0)): From ESM v15 the reference evaluator checks every generated fixture against its strategy's exact shape, and rejects a command that appends to a generated identifier whose event source already has events, with the new `Concurrency` rejection (part of #616)
- **Screenplay** ([Release v4.147.0](https://github.com/Cratis/Screenplay/releases/tag/v4.147.0)): Entropy diagnostics: a generated value below 64 random bits warns with the number of values at a 1% collision probability, unless a unique constraint covers it, and a generated identifier below 64 bits is refused (part of #616)
- **Screenplay** ([Release v4.147.0](https://github.com/Cratis/Screenplay/releases/tag/v4.147.0)): `generate pattern`, `random` and `rule` parse and print in both compilers but are not yet executable, and `generate sequence` is reserved (part of #616)
- **Screenplay** ([Release v4.147.0](https://github.com/Cratis/Screenplay/releases/tag/v4.147.0)): New diagnostics PLAY0672 to PLAY0684 for malformed strategies, modifiers, prefixes, alphabets and sizes, in both compilers (part of #616)
- **Screenplay** ([Release v4.147.0](https://github.com/Cratis/Screenplay/releases/tag/v4.147.0)): Editor completion, hover with entropy and strategy notes, and syntax highlighting for `generate` (part of #616)
- **Screenplay** ([Release v4.147.0](https://github.com/Cratis/Screenplay/releases/tag/v4.147.0)): Documentation: generated values, choosing a strategy and a strategy reference, plus ESM v15 in the interoperability table, golden vector and canonical corpus (part of #616)
- **Stage** ([Release v4.83.0](https://github.com/Cratis/Stage/releases/tag/v4.83.0)): The generated-React and live-custom-package browser scenarios assert the responsive shell (`browser.responsive.*`): at 1440px the navigation sits beside the content with no horizontal overflow; at 390px it is parked off the canvas, nothing overflows, the "Open the menu" toggle exists, pressing it brings the navigation into the window and the toggle then offers to close it. (part of #237)
- **Arc** ([Release v22.82.0](https://github.com/Cratis/Arc/releases/tag/v22.82.0)): The Screenplay generator states a Cratis Components `DataPage` menu item as a `toolbar` item (`item <name> action <Command>`, with its literal label) when the item's command provably opens the `CommandDialog` of a command in the same slice; that dialog is then not repeated as a separate screen action. (#3049)
- **Arc** ([Release v22.82.0](https://github.com/Cratis/Arc/releases/tag/v22.82.0)): The Screenplay generator reports `SP0077` for screen composition Screenplay cannot express yet: a `detailsComponent` pane, a screen opened as a dialog through `useDialog`, and menu item enablement such as `disableOnUnselected`. (#3049)
- **cli** ([Release v3.55.0](https://github.com/Cratis/cli/releases/tag/v3.55.0)): `cratis run --package-set <file> [--packages <folder>]` hands the approved package set (the same document `cratis render --package-set` takes) to the live Stage: the set is mounted read-only at `/packages/approved-packages.json` and the folder of each approved package, `<packages folder>/<npm name>`, read-only at `/packages/<npm name>` - never the folder that holds them. The Stage loads each package at runtime from its browser (ES module) build, with the Stage's own React, and refuses to render when a package is missing or differs from its declaration. A package without a folder, a set that is missing or invalid and `--packages` without `--package-set` are refused before Docker starts. (part of #284)
- **cli** ([Release v3.55.0](https://github.com/Cratis/cli/releases/tag/v3.55.0)): `cratis run` resolves the `ui profile` of the model before Docker starts. A package that is neither shipped (`core`, `scene.web`, `Cratis.Components`) nor approved is refused with `CLI-RENDER-007` (exit code 5) and says to approve it with `--package-set`; nothing is started, so a typo or a forgotten approval no longer produces a sandbox that shows a placeholder where the package's component belongs. A model that does not compile is left to the Stage. (part of #284)
- **cli** ([Release v3.55.0](https://github.com/Cratis/cli/releases/tag/v3.55.0)): The packed-CLI check in CI now also runs the same package set live: `cratis run` without the set refuses with `CLI-RENDER-007`, and with the set the Stage container renders the custom component, its property and style sheet beside the shipped components in a browser, using the same scenario as the rendered application. (part of #284)
- **cli** ([Release v3.55.0](https://github.com/Cratis/cli/releases/tag/v3.55.0)): Documentation: `run.md#custom-packages` and the `screenplay.md` custom package section describe the live package folder, the browser-build contract and what is refused.
- **AI** ([Release v7.39.0](https://github.com/Cratis/AI/releases/tag/v7.39.0)): A preferred-syntax reference for Screenplay: for each construct, the form the corpus uses, the older forms Screenplay still accepts, and the diagnostic that flags them; corpus verification now fails when an example uses a legacy, redundant or deprecated form, selected from the pinned Screenplay contract so new codes are picked up automatically (#636)
- **AI** ([Release v7.39.0](https://github.com/Cratis/AI/releases/tag/v7.39.0)): Running a proposal's specifications read-only before `apply` with `run-specifications` and `proposalId`, and the `screenplay test` exit codes (#633)
- **AI** ([Release v7.39.0](https://github.com/Cratis/AI/releases/tag/v7.39.0)): Caller-supplied equality filters on collection queries (ESM v14, Screenplay 4.143.0), with the remaining `PLAY0268` refusals, query arguments in specifications and order-insensitive collection results; rendering waits for a Stage that admits v14 (#626)
- **Screenplay** ([Release v4.146.0](https://github.com/Cratis/Screenplay/releases/tag/v4.146.0)): `Cratis.Screenplay.CanonicalCorpus` ships the golden executable semantic model vectors for every released ESM version (`full-esm-v1` to `full-esm-v14`, plus the `policy-negation-v7` extension). `EsmGoldenVectors.Versions` lists them, and `EsmGoldenVectors.Get(version)` returns the exact released bytes and their semantic revision, so consumers can test against the published contract instead of copying files from a tag. New ESM versions add their vector automatically (#677)
- **cli** ([Release v3.54.0](https://github.com/Cratis/cli/releases/tag/v3.54.0)): `cratis render` admits ESM v11 (lossless Double-mode number literals), v12 (explicit enum member numbers) and v13 (concept compliance markers such as `pii` and `secret`). ESM v14 query filters stay refused with `CLI-RENDER-004` until the bundled renderer admits them. (#332)
- **cli** ([Release v3.54.0](https://github.com/Cratis/cli/releases/tag/v3.54.0)): `cratis screenplay mcp` serves the model-notes tools from Screenplay 4.144: `list-model-notes`, `propose-model-notes`, `read-proposal` with `view: "notes"`, and `run-specifications` with a `proposalId` to run a retained proposal's candidate model before `apply`. The reference explains that `.screenplay/notes.json` is owned by the server, committed with the model, and never blocks opening a model, and shows where to gate on open questions with `screenplay check --open-questions report|fail`. (#340)
- **Fundamentals** ([Release v7.24.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.24.0)): `IGeneratableInContext<TSelf>` in `Cratis.Concepts`: a concept implements `static TSelf New(GenerationContext context)` when its value depends on the operation's time or tenant; when a type implements both interfaces, callers use the context form (part of #1176)
- **Fundamentals** ([Release v7.24.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.24.0)): `GenerationContext(Now, Tenant)`: the instant the operation was received and the portable tenant identifier, with `GenerationContext.DefaultTenant` (the zero GUID) for the default tenant (part of #1176)
- **Fundamentals** ([Release v7.24.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.24.0)): `GenerateValue.Ulid()`: 26 uppercase Crockford base32 characters with a millisecond timestamp and 80 random bits (part of #1176)
- **Fundamentals** ([Release v7.24.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.24.0)): `GenerateValue.TypeId(prefix)`: a TypeID with a validated lowercase prefix and a UUID v7 suffix (part of #1176)
- **Fundamentals** ([Release v7.24.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.24.0)): `GenerateValue.NanoId(size, alphabet)`: characters drawn uniformly from the default URL-safe alphabet or a custom one (part of #1176)
- **Fundamentals** ([Release v7.24.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.24.0)): `GenerateValue.Bytes(count, encoding)`: random bytes as unpadded base64url, lowercase hex or unpadded RFC 4648 base32 (part of #1176)
- **Fundamentals** ([Release v7.24.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.24.0)): `GenerateValue.UuidV7(context)`, `Ulid(context)` and `TypeId(prefix, context)` take their timestamp from `context.Now`, so a pinned clock pins the time part of the value (part of #1176)
- **Fundamentals** ([Release v7.24.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.24.0)): Documentation on choosing a strategy and on context-aware generation: https://github.com/Cratis/Fundamentals/blob/main/Documentation/csharp/generating-values.md (part of #1176)
- **Stage** ([Release v4.81.0](https://github.com/Cratis/Stage/releases/tag/v4.81.0)): The specification executor settles event-triggered reactions after each command or appended event: `where` guards, productions (checked against constraints), invocations, `runs as` system identities, `from` filters, triggers that both produce and invoke, cascades and the 1000-fact limit. An invoked command never receives the specification's caller. (part of #207)
- **Stage** ([Release v4.81.0](https://github.com/Cratis/Stage/releases/tag/v4.81.0)): Projection checks cover every event a reaction can append, so a projection over reaction-produced events is either verified or refused, never built from mismatched keys. (part of #207)
- **Stage** ([Release v4.80.0](https://github.com/Cratis/Stage/releases/tag/v4.80.0)): The Host reads a packages folder (`Stage:Packages:Path`, `/packages` in the image): `approved-packages.json` and one folder per approved package, named by its npm name. The set is validated with Scene's `ApprovedPackageSetJson` (malformed sets and a set reusing a shipped package name are refused), the package entry module is resolved from its `package.json` (`exports`, `module`, `main`, or `index.js`), and `GET /stage/packages` describes the set, where each module is served from, the style sheets and any diagnostics. Only the files inside the approved packages' folders, of the types a package ships, are served under `/stage/packages/files/**`; the set document and other folders are not reachable. (part of #237)
- **Stage** ([Release v4.80.0](https://github.com/Cratis/Stage/releases/tag/v4.80.0)): The frontend loads the packages before the first render through Scene's `loadApprovedPackages`, with an importer for each package the Stage reported - never an address a scene supplied - and renders them next to the shipped Cratis components with the package catalog resolving `Package.component` names. A package that is missing, does not load, lacks its export or differs from its declaration stops the Stage with the reasons on the page; a profile is never rendered with a package missing. A Stage handed no set renders the shipped packages exactly as before. (part of #237)
- **Stage** ([Release v4.80.0](https://github.com/Cratis/Stage/releases/tag/v4.80.0)): A shared import map in the Stage page maps `react`, `react/jsx-runtime`, `react/jsx-dev-runtime`, `react-dom` and `react-dom/client` to shim modules emitted by the build that re-export the Stage's own React, so a custom package's hooks and contexts are the Stage's. (part of #237)
- **Stage** ([Release v4.80.0](https://github.com/Cratis/Stage/releases/tag/v4.80.0)): `StageShippedPackages` in the contracts is the one list of shipped package names the renderer's catalog and the live package host both use.
- **Stage** ([Release v4.80.0](https://github.com/Cratis/Stage/releases/tag/v4.80.0)): `Verification/live-custom-packages` runs the built image against a model naming `Acme.Charts` with the package mounted (the authored component renders from the package, its property, its style sheet, shipped components beside it, no diagnostics) and again with the package folder missing (the Stage refuses to render and names the package), and a new `live-custom-packages` CI job runs it.
- **Stage** ([Release v4.80.0](https://github.com/Cratis/Stage/releases/tag/v4.80.0)): Documentation: `Documentation/reference/custom-packages.md` describes the live Stage's package folder, endpoints and import map in place of the former limit.
- **AI** ([Release v7.38.2](https://github.com/Cratis/AI/releases/tag/v7.38.2)): The corpus verification job runs the edited model with `cratis run` and checks the edited column and a created row in Chromium, using a pinned Playwright (part of Cratis/AI#536).
- **Scene** ([Release v4.22.0](https://github.com/Cratis/Scene/releases/tag/v4.22.0)): `PropertyEditorKind` (`stringList`, `numberList`, `stringOrList`, `scalar`, `stringMap`) names the editor for a value that has no fields to describe: a list of words or numbers, a word-or-list, a scalar, a record under the author's own names.
- **Scene** ([Release v4.22.0](https://github.com/Cratis/Scene/releases/tag/v4.22.0)): `CollectionItemDescriptor.positional` lets a collection of authored data (chart datasets, tree nodes, columns) hold records without an `id`; items are told apart by position.
- **Screenplay** ([Release v4.145.0](https://github.com/Cratis/Screenplay/releases/tag/v4.145.0)): `run-specifications` accepts an optional `proposalId` and runs a retained proposal's candidate model, including its identity changes, through the same reference evaluator before `apply`. It is read-only: the proposal stays applicable, and continuation pages pin the candidate's source revision (#610)
- **Screenplay** ([Release v4.145.0](https://github.com/Cratis/Screenplay/releases/tag/v4.145.0)): The MCP docs gain an "Edit a specification" recipe: find the specification with `read-ast`, change its steps, cases or examples with `propose-ast`, check changed expected outcomes with `read-proposal` `view: "semantic-diff"`, run the candidate with `run-specifications`, then `apply` (#610)
- **Arc** ([Release v22.80.0](https://github.com/Cratis/Arc/releases/tag/v22.80.0)): The Screenplay generator states the caller of a command scenario as `given caller`: a specification that registers a substituted `ICurrentPrincipalAccessor` returning a `ClaimsPrincipal` built from constant claims becomes `authenticated`, `role` and `claim` lines in the same order. A scenario of an authorized command is stated only when its caller and every policy the command uses are recovered exactly; otherwise it is left out with `SP0039`. A scenario of a command without authorization whose caller setup cannot be stated keeps the scenario without a caller and reports `SP0075`. (#3098)
- **Arc** ([Release v22.80.0](https://github.com/Cratis/Arc/releases/tag/v22.80.0)): The Screenplay generator reports `SP0076` for every `[Theory]` scenario, including reactor scenarios, instead of leaving them out silently. Case tables for such scenarios are tracked in https://github.com/Cratis/Arc/issues/3197. (#3098)
- **AI** ([Release v7.38.0](https://github.com/Cratis/AI/releases/tag/v7.38.0)): The Screenplay skills teach model notes (Screenplay 4.144.0): recording open modeling questions as `question` notes anchored to model elements with `list-model-notes` and `propose-model-notes`, citing and resolving them through external decisions, re-anchoring orphaned notes, keeping secrets and personal data out of committed notes, and the `--open-questions fail` gate of the standalone tool (#627)
- **AI** ([Release v7.38.0](https://github.com/Cratis/AI/releases/tag/v7.38.0)): Copilot path instructions are generated as `.cratis/ai/harnesses/copilot/instructions/<rule>.instructions.md` with `applyTo`, so GitHub Copilot discovers the path-scoped rules (#631)
- **Arc** ([Release v22.79.0](https://github.com/Cratis/Arc/releases/tag/v22.79.0)): Analyzer `ARCCHR0020` (warning) reports an `EventForEventSourceId` whose literal routing names an event source definition together with a stream that definition does not declare, so a typo no longer sends events to a route the command does not describe. Routes that differ from the command's route on purpose stay supported. (part of #2987)
- **Arc** ([Release v22.79.0](https://github.com/Cratis/Arc/releases/tag/v22.79.0)): Analyzer `ARCCHR0021` (info) reports legacy string routing on an `EventForEventSourceId` that spells out a declared definition stream, and offers a code fix that rewrites it to `EventSource = typeof(...)` and `EventStream`, so the definition and its concurrency dimensions are kept. (part of #2987)
- **Stage** ([Release v4.79.0](https://github.com/Cratis/Stage/releases/tag/v4.79.0)): The semantic Stage Host settles event-triggered reactions after each command, including `where`, `runs as`, `from`, productions, invocations, mixed effects and cascades, using Screenplay's reference settlement. The command's events and the reactions' events are appended in one tail-guarded batch; a rejected, denied or unsupported reaction refuses the whole command and appends nothing. (part of #207)
- **Screenplay** ([Release v4.144.0](https://github.com/Cratis/Screenplay/releases/tag/v4.144.0)): Model notes: `question`, `task` and `note` entries anchored to a model element's semantic ID or the application, with an open or resolved state, free-text author, and references to external decisions such as `D123`. A question can be resolved by a specification, a description, a decision, an external decision, or dismissed. Notes on an element without its own identity attach to its owning slice, feature, module or the application (#391)
- **Screenplay** ([Release v4.144.0](https://github.com/Cratis/Screenplay/releases/tag/v4.144.0)): MCP tools `list-model-notes` (filter by anchor, scope, kind, state or reference; `view: "findings"` returns one `model-note.open-question` finding per open question) and `propose-model-notes` (add, edit, resolve, reopen, reanchor and remove), reviewed with `read-proposal` `view: "notes"` and written by `apply` under the same recovery journal as the model (#391)
- **Screenplay** ([Release v4.144.0](https://github.com/Cratis/Screenplay/releases/tag/v4.144.0)): Source, AST, rename, move and property proposals report `orphanedNotes` when they would retire an element that notes are anchored to. Orphaned notes are kept and listed until they are re-anchored or resolved (#391)
- **Screenplay** ([Release v4.144.0](https://github.com/Cratis/Screenplay/releases/tag/v4.144.0)): `screenplay check --open-questions report|fail` lists open questions and, with `fail`, exits 1 while any remain in the checked scope (#391)
- **Screenplay** ([Release v4.144.0](https://github.com/Cratis/Screenplay/releases/tag/v4.144.0)): The notes file format is published as `notes-v1.schema.json` (#391)
- **Chronicle** ([Release v19.52.0](https://github.com/Cratis/Chronicle/releases/tag/v19.52.0)): `RegisterEventType<T>()` and `RegisterEventType(Type)` register event types, with optional `WithId`, `Generation`, `Public`, `Private`, `ForEventStore` and `PublishTo` settings. Defaults match the identifiers markers produce today. (#4732)
- **Chronicle** ([Release v19.52.0](https://github.com/Cratis/Chronicle/releases/tag/v19.52.0)): `RegisterReactor`, `RegisterReducer`, `RegisterConstraint`, `RegisterEventSource` and `RegisterMigration` register plain classes without `IReactor`, `IReducerFor<T>`, `IConstraint`, `IEventSource` or migration markers. A reducer's read model is inferred from its methods, and a constraint only needs `Define(IConstraintBuilder)`. (#4732)
- **Chronicle** ([Release v19.52.0](https://github.com/Cratis/Chronicle/releases/tag/v19.52.0)): A plain migration class with typed `Upcast` and `Downcast` methods can be registered explicitly, and `EventTypeMigration<TUpgrade, TPrevious>` gains a constructor that takes the store's `IEventTypes`, so migrations between unmarked event generations resolve their identifiers from the owning store. (#4732)
- **Chronicle** ([Release v19.52.0](https://github.com/Cratis/Chronicle/releases/tag/v19.52.0)): `IReactors` and `IReducers` gain `Type`-based `Register`, `GetStateFor` and `Replay` operations, plus generic extension methods for plain observer classes. (#4732)
- **Chronicle** ([Release v19.52.0](https://github.com/Cratis/Chronicle/releases/tag/v19.52.0)): `IJsonSchemaGenerator` gains overloads that take the store's `IEventTypes`, so compensation schemas resolve explicitly registered target events. Existing generators keep their current output. (#4732)
- **Chronicle** ([Release v19.52.0](https://github.com/Cratis/Chronicle/releases/tag/v19.52.0)): `ReadModelScenario`, `ReactorScenario` and `EventScenario` honor explicitly registered artifacts, and `ReactorScenario` accepts plain reactor classes. (#4732)
- **Chronicle** ([Release v19.52.0](https://github.com/Cratis/Chronicle/releases/tag/v19.52.0)): Analyzers CHR0001, CHR0002, CHR0003, CHR0005 and CHR0007 accept event types registered through `RegisterEventType` in the same compilation. (#4732)
- **AI** ([Release v7.37.0](https://github.com/Cratis/AI/releases/tag/v7.37.0)): New skills: `cratis-fundamentals-telemetry` (generated metrics and spans with Cratis.Metrics.Roslyn, OpenTelemetry export), `cratis-orleans-jobs` (durable jobs, steps, storage and lifecycle in Cratis.Orleans), `cratis-components-common-controls` (ComboBox, ToggleGroup, Tabs, TagGroup, Breadcrumbs) and `cratis-components-data-surfaces` (PivotViewer, TimeMachine, Canvas, Chat) (#624)
- **AI** ([Release v7.37.0](https://github.com/Cratis/AI/releases/tag/v7.37.0)): Trigger and behavior evaluations for the Kotlin and Java skills (#625)
- **AI** ([Release v7.37.0](https://github.com/Cratis/AI/releases/tag/v7.37.0)): Go evaluations covering older Go minimums, wrapped errors, canceled streams, early iterator exit, borrowed gRPC connections, ambiguous append retries, HTTP HEAD/JSON and v2 import migration, and specs proving the Go rules and skills reach every supported harness (part of #479)
- **AI** ([Release v7.36.0](https://github.com/Cratis/AI/releases/tag/v7.36.0)): The Screenplay model-authoring skill teaches `propose-property` in full: add (Screenplay 4.142.0) with owner, source hops and fixture values, alongside rename and remove, how to choose between a new event generation and `eventNeverPersisted`, how to read `incomplete`, `needsDecision` and `chainCandidates`, and the add refusals; evaluations cover add, rename, remove and a refused event change (#597)
- **Arc** ([Release v22.78.0](https://github.com/Cratis/Arc/releases/tag/v22.78.0)): The Screenplay generator recovers generated values from `[GeneratedValue]` Handle parameters. A parameter whose concept creates a UUID v4 (`Guid.NewGuid()` or `GenerateValue.Uuid()`) becomes a `generated` property, or `generated identifier` when the command returns it as the event source, and `PinGeneratedValue` pins in scenarios become `for "<guid>"` and `generated name = "<guid>"` fixtures, so those scenarios round-trip into the model. Other strategies (UUID v7, hex bytes, custom `New()` bodies, generation context) keep their source form and report information diagnostic `SP0073` until Screenplay can state them. Commands that create identifiers inline without `[GeneratedValue]` keep today's output. See [Generating a Screenplay](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/generating-a-screenplay.md). (part of #3116)
- **Stage** ([Release v4.78.0](https://github.com/Cratis/Stage/releases/tag/v4.78.0)): Event-triggered reactions render as Chronicle reactors: `[Reactor("<semantic id>")]` keeps the observer stable across renames, `[OnceOnly]` keeps replays from repeating effects, a `where` condition becomes a guard, invoked commands are returned for Arc to execute, and produced events are appended to the triggering event source without a stream. (part of #207)
- **Stage** ([Release v4.78.0](https://github.com/Cratis/Stage/releases/tag/v4.78.0)): Automation slices render their own commands (zero or more), events, read models, projections, reducers and queries. (part of #207)
- **Stage** ([Release v4.78.0](https://github.com/Cratis/Stage/releases/tag/v4.78.0)): `STAGE-ESM-039` refuses a reaction whose condition, mapping or destination cannot be rendered without changing its meaning, such as a condition on an optional, composite or enumeration value, or a production that does not map every event property. (part of #207)
- **Stage** ([Release v4.78.0](https://github.com/Cratis/Stage/releases/tag/v4.78.0)): The rendering reference has a new page on reaction rendering, covering the reactor identity, replay, ordering and how live retries differ from Screenplay's reference evaluation: https://github.com/Cratis/Stage/blob/main/Documentation/reference/reaction-rendering.md (part of #207)
- **Screenplay** ([Release v4.143.0](https://github.com/Cratis/Screenplay/releases/tag/v4.143.0)): Equality `filter` clauses on collection queries bind into the executable model as ESM v14: a filter keeps the rows whose same-named read-model property equals the supplied value, combines with `by` as AND, and an optional filter may be omitted (part of #140)
- **Screenplay** ([Release v4.143.0](https://github.com/Cratis/Screenplay/releases/tag/v4.143.0)): Only models with a query filter select ESM v14; models without filters keep their exact executable-model bytes and revision (part of #140)
- **Screenplay** ([Release v4.143.0](https://github.com/Cratis/Screenplay/releases/tag/v4.143.0)): Specifications supply filter values as query arguments in both `then query … arguments` and `when query`, and a query call is identified by its query, key and supplied filter values (part of #140)
- **Screenplay** ([Release v4.143.0](https://github.com/Cratis/Screenplay/releases/tag/v4.143.0)): ESM v14 golden vector and query filters canonical corpus for consumers to verify against (part of #140)
- **Screenplay** ([Release v4.143.0](https://github.com/Cratis/Screenplay/releases/tag/v4.143.0)): Decision record 0069 on admitting equality query filters as ESM v14: https://github.com/Cratis/Screenplay/blob/main/decisions/0069-admit-equality-query-filters-as-esm-v14.md (part of #140)
- **Stage** ([Release v4.77.0](https://github.com/Cratis/Stage/releases/tag/v4.77.0)): Stage admits exact ESM v13 language/semantic pairs (Screenplay 4.141.0) in the renderer, the Host runtime and the specification executor. Later and mixed versions are still refused with `STAGE-ESM-016`. (#345)
- **Stage** ([Release v4.77.0](https://github.com/Cratis/Stage/releases/tag/v4.77.0)): Generated concepts carry their compliance from the model: personal data renders `[PII]` (also when the concept is a secret too), and a secret renders `[Encrypted]` with its scope plus `[NotAudited]`. `[ComplianceDetails]` is not emitted from the executable model. (#345)
- **Stage** ([Release v4.77.0](https://github.com/Cratis/Stage/releases/tag/v4.77.0)): Command inputs that contain personal-data or secret concepts, directly or inside collections, optional values and nested types, render `[property: NotAudited]`, so their values stay out of the causation chain. (#345)
- **Stage** ([Release v4.77.0](https://github.com/Cratis/Stage/releases/tag/v4.77.0)): `STAGE-ESM-040` refuses personal-data or secret concepts used as identities (command and read-model identifiers, event destinations, projection, join and child keys, event-source and stream identifier types) and on enumeration concepts. (#345)
- **Screenplay** ([Release v4.142.0](https://github.com/Cratis/Screenplay/releases/tag/v4.142.0)): `propose-property` can add a property along its chain with `action: "add"`: name the owning declaration, the `type`, whether it is `optional`, and the `hops` that add the property to other declarations or map it in a `produces`, `from` or `append` block. A projection that AutoMaps the same name needs no hop. Producers or projections left without a mapping refuse with `SourcesRequired`, and a required property needs a `fixtureValue` for every existing specification and example occurrence, or the proposal refuses with `FixtureValueRequired`. Adding to an event needs `newGeneration` or `eventNeverPersisted`, as rename and remove do (#389)
- **Arc** ([Release v22.77.0](https://github.com/Cratis/Arc/releases/tag/v22.77.0)): The Screenplay generator reports `SP0071` when a reactor executes a command and handles its outcome in code (reading, matching or discarding the `CommandResult`), and `SP0072` when a reactor recovers from redelivery through `ReactorDelivery` receipts, instead of keeping its `file` reference without saying why. (part of #3094)
- **AI** ([Release v7.35.0](https://github.com/Cratis/AI/releases/tag/v7.35.0)): A product sync ledger (`.cratis/ai/product-sync.json`) records, for each Cratis product, the release the corpus was last synced to and the skills and rules that depend on it; verification keeps it complete and well formed (#619)
- **AI** ([Release v7.35.0](https://github.com/Cratis/AI/releases/tag/v7.35.0)): A drift report (`yarn workspace @cratis/ai-verification run drift`) and a weekly workflow keep one "AI corpus product drift" issue up to date with the releases not yet read into the corpus; private repositories without access are listed as not checked, and an optional `PRODUCT_DRIFT_TOKEN` secret lets the workflow check them
- **AI** ([Release v7.35.0](https://github.com/Cratis/AI/releases/tag/v7.35.0)): New skills: `cratis-arc-hosting`, `cratis-chronicle-hosting`, `cratis-chronicle-decision-reads`, `cratis-arc-testing-kotlin`, `cratis-arc-identity-and-tenancy-kotlin` and `cratis-arc-spring-data-kotlin`
- **AI** ([Release v7.35.0](https://github.com/Cratis/AI/releases/tag/v7.35.0)): Experimental Go guidance: `cratis/language/go`, `cratis/engineering/go`, `cratis/chronicle/client-go` and `cratis/arc/go` profiles with Go rules and skills for Chronicle.Go 0.9.1, Arc.Go 0.1.1 and Fundamentals.Go 0.3.2 (part of #479)
- **AI** ([Release v7.35.0](https://github.com/Cratis/AI/releases/tag/v7.35.0)): An `elixir.md` language rule, so the Elixir language profile carries guidance
- **AI** ([Release v7.35.0](https://github.com/Cratis/AI/releases/tag/v7.35.0)): The Screenplay skills teach `propose-property` rename and remove (Screenplay 4.140.0) (part of #597)
- **AI** ([Release v7.35.0](https://github.com/Cratis/AI/releases/tag/v7.35.0)): Specification examples typed by an event, command or read model imported from another document, with PLAY0520 (#604)
- **AI** ([Release v7.35.0](https://github.com/Cratis/AI/releases/tag/v7.35.0)): The auth skill names AuthProxy and its header contract; the application profile points to `dotnet new cratis` templates; the C# rules name the Cratis architecture analyzers (CRARCH)

## Changed

- **Stage** ([Release v4.178.1](https://github.com/Cratis/Stage/releases/tag/v4.178.1)): The semantic Host's `STAGE-ESM-028` refusal for a command that generates a `generate rule` value now names the concept's rule as well as the command, property and concept, and the documentation states that this refusal is by design: the Host never runs implementation bodies, so render the application to run a rule generator. The supported Host generation subset is the built-in strategies (`uuid`, `uuidv7`, `ulid`, `typeid`, `nanoid`, `bytes`, `pattern` and `random`). (#510)
- **Screenplay** ([Release v4.229.0](https://github.com/Cratis/Screenplay/releases/tag/v4.229.0)): The specification documentation now defines where a `given` event without `for` belongs: the event source the specification acts on. It also covers how constraints count it, when the reference evaluator reports `Unsupported` instead of inventing an identity, and how runners that append to real event streams should place it. See [Givens without an event source](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/specifications.md#givens-without-an-event-source). (#579)
- **cli** ([Release v3.88.0](https://github.com/Cratis/cli/releases/tag/v3.88.0)): Bundles Stage 4.177.2 (from 4.177.1); `cratis run` starts `cratis/stage:4.177.2` by default, and `cratis render` plans with the same renderer. The renderer now takes projections keyed by a payload property or with several `from` blocks (the warehouse movement history of Acme Commerce), which it refused with STAGE-ESM-008 and STAGE-ESM-009 before; the five Acme Commerce domains render, build and pass their 459 generated specifications.
- **Orleans** ([Release v1.26.0](https://github.com/Cratis/Orleans/releases/tag/v1.26.0)): `OnStopped` also runs when the resume hook of a stopped job throws, so it can release whatever the failed hook began.
- **Orleans** ([Release v1.26.0](https://github.com/Cratis/Orleans/releases/tag/v1.26.0)): Custom job storage providers must persist the new `StopFinalized` property of `JobState`.
- **Orleans** ([Release v1.26.0](https://github.com/Cratis/Orleans/releases/tag/v1.26.0)): Jobs stopped before this release run `OnStopped` once more on the first rehydration after upgrading.
- **AI** ([Release v7.89.0](https://github.com/Cratis/AI/releases/tag/v7.89.0)): The application rules now cover recurring design failures: whether an action is allowed is a read-model property rather than a client-side derivation, settings events record one decision each instead of a whole configuration object, each consumer scenario gets its own read model and dispatch never reads a UI model, provider clients stay behind reactors, a reactor never reacts to its own consequences, prompts live as content rather than string literals, and the third copy of a job shape becomes a shared template. (#411)
- **Scene** ([Release v4.72.0](https://github.com/Cratis/Scene/releases/tag/v4.72.0)): A Screenplay table (`core:table`) draws a row for each row its host supplies for the read model it shows (`typeName`), and a summary (`core:summary`) draws the first row's value beside each field's label. A host supplies rows as query results keyed by the read model's name; with none supplied the table still draws only its headings, as before, so a running application whose host binds data its own way is unchanged.
- **Scene** ([Release v4.72.0](https://github.com/Cratis/Scene/releases/tag/v4.72.0)): The preview host gives each read model a Screenplay screen shows (the `typeName` of its data, table and summary elements) the rows of that read model from the sample data pack in effect - a pack's shapes are the rows of a read model by its name - and gives the query a data element names (`core:data` `query`) the same rows. A preview of the Acme Commerce screens now lists the sample products, orders and shipments instead of "Nothing here yet" over bare column headings. (`collectTypeNames` is exported beside `collectQueryNames`.)
- **AI** ([Release v7.88.0](https://github.com/Cratis/AI/releases/tag/v7.88.0)): The Stage rendering admission reference states what the renderer now takes in projections: a constant key at the root of a scope, running totals (zero start, optional totals, concept-to-number and concept-to-concept conversions, what is still refused), the event source identity in a block keyed by an event property, joins inside children, events declared in a state-view slice, and commands that append to several event sources
- **cli** ([Release v3.86.0](https://github.com/Cratis/cli/releases/tag/v3.86.0)): Bundles Stage 4.177.1 (from 4.174.0) and Screenplay 4.226.0 (from 4.216.0); `cratis run` starts `cratis/stage:4.177.1` by default, and `cratis render` plans with the same renderer. `cratis render` now admits ESM v29 and v30 models. The renderer takes running totals that start with a zero add or may be absent, running totals that add a concept into a number or into another concept, projections keyed by an event property that read the event source identity, joins inside children, events a state-view slice declares, and commands that append to several event sources; a product operand of a running total is still refused with STAGE-ESM-050 and published events and Translate slices are still refused. All five Acme Commerce domains (Catalog, Storefront, Sales, Purchasing, Warehouse) render with these: the generated application builds with 0 warnings and its 447 generated specifications pass.
- **Stage** ([Release v4.177.0](https://github.com/Cratis/Stage/releases/tag/v4.177.0)): A running total that may be absent (an optional whole number or concept) now renders for add, subtract, increment and decrement; it is refused only when the same total is also cleared or set from a value that may be absent, which Chronicle cannot add to (part of #558)
- **Stage** ([Release v4.177.0](https://github.com/Cratis/Stage/releases/tag/v4.177.0)): A running total can add a concept into the number it holds, a number into a concept, and a concept into another concept of the same number (the target concept then declares the implicit conversion); a concept into an optional number, or a total of any other type, is refused as STAGE-ESM-017 because Chronicle reads the added event property from a direct member access (part of #558)
- **Stage** ([Release v4.177.0](https://github.com/Cratis/Stage/releases/tag/v4.177.0)): A projection keyed by an event property can read the event's source identity (`sku = $eventSourceId`) when every command that produces the event addresses it with a value of the target's type; otherwise it is still refused as STAGE-ESM-017 (part of #558)
- **Stage** ([Release v4.177.0](https://github.com/Cratis/Stage/releases/tag/v4.177.0)): A join inside a children block renders (Chronicle takes the element identity as the join key, so no `On` is emitted) and its mappings count towards the required properties of the element, whichever of the element's own event and the joined event arrives first; recursive children stay refused (part of #558)
- **Stage** ([Release v4.177.0](https://github.com/Cratis/Stage/releases/tag/v4.177.0)): Events a state-view slice declares are generated with the slice, so a projection can remove with an event no command of the slice produces (part of #503)
- **Stage** ([Release v4.176.0](https://github.com/Cratis/Stage/releases/tag/v4.176.0)): Projections that add or subtract a product of two event values (`add total by unitPrice * quantity`) are refused with `STAGE-ESM-050`, because Chronicle's projection engine adds one event property; the Host and the reference run them.
- **Stage** ([Release v4.176.0](https://github.com/Cratis/Stage/releases/tag/v4.176.0)): An application toolbar button in a layout's `navigation topbar` is reported as omitted with `STAGE-SCENE-NAV-001` until Scene's navigation regions can carry buttons.
- **Stage** ([Release v4.176.0](https://github.com/Cratis/Stage/releases/tag/v4.176.0)): The comparer's "expected Accepted, got Rejected" failure now carries the rejection details like the reference does.
- **cli** ([Release v3.84.0](https://github.com/Cratis/cli/releases/tag/v3.84.0)): Bundles Stage 4.174.0 (from 4.167.1); `cratis run` starts `cratis/stage:4.174.0` by default, and `cratis render` plans with the same renderer. The renderer now renders models whose generated C# names collide (a command property named like its command, a query named like its read model or a property of it) by escaping the colliding member with a trailing `_` and reporting it as STAGE-ESM-050, instead of refusing them with STAGE-ESM-012. It also renders read models with composite keys, scalar absence assertions (`then no <ReadModel> <key>`), per-run projections with optional scalar properties, per-production event source and stream overrides, and live (`observable`) queries that push updates to the generated frontend.
- **AI** ([Release v7.87.1](https://github.com/Cratis/AI/releases/tag/v7.87.1)): The GitHub Actions rule now allows `[skip ci]` on a bootstrap commit that changes only bootstrapped wrapper workflow files whose content the source repository's CI already verified, once the same content has landed with CI running in one canary repository. Package-update bots and any commit touching other files keep normal CI. (#809)
- **Stage** ([Release v4.174.0](https://github.com/Cratis/Stage/releases/tag/v4.174.0)): The conformance matrix no longer lists STAGE-ESM-012 refusals for the renderer where names are now escaped.
- **Stage** ([Release v4.173.0](https://github.com/Cratis/Stage/releases/tag/v4.173.0)): Two production route shapes are still refused with STAGE-ESM-036 until they are proven equivalent to the reference: an override onto an unkeyed stream under a keyed command route, and an override whose literal stream id is `Default`.
- **Arc** ([Release v22.128.0](https://github.com/Cratis/Arc/releases/tag/v22.128.0)): With command read protection enabled, a missing required read model now rejects the command with reason `rule` and the message `<ReadModel> '<key>' does not exist.`, instead of `dependencyUnavailable`. Nullable parameters still receive null when the model is missing, and unprotected reads retain their existing behavior. (#3347)
- **Chronicle** ([Release v19.90.0](https://github.com/Cratis/Chronicle/releases/tag/v19.90.0)): The .NET client now handles different partitions of a reactor or reducer concurrently, while batches for one partition still run in order. Catch-up deliveries no longer time out while they wait behind other partitions in the client. Handlers for different partitions can run at the same time, so a handler that shares non-thread-safe state across partitions must protect it, or set `MaxConcurrentPartitions` to `1` to keep one-at-a-time handling. (#4664)
- **Stage** ([Release v4.172.0](https://github.com/Cratis/Stage/releases/tag/v4.172.0)): `/stage/routes` marks live query routes with `?waitForFirstResult=true`, and a plain GET of a live query answers with its current result.
- **Stage** ([Release v4.172.0](https://github.com/Cratis/Stage/releases/tag/v4.172.0)): A live query whose subscription is refused, or whose runtime faults, shows the error instead of loading forever or keeping stale rows.
- **Stage** ([Release v4.170.0](https://github.com/Cratis/Stage/releases/tag/v4.170.0)): Specifications and the Stage host now run per-run projections whose read models have optional scalar properties. An optional value that no event sets reads back as null instead of 0, false or an empty UUID. Read models with an optional identifier, collections or composite-type properties are still refused, each with its own reason. (part of #512)
- **Arc** ([Release v22.126.0](https://github.com/Cratis/Arc/releases/tag/v22.126.0)): The new capability refuses anything it cannot certify: cloned, wrapped or root providers, disposed scopes, application-registered readers or validator factories, collections of readers or read tokens, and dependency graphs with cached or opaque services. It runs on JIT only and is refused where dynamic code is unavailable. Parameterless validators, commands with read protection switched on and unprotected commands behave as before. (#2831)
- **cli** ([Release v3.83.0](https://github.com/Cratis/cli/releases/tag/v3.83.0)): Bundles Stage 4.167.1 (from 4.159.0); `cratis run` starts `cratis/stage:4.167.1` by default, and `cratis render` plans with the same renderer. The release renders protected command reads on commands with append-time constraints, read-backed requirements next to validated request concepts, unique-value constraints fed by a read, projections that set a collection or composite whole, atomic reaction batches, and the specifications of commands whose own rejection or denial precedes a reaction, a refusal of protected reads of a view whose key is not named `id` (Chronicle's guard admits only `id`), the read-absence rejections of reaction-triggering commands, and the replacement of the seeded content of a template slot a screen fills (Scene 4.70.1).
- **Stage** ([Release v4.169.1](https://github.com/Cratis/Stage/releases/tag/v4.169.1)): Stage now builds against Screenplay 4.209.0. (part of #543)
- **Screenplay** ([Release v4.226.0](https://github.com/Cratis/Screenplay/releases/tag/v4.226.0)): A command can append to several event sources: a production's `for` may name any required scalar command property, so one accepted command appends an event to the order and another to the product (#859)
- **Screenplay** ([Release v4.226.0](https://github.com/Cratis/Screenplay/releases/tag/v4.226.0)): A specification can pin the generated values a reaction-invoked command takes with `given generated <Command>.<property> = <value>`, so a reaction that creates a purchase order with a generated id is specified, not left unsupported (#858)
- **Screenplay** ([Release v4.226.0](https://github.com/Cratis/Screenplay/releases/tag/v4.226.0)): A capture over events carries a list across a context boundary whole (`lines = $.lines`) or fans out one private event per element with `children lines identified by sku`, and `nested` scopes into an object (#857)
- **Screenplay** ([Release v4.226.0](https://github.com/Cratis/Screenplay/releases/tag/v4.226.0)): The golden, canonical corpus, contract probes, conformance syntax vector and documentation carry them; several event sources and pinned values select ESM v30 (decision 0098)
- **Screenplay** ([Release v4.226.0](https://github.com/Cratis/Screenplay/releases/tag/v4.226.0)): The Acme Commerce sample uses all eight admissions (decimals, products, concept conversion, application toolbar buttons, published events, several event sources, pinned generated values, list fan-out) and its workarounds are gone: 173 of 173 specifications pass with no unsupported and no warnings
- **Stage** ([Release v4.169.0](https://github.com/Cratis/Stage/releases/tag/v4.169.0)): Stage now builds against Chronicle 19.83.4.
- **Screenplay** ([Release v4.225.0](https://github.com/Cratis/Screenplay/releases/tag/v4.225.0)): A `Decimal` concept or property can limit its decimal places with `decimals <= N` (0 to 28, trailing zeros do not count), so a third decimal on `Money` is refused where it enters (#867)
- **Screenplay** ([Release v4.225.0](https://github.com/Cratis/Screenplay/releases/tag/v4.225.0)): A projection `add` or `subtract` can take the exact product of two event values with `by <a> * <b>`, so a basket total needs no precomputed line total (#864)
- **Screenplay** ([Release v4.225.0](https://github.com/Cratis/Screenplay/releases/tag/v4.225.0)): A value of one concept maps to a property of another concept over the same primitive, when the target declares no rule or compliance the source lacks, so an id keeps its own concept on each side of a context boundary (#861)
- **Screenplay** ([Release v4.225.0](https://github.com/Cratis/Screenplay/releases/tag/v4.225.0)): The layout's `navigation topbar` region takes application-level `button <id> title "..." slice <Slice>` lines with an optional indented `authorize <Policy>` (#868)
- **Screenplay** ([Release v4.225.0](https://github.com/Cratis/Screenplay/releases/tag/v4.225.0)): A command specification can state the public event its outbound Translate slice publishes, and `PLAY0285` no longer calls it unreachable (#866)
- **Screenplay** ([Release v4.225.0](https://github.com/Cratis/Screenplay/releases/tag/v4.225.0)): The conversions, `decimals <= N` and products select ESM v29; the golden, canonical corpus, contract probes, conformance syntax vector, Monaco completion and documentation carry them (decision 0098)
- **AI** ([Release v7.87.0](https://github.com/Cratis/AI/releases/tag/v7.87.0)): Documents the Screenplay ESM v29 and v30 admissions of decision 0098: the `decimals <= N` rule, `add`/`subtract` by a product, mapping between concepts over one primitive, application toolbar buttons, command specifications that state the published event, several event sources, `given generated` for reaction-invoked commands, and list copy and fan-out in captures over events (#805)
- **AI** ([Release v7.87.0](https://github.com/Cratis/AI/releases/tag/v7.87.0)): Corrects the statements that fanning out to another event source does not run and that reaction-invoked generated values cannot be pinned
- **Stage** ([Release v4.168.0](https://github.com/Cratis/Stage/releases/tag/v4.168.0)): Modeled specifications and the semantic Host now run models whose generated C# names would collide, such as a command property named like its command or a read-model property named like one of its queries. Only the Cratis renderer still refuses these, naming the colliding declaration; the run surfaces keep refusing property names that differ only by case and names Chronicle cannot map. (part of #502)
- **AI** ([Release v7.86.0](https://github.com/Cratis/AI/releases/tag/v7.86.0)): The pull request rule's guidance on grouping related changes now points to the consolidation guard. (#413)
- **Stage** ([Release v4.167.1](https://github.com/Cratis/Stage/releases/tag/v4.167.1)): The Cratis renderer refuses `STAGE-ESM-044` for a command that reads a view whose key property is not named `id`. Chronicle's decision-read guard looks for an `id` property in the read model's schema and refuses anything else (`KeyConversion`), so the rendered command could never succeed: every execution failed with "give the read model a string or Guid Id". The refusal names the command, the read and the key property, and says to rename the key property and the query's key argument to `id`. (#557)
- **Stage** ([Release v4.167.0](https://github.com/Cratis/Stage/releases/tag/v4.167.0)): A specification that expects a protected read to find nothing (`<ReadModel> '<key>' does not exist.`) renders although the command's event triggers a reaction: a refused command appends nothing, so no reaction runs (`STAGE-ESM-011` no longer refuses it). The refusal stays when a command a reaction invokes reads the same read model, because the message is then ambiguous. (#503)
- **Chronicle** ([Release v19.88.1](https://github.com/Cratis/Chronicle/releases/tag/v19.88.1)): The kernel's MongoDB, SQL and in-memory storage can now hold the state that observer type-set changes and failed-partition recovery will need. That is type-set membership and per-connection registrations, retirement results, the pending type-set change, and the recovery cursor, owner and handler holds for failed partitions. It also covers definition-change progress, restart plans, inventory and terminal outcomes. Nothing writes this state yet, and existing observer and failed-partition data keeps loading unchanged. SQL gets one nullable observers column and a definition-change rows table. (part of #4955)
- **Chronicle** ([Release v19.88.1](https://github.com/Cratis/Chronicle/releases/tag/v19.88.1)): The kernel refuses to activate an observer whose stored state needs a newer kernel. That is an observer that has started or finished type-set initialization, or one in an event store whose observers are initialized. The kernel logs an error naming the observer instead of reading the state. Existing stores are not affected. (part of #4955)
- **Chronicle** ([Release v19.88.1](https://github.com/Cratis/Chronicle/releases/tag/v19.88.1)): Updated Cratis.Orleans to 1.23.4. Job recovery retries failed manager initialization after a rolling restart, and resuming a job continues starting other steps when one step fails to start. Stopping or removing a job after a kernel restart now works, and a job cancelled without a result no longer reports an empty partial result.
- **Stage** ([Release v4.166.0](https://github.com/Cratis/Stage/releases/tag/v4.166.0)): The Cratis renderer emits projections that set a collection or composite read-model property whole from an event property of exactly the same required type (`lines = lines`, `shipTo = shipTo`) instead of refusing them with `STAGE-ESM-017`; a whole composite `Set` now counts as establishing the composite for the required-properties check. Optional collections and element-level mappings stay refused. (#558)
- **Stage** ([Release v4.166.0](https://github.com/Cratis/Stage/releases/tag/v4.166.0)): A command can map a required collection or composite value read through a protected read into an event property of the same type instead of being refused with `STAGE-ESM-044`. (#557)
- **Stage** ([Release v4.166.0](https://github.com/Cratis/Stage/releases/tag/v4.166.0)): A specification that expects the caller to be denied by the triggering command's authorization renders although the command's event triggers a reaction: a denied command appends nothing (`STAGE-ESM-011`). (#503)
- **Stage** ([Release v4.165.0](https://github.com/Cratis/Stage/releases/tag/v4.165.0)): Stage loads a model whose execution plan has problems confined to one slice instead of refusing the whole model with `STAGE-PLAN-004`. Specification runs, the Host and the renderer run the supported artifacts and refuse only the affected commands, queries and read models with a typed `STAGE-PLAN-004` refusal; problems that affect the whole model, such as concept validation, still refuse loading. (#501)
- **Stage** ([Release v4.165.0](https://github.com/Cratis/Stage/releases/tag/v4.165.0)): A keyed query with cardinality `One` is refused per query with a typed refusal instead of blocking every other slice; a specification can no longer pass on such a query only because it has no events and expects no results. (#501)
- **Stage** ([Release v4.165.0](https://github.com/Cratis/Stage/releases/tag/v4.165.0)): The Host's read-model browser API and snapshot queries report a refused read model as refused instead of returning it as empty. (#501)
- **Arc** ([Release v22.125.0](https://github.com/Cratis/Arc/releases/tag/v22.125.0)): On JIT, a composite key type without a generated accessor or registration is still validated through reflection, and Arc now logs a warning once per such type naming it, so it can be registered before strict validation becomes the default in a future major release. (#3392)
- **Stage** ([Release v4.162.0](https://github.com/Cratis/Stage/releases/tag/v4.162.0)): The Cratis renderer now renders ESM v22 models that declare `reaction batches atomic`. Each generated reactor handler returns a trigger occurrence's direct productions as one event collection, which Chronicle appends as one all-or-none batch; a selected invocation refusal branch appends as its own batch. Atomic reactions with several production triggers on the same event, and routed direct productions, still refuse with `STAGE-ESM-043`, naming the reaction. Models without the declaration render unchanged. (#422) (part of #503)
- **cli** ([Release v3.82.0](https://github.com/Cratis/cli/releases/tag/v3.82.0)): Bundles Stage 4.159.0 (from 4.154.1); `cratis run` starts `cratis/stage:4.159.0` by default. `cratis render` and Studio keep rendering with the same Stage. The release carries the arrangement conversion Studio needs to export an own shell with its arrangement (Cratis/StudioIssues#816) and the Chronicle 19.83.0 pin of the generated solutions
- **Stage** ([Release v4.161.0](https://github.com/Cratis/Stage/releases/tag/v4.161.0)): Rendering refuses a Scene with error conversion diagnostics instead of failing with an exception, and the scene synthesizer and Host routes collect the diagnostics so an unsupported construct no longer aborts the request. (#532)
- **Stage** ([Release v4.160.0](https://github.com/Cratis/Stage/releases/tag/v4.160.0)): The Cratis renderer no longer refuses `STAGE-ESM-044` for a command that has protected reads and produces an event under an append-time constraint. The rendered application, the Stage executor and the reference evaluator fail in the same order: a missing read, then the requirements, then the constraint. Still refused with `STAGE-ESM-044`: a read path in a `produces when` condition or destination, a read-path mapping to an optional/collection/composite/differently typed property, and reads combined with generated-value freshness scopes. (#557)
- **Stage** ([Release v4.160.0](https://github.com/Cratis/Stage/releases/tag/v4.160.0)): A command whose event takes a unique-value constraint's value from a protected read renders (the validator no longer assumes the constrained mapping is a command property).
- **Stage** ([Release v4.160.0](https://github.com/Cratis/Stage/releases/tag/v4.160.0)): A protected command may now combine its read-backed requirements with validated request concepts (`STAGE-ESM-005` no longer refuses it). Requirements of a protected command are guards in `Handle`, so the order is concept validation, then the reads, then the requirements, the same as the reference. Commands without reads keep the refusal. (#409)
- **Stage** ([Release v4.160.0](https://github.com/Cratis/Stage/releases/tag/v4.160.0)): A specification that expects the triggering command's own rejection (a message only that command declares) renders although the command's event triggers a reaction: a rejected command appends nothing, so no reaction runs (`STAGE-ESM-011` no longer refuses it). (#503)
- **Stage** ([Release v4.159.0](https://github.com/Cratis/Stage/releases/tag/v4.159.0)): `ArrangementConverter.ToSyntax` converts a Scene flow or freeform arrangement (layouts, screen templates and dialog templates) back into the Screenplay `ArrangementSyntax` it is written as, the inverse of `ArrangementConverter.Convert`, so a host that holds Scene declarations (Studio's own shell exported as a screen template) can write the arrangement as typed Screenplay instead of dropping it (part of Cratis/StudioIssues#816)
- **Screenplay** ([Release v4.220.1](https://github.com/Cratis/Screenplay/releases/tag/v4.220.1)): A query with a `performer` block is now an opaque read: it is listed as code the model needs (`PLAY0270` information) and left out of the executable model, instead of making every declaration and specification of the application `unbound` (`PLAY0268`). A specification that reads such a query is left out; everything else keeps running with `screenplay test`. (#862)
- **Screenplay** ([Release v4.220.1](https://github.com/Cratis/Screenplay/releases/tag/v4.220.1)): The Acme Commerce Purchasing dashboard is now composed by a performer; the workaround is gone.
- **Chronicle** ([Release v19.84.0](https://github.com/Cratis/Chronicle/releases/tag/v19.84.0)): The .NET client sends several guards for one event source only to a kernel that advertises support for them. Against an older kernel it keeps refusing with `IncompatibleConcurrencyScopesForEventSource`, and never drops a guard. (#4818)
- **Arc** ([Release v22.124.1](https://github.com/Cratis/Arc/releases/tag/v22.124.1)): The proxy generator no longer re-reads every type of every project assembly for each type it collects, and no longer scans lists for membership or all generated files per index directory, which made generation grow quadratically with solution size (#3400)
- **Arc** ([Release v22.124.1](https://github.com/Cratis/Arc/releases/tag/v22.124.1)): Embedded Screenplay document generation is skipped when none of the sources, references, analyzers, settings or generator it depends on changed since the last build; the previous documents are reused. A build that reported a warning always runs again so the warning is shown again (#3399)
- **Arc** ([Release v22.124.1](https://github.com/Cratis/Arc/releases/tag/v22.124.1)): Embedded Screenplay documents for each scope are produced in parallel, and sources and references are parsed and loaded in parallel, keeping the same output and diagnostic order (#3399)
- **Arc** ([Release v22.124.0](https://github.com/Cratis/Arc/releases/tag/v22.124.0)): The generated Screenplay now omits properties whose type a Screenplay document cannot name — dictionaries, constructed generics such as `KeyValuePair<TKey, TValue>`, interfaces, abstract or plain classes, and collections of them — with Warning `SP0030` naming the property and its original type, instead of substituting another type or a name nothing declares. Representable sibling properties remain. Commands, projections, reactions, queries, screens and scenarios that depend on an affected type are withheld with `SP0030` or `SP0039` rather than restated over fewer fields. See [Properties without a Screenplay type](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/generating-a-screenplay.md#properties-without-a-screenplay-type). (#2527)
- **Stage** ([Release v4.158.0](https://github.com/Cratis/Stage/releases/tag/v4.158.0)): Specifications whose seeds cannot be represented faithfully are refused with a typed reason instead of running: partial or null seeds of projected read models, and seeds of read models built by an opaque reducer. (part of #15)
- **Stage** ([Release v4.158.0](https://github.com/Cratis/Stage/releases/tag/v4.158.0)): Stage now uses Chronicle 19.83.0, and the Host image runs the matching Chronicle kernel. (part of #15)
- **Stage** ([Release v4.157.0](https://github.com/Cratis/Stage/releases/tag/v4.157.0)): A Stage release now publishes the npm runtime package before the NuGet packages, and the release fails when any of its npm, NuGet or Docker publications fails. (part of #499)
- **Screenplay** ([Release v4.218.1](https://github.com/Cratis/Screenplay/releases/tag/v4.218.1)): When a query policy names one of the query's filters, PLAY0273 now says that policies read only the query's `by` argument, not filters, and suggests declaring that argument with `by`, instead of reporting that the path does not resolve. (#789)
- **cli** ([Release v3.81.0](https://github.com/Cratis/cli/releases/tag/v3.81.0)): Bundles Stage 4.154.1 and Screenplay 4.216.0; `cratis run` starts `cratis/stage:4.154.1` by default (#402)
- **cli** ([Release v3.81.0](https://github.com/Cratis/cli/releases/tag/v3.81.0)): `cratis render` admits ESM v1 through v28: Uuid `==` and `!=` comparisons in `require` and `produces when` render; ESM v29 and later are refused with `CLI-RENDER-004` (#402)
- **cli** ([Release v3.81.0](https://github.com/Cratis/cli/releases/tag/v3.81.0)): Resolved C# validation rule bodies now render into validators instead of being refused with `STAGE-ESM-005`; bodies that do not compile or read members Stage does not supply report `STAGE-ESM-019`, `STAGE-ESM-022` or `STAGE-ESM-015` (#402)
- **cli** ([Release v3.81.0](https://github.com/Cratis/cli/releases/tag/v3.81.0)): The Stage Host defaults to the semantic engine and the `eventmodel` engine is deprecated; `cratis run --engine eventmodel` still works but Stage warns at startup (#402)
- **Arc** ([Release v22.123.0](https://github.com/Cratis/Arc/releases/tag/v22.123.0)): Generated TypeScript proxies take their file header from the `CratisProxiesFileHeader` MSBuild property, or else from the project's `.editorconfig` `file_header_template`, and are written without a header when neither is set. Setting `CratisProxiesFileHeader` to `none` turns the header off. Projects that relied on the Cratis MIT header without configuring one now get no header; add `file_header_template` to `.editorconfig` to keep it. See [Proxy generation configuration](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/proxy-generation/Configuration/basic.md). (#3329)
- **AI** ([Release v7.83.0](https://github.com/Cratis/AI/releases/tag/v7.83.0)): The toolchain, specifications and scenario-coverage skills describe reference-runner refusals of unadmitted projections (`UnsupportedEventContext`, `UnsupportedProjectionBlock`) as scoped per specification: only specifications that reach the projection or its read model report unsupported, the rest run, and `planIssues` lists the deferred issues (#779)
- **Stage** ([Release v4.156.0](https://github.com/Cratis/Stage/releases/tag/v4.156.0)): The specification executor and the semantic Host now run ESM v22 models that declare `reaction batches atomic`. Each trigger occurrence's direct productions, and each selected refusal branch, are validated as one unit before anything is appended: a mapping failure, constraint violation, projection refusal or exhausted fact budget appends none of that unit, while earlier successful units remain in the executor. Invoked commands stay separate units, constraint refusals keep their authored message and constraint name, and property-value claims reserved within a batch stay reserved until the batch ends. The live Host keeps its stricter boundary and rolls back the whole initiating command if any unit fails. Models without the declaration keep per-fact reaction execution. The Cratis renderer still refuses atomic batches with `STAGE-ESM-043`. (part of #422)
- **Arc** ([Release v22.122.1](https://github.com/Cratis/Arc/releases/tag/v22.122.1)): `Cratis.Arc.Chronicle` and `Cratis.Arc.Chronicle.Testing` now require Chronicle 19.82.0.
- **cli** ([Release v3.79.0](https://github.com/Cratis/cli/releases/tag/v3.79.0)): `cratis chronicle jobs stop` and `jobs resume` now report why the kernel refused the request (job not found, already concluded, not running, not persisted, nothing took it forward) in text and JSON output, and exit non-zero. They no longer claim success when the kernel refused. The Workbench job actions show a refusal as a failure too.
- **cli** ([Release v3.79.0](https://github.com/Cratis/cli/releases/tag/v3.79.0)): Updated to Chronicle 19.83.0 client packages.
- **AI** ([Release v7.81.0](https://github.com/Cratis/AI/releases/tag/v7.81.0)): The contribution guide asks for changes to rules, skills, agents, hooks and prompts to be reviewed with the same care as code, and explains what the new check flags. (#755)
- **AI** ([Release v7.80.0](https://github.com/Cratis/AI/releases/tag/v7.80.0)): The corpus pins Screenplay 4.213.0. The model-authoring skill teaches that application, module, feature and slice containers get identities before the model binds, so notes anchor to them while modelling. It also covers:
- **AI** ([Release v7.80.0](https://github.com/Cratis/AI/releases/tag/v7.80.0)): reading the identity and incomplete-document reports from `open-workspace` and `workspace-state`;
- **AI** ([Release v7.80.0](https://github.com/Cratis/AI/releases/tag/v7.80.0)): why the notes tools refuse targets;
- **AI** ([Release v7.80.0](https://github.com/Cratis/AI/releases/tag/v7.80.0)): preferring `propose-rename` and `propose-move` over manual renames, which need `semanticRenames`.
- **AI** ([Release v7.79.0](https://github.com/Cratis/AI/releases/tag/v7.79.0)): The code, security and performance review skills, the reviewer agents and the review prompts and coordinators share one report shape: Blockers, Suggestions, Dismissed (with reason), Verdict, and what the review did not examine. An empty Blockers section is a complete review, a blocker states its consequence, and the blocking marker is reserved for issues that must be fixed before merge. Each skill keeps its own risk categories, mapped onto the shared verdict. (#366)
- **Stage** ([Release v4.153.0](https://github.com/Cratis/Stage/releases/tag/v4.153.0)): Command rules and concept rules with a resolved C# body that returns `bool` now render into the generated command and concept validators through an app-local typed context, instead of being refused with `STAGE-ESM-005`. A rule without a message gets the default `A value does not satisfy the '<kind>' rule.` (part of #513)
- **Stage** ([Release v4.153.0](https://github.com/Cratis/Stage/releases/tag/v4.153.0)): A validation rule body that reads `Tenant`, `CausedBy` or `Occurred` is refused with `STAGE-ESM-015`, naming the member; bodies must pass the same pure gate as reducer and policy bodies. (part of #513)
- **Stage** ([Release v4.153.0](https://github.com/Cratis/Stage/releases/tag/v4.153.0)): Rendering an inline `generate rule` factory requires the implementation requirements and resolved contents from the same Screenplay compilation; the documentation now says so. (part of #513)
- **Stage** ([Release v4.153.0](https://github.com/Cratis/Stage/releases/tag/v4.153.0)): Command and concept code-validation bodies written as iterators (`yield return` of messages) now render into the generated validators; interpolated messages are formatted with the invariant culture so they do not change with the host culture. Other constructs the pure gate refuses stay refused. (part of #513)
- **AI** ([Release v7.78.0](https://github.com/Cratis/AI/releases/tag/v7.78.0)): Stage skills cover releases through 4.146.0. This adds exact ESM schema admission through v27 and rendered chronological command comparisons (`DateOnly`, `DateTimeOffset`, explicit offsets), including the comparison shapes Stage still refuses. (#773)
- **AI** ([Release v7.78.0](https://github.com/Cratis/AI/releases/tag/v7.78.0)): Arc and Chronicle skills cover Arc through 22.117 and Chronicle through 19.81.1. New guidance covers occurrence command execution, storage resolution, namespace removal, projection rollout and reconciliation, `StartAtTail`, and conflict details with refusal recovery. Corrected guidance covers internal static query exposure, validation member casing, React query-key state, and all-event child mappings. (#773)
- **AI** ([Release v7.78.0](https://github.com/Cratis/AI/releases/tag/v7.78.0)): The Screenplay skills explain model notes split across files and checks aligned with Screenplay 4.212. (#768)
- **AI** ([Release v7.78.0](https://github.com/Cratis/AI/releases/tag/v7.78.0)): The corpus pins Screenplay 4.212.3. The toolchain skill documents PLAY0801 `DuplicateEventInProjectionScope`. The projections skill explains that a projection uses each event type once per level (the root, one `children` block, one `nested` block or one variant). If the domain has a genuinely different second fact, model it as its own event instead of reusing one event in two `from` blocks. (#769)
- **Stage** ([Release v4.152.0](https://github.com/Cratis/Stage/releases/tag/v4.152.0)): The Stage runtime executes every command through the registered Arc command proxy, configured like `useCommand`, instead of its own `fetch`. Arc now checks required command properties in the browser before the call, the same rule the server enforces. (part of #499)
- **Stage** ([Release v4.152.0](https://github.com/Cratis/Stage/releases/tag/v4.152.0)): The live Stage's `/stage/routes` also returns each command's JSON schema, keyed by the command's full name, so the Stage can build a proxy for every command, including commands with the same name in different modules. (part of #499)
- **Stage** ([Release v4.151.0](https://github.com/Cratis/Stage/releases/tag/v4.151.0)): Plans rendered without the opt-in, and their digests, are unchanged; a partial plan's digest includes its refusals. (part of #500)
- **AI** ([Release v7.77.0](https://github.com/Cratis/AI/releases/tag/v7.77.0)): Twelve skill descriptions have sharper, distinct triggers and point to their sibling skills, so similar skills no longer compete. This covers the Chronicle Elixir, Kotlin and TypeScript clients, Arc validation and queries across languages, the React and slice specification skills, and the CodeScene refactoring and safeguarding skills. (#754)
- **Stage** ([Release v4.150.0](https://github.com/Cratis/Stage/releases/tag/v4.150.0)): Admit ESM v28 models (Screenplay 4.206.0): Uuid `==` and `!=` in command `require` conditions and `produces when` guards now run in the semantic Host and specification executor, comparing canonical lowercase hyphenated Uuids ordinally, including through concepts and protected read paths; non-canonical Uuid input is rejected before any requirement runs. The Cratis renderer renders these comparisons as Guid comparisons, including protected read paths in `require`, and turns a Uuid literal into `Guid.Parse(...)` instead of comparing a Guid with text. The legacy engines refuse Uuid comparisons with `STAGE-ESM-049`. (#487)
- **Arc** ([Release v22.121.0](https://github.com/Cratis/Arc/releases/tag/v22.121.0)): Only `public` static methods on a `[ReadModel]` become query endpoints and get generated proxies. `internal`, `protected` and `private` static methods are no longer exposed, also when they carry the query marker. A `public` static query on an `internal` read model type still works. The new analyzer warning ARC0029 reports a non-public method that looks like a query, so an endpoint that disappeared after upgrading is explained at build time. (#3368)
- **Stage** ([Release v4.149.0](https://github.com/Cratis/Stage/releases/tag/v4.149.0)): A read model whose projection uses an unsupported construct (for example a projection `sequence` or `variant`) is kept without its projection and records the projection's name; each unsupported construct is reported as an error. Additional projections on a read model are now reported as a warning instead of being dropped silently. (#531)
- **Stage** ([Release v4.149.0](https://github.com/Cratis/Stage/releases/tag/v4.149.0)): Unknown arrangement nodes, container kinds, place sizes and size classes are reported as diagnostics, and render planning reports an unsupported arrangement as a finding instead of throwing. Rendering refuses a model with conversion errors. (#531)
- **Chronicle** ([Release v19.83.0](https://github.com/Cratis/Chronicle/releases/tag/v19.83.0)): `ReadModelScenario<T>`: `Given.ForEventSourceId(id).ReadModel(instance)` now seeds the starting state for that read-model key. Events for the key apply on top of the seeded instance (setters, arithmetic and children), a reducer receives it as its current state for the key's first event, other keys start from the normal initial state, and a seeded key is returned by `Instances` and `InstanceForEventSourceId` even without events. Previously the seed was only returned by `IReadModels.GetInstanceById` and was ignored by the fold. Read models without a projection or reducer keep the lookup-only behavior. (#4846)
- **Chronicle** ([Release v19.83.0](https://github.com/Cratis/Chronicle/releases/tag/v19.83.0)): `ReadModelScenario<T>`: seeding the same key twice throws `ReadModelAlreadySeeded`. (#4846)
- **Stage** ([Release v4.148.0](https://github.com/Cratis/Stage/releases/tag/v4.148.0)): The Stage Host (and the Stage Docker image) runs the semantic engine when no engine is configured. To keep the previous behavior, start the Host with `--engine=eventmodel` or set `Stage__Runtime__Engine=eventmodel`. The SpecRunner default is unchanged. (part of #23)
- **AI** ([Release v7.76.0](https://github.com/Cratis/AI/releases/tag/v7.76.0)): The corpus pins Screenplay 4.212.4. The projections skill explains that `automap` or `no automap` on a joined event decides auto-mapping for that joined event alone; without one, it follows its level. Warning PLAY0380 is described as covering only `all` inside `children` or `nested`. (#772)
- **Arc** ([Release v22.119.0](https://github.com/Cratis/Arc/releases/tag/v22.119.0)): The query health endpoint (`QueryHealth.ObserveHealth`) now requires an authenticated user outside Development, over HTTP and both observable-query hub transports. It stays anonymous in Development. Set `Cratis:Arc:QueryHealth:RequireAuthentication` to `false` to keep it anonymous everywhere, or set `Roles` to restrict it further. (#2873)
- **Chronicle** ([Release v19.82.2](https://github.com/Cratis/Chronicle/releases/tag/v19.82.2)): An append whose stored outcome the kernel cannot confirm now fails with the `AppendOutcomeUnknown` error instead of reporting success or a plain failure. The events may or may not be stored, so do not retry blindly. Read the event source's events and append again only if none carries the attempt's correlation id. See [Appending events](https://github.com/Cratis/Chronicle/blob/main/Documentation/events/appending.mdx). (#4895)
- **Chronicle** ([Release v19.82.2](https://github.com/Cratis/Chronicle/releases/tag/v19.82.2)): While a unique or closing constraint index that governs an append still needs repair, the append fails with the `ConstraintIndexUnavailable` error and nothing is stored. Retry it unchanged after a short delay. (#4895)
- **Chronicle** ([Release v19.82.2](https://github.com/Cratis/Chronicle/releases/tag/v19.82.2)): A constraint reindex no longer requires appends to stop. The rebuild hands its progress back to the event sequence, which restores claims and closures written while it ran. (#4895)
- **Screenplay** ([Release v4.213.0](https://github.com/Cratis/Screenplay/releases/tag/v4.213.0)): Modules, features and slices get identities as soon as the model parses, even when it does not bind yet, so model notes anchor to the element you name while you are still modeling. The identity an element has before binding is the one it keeps once the model binds; renames and moves before the first binding keep it through migrations, as for bound models. See [decision 0093](https://github.com/Cratis/Screenplay/blob/main/decisions/0093-give-containers-identities-before-the-model-binds.md). (#885)
- **Screenplay** ([Release v4.213.0](https://github.com/Cratis/Screenplay/releases/tag/v4.213.0)): A container address claimed by more than one declaration, or whose identity collides with another, gets no identity and is reported; note requests that target it are refused. While a document does not parse or place, no new identities are assigned and the incomplete documents are reported. (#885)
- **Screenplay** ([Release v4.213.0](https://github.com/Cratis/Screenplay/releases/tag/v4.213.0)): Renaming an identified module, feature or slice by hand through `propose-ast` or `propose-source` needs explicit `semanticRenames`, now also on models that do not bind. (#885)
- **AI** ([Release v7.75.0](https://github.com/Cratis/AI/releases/tag/v7.75.0)): The general rule, the Pi quality-gate tool description and the hooks README name both configuration files:
- **AI** ([Release v7.75.0](https://github.com/Cratis/AI/releases/tag/v7.75.0)): the shipped defaults in `.cratis/ai/hooks/scripts/quality-gates.json`;
- **AI** ([Release v7.75.0](https://github.com/Cratis/AI/releases/tag/v7.75.0)): project overrides in `.cratis/ai/quality-gates.project.json`.
- **Arc** ([Release v22.118.0](https://github.com/Cratis/Arc/releases/tag/v22.118.0)): `IOccurrenceCommandExecutor` refuses an immediate (non-transactional) append inside a keyed occurrence command before it is sent; the attempt fails with nothing appended and no effect receipt. Use the unit of work (`.Transactional`) for appends in occurrence commands. See [Executing commands for occurrences](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/chronicle/commands/occurrence-commands.md). (#3354)
- **Arc** ([Release v22.118.0](https://github.com/Cratis/Arc/releases/tag/v22.118.0)): Updated Cratis.Chronicle to 19.81.0. (#3354)
- **cli** ([Release v3.78.0](https://github.com/Cratis/cli/releases/tag/v3.78.0)): Bundles Stage 4.146.0 and Screenplay 4.212.2; `cratis run` starts `cratis/stage:4.146.0` by default (#395)
- **cli** ([Release v3.78.0](https://github.com/Cratis/cli/releases/tag/v3.78.0)): A model `cratis render` refuses now lists every independent refusal at once, so fixing it no longer reveals new refusals one render at a time (#395)
- **cli** ([Release v3.78.0](https://github.com/Cratis/cli/releases/tag/v3.78.0)): `cratis run` on the semantic engine refuses only the commands and queries that reach a reducer or code-bodied validation, with `STAGE-IMPL-003`, and runs the rest of the model (#395)
- **cli** ([Release v3.78.0](https://github.com/Cratis/cli/releases/tag/v3.78.0)): Rendered applications pin Arc 22.112.1 and Chronicle 19.78.0 (#395)
- **Stage** ([Release v4.147.0](https://github.com/Cratis/Stage/releases/tag/v4.147.0)): The specification executor and the semantic Host no longer refuse a whole model because a command has a described handler (ESM v23). A specification or command that reaches the handler body is reported as Unsupported with the new `ImplementationBody` capability, after authorization and validation have run, so denied and invalid outcomes for that command, and every specification that does not reach the handler, still run. The Cratis renderer still refuses described handlers with `STAGE-IMPL-002`. (part of #316)
- **Stage** ([Release v4.147.0](https://github.com/Cratis/Stage/releases/tag/v4.147.0)): Specification run reports can now carry the `ImplementationBody` capability. A reader built against an earlier Stage version rejects that value.
- **Stage** ([Release v4.146.0](https://github.com/Cratis/Stage/releases/tag/v4.146.0)): The Cratis renderer runs every independent admission check — version features, implementation envelopes, typed contexts, event lineage, slice and specification admission — and lists all their refusals together, so fixing a model no longer reveals new refusals one render at a time. A model refused by the target profile or by an unaudited ESM version still stops at that refusal first. A refusal reported by two checks is listed once. Refusals collected before an unexpected model shape is reached are no longer lost. Plans that render are unchanged. (part of #500)
- **AI** ([Release v7.74.0](https://github.com/Cratis/AI/releases/tag/v7.74.0)): A decision call no longer appends `DecisionUsageRecorded`, and a provider usage refresh no longer appends `AIProviderUsageSnapshotRecorded`. Decision usage is reported on the `Cratis.AI.Decisions` meter: the counters `cratis.ai.decision.input_tokens`, `cratis.ai.decision.output_tokens`, `cratis.ai.decision.calls`, `cratis.ai.decision.decisions` and `cratis.ai.decision.choices`, tagged `decision.engine`, `model` and `topic`. Provider usage is reported on the `Cratis.AI.Providers.UsageReporting` meter as the gauge `cratis.ai.provider.consumed_tokens`, tagged `provider` and `availability`. Add both meters to your OpenTelemetry setup to collect them. (#651)
- **AI** ([Release v7.74.0](https://github.com/Cratis/AI/releases/tag/v7.74.0)): `AllAIProviderUsageSnapshots` keeps its name and result shape. It is now served from the in-process usage cache and only returns the providers configured in the current namespace. After a restart it is empty until each provider's usage is refreshed again.
- **AI** ([Release v7.74.0](https://github.com/Cratis/AI/releases/tag/v7.74.0)): `DecisionUsageForLastThirtyDays` no longer receives new data, because nothing appends `DecisionUsageRecorded` any more.
- **AI** ([Release v7.74.0](https://github.com/Cratis/AI/releases/tag/v7.74.0)): The constructors of `ProviderUsageLevels` and `DecisionUsageRecorder` no longer take `ICommandPipeline`, and `IRecentUsageSnapshots` has a new `Observe()` member. This only matters if you construct these types or implement the interface yourself.
- **AI** ([Release v7.74.0](https://github.com/Cratis/AI/releases/tag/v7.74.0)): Cratis.AI now depends on Cratis.Fundamentals 7.25.1 (was 7.19.4).
- **Stage** ([Release v4.145.0](https://github.com/Cratis/Stage/releases/tag/v4.145.0)): The specification executor refuses only the specifications that reach a reducer or a validation implementation body, and the semantic Host refuses only the commands and queries that reach one. Previously a single such body anywhere refused every specification and every command. A body is reached through the command under test, commands invoked by reactions, concept rules on command properties and query arguments, and reducers fed by given, appended or produced events, including events from an action expected to be refused. (part of #513)
- **Stage** ([Release v4.145.0](https://github.com/Cratis/Stage/releases/tag/v4.145.0)): These refusals carry the new diagnostic code `STAGE-IMPL-003`, naming the body the specification or command reaches. (part of #316)
- **Arc** ([Release v22.117.0](https://github.com/Cratis/Arc/releases/tag/v22.117.0)): Updated Cratis.Chronicle to 19.77.2 and Cratis.Metrics.Roslyn to 7.25.0. (part of #3288)
- **Chronicle** ([Release v19.80.0](https://github.com/Cratis/Chronicle/releases/tag/v19.80.0)): Cratis.Orleans is updated to 1.23.0.
- **Chronicle** ([Release v19.80.0](https://github.com/Cratis/Chronicle/releases/tag/v19.80.0)): A step that times out is run again, up to five attempts, before its partition is reported as failed, so a busy observer no longer turns into a cascade of failed partitions. (part of #4991)
- **Chronicle** ([Release v19.80.0](https://github.com/Cratis/Chronicle/releases/tag/v19.80.0)): A failed job step records one short message instead of a multi-kilobyte stack trace. (part of #4644)
- **Chronicle** ([Release v19.80.0](https://github.com/Cratis/Chronicle/releases/tag/v19.80.0)): Replay keeps at most 16 partition steps active at once instead of starting all of them. (part of #4991)
- **Chronicle** ([Release v19.80.0](https://github.com/Cratis/Chronicle/releases/tag/v19.80.0)): A job recorded as Running whose steps all concluded more than two minutes ago is no longer treated as running, so `observers replay` starts a real job and a replaying observer without a live job is routed again. (part of #4991)
- **Chronicle** ([Release v19.80.0](https://github.com/Cratis/Chronicle/releases/tag/v19.80.0)): The replay-complete notification to the observer is retried instead of being fired once and forgotten. (part of #4991)
- **Chronicle** ([Release v19.80.0](https://github.com/Cratis/Chronicle/releases/tag/v19.80.0)): Observers coalesce handled-event counts and failure follow-up writes, which takes load off the observer grain. (part of #4991)
- **Chronicle** ([Release v19.80.0](https://github.com/Cratis/Chronicle/releases/tag/v19.80.0)): The kernel statistics projections are no longer fully replayed on every restart, and superseded read model generations are deleted after a replay. (part of #4692) (part of #4644)
- **Scene** ([Release v4.69.0](https://github.com/Cratis/Scene/releases/tag/v4.69.0)): The `Drawer` menu mode now opens an off-canvas menu over a dimming scrim, and `Overlay` no longer dims; the hover-driven rail is `Reveal` alone. A touch width now always resolves to Drawer (#196)
- **cli** ([Release v3.77.0](https://github.com/Cratis/cli/releases/tag/v3.77.0)): Bundles Stage 4.143.0 and Screenplay 4.211.2, so the rendered application scenarios require the custom two-column manual command form (part of Cratis/Screenplay#721)
- **cli** ([Release v3.77.0](https://github.com/Cratis/cli/releases/tag/v3.77.0)): Rendering refuses an unknown runtime package or a missing layout through Stage's own profile input resolution, so Studio and the CLI refuse identically (part of Cratis/Screenplay#722)
- **Stage** ([Release v4.144.0](https://github.com/Cratis/Stage/releases/tag/v4.144.0)): Generated applications pin Arc 22.112.1 for both the .NET and the frontend packages, Chronicle 19.78.0 with the `cratis/chronicle:19.78.0-development` kernel image, and on the frontend Fundamentals 7.25.1 and Components 4.29.0. Existing applications see the new versions on their next regeneration. (#493)
- **Stage** ([Release v4.144.0](https://github.com/Cratis/Stage/releases/tag/v4.144.0)): Stage itself builds and ships with Arc 22.112.1, Chronicle 19.78.0 and Fundamentals 7.25.1, and its bundled kernel image is `cratis/chronicle:19.78.0-development`. (#493)
- **Orleans** ([Release v1.23.0](https://github.com/Cratis/Orleans/releases/tag/v1.23.0)): `IJobsManager.Stop` now returns `Result<StopJobError>` instead of `Task`; update callers that await it as a plain task if they need the outcome.
- **Orleans** ([Release v1.23.0](https://github.com/Cratis/Orleans/releases/tag/v1.23.0)): A running job is watched: it counts its steps in storage and finalizes itself when every step is done, counting `Failed` and `CompletedWithFailure` as failed, instead of staying `Running` when a step's report never arrived.
- **Orleans** ([Release v1.23.0](https://github.com/Cratis/Orleans/releases/tag/v1.23.0)): A step persists its terminal status first and then delivers it to the job, retrying with backoff until acknowledged. A delivery that never succeeds no longer marks the step failed; the job accepts each outcome once per step and attempt.
- **Arc** ([Release v22.116.0](https://github.com/Cratis/Arc/releases/tag/v22.116.0)): Subscribing to a query without `[AllowAnonymous]` or a guest policy over the hub's WebSocket or SSE transport now applies the host's default authorization before the query runs, as a direct request to that query does. A caller the host would turn away receives an Unauthorized frame, and SSE subscribe returns 401. `[AllowAnonymous]` and guest-policy queries stay reachable anonymously. (#2952)
- **Arc** ([Release v22.116.0](https://github.com/Cratis/Arc/releases/tag/v22.116.0)): Non-observable queries performed over the hub now pass the registered emission guards before their result is sent. A guard that denies sends Unauthorized; a guard that suppresses sends nothing. (#2955)
- **Arc** ([Release v22.115.0](https://github.com/Cratis/Arc/releases/tag/v22.115.0)): Validation results now always report their members as camelCase field paths (`name`, `address.street`, `items[0].name`), the same form command and concept validators already used. Server-side assertions against `ValidationResult.Members` must use the camelCase field path instead of `nameof(Property)`.
- **AI** ([Release v7.73.0](https://github.com/Cratis/AI/releases/tag/v7.73.0)): The model-authoring skill teaches that one proposal may remove and add unrelated references together, that only a reference with the same text both removed and added is refused, and how to read the located conflict's document, path and occurrences instead of splitting the batch. Use `propose-move` or a semantic migration to keep a moved reference's identity. (#762)
- **AI** ([Release v7.73.0](https://github.com/Cratis/AI/releases/tag/v7.73.0)): The Screenplay skills describe a file or inline command handler as refused with `PLAY0800`, whose required `subject` argument names the command: a permanent limitation that is gap-filled in code, not something a later ESM version adds. `PLAY0268` keeps meaning "not representable in a supported ESM version yet". (#761)
- **AI** ([Release v7.73.0](https://github.com/Cratis/AI/releases/tag/v7.73.0)): The pinned Screenplay compiler, standalone tool and contract move to 4.211.1.
- **Stage** ([Release v4.142.0](https://github.com/Cratis/Stage/releases/tag/v4.142.0)): The semantic Host decides a command on the session world, then reads the facts other writers appended since and commits the decision against them. Only an outside fact the decision depends on turns the command into a concurrency conflict; unrelated outside facts are absorbed and the session continues. Refusals keep their outcome. A batch whose write loses the race is retried with the same decision only when its reactions invoked no commands. (#474)
- **Stage** ([Release v4.142.0](https://github.com/Cratis/Stage/releases/tag/v4.142.0)): Stage now builds against Screenplay 4.206.0.
- **Arc** ([Release v22.114.0](https://github.com/Cratis/Arc/releases/tag/v22.114.0)): Protected-read refusals PLAY0781–PLAY0785 are attributed to the affected command and read through Screenplay's typed diagnostic arguments, and each refused read is reported separately. (#3344)
- **Arc** ([Release v22.114.0](https://github.com/Cratis/Arc/releases/tag/v22.114.0)): Updated Cratis.Screenplay to 4.208.0. (#3344)
- **Stage** ([Release v4.141.0](https://github.com/Cratis/Stage/releases/tag/v4.141.0)): Applications Stage renders and scaffolds now target Arc 22.112.0.
- **Stage** ([Release v4.141.0](https://github.com/Cratis/Stage/releases/tag/v4.141.0)): The renderer still refuses, with `STAGE-ESM-046` naming the property, a compared DateTime concept that carries compliance or is optional, and a compared DateTime property whose name is not camel case.
- **Stage** ([Release v4.141.0](https://github.com/Cratis/Stage/releases/tag/v4.141.0)): For a command with an authorization policy, an unauthorized caller sending an unbindable date body gets a validation error rather than 403, because Arc binds the body before evaluating Stage's named policies (Cratis/Arc#3341).
- **Screenplay** ([Release v4.211.2](https://github.com/Cratis/Screenplay/releases/tag/v4.211.2)): The canonical screen-composition corpus renders a manual two-column command form (1fr and 2fr columns, a 24px gap and a field spanning both columns) so live Stage and generated React are held to the same grid geometry. (#721)
- **Screenplay** ([Release v4.211.0](https://github.com/Cratis/Screenplay/releases/tag/v4.211.0)): `propose-source`, `propose-ast` and the other authoring tools accept a batch that removes one reference and adds an unrelated one, the same as proposing the two edits one after the other. A batch is refused only when a reference with the same text is both removed and added, because its identity cannot be told apart from a move; use `propose-move` or semantic migrations for a real move. See [reference continuity](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/mcp/authoring-tools.md). (#783)
- **Screenplay** ([Release v4.211.0](https://github.com/Cratis/Screenplay/releases/tag/v4.211.0)): MCP responses write document identities and document paths as plain strings: `conflicts[].document`, `conflicts[].path` and `conflicts[].otherPath`, and the document fields in a `propose-move` report. A conflict without a document reports `null`. (#783)
- **Screenplay** ([Release v4.210.0](https://github.com/Cratis/Screenplay/releases/tag/v4.210.0)): A file or inline command handler is now refused with its own error code `PLAY0800` (command handler requires a constrained implementation attachment) instead of `PLAY0268`, with a required `subject` argument naming the command. `PLAY0268` keeps meaning a construct is not representable in a supported executable model version yet, so tools can tell a permanent limitation from one that a later version admits. Tools that matched the handler refusal by `PLAY0268` and its message text switch to `PLAY0800`. See the [diagnostics reference](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/diagnostics.md). (#852)
- **AI** ([Release v7.71.0](https://github.com/Cratis/AI/releases/tag/v7.71.0)): The Screenplay command-surface skill teaches that, from Screenplay 4.209.0, a protected read whose key (or any part of a composite key) is a shape the event store refuses rejects as missing state, even when an instance is stored at that key. The refused shapes are empty, whitespace-only, exactly `*`, containing `#`, and leading or trailing whitespace. Only protected reads change, and the skill shows how to keep such keys out of read keys. (#756)
- **Stage** ([Release v4.140.0](https://github.com/Cratis/Stage/releases/tag/v4.140.0)): Bundles Scene 4.68.2 (engine and model NuGet, `@cratis/scene.*` and the default blueprint on npm), which carries the template layout and contrast fixes this vector found; the frozen render digests that embed the scene pin are refreshed.
- **Stage** ([Release v4.140.0](https://github.com/Cratis/Stage/releases/tag/v4.140.0)): A new `Verification/blueprint-templates` vector: the default blueprint's MasterDetail, Dashboard and ProfileSettings screen templates are applied to screens in `model/templates.play` and rendered (a) on the live Stage image (nothing approved, the blueprint ships in the Stage) and (b) in a generated React application built the way its author would (Debug backend with generated Arc proxies, npm install, frontend build). The browser scenario asserts, per template, that every slot is filled, the page does not overflow, the grid layout holds and axe finds no WCAG A/AA violation. Both run in CI (`live` job step and a new `generated-react-blueprint-templates` job).
- **Screenplay** ([Release v4.209.0](https://github.com/Cratis/Screenplay/releases/tag/v4.209.0)): A protected command read whose key, or any part of a composite key, is a shape the event store refuses (empty, whitespace-only, exactly `*`, containing `#`, or with leading or trailing whitespace) now rejects with the same `Validation` outcome and message as a missing view, even when the world holds an instance at that key. Other uses of such a key, including command identifiers, are unchanged. The canonical protected-reads corpus gains vectors for these shapes so hosts can prove they map their store's refusal to this outcome. See [decision 0091](https://github.com/Cratis/Screenplay/blob/main/decisions/0091-protected-reads-treat-keys-the-event-store-refuses-as-missing.md) and [Keys the event store refuses](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/commands.md). (#843)
- **AI** ([Release v7.70.0](https://github.com/Cratis/AI/releases/tag/v7.70.0)): The Screenplay and Stage skills teach that rendering admits concepts with `generate rule` and emits the attached C# body as the concept's generation factory, with `STAGE-ESM-019`, `STAGE-ESM-020` and `STAGE-ESM-022` for bodies it refuses, while the Host and the legacy syntax engine still refuse commands that generate such a value with `STAGE-ESM-028`. (#752)
- **AI** ([Release v7.70.0](https://github.com/Cratis/AI/releases/tag/v7.70.0)): The skills teach ESM v27 composite read-model keys downstream: the semantic Host runs them, the specification executor refuses specifications over them, and rendering refuses them with `STAGE-ESM-047` and `STAGE-ESM-048`. `cratis render` from CLI 3.75.0 admits ESM v1–v27 and blocks v28 with `CLI-RENDER-004`. (#752)
- **AI** ([Release v7.70.0](https://github.com/Cratis/AI/releases/tag/v7.70.0)): The skills teach that Stage 4.138.0 renders protected command reads as Arc read protection, which reads it still refuses with `STAGE-ESM-044`, and that `cratis render` gets this from the first CLI that bundles Stage 4.138.0. (#752)
- **AI** ([Release v7.70.0](https://github.com/Cratis/AI/releases/tag/v7.70.0)): The skills describe `cratis run`'s semantic engine as the default (CLI 3.73.0; `--engine` since 3.64.0) and the EventModel engine as legacy, no longer recommending it as a fallback. (#752)
- **AI** ([Release v7.70.0](https://github.com/Cratis/AI/releases/tag/v7.70.0)): The toolchain and event-modeling skills state that the language is frozen at ESM v1–v28 and link [the freeze decision](https://github.com/Cratis/Screenplay/blob/main/decisions/0092-the-language-is-frozen-at-esm-v28.md): model with what v1–v28 offers and report a typed refusal downstream as a platform gap. (#752)
- **AI** ([Release v7.70.0](https://github.com/Cratis/AI/releases/tag/v7.70.0)): The protected-reads reference lists the typed arguments of PLAY0781–PLAY0785 and the published `reason` keywords, so tools read the arguments instead of parsing message text. (#751)
- **Arc** ([Release v22.113.0](https://github.com/Cratis/Arc/releases/tag/v22.113.0)): A read-protection conflict now says which event changed the read model when Chronicle reports it, for example "BookStock 'isbn-1' changed after BorrowBook read it (BookBorrowed at 1042)", and the validation result's state carries the event type and sequence number (#3242)
- **Arc** ([Release v22.113.0](https://github.com/Cratis/Arc/releases/tag/v22.113.0)): Arc uses Chronicle's public `SuspendReadRegions()` for nested commands instead of reflection, and requires Chronicle 19.76.0 (#3242)
- **Stage** ([Release v4.139.0](https://github.com/Cratis/Stage/releases/tag/v4.139.0)): Stage now audits ESM v22 models (`reaction batches atomic`) instead of refusing them as an unknown version with `STAGE-ESM-016`. Rendering and the Host refuse atomic reaction batches with `STAGE-ESM-043`, and the rest of the model is checked as for v23 and later models. Running and rendering atomic batches follows in a later release. (part of #422)
- **cli** ([Release v3.76.0](https://github.com/Cratis/cli/releases/tag/v3.76.0)): Bundles Stage 4.138.0: `cratis render` uses its renderer and `cratis run` starts `cratis/stage:4.138.0` by default. (#388)
- **cli** ([Release v3.76.0](https://github.com/Cratis/cli/releases/tag/v3.76.0)): `cratis render` renders ESM v25 protected command reads (`command reads protected`) as Arc read protection: each command with `reads` gets `[ReadProtection(On)]` and a read-model `Handle` parameter per read. Reads Stage cannot render faithfully, such as reads combined with constrained events or read paths in `produces when`, are still refused with `STAGE-ESM-044`, which now names the reason. See [cratis render](https://github.com/Cratis/cli/blob/main/Documentation/reference/screenplay.md). (#388)
- **cli** ([Release v3.76.0](https://github.com/Cratis/cli/releases/tag/v3.76.0)): Generated single-instance queries keyed by a text or UUID value now take an event source id; UUID keys are matched as text, so callers send the canonical lowercase form. (#388)
- **Orleans** ([Release v1.21.0](https://github.com/Cratis/Orleans/releases/tag/v1.21.0)): Admission is asked before `Start`, before every `Resume` (explicit, `IJobsManager.Resume`, rehydration after a silo dies, and recovery), and before every stage after the first. A refused job that is running is stopped and drained, and it is not resumed while the owner keeps refusing. A refused stage stops the job. (#81)
- **Orleans** ([Release v1.21.0](https://github.com/Cratis/Orleans/releases/tag/v1.21.0)): An exception or timeout in `MayRun` fails the start or resume and changes nothing. It is never a refusal. A stage whose admission cannot be answered is asked again on a timer. (#81)
- **Orleans** ([Release v1.21.0](https://github.com/Cratis/Orleans/releases/tag/v1.21.0)): `MayRun` runs inside the job's turn, so it must not call the job, its steps, or a non-interleaving method of a grain that may be waiting on the job's start or resume. To change what running jobs may do, call `StopAndDrain` first, then refuse them from `MayRun`. Silos older than 1.21 do not ask, so the guarantee holds once every silo runs 1.21 or later. (#81)
- **cli** ([Release v3.75.0](https://github.com/Cratis/cli/releases/tag/v3.75.0)): Bundles Stage 4.137.0: `cratis run` starts `cratis/stage:4.137.0` by default, and its default `semantic` engine runs ESM v27 models with composite read-model keys. The `eventmodel` engine refuses them. (#386)
- **cli** ([Release v3.75.0](https://github.com/Cratis/cli/releases/tag/v3.75.0)): The CLI's Screenplay compiler (`cratis screenplay`, `cratis render` and the Screenplay MCP server) is now Screenplay 4.204.0, which reads ESM v27. (#386)
- **cli** ([Release v3.75.0](https://github.com/Cratis/cli/releases/tag/v3.75.0)): `cratis render` admits ESM v1 through v27. Stage 4.137.0 does not render composite read-model keys yet: read models and projections keyed by several parts report `STAGE-ESM-048`, single-instance queries by key parts report `STAGE-ESM-047`, and nothing is published. ESM v28 and later are blocked by `CLI-RENDER-004`. See [cratis render](https://github.com/Cratis/cli/blob/main/Documentation/reference/screenplay.md). (#386)
- **cli** ([Release v3.75.0](https://github.com/Cratis/cli/releases/tag/v3.75.0)): Generated applications now reference Arc 22.109.0 and Chronicle 19.71.0. (#386)
- **Arc** ([Release v22.112.1](https://github.com/Cratis/Arc/releases/tag/v22.112.1)): `useQuery`: changing an optional argument now fetches again, as changing a required argument already did. (#3312)
- **Chronicle** ([Release v19.77.3](https://github.com/Cratis/Chronicle/releases/tag/v19.77.3)): Repeated strongly consistent reads of the same key no longer reuse earlier work. Each read costs roughly what a first read costs, and that cost grows with the number of events for the key. Prefer a materialized projection for long histories that are read often, or that a reactor reads on every event. (part of #4844)
- **Arc** ([Release v22.112.0](https://github.com/Cratis/Arc/releases/tag/v22.112.0)): Generated default output for applications whose commands use read protection `On` is now an ESM v25 document. Reads under `Off`, `Measure` or `[Unprotected]` stay advisory and are not written as `reads` in a document that declares protected reads. When `MaximumExecutableModelVersion` is below v25, the output is unchanged and a warning names the version needed.
- **Arc** ([Release v22.112.0](https://github.com/Cratis/Arc/releases/tag/v22.112.0)): In authoring output, a read is named after its view when the parameter name matches it (`reads Current by sourceId`), and `[LookUpBy]` is honored in every read protection mode.
- **Stage** ([Release v4.138.0](https://github.com/Cratis/Stage/releases/tag/v4.138.0)): Generated single-instance queries keyed by a plain text or UUID value now take an event source id, which fixes Arc analyzer ARC0015 in generated applications. UUID keys are matched as text, so callers must send the canonical lowercase form. (part of #440)
- **Stage** ([Release v4.138.0](https://github.com/Cratis/Stage/releases/tag/v4.138.0)): Protected reads that cannot be rendered faithfully, such as reads combined with constrained events or read paths in `produces when`, are still refused with STAGE-ESM-044, now naming the specific reason. (part of #440)
- **Chronicle** ([Release v19.77.2](https://github.com/Cratis/Chronicle/releases/tag/v19.77.2)): The Kernel runs on Cratis.Orleans 1.20.0. Stopping or deactivating a catch-up or replay job step now drains it within the job step stop timeout instead of waiting for the grain deactivation timeout; a step stopped mid-checkpoint resumes from its last durable checkpoint. (#5004)
- **Stage** ([Release v4.137.0](https://github.com/Cratis/Stage/releases/tag/v4.137.0)): Stage now uses Screenplay 4.204.0 and admits ESM v27 models. The semantic Host runs read models with composite keys end to end: projections keyed by named parts, removals, list queries that filter on any part, modeled queries by parts, and the read-model browser, which shows each key as an object of its parts. Composite-keyed read models get no conventional `Get<ReadModel>ById` query. (part of #481)
- **Stage** ([Release v4.137.0](https://github.com/Cratis/Stage/releases/tag/v4.137.0)): The specification executor refuses specifications over composite-keyed read models as unsupported (projection), naming the composite key. (part of #481)
- **Stage** ([Release v4.137.0](https://github.com/Cratis/Stage/releases/tag/v4.137.0)): Rendering refuses composite read-model keys with typed diagnostics instead of failing: `STAGE-ESM-048` for a read model with several key parts or a projection keyed by parts, and `STAGE-ESM-047` for a single-instance query by parts until Chronicle can look up composite keys (https://github.com/Cratis/Chronicle/issues/4265). The legacy syntax engine refuses composite-keyed read models with `STAGE-ESM-048`. (part of #481)
- **AI** ([Release v7.69.0](https://github.com/Cratis/AI/releases/tag/v7.69.0)): The render skills say `cratis render` accepts models up to ESM v26 from Cratis CLI 3.74.0, with Stage refusing the constructs it cannot render yet through typed `STAGE-ESM-*` diagnostics, and explain what a CLI reports for a newer model: `CLI-RENDER-004`, or the binder's `PLAY0268` when its bundled compiler predates the construct.
- **Chronicle** ([Release v19.77.0](https://github.com/Cratis/Chronicle/releases/tag/v19.77.0)): Testing scenarios now register precise event and read-model schemas, because the in-process kernel advertises current capabilities by default. (part of #4911)
- **Chronicle** ([Release v19.77.0](https://github.com/Cratis/Chronicle/releases/tag/v19.77.0)): SQL stores get an additive event-store migration, `ES-Occurrences-v19_76_0`, for lifecyc
- **Orleans** ([Release v1.20.0](https://github.com/Cratis/Orleans/releases/tag/v1.20.0)): A job whose silo dies during a drain finishes the drain when it next activates and is never resumed; `Resume` is refused while a drain is pending. (part of #81)
- **Orleans** ([Release v1.20.0](https://github.com/Cratis/Orleans/releases/tag/v1.20.0)): A step's stop report from before a `Resume` no longer counts against the resumed job, and a step stopped just before the resume is started again in the resumed execution. Silos older than 1.20 keep the earlier behavior. (part of #81)
- **Orleans** ([Release v1.20.0](https://github.com/Cratis/Orleans/releases/tag/v1.20.0)): `OnStepCompletedOrStopped` can run again for a step after a crash, or not at all, so it must be idempotent and owners should not take results from it alone. Use `StopAndDrain` only once every silo runs 1.20 or later. (part of #81)
- **Stage** ([Release v4.136.0](https://github.com/Cratis/Stage/releases/tag/v4.136.0)): Rendering now admits concepts that use `generate rule` (ESM v21). Stage compile-checks the attached C# body against the BCL and Fundamentals and emits it as the concept's `IGeneratableInContext<T>.New(GenerationContext)` factory, so the rendered application generates the value with the tenant and time of the operation. A body that does not compile or that produces a compiler warning is refused with `STAGE-ESM-019` at its source location; type or namespace shadowing is refused with `STAGE-ESM-022`, and a missing attachment with `STAGE-ESM-020`. The Host and the legacy syntax engine still refuse commands that generate a `generate rule` value with `STAGE-ESM-028`. (#414)
- **cli** ([Release v3.74.0](https://github.com/Cratis/cli/releases/tag/v3.74.0)): `cratis render` admits ESM v21 through v26. Stage plans each model and refuses the constructs it cannot render yet with typed `STAGE-ESM-*` diagnostics, so nothing is published for them; for example, models compiled to ESM v22 report `STAGE-ESM-016` with Stage 4.135.0. ESM v27 and later are still blocked by `CLI-RENDER-004`. See [cratis render](https://github.com/Cratis/cli/blob/main/Documentation/reference/screenplay.md). (#384)
- **cli** ([Release v3.74.0](https://github.com/Cratis/cli/releases/tag/v3.74.0)): Bundles Stage 4.135.0: `cratis render` uses its renderer and `cratis run` starts `cratis/stage:4.135.0` by default. (#384)
- **Arc** ([Release v22.111.0](https://github.com/Cratis/Arc/releases/tag/v22.111.0)): The generator requires Cratis.Screenplay 4.203.0.
- **Arc** ([Release v22.111.0](https://github.com/Cratis/Arc/releases/tag/v22.111.0)): A concept `Matches` rule that uses regex lookaround is withheld and reported, because Screenplay cannot express it.
- **Arc** ([Release v22.110.0](https://github.com/Cratis/Arc/releases/tag/v22.110.0)): A command body that cannot be read is reported only after the command's authorization has run, on both the execute and the `/validate` endpoint. An unauthorized caller now gets `403` instead of `400`. Policies with a requirement that reads the command cannot run without it, so for those commands an unbindable body still gives a validation error. (#3341)
- **Arc** ([Release v22.110.0](https://github.com/Cratis/Arc/releases/tag/v22.110.0)): A body that cannot be read now gives a `malformedRequest` validation result naming the failing member (for example `from` or `items[2].when`). The message stays generic, so no parser or type details are exposed. (#3341)
- **Arc** ([Release v22.110.0](https://github.com/Cratis/Arc/releases/tag/v22.110.0)): Controller-based commands report model binding errors with plain member names (`from`) instead of JSON paths (`$.from`). (#3341)
- **AI** ([Release v7.67.0](https://github.com/Cratis/AI/releases/tag/v7.67.0)): The Stage and Screenplay skills say Stage admits ESM v26: its Host and specification executor run Date and DateTime comparisons in command conditions and validation rules, while rendering them is refused with `STAGE-ESM-046`, so delivery goes through gap-fill.
- **Stage** ([Release v4.135.1](https://github.com/Cratis/Stage/releases/tag/v4.135.1)): Applications Stage renders and scaffolds now target Arc 22.109.0 and Chronicle 19.71.0, and the Stage Host image runs the Chronicle 19.71.0 kernel. This prepares rendering of protected command reads with Arc read protection. (part of #440)
- **cli** ([Release v3.73.0](https://github.com/Cratis/cli/releases/tag/v3.73.0)): `cratis run` runs models on Stage's semantic engine when `--engine` is omitted, for files and folders. To keep the previous behavior, run with `--engine eventmodel`; it stays available as an explicit fallback. See [Runtime engines](https://github.com/Cratis/cli/blob/main/Documentation/reference/run.md#runtime-engines). (#324)
- **Orleans** ([Release v1.19.0](https://github.com/Cratis/Orleans/releases/tag/v1.19.0)): Deactivating a job step cancels its work and waits for it within Orleans' deactivation timeout. The step stays recoverable: it writes no final status and reports nothing to the job, and recovery runs it again. (#74)
- **Orleans** ([Release v1.19.0](https://github.com/Cratis/Orleans/releases/tag/v1.19.0)): A job step reports exactly one outcome per run, after `Stop` has returned. A stop from the job no longer waits for the step's report, so stopping a job no longer loops back through the step.
- **Orleans** ([Release v1.19.0](https://github.com/Cratis/Orleans/releases/tag/v1.19.0)): A step's state snapshot is copied with the Orleans `DeepCopier<TState>`. Silos register it through the serializer; a specification host such as Orleans.TestKit must register it, otherwise the step fails with a message naming the missing registration.
- **Orleans** ([Release v1.19.0](https://github.com/Cratis/Orleans/releases/tag/v1.19.0)): Steps that still call their own grain reference from their work make deactivation wait for that work, up to Orleans' deactivation timeout. Move those calls to `TryInvokeOnActivation`.
- **Stage** ([Release v4.135.0](https://github.com/Cratis/Stage/releases/tag/v4.135.0)): Rendering a model that compares `Date` or `DateTime` values in commands is refused with STAGE-ESM-046, on the renderer and the default sandbox engine, until generated applications can compare them exactly. (part of #473)
- **cli** ([Release v3.72.0](https://github.com/Cratis/cli/releases/tag/v3.72.0)): Bundles Stage 4.134.0 (a navigation item authored with `slot side` renders into the slot the layout declares, Cratis/Stage#467, Cratis/Stage#456) and Screenplay 4.201.0.
- **cli** ([Release v3.72.0](https://github.com/Cratis/cli/releases/tag/v3.72.0)): The `Integration/Cli/Shell` scenario clicks the `Knowledge base` item (`slot side`) of the Support sidebar and asserts the page stays in the primary outlet, the target renders in the side pane, both items are active, and `Close` leaves only the page active - on a live `cratis run` Stage (own root and blueprint root) and on the application `cratis render` generated.
- **Screenplay** ([Release v4.204.0](https://github.com/Cratis/Screenplay/releases/tag/v4.204.0)): Joins, children, `remove via join`, `every`, `all`, `nested`, `clear with`, `variant` and reducers on a composite-keyed read model, and list queries with a `by` block over one, are refused with PLAY0268 instead of the whole read model being refused. (#599)
- **cli** ([Release v3.71.0](https://github.com/Cratis/cli/releases/tag/v3.71.0)): Bundles Stage 4.132.0 (and the `cratis/stage:4.132.0` image `cratis run` starts), which renders the specifications, one-row summary projections and live collections of the CRM, Ticketing, Approvals, Inventory, HR, Project tracker, Administration and Orders samples without simplifying them (Cratis/Stage#478).
- **Stage** ([Release v4.134.0](https://github.com/Cratis/Stage/releases/tag/v4.134.0)): The Stage draws a navigation item that names a slot the shell declares (`slot side`) in a closable pane beside the page, through Scene 4.67.0's `ApplicationHost` (Cratis/Scene#184): both items are active, `Close` empties the pane, the pane survives navigation of the page and is restored from a reload or a deep link; a shell without the slot opens the target in the primary outlet.
- **Stage** ([Release v4.134.0](https://github.com/Cratis/Stage/releases/tag/v4.134.0)): A new `uiprofile-root` conformance vector: the canonical corpus' `ui-profile-root-positive` document (own layout root with options, appearance and a new-screens default, own application-scope screen template root, blueprint root with a version pin) is translated by Stage's converter and resolved to an effective shell by the .NET Scene engine and by the TypeScript engine against the same checked-in expectations (`Source/Conformance.Specs/for_UiProfileRootVector`, `Source/Frontend/src/uiProfileRootVector.spec.ts`).
- **Stage** ([Release v4.134.0](https://github.com/Cratis/Stage/releases/tag/v4.134.0)): Screen templates that declare `scopes application` and fit no slot carry the root role, so Scene's resolver accepts them as the application's shell, as Screenplay's validator already does.
- **Stage** ([Release v4.134.0](https://github.com/Cratis/Stage/releases/tag/v4.134.0)): Bundles Scene 4.67.0 and Screenplay 4.201.0; frozen digests refreshed.
- **Stage** ([Release v4.133.0](https://github.com/Cratis/Stage/releases/tag/v4.133.0)): Stage's specification runner now runs specifications for concepts that use `generate rule` (ESM v21) when the generated value is pinned. Like the reference evaluator, it checks the pinned String against the concept's rules and never runs the generation body; unpinned generation stays unsupported. A model whose `generate rule` concepts are used by no command is no longer refused. (part of #414)
- **Stage** ([Release v4.133.0](https://github.com/Cratis/Stage/releases/tag/v4.133.0)): The Host refuses only the commands that generate a `generate rule` value, with `STAGE-ESM-028` naming the command, property and concept, because its interpreter never runs implementation bodies; render the application to run them. Rendering still refuses `generate rule` with `STAGE-ESM-028`. (part of #414)
- **Stage** ([Release v4.132.0](https://github.com/Cratis/Stage/releases/tag/v4.132.0)): A protected live collection over a multi-block projection renders. The refusal named Chronicle#4816, which is fixed in the pinned Chronicle.
- **Stage** ([Release v4.132.0](https://github.com/Cratis/Stage/releases/tag/v4.132.0)): Running totals (`add`, `subtract`, `increment`, `decrement`) establish a required whole number from nothing, so a projection that only counts is complete. An optional whole number still cannot accumulate.
- **Stage** ([Release v4.132.0](https://github.com/Cratis/Stage/releases/tag/v4.132.0)): The live blueprint scenario now covers all eight samples (Orders added), runs them against the published blueprint packages 4.66.0, and fails instead of noting a template the package does not ship.
- **Stage** ([Release v4.132.0](https://github.com/Cratis/Stage/releases/tag/v4.132.0)): Cratis.Scene.Engine and Cratis.Scene.Model 4.66.0.
- **AI** ([Release v7.66.0](https://github.com/Cratis/AI/releases/tag/v7.66.0)): The Screenplay pin and the byte-identical compiler contract are 4.201.0.
- **AI** ([Release v7.66.0](https://github.com/Cratis/AI/releases/tag/v7.66.0)): The profile examples name the shell with `root template` instead of the legacy `layout` line, which now warns PLAY0791 and joins the preferred-syntax style codes.
- **Chronicle** ([Release v19.74.0](https://github.com/Cratis/Chronicle/releases/tag/v19.74.0)): Resolved SQL identities are applied each time a connection opens, so rotated passwords and refreshed access tokens take effect without a restart. A failed login drops the cached resolution and is retried. (part of #4948)
- **Chronicle** ([Release v19.74.0](https://github.com/Cratis/Chronicle/releases/tag/v19.74.0)): Requires Cratis Arc 22.109.0 or later. (part of #4948)
- **Screenplay** ([Release v4.202.0](https://github.com/Cratis/Screenplay/releases/tag/v4.202.0)): `Samples/Crm`, `Samples/Ticketing` and `Samples/Inventory`: `CurrentFigures` is an `observable` list query over the one `global` figures row instead of an `observable ... optional by summaryId` lookup. A keyed live lookup is not something the generated application can serve, and a one-row live list keeps the dashboard live without changing what it shows. The conformance syntax vectors of those three samples follow.
- **Screenplay** ([Release v4.202.0](https://github.com/Cratis/Screenplay/releases/tag/v4.202.0)): `Samples/Crm/README.md` says so and counts the blueprint's twenty screen templates (Cratis/Scene#181).
- **Stage** ([Release v4.131.0](https://github.com/Cratis/Stage/releases/tag/v4.131.0)): Commands that route their events to an event stream can now also return a response, including a generated value: Stage runs and renders them in the Host, the specification runner and generated code, and the generated TypeScript proxy carries the response type. STAGE-ESM-038 no longer refuses commands for combining routing, responses and generated values. (#451)
- **cli** ([Release v3.70.0](https://github.com/Cratis/cli/releases/tag/v3.70.0)): Bundles Stage 4.130.0 (renders a ui profile's `root template`, shell `option`s and `appearance`, Cratis/Stage#466) and Screenplay 4.200.0 (root template language and diagnostics `PLAY0790`-`PLAY0799`).
- **cli** ([Release v3.70.0](https://github.com/Cratis/cli/releases/tag/v3.70.0)): `cratis run` reports the compiler's root template errors `PLAY0790`-`PLAY0799` with their code and `file(line,column)` before Docker starts, and a version pin no installed blueprint satisfies - and any other root template that cannot be the shell - as the new `CLI-RENDER-019`, which `cratis render` reports too.
- **cli** ([Release v3.70.0](https://github.com/Cratis/cli/releases/tag/v3.70.0)): The `Integration/Cli/Shell` fixture roots its profile on an own template with `option showFooter false` and a dark `appearance` with an accent; the CI script runs it on a live Stage twice (own root and the default blueprint's root), asserts the shell options and appearance in the browser, and checks that `cratis run` and `cratis render` refuse an unsatisfied pin.
- **cli** ([Release v3.70.0](https://github.com/Cratis/cli/releases/tag/v3.70.0)): Documentation for the root template in `run.md` and `screenplay.md`.
- **Scene** ([Release v4.67.0](https://github.com/Cratis/Scene/releases/tag/v4.67.0)): A navigation item authored with `slot <name>`, where `<name>` is an outlet the shell declares (not a nested `core:outlet` of a screen), renders its target into that slot: `ApplicationHost` hosts the outlet (`CompositionOptions.hostedOutlets`), `placeInOutlet` keeps the primary screen and places the target beside it (`shellOutletOwner`), and both items are active.
- **Scene** ([Release v4.67.0](https://github.com/Cratis/Scene/releases/tag/v4.67.0)): The default `AppShell` draws any slot beyond its own regions as a side pane; a hosted outlet has a `Close` button backed by the new `closeOutlet(name)` on the navigation context.
- **Scene** ([Release v4.67.0](https://github.com/Cratis/Scene/releases/tag/v4.67.0)): Documentation in `preview-host.md`.
- **AI** ([Release v7.65.0](https://github.com/Cratis/AI/releases/tag/v7.65.0)): The Stage skills separate what Stage runs from what it renders. Since Stage 4.129.0, the specification runner and host run protected command reads: a missing read is rejected first, and `require` and produced values use the read's properties. Rendering protected reads is still refused with STAGE-ESM-044. A protected command with a requirement below Error severity is refused with STAGE-ESM-045, and the host refuses outside appends while it decides a protected command. (#739)
- **AI** ([Release v7.65.0](https://github.com/Cratis/AI/releases/tag/v7.65.0)): The Stage skills teach the opt-in for rendering reducers as self-reducing read models in new applications (Stage 4.128.0), and the root-template shell guidance follows Stage 4.130.0. (#739)
- **AI** ([Release v7.65.0](https://github.com/Cratis/AI/releases/tag/v7.65.0)): The generated-values skills teach that a `generate rule` body's generation context is a language-neutral contract (`Now`, `Tenant`, a String result) that each target binds to its own type, with the Cratis C# binding to Fundamentals' `GenerationContext`. The legacy-extraction skill recovers compound rule bodies as far as the Arc generator does. (#721)
- **Screenplay** ([Release v4.201.0](https://github.com/Cratis/Screenplay/releases/tag/v4.201.0)): The canonical `screen-composition/v1` corpus carries the ui profile root template vectors (the `uiprofile-root-*` set of the Scene shared fixtures): `ui-profile-root-positive` (own layout, own application-scope screen template and blueprint template with a version pin as the root template, shell options, appearance, new screens default), `ui-profile-root-legacy-layout`, and the rejection vectors `ui-profile-root-unknown` (PLAY0790, PLAY0792, PLAY0798), `ui-profile-root-not-a-shell` (PLAY0794, PLAY0795, PLAY0799) and `ui-profile-root-invalid` (PLAY0796, PLAY0797), with their exact diagnostics pinned. Every vector prints canonically, compiles again and round trips through syntax JSON losslessly in C#; the TypeScript compiler reads them all and reports the legacy `layout` line (`PLAY0791`) like the C# compiler does. Docs: the ui profile page describes the conversion contract and the corpus (#827)
- **Screenplay** ([Release v4.201.0](https://github.com/Cratis/Screenplay/releases/tag/v4.201.0)): MCP: the new read tool `ui-profiles` returns each ui profile's root template with its pin and options, the appearance, the new screens default, the legacy layout line and the shell diagnostics, plus the own templates applicable as the root template or the new screens default and the accepted appearance values. The compiler's own rules back it (`ProfileShellValidator`), so a refused edit and the read agree. The edits are the typed nodes `RootTemplateSyntax`, `ShellOptionSyntax`, `ProfileAppearanceSyntax` and `NewScreenTemplateSyntax` through `read-ast`/`propose-ast`, which refuse an invalid reference with its PLAY0790-PLAY0799 code. The `when_authoring_the_ui_profile_shell` transcript runs on the corpus vector; tool reference, authoring guide and the contract golden are updated (part of #828)
- **AI** ([Release v7.64.0](https://github.com/Cratis/AI/releases/tag/v7.64.0)): The Screenplay compiler pin is 4.199.0.
- **Scene** ([Release v4.66.0](https://github.com/Cratis/Scene/releases/tag/v4.66.0)): `resolveTemplateReference` (TypeScript) and `TemplateReferenceResolver.Resolve` (C#) answer from the names the blueprint's manifest lists (`screenTemplates`, `dialogTemplates`, `layouts`) when its source carries no template bodies, with the same `Resolved` kind and the same `Blueprint '<name>' has no template '<id>'` diagnostic otherwise. A source that carries its templates is answered from them, as before.
- **Stage** ([Release v4.130.0](https://github.com/Cratis/Stage/releases/tag/v4.130.0)): The converter carries a ui profile's `root` template (own or blueprint, with the version pin and shell options), `appearance` (colour scheme, accent) and `defaults` (new-screens template) into the Scene document the Stage serves, and the render planner asks Scene's `ShellResolver` (through `RootShell.Resolve`) what the root resolves to, so an unknown root, a blueprint that is not installed or a pin no installed version satisfies is a build-time finding (`RenderFindings`).
- **Stage** ([Release v4.130.0](https://github.com/Cratis/Stage/releases/tag/v4.130.0)): The Stage runtime starts the shell `resolveEffectiveShell` names (the function the Studio preview uses), applies the profile's shell options (`navigationMode`, `menuTheme`, `showFooter`) and appearance (light/dark/system scheme, accent as the theme's primary colour), and states an unresolved root or an option it does not understand instead of drawing another shell or a blank page.
- **Stage** ([Release v4.130.0](https://github.com/Cratis/Stage/releases/tag/v4.130.0)): Scene 4.53.1 -> 4.62.0 and Screenplay 4.188/4.193 -> 4.197.0; frozen digests and pins refreshed; documentation in `reference/stage-rendering.md`.
- **Stage** ([Release v4.129.0](https://github.com/Cratis/Stage/releases/tag/v4.129.0)): While a protected command is being decided, the host refuses any event appended to the session's event log from outside, rather than only events that affect the command's reads. (part of #440)
- **Stage** ([Release v4.129.0](https://github.com/Cratis/Stage/releases/tag/v4.129.0)): A protected command with a requirement below Error severity is refused with STAGE-ESM-045, also when a reaction invokes it, until Screenplay defines how such requirements behave. (part of #440)
- **Scene** ([Release v4.65.0](https://github.com/Cratis/Scene/releases/tag/v4.65.0)): `blueprintCatalog.json` (package and repository root) lists the two new templates; the CRM documentation counts them.
- **AI** ([Release v7.63.0](https://github.com/Cratis/AI/releases/tag/v7.63.0)): The `matches` rule is taught as Screenplay's portable match dialect, including its anchors, character classes, whitespace set and PLAY0699 refusals, instead of as a platform regular expression. (#723)
- **AI** ([Release v7.63.0](https://github.com/Cratis/AI/releases/tag/v7.63.0)): Stage guidance states what Stage 4.127.0 admits (ESM v1–v21 and v23–v25), what it refuses (v22, described handlers, atomic batches, protected reads) and which generated-value strategies it renders. Statements that described handlers never bind or that every read is unprotected are corrected.
- **AI** ([Release v7.63.0](https://github.com/Cratis/AI/releases/tag/v7.63.0)): The Screenplay compiler pin is 4.198.0.
- **Screenplay** ([Release v4.200.0](https://github.com/Cratis/Screenplay/releases/tag/v4.200.0)): Root template diagnostics `PLAY0790`-`PLAY0799` (unknown template, legacy `layout`, unknown blueprint, unsatisfied version pin, template not applicable as shell, no content outlet, unknown shell option, invalid appearance, duplicate root template, new-screens template not applicable to a feature). One rule set, `ProfileShellValidator`, run by the compiler (document facts) and by `UiProfileShellBinder.Bind` (installed blueprint catalog facts); the rules restate Scene's `ShellResolver` / `TemplateApplicability` shared vectors. (#826)
- **Screenplay** ([Release v4.200.0](https://github.com/Cratis/Screenplay/releases/tag/v4.200.0)): The TypeScript compiler reports the legacy profile `layout` line (`PLAY0791`, shared `diagnostics.json` vectors hold C# and TS to the same code/line) and `QuickFixes` offers the mechanical fix-it: `layout X` becomes `root template X`, or the ignored `layout` line is removed beside a root template. Monaco and VS Code code actions pick it up. (#826)
- **Screenplay** ([Release v4.200.0](https://github.com/Cratis/Screenplay/releases/tag/v4.200.0)): Contract golden regenerated (the new codes and their arguments); docs: diagnostics table, ui-profile page.
- **Cast** ([Release v0.2.0](https://github.com/Cratis/Cast/releases/tag/v0.2.0)): Tiers on member pages always come from the registry; a member's `cast.json` cannot change a tier, and profiles for another login are ignored (#10)
- **Cast** ([Release v0.2.0](https://github.com/Cratis/Cast/releases/tag/v0.2.0)): A member's profile that cannot be read or rendered falls back to the GitHub profile instead of stopping the directory build (#10)
- **AI** ([Release v7.62.0](https://github.com/Cratis/AI/releases/tag/v7.62.0)): Arc C# guidance starts new code with read protection `On` (`<CratisReadProtection>On</CratisReadProtection>`): the state rule goes in a `CommandValidator<T>` with the read model as a constructor parameter, and `Handle()` returns the events. Under `Off`, the default, a validator over a plain read is a hint. `[ProtectedDecision]` with `DecisionRead<T>` is described as the older per-command opt-in, not obsolete (#731)
- **AI** ([Release v7.62.0](https://github.com/Cratis/AI/releases/tag/v7.62.0)): The "choosing how a rule holds" reference is rewritten around the rule shapes (unique value, one entity, two entities with `[LookUpBy]`, per-stream read model, stream decision, aggregate, explicit scope, repair reactor and `[Unprotected("why")]`), with the refusals, the Measure rollout and how to test the race (#731)
- **AI** ([Release v7.62.0](https://github.com/Cratis/AI/releases/tag/v7.62.0)): C# specification guidance uses a plain `new CommandScenario<T>()`, `AppendConcurrently` and `ShouldHaveValidationErrorBecauseOf(ValidationResultReason.ConcurrencyViolation)`; `UseDecisionReads()` is no longer taught (#731)
- **AI** ([Release v7.62.0](https://github.com/Cratis/AI/releases/tag/v7.62.0)): Reducer guidance states that unfiltered reducers without constructor dependencies are admitted by decision reads and read protection (#731)
- **AI** ([Release v7.62.0](https://github.com/Cratis/AI/releases/tag/v7.62.0)): Evaluation cases cover the rule shapes, the Measure rollout, `ReadChanged` handling, the race test and the negative case of a validator under `Off` (#731)
- **AI** ([Release v7.62.0](https://github.com/Cratis/AI/releases/tag/v7.62.0)): Validator guidance states that a caller sending `X-Allowed-Severity: Error` can remove validator Error results under `Off` and `Measure` unless the command declares `[BlockOnValidationSeverity]`, and that from Arc 22.108.0 a command declared `On` blocks `Error` and `Unknown` whatever the caller sends (#731)
- **Stage** ([Release v4.127.1](https://github.com/Cratis/Stage/releases/tag/v4.127.1)): Stage's specification runner and fixture checks now evaluate concept and command value rules, including `validate checksum`, with Screenplay's public value-rule check (the same implementation as the reference evaluator) instead of Stage's own copies. Results are unchanged; rejection messages for deprecated Studio lookaround patterns now use Screenplay's wording. Generated applications are unchanged. (#455)
- **Arc** ([Release v22.109.0](https://github.com/Cratis/Arc/releases/tag/v22.109.0)): `EntityFrameworkCoreOptions` (`ConnectionString`, `AutoDiscoverDbContexts`, `ConnectionResolution`) now bind from the `Cratis:EntityFrameworkCore` configuration section. The `configureOptions` callback runs afterwards and wins. (part of #3316)
- **Chronicle** ([Release v19.73.1](https://github.com/Cratis/Chronicle/releases/tag/v19.73.1)): The namespace selector, breadcrumb and home page no longer depend on shared MVVM singleton state; the last chosen namespace per event store is remembered in the browser for event store level pages.
- **Arc** ([Release v22.108.0](https://github.com/Cratis/Arc/releases/tag/v22.108.0)): `ShouldAdmitDecisionReadsOf` and `ShouldAdmitDecisionReadsIn` also check commands declared `On`, the read models their validators take, and per-stream read models (#3330)
- **Stage** ([Release v4.127.0](https://github.com/Cratis/Stage/releases/tag/v4.127.0)): A model that declares protected command reads (`command reads protected`) is now refused with STAGE-ESM-044 by the renderer, the specification runner, the host and the default sandbox engine, including when only part of the model is rendered, instead of running or rendering the commands without their reads. (part of #440)
- **cli** ([Release v3.69.0](https://github.com/Cratis/cli/releases/tag/v3.69.0)): The CLI bundles Stage 4.125.0, whose catalog ships `PrimeReact` and `Cratis.Blueprint.Default` and whose live Stage and generated React application load the templates of approved domain blueprints; `cratis run` starts `cratis/stage:4.125.0` by default. Scene 4.53.1 accepts a blueprint manifest in the approved package set.
- **cli** ([Release v3.69.0](https://github.com/Cratis/cli/releases/tag/v3.69.0)): Two scope specs that used a generated-concept collision as their example of a construct Stage refuses now use an interval reaction (`STAGE-ESM-024`), since Stage 4.121 onward renders the former.
- **Screenplay** ([Release v4.198.0](https://github.com/Cratis/Screenplay/releases/tag/v4.198.0)): The Library, Commerce and TimeTracking samples declare `reaction batches atomic` at their root, so a model copied from them starts with all-or-none reaction production batches. Invoicing already did. (#771)
- **Screenplay** ([Release v4.198.0](https://github.com/Cratis/Screenplay/releases/tag/v4.198.0)): The getting-started walk-through, the MCP authoring guide and the `open-workspace` tool description tell new models to declare `reaction batches atomic`, and present per-fact production as legacy behavior kept for existing models. See [Atomic production batches](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/reactions.md#atomic-production-batches). (#771)
- **Screenplay** ([Release v4.197.0](https://github.com/Cratis/Screenplay/releases/tag/v4.197.0)): `ui profile` gains `root template [blueprint <Blueprint>] <Name> [version "<range>"]` with `option <name> <value>` lines, an `appearance` block (`color scheme light|dark|system`, `accent "<#hex>"`) and `new screens use template <ref>`. `layout <Name>` stays readable beside it.
- **Screenplay** ([Release v4.197.0](https://github.com/Cratis/Screenplay/releases/tag/v4.197.0)): New syntax nodes `RootTemplateSyntax`, `ShellOptionSyntax`, `ProfileAppearanceSyntax`, `NewScreenTemplateSyntax`; parser (`ProfileShellParser`), printer (byte-identical round trip), walker, transport schema (C# and TS generated files), docs (grammar, ui-profile, templates, diagnostics), Monaco completion/keyword docs, VS Code TextMate grammar, Invoicing sample.
- **Screenplay** ([Release v4.197.0](https://github.com/Cratis/Screenplay/releases/tag/v4.197.0)): Diagnostics PLAY0788 (malformed/repeated shell lines), PLAY0789 (malformed/repeated appearance), PLAY0798 (second root template); a bad version range reuses PLAY0721.
- **Screenplay** ([Release v4.197.0](https://github.com/Cratis/Screenplay/releases/tag/v4.197.0)): Template renames stay refused (layouts/templates are not rename targets), so a profile's reference cannot go stale; folder merge needs no change (a profile lives in one file).
- **Scene** ([Release v4.62.0](https://github.com/Cratis/Scene/releases/tag/v4.62.0)): `composeApplicationScreen` (preview host and Stage's composition) resolves the shell through the engine's `resolveEffectiveShell` (`effectiveShellOf`) instead of `shellComponentForLayout(screen.layout) ?? screen.layout`; the template chain's placement and the outlet a screen lands in are the resolved shell's outlets / primary outlet. With a profile `root`, that template is the shell of every screen (a screen may still opt out with the chrome-less `FullPage` layout); without one, behaviour is unchanged (legacy layout).
- **Scene** ([Release v4.62.0](https://github.com/Cratis/Scene/releases/tag/v4.62.0)): A root screen template (role Root) is drawn by the template component with its own arrangement/content; the screen goes in its primary outlet.
- **Scene** ([Release v4.62.0](https://github.com/Cratis/Scene/releases/tag/v4.62.0)): `previewProfile` now carries `root`, `appearance` and `defaults`.
- **Scene** ([Release v4.62.0](https://github.com/Cratis/Scene/releases/tag/v4.62.0)): `CompositionOptions.templateLibrary` lets a host hand over the installed blueprints.
- **Scene** ([Release v4.62.0](https://github.com/Cratis/Scene/releases/tag/v4.62.0)): Docs: `blueprints/preview-host.md`.
- **Stage** ([Release v4.126.0](https://github.com/Cratis/Stage/releases/tag/v4.126.0)): Commands that route their events to an event stream can now also have generated properties: Stage runs and renders them in the Host, the specification runner and generated code, including a generated identifier as the event source of a routed stream. Generated commands that return results now check their stream id the same way as other routed commands. A route combined with a command response is still refused with STAGE-ESM-038. (part of #451)
- **Scene** ([Release v4.61.0](https://github.com/Cratis/Scene/releases/tag/v4.61.0)): `TemplateMetadata` gains `role` and `primaryOutlet`; `ApplicableTemplates` default scopes treat a root screen template as application-scope.
- **Scene** ([Release v4.60.0](https://github.com/Cratis/Scene/releases/tag/v4.60.0)): Storybook story `Blueprint/Gallery navigation` (click an entry, select mode, destinations list) for the SC4 navigating shell controls.
- **Scene** ([Release v4.60.0](https://github.com/Cratis/Scene/releases/tag/v4.60.0)): `locationTrail` and `useShellLink` are exported from the shell barrel, so hosts and other blueprints can reuse them.
- **Templates** ([Release v1.8.0](https://github.com/Cratis/Templates/releases/tag/v1.8.0)): New C# applications from the `cratis` and `cratis-aspire` templates start with Arc read protection `On`, so read models that commands and validators take guard the command's append. The README explains how to switch to `Measure` or `Off` (#80)
- **Chronicle** ([Release v19.73.0](https://github.com/Cratis/Chronicle/releases/tag/v19.73.0)): Application read model databases are not dropped by the removal; the application owns that data.
- **AuthProxy** ([Release v2.31.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.31.0)): AuthProxy now refuses to start when `Session:CookieDomain` is combined with the `SubHost` tenant resolution, when a declared service host or the callback host is outside the cookie domain, when the domain is an address, a top-level domain, a wildcard or carries a port, when the cookie name is not a valid name, and when the name uses the `__Host-` prefix together with a domain. None of these can occur unless you set the new options.
- **AuthProxy** ([Release v2.31.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.31.0)): Invitations, credential links and registration still run on the host they start on. With a callback host, register a provider callback for every host where one of them can start.
- **Scene** ([Release v4.58.0](https://github.com/Cratis/Scene/releases/tag/v4.58.0)): **Shell controls navigate through the navigation context** (spec N1, N2): `menuItem`, `breadcrumb` crumbs, `logo`, `userMenu` entries and the topbar/sidebar region items activate via the new `useNavigationActivation` (`@cratis/scene.react`). A click renders the target in its slot and records it in the host history; the address of the hosting page is never written. Outside a host they stay plain hash links.
- **Scene** ([Release v4.58.0](https://github.com/Cratis/Scene/releases/tag/v4.58.0)): **Active state is derived from the history location** (N1): a menu entry is current while its screen is the primary screen (`useShellLink`), no document-kept `isActive` needed.
- **Scene** ([Release v4.58.0](https://github.com/Cratis/Scene/releases/tag/v4.58.0)): **The breadcrumb follows the location** (N4): `locationTrail` derives module › feature trail from the structure; default application chrome now includes a breadcrumb; authored `items` still win.
- **Scene** ([Release v4.58.0](https://github.com/Cratis/Scene/releases/tag/v4.58.0)): **Activation policy** (N1/N2): `NavigationActivationProvider`, `navigationMode` (`navigate` | `select` | per-control function), Alt-click selects, `onActivate`, `onNavigate`; `ApplicationHost` takes `navigationPolicy`.
- **Scene** ([Release v4.58.0](https://github.com/Cratis/Scene/releases/tag/v4.58.0)): **`ScenePreviewHost`**: new `{ application }` target, `initialDestination` (screen or dialog), `navigationMode`, `onActivate`, `onNavigate`.
- **Scene** ([Release v4.58.0](https://github.com/Cratis/Scene/releases/tag/v4.58.0)): **`listDestinations(document)`** (N3/N5): Pages / States / Dialogs for the *Showing* picker; `galleryApplication()` + `galleryComposition` make the blueprint gallery a navigable application. Listing pinned by a JSON fixture.
- **Scene** ([Release v4.58.0](https://github.com/Cratis/Scene/releases/tag/v4.58.0)): Docs: `Documentation/blueprints/preview-host.md`.
- **Stage** ([Release v4.125.0](https://github.com/Cratis/Stage/releases/tag/v4.125.0)): Bumped `Cratis.Scene.Engine`, `Cratis.Scene.Model` and the `@cratis/scene.*` packages to 4.53.1, which re-pins the digests of the generated frontend bytes.
- **Stage** ([Release v4.125.0](https://github.com/Cratis/Stage/releases/tag/v4.125.0)): `CratisRendering.ShippedPackages` is composed from the generated manifests; `ShippedPackageNames` has five entries, so an approved package may not reuse `PrimeReact` or `Cratis.Blueprint.Default`.
- **Scene** ([Release v4.57.0](https://github.com/Cratis/Scene/releases/tag/v4.57.0)): `UiProfile.Layout` is documented as legacy: it stays readable and writable, `Root` supersedes it. Existing documents without the new members load and write back unchanged.
- **Stage** ([Release v4.124.0](https://github.com/Cratis/Stage/releases/tag/v4.124.0)): `matches` validation rules now give the same result as Screenplay 4.188 everywhere. The specification runner and the host use Screenplay's own pattern matching, and generated validators match characters the same way (for example `.` no longer matches a line separator); a pattern that generated code cannot express exactly is refused with STAGE-ESM-005 instead of being rendered with different behavior. (#448)
- **Stage** ([Release v4.124.0](https://github.com/Cratis/Stage/releases/tag/v4.124.0)): The default sandbox engine (`cratis run` without the semantic engine) does not enforce the four new text rules; they are added to its documented list of rules it does not enforce. (#448)
- **Orleans** ([Release v1.18.0](https://github.com/Cratis/Orleans/releases/tag/v1.18.0)): The generic `IJobsManager.Start` and `GetJobsOfType` methods now document that they are not safe while two releases share a cluster; use `IJobs` instead. (#76)
- **Stage** ([Release v4.123.0](https://github.com/Cratis/Stage/releases/tag/v4.123.0)): Commands whose generated property names clash with names the Cratis renderer uses inside the generated `Handle` method (such as `operation`, `occurred` or `source`) now render: the renderer renames its own locals instead of refusing the model with STAGE-ESM-038, and the Stage Host and specification runner no longer refuse these models. Generated code is unchanged for commands without such clashes. (part of #451)
- **AI** ([Release v7.60.1](https://github.com/Cratis/AI/releases/tag/v7.60.1)): `module-navigation-modes-and-slice-buttons` and `blueprint-template-and-sample-data` tell the agent there is no model file and to write the declarations from scratch. Before, the blueprint task ended with the agent asking for the repository (the skill was never loaded).
- **AI** ([Release v7.60.1](https://github.com/Cratis/AI/releases/tag/v7.60.1)): The two navigation assertions of the first task are worded as what the answer declares (Sales `extends`, Support `overrides`, Reports nothing; each item targets its own module), not as "lists only its own item", which graders read both ways for an `extends` region.
- **AI** ([Release v7.60.0](https://github.com/Cratis/AI/releases/tag/v7.60.0)): A query never writes `Skip`, `Take`, `Limit` or `OrderBy` to serve the client's page or sort. The old advice to give every list a default `OrderBy` is removed; an initial order is the frontend's `sorting` argument to `useWithPaging`.
- **AI** ([Release v7.60.0](https://github.com/Cratis/AI/releases/tag/v7.60.0)): The `AsQueryable()` examples in the paging skill and `vertical-slices.md` now show `Observe`, and `IQueryable<T>` is described as the shape for LINQ-native providers such as Entity Framework Core.
- **AI** ([Release v7.60.0](https://github.com/Cratis/AI/releases/tag/v7.60.0)): The React, code review, performance review and read-model query guidance, and the performance reviewer agent, no longer present `IQueryable<T>` as the only paged shape or `Skip`/`Take` as how a query pages.
- **AI** ([Release v7.60.0](https://github.com/Cratis/AI/releases/tag/v7.60.0)): The paging skill documents the `Expression not supported ... Skip(0).Take(30).Cast()` failure: Arc before 22.50.6 appended a `Cast` that MongoDB cannot translate to every paged `IQueryable` request.
- **Stage** ([Release v4.122.0](https://github.com/Cratis/Stage/releases/tag/v4.122.0)): A model that describes a command handler without supplying its implementation is now refused with STAGE-IMPL-002 by the renderer, the specification runner and the host, instead of being rendered or run without the handler. (part of #316)
- **Stage** ([Release v4.122.0](https://github.com/Cratis/Stage/releases/tag/v4.122.0)): A model that declares atomic reaction batches (`reaction batches atomic`) is now refused with STAGE-ESM-043 on every path until Stage supports them. (part of #316)
- **cli** ([Release v3.68.0](https://github.com/Cratis/cli/releases/tag/v3.68.0)): The CLI bundles Stage 4.120.0 and Screenplay 4.188.0 (including its MCP server); `cratis run` starts `cratis/stage:4.120.0` by default.
- **AI** ([Release v7.58.0](https://github.com/Cratis/AI/releases/tag/v7.58.0)): The pinned Screenplay moves from 4.164.0 to 4.188.0 with its compiler contract. The `translate-example`, `invoicing-dues-example` and `invoicing-dues-design` examples keep the capture in the `Translate` slice and put the translator reactions in an `Automation` slice beside it (a reaction in the capture's own directionless slice is `PLAY0694`), and append the first record of a key with `when added`, so they compile and run clean again.
- **AI** ([Release v7.58.0](https://github.com/Cratis/AI/releases/tag/v7.58.0)): The `preferred-syntax` spec counts ten non-error style diagnostics, now including `PLAY0787`.
- **Stage** ([Release v4.121.0](https://github.com/Cratis/Stage/releases/tag/v4.121.0)): Generated `Common` concept, type and enum files now use short type names with `using` directives instead of `global::`-qualified names. The usings sit inside the file-scoped namespace and are rooted with `global::`, so code you add in `Customizations/` cannot change what a generated name refers to; names that cannot be proven safe stay qualified. Existing generated applications see a one-time text change in these files on their next regeneration; other generated files follow in later releases. (part of #424)
- **Stage** ([Release v4.121.0](https://github.com/Cratis/Stage/releases/tag/v4.121.0)): The rendered scaffold's `.editorconfig` places `using` directives inside the namespace for generated code. (part of #424)
- **Stage** ([Release v4.121.0](https://github.com/Cratis/Stage/releases/tag/v4.121.0)): Do not declare your own types inside generated namespaces; see https://github.com/Cratis/Stage/blob/main/Documentation/guides/customize-rendered-application.md. (part of #424)
- **Screenplay** ([Release v4.188.0](https://github.com/Cratis/Screenplay/releases/tag/v4.188.0)): The `propose-ast` tool description names the application shell edits and their diagnostics; the capability matrix, the release acceptance matrix and the MCP guides gain the new rows.
- **Stage** ([Release v4.120.0](https://github.com/Cratis/Stage/releases/tag/v4.120.0)): Commands with generated properties can now also have command rules and requirements: Stage runs and renders them in the Host, the specification runner and generated code, checking the requirements on the request values before any value is generated, as Screenplay does. STAGE-ESM-038 is now reported only when a rule or requirement reads a generated property. (part of #451)
- **cli** ([Release v3.67.0](https://github.com/Cratis/cli/releases/tag/v3.67.0)): The CLI bundles Stage 4.119.1 (built on Screenplay 4.180.1); `cratis run` starts `cratis/stage:4.119.1` by default. Generated applications pin Arc 22.104.0, and validation rules of every severity on generated concepts now render instead of being refused with `STAGE-ESM-038` (an unpinned generated value Stage cannot prove still is).
- **Screenplay** ([Release v4.184.0](https://github.com/Cratis/Screenplay/releases/tag/v4.184.0)): `matches` patterns in the exact shapes Studio generated for equals, not equals, contains, not contains, starts with and ends with (both the `$` and the `(?![\s\S])` forms) now bind as the matching first-class rule with warning PLAY0787 and a quick fix, instead of failing with PLAY0699. Executable models already holding these patterns evaluate them as the first-class rule. Every other lookaround is still refused. (#810)
- **Stage** ([Release v4.119.0](https://github.com/Cratis/Stage/releases/tag/v4.119.0)): STAGE-ESM-028 now refuses only `generate rule` among the ESM v21 generation strategies. (part of #414)
- **Stage** ([Release v4.118.0](https://github.com/Cratis/Stage/releases/tag/v4.118.0)): STAGE-ESM-042 is now reported only for concept rule kinds Stage does not know; the legacy event-model engine still refuses checksum rules. (part of #414)
- **Stage** ([Release v4.117.0](https://github.com/Cratis/Stage/releases/tag/v4.117.0)): Stage and the rendered backend scaffold use Arc 22.104.0 (with Cratis.Fundamentals 7.25.0). Generated values that fail a concept rule of any severity are now rejected by the rendered application at run time. (part of #414)
- **Stage** ([Release v4.117.0](https://github.com/Cratis/Stage/releases/tag/v4.117.0)): Generated values guarded by warning- or information-severity concept rules now render instead of being refused with STAGE-ESM-038; concepts with unproven or refuted rules still need pinned fixture values. (part of #414)
- **Screenplay** ([Release v4.183.0](https://github.com/Cratis/Screenplay/releases/tag/v4.183.0)): A `matches` pattern is now a flagless JavaScript `RegExp` restricted to a portable linear dialect. Both compilers refuse lookarounds, backreferences, `\b`, `\p{…}`, .NET-only syntax (`\A`, `\z`, inline options, class subtraction) and patterns over the size budget with PLAY0699. The message names the construct and suggests an equivalent where one exists. Existing models that use one of these constructs no longer compile: rewrite the pattern as the message suggests, for example `\A`/`\z` as `^`/`$` or a length-only lookahead as a counted repeat. See [Commands](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/commands.md). (#800)
- **Screenplay** ([Release v4.183.0](https://github.com/Cratis/Screenplay/releases/tag/v4.183.0)): `matches` rules are evaluated by Screenplay's own linear-time matcher instead of .NET's regular expression engine. Verdicts no longer depend on how busy the host is, on the target framework or on runtime settings, and there is no timeout. (#800)
- **Screenplay** ([Release v4.183.0](https://github.com/Cratis/Screenplay/releases/tag/v4.183.0)): A few `matches` verdicts in the reference evaluator now agree with JavaScript where they used to differ: `\s` no longer matches Unicode spaces such as the no-break space U+00A0 (this also affects the built-in `email` rule), `.` no longer matches `\r`, U+2028 or U+2029, and `\w` no longer matches U+0130. (#800)
- **Screenplay** ([Release v4.183.0](https://github.com/Cratis/Screenplay/releases/tag/v4.183.0)): Executable models saved by earlier versions still load when a pattern is outside the dialect. The evaluator reports such a rule as an unsupported validation, and generation checks report it as Unproven instead of timing out. (#800)
- **Screenplay** ([Release v4.182.0](https://github.com/Cratis/Screenplay/releases/tag/v4.182.0)): A pending handler intent without `produces` now fails executable binding with PLAY0696 instead of PLAY0268. Its source stays valid. (#782)
- **Arc** ([Release v22.106.0](https://github.com/Cratis/Arc/releases/tag/v22.106.0)): `new CommandScenario<T>()` enables decision reads automatically when the command needs them; `UseDecisionReads()` is no longer needed (#3276)
- **Arc** ([Release v22.106.0](https://github.com/Cratis/Arc/releases/tag/v22.106.0)): Commands routed through event source definitions pass their declared routing to Chronicle under `On`, so the append is checked against the definition's concurrency (#3283)
- **Arc** ([Release v22.106.0](https://github.com/Cratis/Arc/releases/tag/v22.106.0)): ARCCHR0002, ARCCHR0011, ARCCHR0012 and ARCCHR0013 follow the read-protection rules, and `[LookUpBy]` lookups are checked against the command a validator belongs to (#3268)
- **Arc** ([Release v22.106.0](https://github.com/Cratis/Arc/releases/tag/v22.106.0)): Requires Chronicle 19.
- **Arc** ([Release v22.105.0](https://github.com/Cratis/Arc/releases/tag/v22.105.0)): The Screenplay generator now states reactors that return several events whose append constraints could reject the batch, by declaring `reaction batches atomic` (Screenplay ESM v22). Chronicle appends such a batch all or nothing, and the generated model now says the same. Batches that close a stream, and batches whose rejecting constraint is not in the generated document (such as a class-level `[Unique]`), keep their code reference with SP0070. With `MaximumExecutableModelVersion` below 22 the output is unchanged. Arc now depends on Cratis.Screenplay 4.181.0. See [Generating a Screenplay](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/generating-a-screenplay.md). (#3093)
- **Scene** ([Release v4.42.0](https://github.com/Cratis/Scene/releases/tag/v4.42.0)): Nothing is renamed. The spec names stand beside the earlier templates, which keep working: `LoginScreen` beside `Login`, `NotFoundScreen` beside `NotFound`, `ForbiddenScreen` beside `AccessDenied`, `ErrorScreen` beside `Error`, `QuickCreateDialog` beside `FormDialog` (`foundationTemplateAliases`). The `ConfirmDialog` of the components blueprint and this one are kept apart because a template reference names its blueprint.
- **Stage** ([Release v4.115.0](https://github.com/Cratis/Stage/releases/tag/v4.115.0)): A rendered specification may leave a generated value unpinned when every rule on its concept is proven by Screenplay's rule consistency check; unproven or refuted rules still require a pin (`STAGE-ESM-038`). (#423)
- **Screenplay** ([Release v4.181.1](https://github.com/Cratis/Screenplay/releases/tag/v4.181.1)): The version-1 generation context for `generate rule` bodies is a language-neutral contract (`Now`, `Tenant`, String result) that the selected provider binds to its own type. The Cratis C# target binds Fundamentals' `Cratis.Concepts.GenerationContext`, so compound bodies such as `return $"{context.Tenant}:{GenerateValue.Ulid(context)}";` compile, and `Cratis.Screenplay.Contexts.GenerationContext` stays dependency-free. The [context reference](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/context.md) lists the portable subset and the target-bound uses (#799)
- **Stage** ([Release v4.114.0](https://github.com/Cratis/Stage/releases/tag/v4.114.0)): **Shared composition and host.** `App.tsx` composes every screen through `composeApplicationScreen` and runs it in `ApplicationHost` (`@cratis/scene.blueprint.default` 4.38). The Stage decides only what is its own: shell chrome, the command form, the status line, data sources (`decorate`), and a `scope` providing its data, interactions, theme and slice invoker around the screen and every dialog. Deleted: `FlowArrangementView`, `useSizeClass`, the `Stage:template` wrapper, `StageNavigationTree` and its CSS - Scene owns them (REN2).
- **Stage** ([Release v4.114.0](https://github.com/Cratis/Stage/releases/tag/v4.114.0)): **Navigation regions.** A model with `navigation topbar|sidebar` gets the blueprint shell's regions drawing the effective navigation (inherit / extend / override per module); module swap, active state in both regions, render-into-slot, first feature for a module target come from Scene. `screenFor` and `moduleOf` (Scene #134) are the Stage's: the screen declared in a feature, the first of a screen's `path`. A model with no regions keeps the authored `Navigation` contributions / flat screen list.
- **Stage** ([Release v4.114.0](https://github.com/Cratis/Stage/releases/tag/v4.114.0)): **Toolbar slice dialogs with the real invoker.** A toolbar button naming a State Change slice opens Scene's `SliceDialogView`; fields come from the command's JSON schema (`schemaPropertiesOf`, shared with `StageCommandForm`); submit posts to the route the Stage registered through `createStageSliceInvoker`, validation results return against their fields, success closes and refreshes data.
- **Stage** ([Release v4.114.0](https://github.com/Cratis/Stage/releases/tag/v4.114.0)): **Deep links.** Hash history (`createHashSceneHistory`) restores module, feature and slots on reload; asserted in a browser.
- **Stage** ([Release v4.114.0](https://github.com/Cratis/Stage/releases/tag/v4.114.0)): **Permission-hidden items.** `App` takes `isVisible(item)`, fed to the regions: hidden, never disabled, at every level.
- **Stage** ([Release v4.114.0](https://github.com/Cratis/Stage/releases/tag/v4.114.0)): **Wire.** `SceneApplication.Structure` is now serialized in the runtime document and the live scene when a toolbar button names a slice (otherwise byte-identical to before: plan digests move only for the Scene 4.38 pin and the frontend files); `commandSchemas` carries each command's JSON schema in the same case.
- **Stage** ([Release v4.114.0](https://github.com/Cratis/Stage/releases/tag/v4.114.0)): **SD6.** `SceneApplication.ForRuntime()` and `StageSceneDocument` strip sample data packs, blueprint packs and the profile's selection from the runtime document and `/stage/scene`.
- **Stage** ([Release v4.114.0](https://github.com/Cratis/Stage/releases/tag/v4.114.0)): Scene packages pinned to 4.38.0 (frontend, scaffold package set, specs); NuGet `Cratis.Scene.*` stays on the latest published (4.36.0) until 4.38 is indexed.
- **Stage** ([Release v4.114.0](https://github.com/Cratis/Stage/releases/tag/v4.114.0)): Docs: `Documentation/reference/stage-rendering.md` (navigation regions, slice dialogs, no sample data, one composition). (part of #407)
- **Scene** ([Release v4.41.0](https://github.com/Cratis/Scene/releases/tag/v4.41.0)): Existing templates (`Dashboard`, `CrudList`, `MasterDetail`, `DetailView`, `FormPage`, `ModuleWorkspace`, ...) are unchanged and keep their names: the foundation set is added alongside rather than renamed, so nothing breaks. As with the components (see #105) the set lives in the published `blueprint.default` rather than a new package (a new npm package cannot be published until a trusted publisher exists).
- **Arc** ([Release v22.104.0](https://github.com/Cratis/Arc/releases/tag/v22.104.0)): A generated or scenario-pinned `[GeneratedValue]` now fails with `GeneratedValueRejected` when it breaks any rule of its concept validator, including Warning and Information rules. Before, those severities let the command run with the value. The server chose the value, so a failing rule is a server defect; this matches the Screenplay reference. Validation of caller-supplied input is unchanged. See [Generated values](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/commands/generated-values.md). (#3304)
- **Arc** ([Release v22.104.0](https://github.com/Cratis/Arc/releases/tag/v22.104.0)): Arc now depends on Cratis.Fundamentals 7.25.0, which adds `GenerateValue.Pattern`, `GenerateValue.Integer`, `GenerateValue.HasValidChecksum` and the `Checksum` enum. (#3308)
- **Arc** ([Release v22.103.0](https://github.com/Cratis/Arc/releases/tag/v22.103.0)): The Screenplay generator no longer accepts "Query reference ... is ambiguous across slices" as a known binder limit. Queries that share a name in different slices, such as `All` on several read models, now bind by slice, and a generated document that is still ambiguous fails verification instead of passing. Arc now depends on Cratis.Screenplay 4.180.1. See [Generating a Screenplay](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/generating-a-screenplay.md). (#3301)
- **cli** ([Release v3.66.0](https://github.com/Cratis/cli/releases/tag/v3.66.0)): The CLI bundles Stage 4.113.0 and Screenplay 4.180.1 (including its MCP server); `cratis run` starts `cratis/stage:4.113.0` by default. Rendered applications are two-project solutions with a `<Project>.Specs` project, and validation rules on optional whole-number, decimal and Boolean concept properties now render.
- **cli** ([Release v3.66.0](https://github.com/Cratis/cli/releases/tag/v3.66.0)): A render whose bundled renderer breaks its own contract is refused with `CLI-RENDER-005`, naming the error to report to Cratis/Stage, instead of crashing; nothing is published.
- **Scene** ([Release v4.34.0](https://github.com/Cratis/Scene/releases/tag/v4.34.0)): `ScenePreviewHost`, `ApplicationHost`, `composeApplicationScreen`, `composeOutletScreen`, `composeDialog`, `diagnosePreview`, `resolvePreviewPlan`, `createPreviewSampleData`, `previewProfile`, the `Scene:template` wrapper and the flow arrangement view are exported from `@cratis/scene.blueprint.default` instead of the unpublished `@cratis/scene.preview`. Nothing else about them changes; the specs moved with them.
- **Scene** ([Release v4.34.0](https://github.com/Cratis/Scene/releases/tag/v4.34.0)): The preview host's stylesheet is part of `@cratis/scene.blueprint.default/styles.css`.
- **Scene** ([Release v4.34.0](https://github.com/Cratis/Scene/releases/tag/v4.34.0)): The docs page `Documentation/blueprints/preview-host.md` names the new import.
- **Scene** ([Release v4.32.0](https://github.com/Cratis/Scene/releases/tag/v4.32.0)): The foundation set lives in the published `@cratis/scene.blueprint.default` rather than a new `blueprint.foundation` package: a brand-new npm package cannot be published by the release workflow until a trusted publisher is configured for it on npm, and a failed publish fails the run for every other change. The code sits in its own `foundation/` folder with its own barrel, so moving it into a package later is mechanical.
- **Scene** ([Release v4.32.0](https://github.com/Cratis/Scene/releases/tag/v4.32.0)): The light theme's `text.mutedColor` is `#5b6472` (was `#6b7280`), which keeps muted text AA-contrast on the page background as well as on cards.
- **Chronicle** ([Release v19.71.0](https://github.com/Cratis/Chronicle/releases/tag/v19.71.0)): Models that declare an event stream refuse key-only reads and mismatched decision-read routes rather than mixing streams. (#4932)
- **Stage** ([Release v4.112.0](https://github.com/Cratis/Stage/releases/tag/v4.112.0)): Stage now renders command validation rules on optional whole-number, decimal and Boolean concept properties, which it used to refuse with STAGE-ESM-005. An absent value passes, a present value is compared by value exactly as Screenplay specifies, and Boolean equality compares the actual true or false value. `not empty` rules, collections and concepts with named values are still refused with a specific reason. (#419)
- **Chronicle.Elixir** ([Release v3.14.2](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.14.2)): Returning `{:error, reason}` from the `Chronicle.decide/2` function now rejects the decision: nothing the function appended is written, and `{:error, reason}` is returned as-is instead of `{:ok, {:error, reason}}`. Code that matched `{:ok, {:error, _}}` should match `{:error, _}` instead. (#161)
- **Stage** ([Release v4.111.0](https://github.com/Cratis/Stage/releases/tag/v4.111.0)): Stage moves to Cratis.Screenplay 4.180.1. A protected query whose specification has no `given caller` is now refused by the language itself (`PLAY0389`) before Stage plans the model.
- **Stage** ([Release v4.110.0](https://github.com/Cratis/Stage/releases/tag/v4.110.0)): Stage moves to Cratis.Scene 4.30.0 and Cratis.Screenplay 4.179.0, and the generated frontend pins the matching `@cratis/scene.*` packages.
- **Stage** ([Release v4.110.0](https://github.com/Cratis/Stage/releases/tag/v4.110.0)): The Billing sample demonstrates navigation regions and toolbar buttons.
- **AI** ([Release v7.57.0](https://github.com/Cratis/AI/releases/tag/v7.57.0)): The skill now documents the reactor and reducer context as a `Chronicle.Events.EventContext` struct instead of a six-key map, and no longer says the client emits no telemetry.
- **AI** ([Release v7.57.0](https://github.com/Cratis/AI/releases/tag/v7.57.0)): The Elixir rule and the product ledger are synced to Chronicle.Elixir v3.13.0.
- **Chronicle.Elixir** ([Release v3.14.1](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.14.1)): The shared Chronicle pages show Elixir code for decision reads, the dynamic consistency boundary, closing streams, replay notifications and the testing scenarios.
- **Chronicle.Elixir** ([Release v3.14.1](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.14.1)): The Dynamic Consistency Boundary page now says correctly that only the .NET client refuses reducer-backed decision reads.
- **AI** ([Release v7.56.3](https://github.com/Cratis/AI/releases/tag/v7.56.3)): The Stage sandbox guidance now states exactly what the default engine checks: missing required properties and simple literal `validate` rules on top-level properties of commands that produce events. It also lists the rules it evaluates with the wrong meaning (numeric `min`/`max`, `not empty` on nested properties) and everything it skips (other rules, concept rules, `require`, constraints, command and query authorization, the `/validate` route). Skills previously said it enforced no validation at all. (#709)
- **AI** ([Release v7.56.3](https://github.com/Cratis/AI/releases/tag/v7.56.3)): The Arc command and decision-read skills teach that the fresh-identifier guard also covers events written directly through the command's unit of work (`IUnitOfWork.AddEvent`, `AddEventWithNamedTags`, `AddEvents`, `eventLog.Transactional.Append` and its variants) and nested commands, how a conflicting scope is reported as `ConflictingConcurrencyScopes`, and that Arc 22.100.0 requires Chronicle 19.65.2 or later. (#710)
- **Screenplay** ([Release v4.179.0](https://github.com/Cratis/Screenplay/releases/tag/v4.179.0)): Renaming or moving a slice, feature or module that a toolbar button names is refused with an explicit message instead of leaving the button's `slice` stale.
- **Chronicle.Go** ([Release v0.11.0](https://github.com/Cratis/Chronicle.Go/releases/tag/v0.11.0)): Contracts and the verified decision-guard profile move to Chronicle 19.70.0. Run a Chronicle server of 19.70.0 or later: an older server ignores `reactors.StartAtTail()` and the reactor catches up from the beginning, and decision guards are only supported against the verified 19.70.0 profile.
- **Chronicle.Kotlin** ([Release v6.15.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.15.0)): Requires `io.cratis:chronicle-contracts` 19.70.0 and a Chronicle server of 19.70.0 or later. Upgrade the server first: an older server ignores `@StartAtTail` and the reactor catches up from the beginning.
- **Chronicle.TypeScript** ([Release v6.53.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.53.0)): Requires `@cratis/chronicle.contracts` 19.70.0 and a Chronicle server of 19.70.0 or later. Upgrade the server first: an older server ignores `@startAtTail()` and the reactor catches up from the beginning.
- **Chronicle.Elixir** ([Release v3.14.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.14.0)): Requires `cratis_chronicle_contracts` 19.70 and a Chronicle server of 19.70.0 or later. Upgrade the server first: an older server ignores the option and the reactor catches up from the beginning.
- **Screenplay** ([Release v4.178.0](https://github.com/Cratis/Screenplay/releases/tag/v4.178.0)): Renaming or moving a module or feature that a navigation item targets is refused with an explicit message instead of leaving the `target` stale. The TypeScript compiler recognizes module `navigation` blocks and skips them, as it skips layouts, so the reference checks are C# only.
- **Screenplay** ([Release v4.177.0](https://github.com/Cratis/Screenplay/releases/tag/v4.177.0)): Every sample, canonical-corpus source and fixture that declares a layout or template now declares a `category`, so they compile warning-free.
- **Screenplay** ([Release v4.177.0](https://github.com/Cratis/Screenplay/releases/tag/v4.177.0)): Docs: `templates.md` (own and blueprint templates, category, applicability), `grammar.md`, `ui-profile.md`, `diagnostics.md`, the capability matrix. (#761)
- **Chronicle** ([Release v19.70.0](https://github.com/Cratis/Chronicle/releases/tag/v19.70.0)): Upgrade the Chronicle server before the clients: a server that predates this release ignores `StartAtTail` and the reactor catches up from the beginning.
- **Stage** ([Release v4.109.0](https://github.com/Cratis/Stage/releases/tag/v4.109.0)): A value that Stage's Host generates and that fails its concept's shape or rules is reported as a server error after authorization and input validation, never as a validation error, and appends nothing. (#393)
- **Stage** ([Release v4.109.0](https://github.com/Cratis/Stage/releases/tag/v4.109.0)): The specification executor reports a generated fixture that fails its concept's rules with the reference evaluator's message, checking each fixture's shape and then its rules in fixture order. (#393)
- **Chronicle** ([Release v19.69.0](https://github.com/Cratis/Chronicle/releases/tag/v19.69.0)): SQL stores get additive event-store and namespace migrations for trigger definitions and indexed effect receipts. (part of #4911)
- **Screenplay** ([Release v4.175.0](https://github.com/Cratis/Screenplay/releases/tag/v4.175.0)): Specifications of record captures (`source api`, polls and other outside sources) now treat the first record of a key as added, as Chronicle does: `when added` holds on it, while `when <field>` and `and`/`or` combinations of field changes need an earlier record of the same key from `given capture`. This applies at root, child and nested level; expression guards, `map` and unguarded appends are unchanged. A specification that relied on the old rule now reports the events it expected: add a separate append with `when added` for behavior on first sight and keep the field-guarded append for later updates, or seed the key with `given capture` when the scenario is an update. See [decision 0080](https://github.com/Cratis/Screenplay/blob/main/decisions/0080-treat-the-first-record-of-a-key-in-a-record-capture-as-added-only.md). (#767)
- **Stage** ([Release v4.108.1](https://github.com/Cratis/Stage/releases/tag/v4.108.1)): Generated applications now use Arc 22.100.1 and Chronicle 19.66.0, and the Stage Host and packages are updated to match.
- **Stage** ([Release v4.108.1](https://github.com/Cratis/Stage/releases/tag/v4.108.1)): Generated commands keep their freshness behavior on Arc 22.100. Stage still guards freshly generated identifiers itself, and generated values in older models stay unguarded rather than being refused by Arc's new default guard.
- **Screenplay** ([Release v4.174.0](https://github.com/Cratis/Screenplay/releases/tag/v4.174.0)): `RuleConsistency.Check(generation, primitive, rule)` assesses date patterns with the current UTC year, like the compiler, so it gives the same Proven, Refuted or Unproven status as the PLAY0688/PLAY0689 diagnostics. (#775)
- **Scene** ([Release v4.25.0](https://github.com/Cratis/Scene/releases/tag/v4.25.0)): `category` is required: `TemplateCatalog.Describe` / `describeTemplateCatalog` report a missing category (`templateCategoryMissing`) as a problem for a template in a `Blueprint` package and as a warning for an own template.
- **Scene** ([Release v4.25.0](https://github.com/Cratis/Scene/releases/tag/v4.25.0)): Every template in `blueprint.default` (`Foundation / <type>`) and `blueprint.components` (`Business / <domain>`) now has a category; the components list/detail/command templates declare their slice kinds.
- **Scene** ([Release v4.25.0](https://github.com/Cratis/Scene/releases/tag/v4.25.0)): `template-applicability-fixtures.json` now covers each level, explicit scopes, slot-nesting failure, hidden blueprints, the slice-kind split, category error/warning and version-pinned references, asserted by both `Engine.Specs` and `engine` specs. `scene-model-shape.json` and docs (`template-applicability.md`, `template-provenance.md`) updated.
- **Scene** ([Release v4.24.0](https://github.com/Cratis/Scene/releases/tag/v4.24.0)): Components that had no hand-written descriptor now have one with no editable properties (their name, category and icon), so a picker can list them. A package written before categories still loads: the category rule is checked by `validateComponentMetadata`, not by `validatePackageBundle`.
- **Screenplay** ([Release v4.173.0](https://github.com/Cratis/Screenplay/releases/tag/v4.173.0)): `screenplay_declaration_details` describes the ESM v21 strategies `pattern`, `random` and `generate rule` as executable. Their authored values are now under `generation.arguments`, which replaces `previewArguments`: `pattern` and `checksum` are strings, `range` carries exact Int64 `minimum` and `maximum`, and `rule` is the rule name. See [generated values and responses](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/mcp/reference.md#generated-values-and-responses). (part of #618)
- **Screenplay** ([Release v4.173.0](https://github.com/Cratis/Screenplay/releases/tag/v4.173.0)): Pattern and random strategies report the compiler's exact `supportCount`, with `entropyBits` and the 1% collision count computed from it. Date tokens use the minimum support over the compiler's 100-year UTC horizon. Malformed patterns or ranges, support-budget exhaustion (PLAY0691) and empty support (PLAY0692) give null entropy and the compiler's message instead of an error. Rule generation reports unknown entropy because the implementation is opaque. (part of #618)
- **Screenplay** ([Release v4.173.0](https://github.com/Cratis/Screenplay/releases/tag/v4.173.0)): `generation.derivedPattern` covers `pattern` strategies, using the same expression the PLAY0688 repair writes, and `checksum` validation rules are listed with their proof status. (part of #618)
- **Stage** ([Release v4.108.0](https://github.com/Cratis/Stage/releases/tag/v4.108.0)): Stage now renders commands with an optional scalar concept property whose validation rules all accept absence (comparisons, `length` and `matches`). An absent value is accepted and a present value is validated exactly as Screenplay specifies. Optional concepts with absence-rejecting rules such as `not empty`, optional collections of validated concepts and optional named-value concepts are still refused with STAGE-ESM-005, and the message now says which of these applies. (#409)
- **Stage** ([Release v4.107.0](https://github.com/Cratis/Stage/releases/tag/v4.107.0)): A generated application ignores `.editorconfig` and `.globalconfig` files in parent folders, so it builds the same inside another repository. (part of #401)
- **Chronicle** ([Release v19.68.0](https://github.com/Cratis/Chronicle/releases/tag/v19.68.0)): An explicit concurrency scope whose tail was unavailable now guards an empty stream instead of being skipped; `ConcurrencyOptions.SkipIncompleteExplicitScopes` restores the old behaviour (#4898)
- **Chronicle** ([Release v19.68.0](https://github.com/Cratis/Chronicle/releases/tag/v19.68.0)): An explicit concurrency scope built for one stream of an event source is refused when passed to a single-route append to another stream of it; `ConcurrencyOptions.AllowRouteScopeStreamMismatch` restores the old behaviour (#4899)
- **Chronicle** ([Release v19.68.0](https://github.com/Cratis/Chronicle/releases/tag/v19.68.0)): The concurrency and Dynamic Consistency Boundary documentation states that revising or redacting an event is not detected by append conditions (part of #4900)
- **Arc** ([Release v22.101.0](https://github.com/Cratis/Arc/releases/tag/v22.101.0)): Validators whose constructor registers rules as an expression body (`public MyValidator() => RuleFor(...)`) now have those rules recovered. (part of #3116)
- **Arc** ([Release v22.101.0](https://github.com/Cratis/Arc/releases/tag/v22.101.0)): Arc requires Cratis Screenplay 4.164.0 or later. (part of #3116)
- **Screenplay** ([Release v4.172.0](https://github.com/Cratis/Screenplay/releases/tag/v4.172.0)): `PLAY0268` no longer refuses `pattern`, `random` and `rule` generation; generated secrets remain refused (part of #616)
- **Screenplay** ([Release v4.172.0](https://github.com/Cratis/Screenplay/releases/tag/v4.172.0)): The generated-values documentation covers patterns, checksums, ranges and rule generators with the shop example (part of #616)
- **cli** ([Release v3.65.0](https://github.com/Cratis/cli/releases/tag/v3.65.0)): The CLI bundles Stage 4.106.0 and Screenplay 4.170.0; rendered applications use Chronicle 19.64.1 and Arc 22.95.0, rendered queries take concept-typed keys and filter values again so out-of-rule arguments answer with a validation error, and `cratis run` starts the `cratis/stage:4.106.0` image.
- **Screenplay** ([Release v4.171.0](https://github.com/Cratis/Screenplay/releases/tag/v4.171.0)): New error `PLAY0700`: a capture over events must key by a property that every `from` event declares as required; a context key such as `key $eventSourceId` is refused. Chronicle fails the partition for an event without the key, so the model now says so at compile time. (#483)
- **Screenplay** ([Release v4.171.0](https://github.com/Cratis/Screenplay/releases/tag/v4.171.0)): New error `PLAY0701`: `given capture` and `when capture` cannot name a capture over events, because a record does not say which event arrived. When the capture reads exactly one event, the quick fix in the editors and through MCP rewrites the step to `given <Event>` / `when append <Event>` with the same lines. (#483)
- **Stage** ([Release v4.106.0](https://github.com/Cratis/Stage/releases/tag/v4.106.0)): Rendered queries take concept-typed `by` keys and filter values again, so Arc's concept validators answer an out-of-rule argument with a 400 instead of an empty result. Nested and collection concept values are validated too, so they are no longer refused. A valid key that matches nothing still returns no result. (#370)
- **Stage** ([Release v4.106.0](https://github.com/Cratis/Stage/releases/tag/v4.106.0)): Stage builds against Screenplay 4.170.0. ESM v20 models remain refused with `STAGE-ESM-016`. (#370)
- **Stage** ([Release v4.106.0](https://github.com/Cratis/Stage/releases/tag/v4.106.0)): An optional concept key or filter with a `not empty` rule fails with `STAGE-ESM-010`, because Arc skips validation for a null argument while the reference validates it. Query rejection specifications with prior events or read-model state, and composite query arguments that leave out members, are refused with their own diagnostics rather than rendered differently from the reference. (#370)
- **Chronicle** ([Release v19.67.0](https://github.com/Cratis/Chronicle/releases/tag/v19.67.0)): Decision 0009 now records two clarifications. A unit of work with protected reads and no events stores its receipt through the same validate-only append, so the decision's scopes are still checked. Each schedule cursor tracks the revision registration announced (`RegisteredRevision`) separately from the one it has applied (`AppliedRevision`), so a schedule change is migrated exactly once. (part of #4911)
- **Stage** ([Release v4.105.1](https://github.com/Cratis/Stage/releases/tag/v4.105.1)): Commands that Stage can't render now say exactly why. Instead of one generic `STAGE-ESM-005: Command '<X>' exceeds the first Cratis command capability`, each failing condition gets its own `STAGE-ESM-005` diagnostic that names the event, property, validation rule, requirement or concept involved, explains why, and says what to change in the model. All failing conditions are reported, not just the first. For example, an optional event property now reads: Cratis events have no optional properties; make it required (in Studio's model board, tick "Required") or remove it. The same models are refused as before. (part of #409)
- **Arc** ([Release v22.100.0](https://github.com/Cratis/Arc/releases/tag/v22.100.0)): An enrollment scope that conflicts with a generated identifier's guard is reported as `ConflictingConcurrencyScopes`, without the identifier or scope values in the message. (#3245)
- **Arc** ([Release v22.100.0](https://github.com/Cratis/Arc/releases/tag/v22.100.0)): Arc requires Cratis Chronicle 19.65.2 or later. (#3245)
- **Chronicle** ([Release v19.66.0](https://github.com/Cratis/Chronicle/releases/tag/v19.66.0)): Registering an opted-in subscription fails, before anything is recorded, when it names a generation that the source or the target event store has not registered, or two generations of the same event type (part of #4710)
- **Chronicle** ([Release v19.66.0](https://github.com/Cratis/Chronicle/releases/tag/v19.66.0)): When the target event store does not have the pinned generation at forwarding time, the subscription appends nothing and fails the batch without moving past the failing event, so it is retried instead of being skipped. Events forwarded before the failure stay acknowledged (part of #4710)
- **Chronicle** ([Release v19.66.0](https://github.com/Cratis/Chronicle/releases/tag/v19.66.0)): Changing only the generation or the opt-in of an existing subscription rebinds it in place, without unsubscribing it first (part of #4710)
- **AI** ([Release v7.55.0](https://github.com/Cratis/AI/releases/tag/v7.55.0)): Skills, rules, agents and prompts point to `general.md`'s Model first definition and the status script instead of restating the opt-in test, and verification fails when an instruction restates it. (#677)
- **AI** ([Release v7.54.0](https://github.com/Cratis/AI/releases/tag/v7.54.0)): Vertical slices rule: observation commands append only changes, compared against a `[Passive]` model or the stream's own events, with two specifications each; counters built with `[Increment]`/`[Decrement]` need commands that refuse non-transitions.
- **AI** ([Release v7.54.0](https://github.com/Cratis/AI/releases/tag/v7.54.0)): Reactors rule and skill: a reactor added in a release catches up the whole history on first registration and `[OnceOnly]` does not cover that; sweeps must not decide from read models that are replaying.
- **AI** ([Release v7.54.0](https://github.com/Cratis/AI/releases/tag/v7.54.0)): Projection skill points to the counter transition requirement.
- **Stage** ([Release v4.104.0](https://github.com/Cratis/Stage/releases/tag/v4.104.0)): Reducer and specification artifacts in a render plan now also list their declaring slice among their sources, so a consumer such as Studio's slice Preview can find a slice's files by filtering on the slice id. Existing sources are kept, and the slice of an event a reducer reads never becomes an owner. Plan digests change; file contents don't. The [render plans reference](https://github.com/Cratis/Stage/blob/main/Documentation/reference/render-plans.md) now lists which artifacts each slice owns. (part of #400)
- **Screenplay** ([Release v4.169.0](https://github.com/Cratis/Screenplay/releases/tag/v4.169.0)): The *Proposed* view marks what a proposal adds and changes, and the *Current* view marks what it removes, with an Added, Changed or Removed badge that also carries the text for screen readers. The Current and Proposed buttons show the counts, for example "Proposed · 3 added, 1 changed". Elements the board cannot badge on their own (queries, screens, specifications, triggers and persona lanes) mark the slice or module that contains them as changed. See [the board view](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/mcp/view.md). (#709)
- **Screenplay** ([Release v4.169.0](https://github.com/Cratis/Screenplay/releases/tag/v4.169.0)): The board opens scrolled to the first change, and scrolls to it again when you switch between Current and Proposed or the model is refreshed. (#709)
- **Screenplay** ([Release v4.169.0](https://github.com/Cratis/Screenplay/releases/tag/v4.169.0)): Bump `@cratis/event-models` and `@cratis/scene` to 0.172.0 in the MCP App, the event models package and the VS Code extension.
- **Stage** ([Release v4.103.2](https://github.com/Cratis/Stage/releases/tag/v4.103.2)): Generated applications use Cratis Arc 22.95.0. (#392)
- **AI** ([Release v7.52.1](https://github.com/Cratis/AI/releases/tag/v7.52.1)): Documentation guidance and the technical-examples skill now say published pages may state version requirements and pin what the reader runs, but must not carry the author's verification log (exact SDK builds, image digests or SHAs, test dates, "tested with" lines, which samples were not run). Those belong in the change summary.
- **AI** ([Release v7.52.0](https://github.com/Cratis/AI/releases/tag/v7.52.0)): The skills check examples against the Screenplay 4.164.0 compiler and describe what Stage 4.103.0 and the cratis CLI 3.62.0 render. (#668) (#684) (#681)
- **AI** ([Release v7.52.0](https://github.com/Cratis/AI/releases/tag/v7.52.0)): Arc and Chronicle skills describe Arc 22.97.0 and Chronicle 19.65.0, including reactor command invocation with refusal handling and read-model collection observation. (#695)
- **AI** ([Release v7.52.0](https://github.com/Cratis/AI/releases/tag/v7.52.0)): Skills link to documentation pages with absolute `https://www.cratis.io` URLs, and verification fails on a documentation-site path that an agent cannot open. (#696)
- **Arc** ([Release v22.98.0](https://github.com/Cratis/Arc/releases/tag/v22.98.0)): Denial specifications that cannot be stated truthfully stay reported with SP0039, and the warning now names the reason: caller not recovered, policy not recovered exactly, the stated caller satisfies the stated authorization, the denial cannot be decided from the stated caller, the denial is combined with another outcome, no stated policy explains it, or the command's own code can return an authorization denial. (#3185)
- **Chronicle** ([Release v19.65.2](https://github.com/Cratis/Chronicle/releases/tag/v19.65.2)): `ConflictingEnrollmentScope` now carries the conflict as typed properties: `EventSourceId`, `Effective`, `Required` and, when known, `EventSequenceId`. Hosts that translate enrollment conflicts, such as Arc's fresh-identifier guard, can now classify them without parsing the message. (#4909)
- **Screenplay** ([Release v4.166.0](https://github.com/Cratis/Screenplay/releases/tag/v4.166.0)): The event model board in the MCP App takes the theme from the MCP Apps host when it connects and whenever the host changes it; a host that sends no theme, or one the board does not know, still gets dark. See [the view documentation](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/mcp/view.md). (#710)
- **Screenplay** ([Release v4.166.0](https://github.com/Cratis/Screenplay/releases/tag/v4.166.0)): Bump `@cratis/event-models` and `@cratis/scene` to 0.171.14 in the MCP App, the event models package and the VS Code extension, and `@cratis/fundamentals` to 7.24.1, so the board's chrome uses theme tokens and the page loads one copy of `@cratis/fundamentals`.
- **AI** ([Release v7.51.5](https://github.com/Cratis/AI/releases/tag/v7.51.5)): The legacy-extraction skill explains which navigation Arc's Screenplay generator recovers from react-router route tables (`item <name> navigate to <Screen>` from menu items and `navigate to <Screen>` after a command dialog succeeds), what it needs to match a route to a screen, and what still has to be written by hand. Requires Arc.Screenplay 22.96.0. (#692)
- **cli** ([Release v3.63.0](https://github.com/Cratis/cli/releases/tag/v3.63.0)): The CLI bundles Stage 4.103.0 and Screenplay 4.160.0; rendered applications use Chronicle 19.64.1 and Arc 22.88.0, and `cratis run` starts the `cratis/stage:4.103.0` image.
- **Arc** ([Release v22.97.0](https://github.com/Cratis/Arc/releases/tag/v22.97.0)): `CommandInvocation` carries Chronicle's `[ReactorSideEffect]` marker, so reactors that return command invocations synchronously no longer raise `CHR0054`. (#3094)
- **Arc** ([Release v22.97.0](https://github.com/Cratis/Arc/releases/tag/v22.97.0)): Arc requires Cratis Chronicle 19.63.0 or later and Cratis Screenplay 4.160.0 or later. (#3094)
- **Screenplay** ([Release v4.164.0](https://github.com/Cratis/Screenplay/releases/tag/v4.164.0)): `PLAY0268` no longer refuses rules on generated concepts (part of #616)
- **Screenplay** ([Release v4.164.0](https://github.com/Cratis/Screenplay/releases/tag/v4.164.0)): The generated-values documentation follows one shop example through strategies, choosing a strategy, rule consistency and when not to generate (part of #616)
- **AI** ([Release v7.51.4](https://github.com/Cratis/AI/releases/tag/v7.51.4)): Every skill body now stays under the 16,000-character authoring target: tables, extended examples and long procedures in 34 skills (most of the Screenplay skills, the Chronicle clients, reactors, reducers and projections, and the Arc command, query and identity skills) moved into `references/`, each with a pointer that says when to read it. No guidance was removed. (#686)
- **AI** ([Release v7.51.4](https://github.com/Cratis/AI/releases/tag/v7.51.4)): Verification warns when a skill body grows past the 16,000-character target, instead of at 18,000. (#686)
- **AI** ([Release v7.51.4](https://github.com/Cratis/AI/releases/tag/v7.51.4)): Verification fails when a relative link in a skill or one of its references does not resolve from the file it is in. (#686)
- **Chronicle** ([Release v19.65.0](https://github.com/Cratis/Chronicle/releases/tag/v19.65.0)): The ASP.NET Core Chronicle health check reports the configured failure status ("Registration is in progress") while the client re-registers. After a kernel restart, readiness therefore stays down until observers, projections and constraints are registered again, instead of routing traffic to a pod that is not ready. (#4875)
- **Chronicle** ([Release v19.65.0](https://github.com/Cratis/Chronicle/releases/tag/v19.65.0)): `WaitForRegistration` now waits for a registration that is in progress and returns its outcome, instead of returning the previous outcome at once. (#4875)
- **Stage** ([Release v4.103.0](https://github.com/Cratis/Stage/releases/tag/v4.103.0)): Stage, the Stage Host image (`cratis/chronicle:19.64.1-development`) and the rendered backend scaffold use Chronicle 19.64.1. (#371)
- **AI** ([Release v7.51.3](https://github.com/Cratis/AI/releases/tag/v7.51.3)): Verification fails when a skill carries release history: versions outside a `Requires` line, issue or pull request numbers, source-line citations, commit hashes or history wording. `SKILL_HYGIENE_MODE=warn` reports them without failing. (#662)
- **AI** ([Release v7.51.3](https://github.com/Cratis/AI/releases/tag/v7.51.3)): The authoring rule explains how to decide what a version marks before removing it: release history goes, while the release that introduced a behavior, or one that changed it, stays as a `Requires` line. (#662)
- **Stage** ([Release v4.102.0](https://github.com/Cratis/Stage/releases/tag/v4.102.0)): Stage uses Screenplay 4.160.0, and the rendered backend scaffold uses Arc 22.88.0. (#214)
- **AI** ([Release v7.51.2](https://github.com/Cratis/AI/releases/tag/v7.51.2)): Rules that only matter for certain files now load when those files are touched, instead of in every session; rules a task needs before any file is touched, such as committing, opening a pull request or writing a work record, stay loaded in every session. Harnesses without path-scoped rules reach each scoped rule through `general.md`. (#675)
- **AI** ([Release v7.51.2](https://github.com/Cratis/AI/releases/tag/v7.51.2)): Path-scoped profile rules cover every supported language and Screenplay models, and the Pi package keeps them for single-language repositories. (#675)
- **AI** ([Release v7.51.2](https://github.com/Cratis/AI/releases/tag/v7.51.2)): Verification warns when the rule bytes a harness loads at session start grow past the current budget. (#675)
- **AI** ([Release v7.51.1](https://github.com/Cratis/AI/releases/tag/v7.51.1)): The Screenplay method and language skills, slice conformance and slice specifications, the event-model diagram, reactor and read-model specification skills, and the React page skill describe current behavior without release history, probe results, source citations or issue numbers; a minimum version appears only as a `Requires` line, naming the release that introduced the behavior, where older releases behave differently. (part of #662)
- **AI** ([Release v7.51.1](https://github.com/Cratis/AI/releases/tag/v7.51.1)): Legacy extraction lists what `cratis screenplay generate` recovers from a slice's screens: file, data bindings, title, tables and columns, actions and toolbar actions from Cratis Components, with qualified references for cross-slice actions, toolbar items and data bindings. (part of #662)
- **Screenplay** ([Release v4.161.0](https://github.com/Cratis/Screenplay/releases/tag/v4.161.0)): A query's `by` key and every supplied filter value are now checked against their concept's `validate` rules after authorization, as Arc does at runtime. An out-of-rule argument is a validation rejection with the rule's message instead of a lookup that finds nothing; a valid key that matches nothing still answers no result, and an omitted optional filter is not checked. This applies to every executable model version. (#682)
- **Screenplay** ([Release v4.161.0](https://github.com/Cratis/Screenplay/releases/tag/v4.161.0)): `PLAY0465` also reports a query rejection that is combined with `then no result`, a result, a denial or more than one query. (#682)
- **Arc** ([Release v22.95.0](https://github.com/Cratis/Arc/releases/tag/v22.95.0)): A command that supplies an explicit `BeforeFirst` scope for a generated target keeps working. A conflicting explicit scope for that target is rejected with `ConflictingConcurrencyScopes` before anything is appended. (#3129)
- **Arc** ([Release v22.95.0](https://github.com/Cratis/Arc/releases/tag/v22.95.0)): Arc requires Cratis Chronicle 19.59.4 or later. (#3129)
- **Chronicle** ([Release v19.64.0](https://github.com/Cratis/Chronicle/releases/tag/v19.64.0)): When several programs share an event store, each one replaces only its own declaration. Seeds added by hand, and other programs' declarations, are kept. Identical seeds declared by more than one program are applied once, in the order they were declared. Set `ProgramIdentifier` when several programs share a store (#4869)
- **Chronicle** ([Release v19.64.0](https://github.com/Cratis/Chronicle/releases/tag/v19.64.0)): Global seeds stored by earlier versions are cleared by the first authoritative registration after both the client and the kernel are upgraded. To clear stale development seeds without resetting the store, upgrade both, remove the seeder or scope it with `ForNamespace(...)`, then start the application once (#4869)
- **Chronicle** ([Release v19.64.0](https://github.com/Cratis/Chronicle/releases/tag/v19.64.0)): If a seeder cannot be activated, the client keeps the previously stored declaration instead of replacing it with an incomplete one, and logs which seeders failed (#4869)
- **cli** ([Release v3.62.0](https://github.com/Cratis/cli/releases/tag/v3.62.0)): `cratis render <PATH>` now renders with the model root's persisted identities when `.screenplay/identities.json` exists, so generated event and type ids match the ones Studio and the Screenplay MCP use. **Generated output changes for roots with persisted identities**: earlier releases ignored those identities and rendered temporary ones, which diverged from the rest of the toolchain. To see the change, render the same root with the previous CLI and with this one into two folders and diff them. Roots without persisted identities render exactly as before. Existing destinations still face the stored event type id check (`CLI-RENDER-016`). See [Render options](https://github.com/Cratis/cli/blob/main/Documentation/reference/screenplay.md). (#361)
- **cli** ([Release v3.62.0](https://github.com/Cratis/cli/releases/tag/v3.62.0)): For a root with persisted identities, `--name` must equal the saved application name; a different name is refused with `CLI-RENDER-018`. If the root cannot be opened (for example a pending operation or conflicting identities), render refuses with `CLI-RENDER-017` and the reason instead of falling back to temporary identities. (#361)
- **cli** ([Release v3.62.0](https://github.com/Cratis/cli/releases/tag/v3.62.0)): Release-baseline warnings for PATH input now come from the same opened workspace the render uses, so their model revision always matches the rendered model. (#361)
- **cli** ([Release v3.62.0](https://github.com/Cratis/cli/releases/tag/v3.62.0)): The CLI bundles Stage 4.99.0.
- **AI** ([Release v7.51.0](https://github.com/Cratis/AI/releases/tag/v7.51.0)): The README's skill-authoring guidance and the skill review prompt follow the new rule; skills no longer carry version pins. (part of #674)
- **Arc** ([Release v22.94.0](https://github.com/Cratis/Arc/releases/tag/v22.94.0)): A screen binding is written only when its import resolves to a slice that declares the command or query. Imports from outside any slice directory, or from a module path that cannot be resolved, are still reported with SP0028 and left out, also when the screen's own slice declares a command or query of the same name. (#3204)
- **Chronicle** ([Release v19.62.4](https://github.com/Cratis/Chronicle/releases/tag/v19.62.4)): The [seeding documentation](https://github.com/Cratis/Chronicle/blob/main/Documentation/event-seeding/seeding-with-csharp.mdx) now states the scope of global seeds:
- **Chronicle** ([Release v19.62.4](https://github.com/Cratis/Chronicle/releases/tag/v19.62.4)): A global seed reaches every namespace of the event store, including ones created later, once.
- **Chronicle** ([Release v19.62.4](https://github.com/Cratis/Chronicle/releases/tag/v19.62.4)): Opening a store for a new namespace creates it, and the kernel then applies the stored global seeds. This usually happens before the application's first write, but the order is not guaranteed.
- **Chronicle** ([Release v19.62.4](https://github.com/Cratis/Chronicle/releases/tag/v19.62.4)): Development or sample data belongs in `ForNamespace(...)`.
- **Chronicle** ([Release v19.62.4](https://github.com/Cratis/Chronicle/releases/tag/v19.62.4)): Removing a global seed from code does not remove the stored entry yet (part of #4869)
- **Chronicle** ([Release v19.62.3](https://github.com/Cratis/Chronicle/releases/tag/v19.62.3)): SQL storage records which physical database each event store, namespace and read-model set uses, in a new `DatabaseNames` table in the cluster database, and never moves a database once it is recorded. Existing deployments with short names keep their databases unchanged. An existing deployment whose PostgreSQL names were already truncated keeps the shared database where ownership is clear; where data could be stranded, the kernel stops with `DatabaseOwnershipUnresolved` and the [SQL database names](https://github.com/Cratis/Chronicle/blob/main/Documentation/hosting/configuration/storage.mdx#sql-database-names) documentation describes how to move the data and record the binding. A configured cluster database name longer than the provider limit now fails startup instead of being truncated. (#4849)
- **cli** ([Release v3.61.1](https://github.com/Cratis/cli/releases/tag/v3.61.1)): The CLI bundles Screenplay 4.159.0.
- **Stage** ([Release v4.99.0](https://github.com/Cratis/Stage/releases/tag/v4.99.0)): Stage builds on Screenplay and its canonical corpus 4.159.0. Models that use ESM v17 (explicit no-event assertions and recovery redelivery, Screenplay decision 0074) are still refused with `STAGE-ESM-016` until Stage renders them (see #371). (#388)
- **Chronicle** ([Release v19.62.0](https://github.com/Cratis/Chronicle/releases/tag/v19.62.0)): A unit of work that has had a contributor keeps every required scope until it completes, accepts events for only one event sequence, rejects changes made from inside a contributor with `UnitOfWorkMutatedDuringEnrollment`, and refuses to commit with `UnitOfWorkEnrollmentNotificationFailed` when a contributor's `Enrolled` notification fails. Units without contributors behave as before. Custom `IUnitOfWork` implementations keep compiling and throw `UnitOfWorkEnrollmentContributorsNotSupported` only when a contributor is attached. (#4861)
- **Screenplay** ([Release v4.160.0](https://github.com/Cratis/Screenplay/releases/tag/v4.160.0)): A mixed refusal is classified as authorization first, then constraint, then validation; concurrency conflicts, exceptions and unsupported outcomes are never refusals and keep failing the reaction, matching Arc reactors (#433)
- **Screenplay** ([Release v4.160.0](https://github.com/Cratis/Screenplay/releases/tag/v4.160.0)): `PLAY0268` no longer reports reaction refusal handling, and the editor no longer describes refusal branches as syntax-only (#433)
- **AI** ([Release v7.50.0](https://github.com/Cratis/AI/releases/tag/v7.50.0)): Read models that mix kinds of computation are split by default; keeping them together needs a written reason. (part of #672)
- **Chronicle** ([Release v19.60.0](https://github.com/Cratis/Chronicle/releases/tag/v19.60.0)): Registering an opted-in webhook fails, before anything is recorded, when it names an unregistered generation or two generations of the same event type, the same rule that applies to opted-in reactors, reducers and projections (part of #4710)
- **Chronicle** ([Release v19.60.0](https://github.com/Cratis/Chronicle/releases/tag/v19.60.0)): When a pinned event cannot be released in its pinned generation, the webhook sends no request and fails the batch without acknowledging it, so it is retried instead of being skipped (part of #4710)
- **cli** ([Release v3.61.0](https://github.com/Cratis/cli/releases/tag/v3.61.0)): The CLI bundles Stage 4.97.0.
- **Chronicle** ([Release v19.59.7](https://github.com/Cratis/Chronicle/releases/tag/v19.59.7)): On startup the SQL storage upgrades existing per-event-source constraint tables to a unique index. On SQL Server the value column is bounded to 200 characters first; the change is skipped, never truncating data, when a table holds longer values or values stored before constraint values were hashed, and a warning names the table and links to https://github.com/Cratis/Chronicle/issues/4866. A table that already contains duplicate values keeps every row, keeps a non-unique index and logs a warning once per process; remove the duplicates and restart to get the unique index. (part of #3744)
- **Stage** ([Release v4.98.1](https://github.com/Cratis/Stage/releases/tag/v4.98.1)): Stage and the rendered backend use Arc 22.88.0, Chronicle 19.59.4 (the Stage Host image bundles `cratis/chronicle:19.59.4-development`) and Screenplay 4.156.1.
- **Stage** ([Release v4.98.1](https://github.com/Cratis/Stage/releases/tag/v4.98.1)): The daily package update no longer bumps the .NET reference pack that Stage embeds to check pure reducer transitions. That pack stays on its pinned version.
- **Arc** ([Release v22.91.0](https://github.com/Cratis/Arc/releases/tag/v22.91.0)): In the default scenario mode, `QueryScenario` observes Chronicle read models over the scenario's own storage, so read models built with `[ChildrenFrom<T>]`, joins and reducers emit correctly instead of failing (#3154)
- **Arc** ([Release v22.91.0](https://github.com/Cratis/Arc/releases/tag/v22.91.0)): Arc requires Cratis Chronicle 19.59.1 or later, and references Cratis.Metrics.Roslyn 7.24.0 and FluentValidation 12.2.0 as Chronicle requires (#3154)
- **Stage** ([Release v4.98.0](https://github.com/Cratis/Stage/releases/tag/v4.98.0)): `STAGE-ESM-004` now refuses only state-change slices without commands. `STAGE-ESM-006` still refuses expression conditions and enumeration operands in production conditions. (#360)
- **AI** ([Release v7.48.4](https://github.com/Cratis/AI/releases/tag/v7.48.4)): Agents now choose how to build a Chronicle read model with one ladder that matches the Chronicle documentation: model-bound attributes first, fluent `IProjectionFor<T>` when the mapping needs structure, and a reducer when the logic reads better as code, as a normal choice rather than a last resort. (#660)
- **AI** ([Release v7.48.4](https://github.com/Cratis/AI/releases/tag/v7.48.4)): Agents write Chronicle self-reducing read models (static `Reduce` methods on the read model, Chronicle 19.58.0 and later) as the default reducer form in .NET, use `IReducerFor<T>` when the fold needs injected services or must live apart from the model, and nominate a plain class only when the contract assembly cannot reference Chronicle. The guidance covers marker-free discovery on upgrade, near-miss warnings, replay hooks, ownership conflicts, testing, and that decision reads do not admit reducers. (#660)
- **AI** ([Release v7.48.4](https://github.com/Cratis/AI/releases/tag/v7.48.4)): Arc guidance keeps the read model, its `Reduce` methods and its queries on one record, with `RequireQueryAttribute` and `[Query]` only for Arc versions before 22.90.0. (#660)
- **cli** ([Release v3.60.0](https://github.com/Cratis/cli/releases/tag/v3.60.0)): Every `cratis render`, at application scope and for selected scopes, including `--check`, now runs Stage's publication check against the destination before writing. A render that would change an existing Chronicle event type id, or cannot read one safely, is refused with `CLI-RENDER-016` and Stage's `STAGE-EVENT-002` diagnostic; nothing is written and `--force` does not bypass it. Pin the event's `id` to keep its stored name. (#354)
- **cli** ([Release v3.60.0](https://github.com/Cratis/cli/releases/tag/v3.60.0)): An existing destination file that cannot be read for that check is refused instead of failing with an unhandled error. (#354)
- **cli** ([Release v3.60.0](https://github.com/Cratis/cli/releases/tag/v3.60.0)): The CLI bundles Screenplay 4.154.0 and Stage 4.96.0, which brings Chronicle 19.55.2 and Arc 22.87.0 to rendered applications.
- **Arc** ([Release v22.90.0](https://github.com/Cratis/Arc/releases/tag/v22.90.0)): A static method on a `[ReadModel]` that takes the read model itself as a parameter, such as a self-reducing read model's `Reduce(event, current)`, is no longer exposed as a query endpoint or generated proxy. The rule applies the same way to runtime discovery, the TypeScript proxy generator, query metadata, Screenplay and the analyzers; marking such a method `[Query]` is reported as an error. `RequireQueryAttribute` keeps working as before. (#3239)
- **Arc** ([Release v22.90.0](https://github.com/Cratis/Arc/releases/tag/v22.90.0)): `ARCCHR0019` no longer warns that a self-parameter `Reduce` method would become a query endpoint. (#3239)
- **AI** ([Release v7.48.3](https://github.com/Cratis/AI/releases/tag/v7.48.3)): The `cratis-screenplay-toolchain` skill is rewritten as guidance for running and checking models: locating the model, the command behind each verdict and what a pass looks like, reading diagnostics, executable and renderable constructs, and traps. It no longer carries version tables, probe history or source citations; where a construct needs a minimum tool version, the reference that teaches it says so in one `Requires` line. (part of #662)
- **AI** ([Release v7.48.3](https://github.com/Cratis/AI/releases/tag/v7.48.3)): Skills that sent agents to the toolchain's version table now point to how to read the installed versions (`screenplay --version`, `cratis --version`) or to the capability reference that answers the question. (part of #662)
- **Screenplay** ([Release v4.158.0](https://github.com/Cratis/Screenplay/releases/tag/v4.158.0)): `propose-source` with `formatting: "PreserveExactSource"` now writes your source text exactly as supplied, including structural edits such as an added `import` or an appended `feature`. Comments, column alignment, blank lines and line endings are kept, a replaced document keeps its BOM policy, and the proposal goes through the same parse, identity, reference and compilation checks as canonical printing. `CanonicalizeTouchedDocuments` still reprints touched documents canonically, and `propose-ast` is unchanged. (#708)
- **Screenplay** ([Release v4.158.0](https://github.com/Cratis/Screenplay/releases/tag/v4.158.0)): A `propose-source` structural change refused under `PreserveTrivia` now names `PreserveExactSource` as the way to keep the supplied text. (#708)
- **Stage** ([Release v4.97.0](https://github.com/Cratis/Stage/releases/tag/v4.97.0)): Stage builds on Screenplay and its canonical corpus 4.154.0. (#375)
- **Screenplay** ([Release v4.157.0](https://github.com/Cratis/Screenplay/releases/tag/v4.157.0)): `PLAY0268` now names only reaction refusal branches and `$refusal` values, which remain syntax-only (part of #433)
- **Stage** ([Release v4.96.1](https://github.com/Cratis/Stage/releases/tag/v4.96.1)): Stage no longer pins `Microsoft.Orleans.Reminders` directly. It now resolves together with `Microsoft.Orleans.Server` through `Cratis.Orleans` and the Chronicle testing packages, so automated package updates can't move it to a different Orleans version than the server. (#217)
- **Stage** ([Release v4.96.0](https://github.com/Cratis/Stage/releases/tag/v4.96.0)): Stage builds on Screenplay and its canonical corpus 4.152.0, Chronicle 19.55.2 and Arc 22.87.0. Generated applications, the Docker images and the spec runner pin the same Chronicle and Arc versions. (#344)
- **Stage** ([Release v4.96.0](https://github.com/Cratis/Stage/releases/tag/v4.96.0)): A semantic `not empty` rule on text now rejects whitespace-only values, for both concept and command validation, following Screenplay decision 0071. (#344)
- **Stage** ([Release v4.96.0](https://github.com/Cratis/Stage/releases/tag/v4.96.0)): Non-text `secret` concepts (`Int`, `Decimal`, `Bool`, `Date`, `DateTime`, `Uuid`) now render and run instead of failing with `STAGE-ESM-041`. Chronicle 19.55.2 encrypts them at rest and returns them in their original type. (#344)
- **Stage** ([Release v4.96.0](https://github.com/Cratis/Stage/releases/tag/v4.96.0)): The rendering guides now explain how event ids are chosen, which publishers enforce `STAGE-EVENT-002`, and that renaming an event without a pin still loses access to its stored events. They now recommend the Screenplay rename tool, which adds the pin. (#372)
- **AI** ([Release v7.48.1](https://github.com/Cratis/AI/releases/tag/v7.48.1)): The Stage rendering and sandbox skill reads as guidance only: how to render, what is admitted and refused with the diagnostic you will see, how to recover, and how to verify a render. Release history, probe results, source citations and per-version listings are gone, and the one version requirement is a single `Requires` line (part of #662)
- **AI** ([Release v7.48.1](https://github.com/Cratis/AI/releases/tag/v7.48.1)): Scaffold and CLI bundle version pins moved from the skill to a maintainer compatibility page (part of #662)
- **Screenplay** ([Release v4.156.0](https://github.com/Cratis/Screenplay/releases/tag/v4.156.0)): Every MCP proposal result now carries a short human `summary`, also returned as a second text block after the JSON: which documents change, which modules, features, slices, commands, events, read models, screens and reactions are added or removed, what the authoring checks reported, how many comments are dropped and whether the result is executable. (#711)
- **Screenplay** ([Release v4.156.0](https://github.com/Cratis/Screenplay/releases/tag/v4.156.0)): Proposal results explain their `authoringDiagnosticCount`: the new `authoringDiagnosticSeverities` splits it into errors, warnings and information with the distinct codes, and a note says it counts checks run while proposing, including the `PLAY0288` canonical-printing notice, while `after.readiness` counts diagnostics of the resulting source alone. (#711)
- **AI** ([Release v7.48.0](https://github.com/Cratis/AI/releases/tag/v7.48.0)): The rules and skills no longer recommend a passive read model for command-side decisions without saying it guards nothing. Passive is current, not protected (#661)
- **AI** ([Release v7.48.0](https://github.com/Cratis/AI/releases/tag/v7.48.0)): Corrected guidance (#661):
- **AI** ([Release v7.48.0](https://github.com/Cratis/AI/releases/tag/v7.48.0)): which command property Arc uses as the event source
- **AI** ([Release v7.48.0](https://github.com/Cratis/AI/releases/tag/v7.48.0)): when ARCCHR0002 fires
- **AI** ([Release v7.48.0](https://github.com/Cratis/AI/releases/tag/v7.48.0)): that `[RemoveConstraint]` also releases a `[Unique]` event type
- **AI** ([Release v7.48.0](https://github.com/Cratis/AI/releases/tag/v7.48.0)): what a decision guard detects when another writer has no guard
- **AI** ([Release v7.48.0](https://github.com/Cratis/AI/releases/tag/v7.48.0)): what an empty protected commit validates
- **Screenplay** ([Release v4.155.0](https://github.com/Cratis/Screenplay/releases/tag/v4.155.0)): A capture whose `source events` consume events from more than one origin is now refused at design time with `PLAY0687`, matching the runtime rule that one capture reads one event store; split such a capture into one capture per origin (#706)
- **AI** ([Release v7.47.1](https://github.com/Cratis/AI/releases/tag/v7.47.1)): The shop example's `ApiKey` is identified by a separate `ApiKeyId`, because an event-source ID is plaintext metadata that cannot be encrypted; `ApiKey` stays a secret value property (part of #576)
- **AI** ([Release v7.47.1](https://github.com/Cratis/AI/releases/tag/v7.47.1)): The generated-values reference explains how Chronicle checks generated-value freshness: a batch's scopes once, all or nothing, before the batch, and again on a storage retry that renumbers the append (part of #576)
- **Chronicle** ([Release v19.59.2](https://github.com/Cratis/Chronicle/releases/tag/v19.59.2)): The concurrency documentation explains how a generated identifier is guaranteed to be new with a scope that expects no prior events, how batches and storage retries check that scope, what happens on a collision, and when to use a unique constraint or a deterministic identifier instead (#4713)
- **Stage** ([Release v4.94.0](https://github.com/Cratis/Stage/releases/tag/v4.94.0)): Time-ordered generated values (`uuidv7`, `ulid` and `typeid` concepts in ESM v15 models) now take their time from the command's receipt time instead of the wall clock, in rendered applications and in the Stage Host. A value and `$context.occurred` of the same command come from the same instant. Rendered concepts implement `IGeneratableInContext<T>`, so hand-written code that called `New()` on one of them now passes a `GenerationContext`. (#376)
- **Stage** ([Release v4.94.0](https://github.com/Cratis/Stage/releases/tag/v4.94.0)): Rendered command specifications with an unpinned time-ordered value fix Arc's scenario clock and check that the value's time part matches the receipt time. (#376)
- **Screenplay** ([Release v4.154.0](https://github.com/Cratis/Screenplay/releases/tag/v4.154.0)): `screenplay baseline admit --from-esm` records the stored name that shipped ESM v16 carries for renamed events, instead of refusing every shipped event name that differs from the current pinned name; a shipped stored name that differs from the current one still refuses with `ShippedStoredNameMismatch`. (#719)
- **Arc** ([Release v22.88.0](https://github.com/Cratis/Arc/releases/tag/v22.88.0)): Validation results that Arc composes itself after stream completion use the new reason `frameworkFailure` instead of `rule` (#3058)
- **AI** ([Release v7.47.0](https://github.com/Cratis/AI/releases/tag/v7.47.0)): Renaming a Screenplay event while keeping stored events readable: pin the old stored name with `id "<old name>"`, which ESM v16 now carries to renderers as the event's stored name. The skills cover the pin rules (PLAY0472), the end of the interim PLAY0686 caveat, and what Stage and the cratis CLI render today (#654)
- **AI** ([Release v7.47.0](https://github.com/Cratis/AI/releases/tag/v7.47.0)): The Screenplay release baseline: run `screenplay baseline admit` in the release job and `screenplay baseline check` in CI, read the baseline through the MCP, and which event edits a baselined revision accepts; this replaces the earlier `eventNeverPersisted` guidance (#655)
- **AI** ([Release v7.47.0](https://github.com/Cratis/AI/releases/tag/v7.47.0)): The standalone Screenplay tool pin and pinned language contract move to 4.153.0 (part of #655)
- **AI** ([Release v7.45.0](https://github.com/Cratis/AI/releases/tag/v7.45.0)): `cratis-guard-writes` allows writes to dependency manifests, lockfiles, `global.json` and NuGet configuration by default when the file belongs to a repository whose `origin` is `github.com/Cratis/*`. Set `allowDependencyManifestWrites` in that repository's `.cratis/ai.json` to `false` to keep the block, or to `true` to allow these writes in any other repository. Generated files and `.env` files stay blocked everywhere, and `CRATIS_HOOKS_ALLOW_PROTECTED_WRITES=1` still allows a single protected write (#520)
- **AI** ([Release v7.45.0](https://github.com/Cratis/AI/releases/tag/v7.45.0)): The dependency-manifest rule lets Cratis organization repositories bump versions as needed, without unrelated churn and with bumps called out in the pull request; other repositories still change them only when asked (#520)
- **Screenplay** ([Release v4.153.0](https://github.com/Cratis/Screenplay/releases/tag/v4.153.0)): `screenplay_propose_property` and `screenplay_propose_rename` report each event revision's `mutability`. Without a baseline nothing changes. Revisions outside the baseline are edited in place without choosing `newGeneration` or `eventNeverPersisted`, and their renames add no pin. Baselined revisions refuse in-place edits and `eventNeverPersisted` with `BaselinedRevisionImmutable` and accept only `newGeneration`. (#686)
- **Screenplay** ([Release v4.153.0](https://github.com/Cratis/Screenplay/releases/tag/v4.153.0)): Every proposal and every apply checks the candidate against the baseline: a change to a baselined revision's stored shape, including through a concept, composite type or enum it uses, refuses with `BaselinedRevisionChanged`, a removed one with `BaselinedRevisionMissing`, and a baseline that changed since the proposal with `StaleReleaseBaseline`. An unreadable baseline blocks only proposals that change event contracts. (#686)
- **cli** ([Release v3.59.0](https://github.com/Cratis/cli/releases/tag/v3.59.0)): The CLI bundles Stage 4.92.0, and `cratis run` starts the matching `cratis/stage:4.92.0` image.
- **cli** ([Release v3.59.0](https://github.com/Cratis/cli/releases/tag/v3.59.0)): Observable collection queries render as Arc observable queries that push every change to subscribers, and snapshot collection queries now render instead of being refused, with or without a `by` key and equality filters.
- **cli** ([Release v3.59.0](https://github.com/Cratis/cli/releases/tag/v3.59.0)): Screenplay `all` projection blocks whose mappings set event-source identities render as Chronicle `FromAll`; `all` blocks with literal mappings or no mappings are still refused with `STAGE-ESM-017`.
- **cli** ([Release v3.59.0](https://github.com/Cratis/cli/releases/tag/v3.59.0)): Event sources with PascalCase names render as `{Name}EventSource` classes with a public constant per stream, and every generated stream reference uses that constant; the stored stream names Chronicle sees are unchanged. A constant that collides with another member or a C# keyword is refused with `STAGE-ESM-012`.
- **Screenplay** ([Release v4.152.0](https://github.com/Cratis/Screenplay/releases/tag/v4.152.0)): Event `id` pins are validated: a pin must be an event-name identifier, every generation of an event must share one stored name, and two events in one application cannot share a stored name (PLAY0472). (#704)
- **Screenplay** ([Release v4.152.0](https://github.com/Cratis/Screenplay/releases/tag/v4.152.0)): Warning PLAY0686 is retired: event pins are carried to renderers instead of being reported as dropped, and `screenplay_propose_rename` no longer reports `eventPinWarnings` entries. (#704)
- **Screenplay** ([Release v4.152.0](https://github.com/Cratis/Screenplay/releases/tag/v4.152.0)): Generated-value freshness and fixture-shape checks in the reference evaluator now apply to models that declare concept generation, rather than to every model at ESM v15 or later, so a model that moves to a later version for an unrelated reason keeps its evaluation. (#704)
- **Chronicle** ([Release v19.58.0](https://github.com/Cratis/Chronicle/releases/tag/v19.58.0)): Upgrade effect: an existing class that does not implement `IReducer` and already has a `public static Reduce` method of exactly that shape becomes a self reducer after upgrading. A static `Reduce` that only nearly matches logs a warning and is skipped; types implementing `IReducer` or `IReducerFor<T>` keep their current behavior. With Arc, mark such a model `[ReadModel(RequireQueryAttribute = true)]` and its query methods `[Query]` so `Reduce` is not exposed as a query endpoint. (#4731)
- **Chronicle.Go** ([Release v0.10.0](https://github.com/Cratis/Chronicle.Go/releases/tag/v0.10.0)): Contracts are regenerated from Chronicle 19.56.0, and the verified decision-guard profile and the integration workflow image move from 19.32.3 to 19.56.0. The full integration suite passes against a 19.56.0 kernel.
- **AI** ([Release v7.44.0](https://github.com/Cratis/AI/releases/tag/v7.44.0)): Screenplay specifications can pin a child projection event that arrives before its parent: the reference evaluator holds the child until the parent exists, and a child whose parent never arrives stays out of the read model (#648)
- **AI** ([Release v7.44.0](https://github.com/Cratis/AI/releases/tag/v7.44.0)): A stream whose stored name is `All` is refused (PLAY0273), and an event `id` pin now warns (PLAY0686) because renderers do not carry it yet, so a renamed event renders under its new name (#650)
- **AI** ([Release v7.44.0](https://github.com/Cratis/AI/releases/tag/v7.44.0)): `not empty` on text rejects whitespace-only values in every ESM version, while collections still need one element and identity parts are unaffected; specifications that relied on whitespace being accepted now fail (#652)
- **AI** ([Release v7.44.0](https://github.com/Cratis/AI/releases/tag/v7.44.0)): The standalone Screenplay tool pin and pinned language contract move to 4.151.0 (part of #652)
- **Chronicle.TypeScript** ([Release v6.52.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.52.0)): Moved to `@cratis/chronicle.contracts` 19.56.1, filling the new `IsNotReplayable`, `IsInactive` and `GenerationDelivery` fields on registrations.
- **Chronicle.Kotlin** ([Release v6.14.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.14.0)): Moved to `chronicle-contracts` 19.56.0.
- **Chronicle** ([Release v19.57.0](https://github.com/Cratis/Chronicle/releases/tag/v19.57.0)): Captures over public events name the events they consume with `from <Event>` lines, the same syntax as Screenplay; the inbox to read is derived from the events' originating event store (#4700)
- **Chronicle** ([Release v19.57.0](https://github.com/Cratis/Chronicle/releases/tag/v19.57.0)): Chronicle uses Cratis.Screenplay 4.149.0 and takes Screenplay updates again with the other scheduled package updates (#4799)
- **Screenplay** ([Release v4.151.0](https://github.com/Cratis/Screenplay/releases/tag/v4.151.0)): `not empty` on text now rejects whitespace-only text as well as null and empty text, for concept rules and command property rules alike and in every executable model version, matching Arc: whitespace is the Unicode White_Space set (U+0085 and U+00A0 count, U+FEFF does not). Specifications that relied on whitespace-only text being accepted now expect a rejection. Collections keep "at least one element", and event-source and stream-id parts still treat whitespace as a value (#680)
- **Stage** ([Release v4.92.0](https://github.com/Cratis/Stage/releases/tag/v4.92.0)): An event source whose model name is a PascalCase identifier renders as `{Name}EventSource`. Each stream with such a name becomes a public constant on that class holding its stored name, and every stream reference uses that constant: `EventStream` attributes, command stream attributes, reducer and reactor `from` filters, and generated specification routes. Chronicle sees exactly the same stored names as before. Other names render as before. (#368)
- **Stage** ([Release v4.92.0](https://github.com/Cratis/Stage/releases/tag/v4.92.0)): A stream constant that would collide with another member or a C# keyword fails `STAGE-ESM-012`. (#368)
- **Stage** ([Release v4.92.0](https://github.com/Cratis/Stage/releases/tag/v4.92.0)): The renderer guide and rendering reference warn that renaming an event in a model that already has stored data renames its Chronicle event type, until Screenplay carries the stored event name. (#368)
- **Screenplay** ([Release v4.150.0](https://github.com/Cratis/Screenplay/releases/tag/v4.150.0)): A stream whose stored name is `All` (its name, or an `id "All"` pin) is refused with PLAY0273, as the stored source name `Default` already is. Models that use it must rename the stream; events already stored under `All` read as source-only appends. This narrows what earlier releases bound. `all` and other spellings remain valid. (#700)
- **Arc** ([Release v22.87.0](https://github.com/Cratis/Arc/releases/tag/v22.87.0)): Arc requires Cratis Chronicle 19.54.0 or later (part of #3154)
- **Arc** ([Release v22.87.0](https://github.com/Cratis/Arc/releases/tag/v22.87.0)): In the default scenario mode, observing a read model built with `[ChildrenFrom<T>]` is not supported yet and fails with Chronicle's error; use decision mode (`EnableDecisionReads`) for those read models until https://github.com/Cratis/Chronicle/issues/4816 ships (part of #3154)
- **AI** ([Release v7.43.0](https://github.com/Cratis/AI/releases/tag/v7.43.0)): The standalone Screenplay tool pin and pinned language contract move to 4.149.0 (part of #645)
- **AI** ([Release v7.42.0](https://github.com/Cratis/AI/releases/tag/v7.42.0)): `ship-changes` ends with a mandatory cleanup step, which is the trigger for harnesses without hooks.
- **AI** ([Release v7.42.0](https://github.com/Cratis/AI/releases/tag/v7.42.0)): The worktree rule points to the script instead of manual removal.
- **Chronicle** ([Release v19.55.1](https://github.com/Cratis/Chronicle/releases/tag/v19.55.1)): The kernel and clients build against Cratis Arc 22.86.0, Cratis Fundamentals 7.24.0, Orleans 10.4.0 and Cratis.Orleans 1.16.3, along with the other dependency updates from the reverted 2026-10-12 package update (part of #4799)
- **cli** ([Release v3.57.1](https://github.com/Cratis/cli/releases/tag/v3.57.1)): The `validate` help and the Screenplay reference list every `--check` name (including `personas`, `purposes`, `privilege` and `enum-pinning`) and the exit codes: 0 valid, 1 missing or invalid input or scope, 5 validation failed. (part of #339)
- **Chronicle** ([Release v19.55.0](https://github.com/Cratis/Chronicle/releases/tag/v19.55.0)): The kernel now accepts gRPC messages up to 100 MB by default, matching what every client allows itself to send. It was limited to 4 MB.
- **AI** ([Release v7.41.0](https://github.com/Cratis/AI/releases/tag/v7.41.0)): Rendering guidance follows CLI 3.57.0 / Stage 4.89.1: observable equality filters, reaction `runs as` for role and authenticated identities, semantic observer filters and single-hop reaction append specifications now render; the refusals that remain are listed exactly as Stage emits them (part of #643)
- **AI** ([Release v7.41.0](https://github.com/Cratis/AI/releases/tag/v7.41.0)): The rendered-application pin table lists the Stage 4.89.1 scaffold: Arc 22.83.0 and Chronicle 19.54.0 (part of #643)
- **AI** ([Release v7.41.0](https://github.com/Cratis/AI/releases/tag/v7.41.0)): The `cratis/stage` sandbox section describes Stage 4.89.1, including Host encryption of personal-data values (part of #643)
- **AI** ([Release v7.41.0](https://github.com/Cratis/AI/releases/tag/v7.41.0)): The standalone Screenplay tool pin and pinned language contract move to 4.148.0 (part of #643)
- **Screenplay** ([Release v4.149.0](https://github.com/Cratis/Screenplay/releases/tag/v4.149.0)): The `EventRoutes` canonical corpora use the stream `Archive` instead of `All`, so Cratis renderers can run them, and the observer-filter specifications assert through a projected read model that a reaction did not fire for unrouted facts or facts on another stream. (#699)
- **Chronicle.Kotlin** ([Release v6.13.1](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.13.1)): `ChronicleOptions.copy()` and its constructor take one more trailing parameter, `maxReceiveMessageSize`; the existing constructor overloads are unchanged.
- **Stage** ([Release v4.90.0](https://github.com/Cratis/Stage/releases/tag/v4.90.0)): The generated frontend asks observable queries for their first result (`waitForFirstResult=true`), so list screens load as before. Screens still refresh after commands; pushing live updates to the generated frontend and the Stage Host is tracked in https://github.com/Cratis/Stage/issues/366. (#278)
- **Stage** ([Release v4.90.0](https://github.com/Cratis/Stage/releases/tag/v4.90.0)): A protected observable list specification that expects rows is refused with `STAGE-ESM-011` until Arc's command scenario can observe read models (https://github.com/Cratis/Arc/issues/3221). Denial specifications still render. (#278)
- **cli** ([Release v3.57.0](https://github.com/Cratis/cli/releases/tag/v3.57.0)): The CLI bundles Stage 4.89.1 and Screenplay 4.147.1, and `cratis run` starts the matching `cratis/stage:4.89.1` image. (#345)
- **cli** ([Release v3.57.0](https://github.com/Cratis/cli/releases/tag/v3.57.0)): `cratis render` admits ESM v14 and v15: equality query filters render on observable collection queries, and concepts with a generation strategy (UUID v4/v7, ULID, TypeID, NanoID, random bytes) render with freshness scopes on generated event sources. Models newer than v15 are still refused with `CLI-RENDER-004`. (#345)
- **cli** ([Release v3.57.0](https://github.com/Cratis/cli/releases/tag/v3.57.0)): Reactions declaring `runs as` and reactions with a `from` observer filter now render through the bundled Stage instead of being refused with `STAGE-ESM-034`/`STAGE-ESM-035`; `STAGE-ESM-034` remains only for system-identity reactions that invoke commands whose authorization reads claims or uses opaque policies. (#345)
- **AI** ([Release v7.40.0](https://github.com/Cratis/AI/releases/tag/v7.40.0)): Rendering guidance follows CLI 3.56.0 / Stage 4.83.0: render admission covers ESM v1 to v13, so models with UUID-concept generated values, command responses, explicit enum numbers and concept compliance (v13) render through the CLI. ESM v14 collection filters and later versions are still refused (`CLI-RENDER-004`) (#623)
- **AI** ([Release v7.40.0](https://github.com/Cratis/AI/releases/tag/v7.40.0)): The refusals that remain are stated exactly as Stage 4.83.0 emits them, including event-triggered Automation limits, validated query keys and routed companion replay (#623)
- **AI** ([Release v7.40.0](https://github.com/Cratis/AI/releases/tag/v7.40.0)): The rendered-application pin table lists the Stage 4.83.0 scaffold: Arc 22.78.0, Chronicle 19.45.0 and Scene 4.22.1 (#623)
- **AI** ([Release v7.40.0](https://github.com/Cratis/AI/releases/tag/v7.40.0)): The `cratis/stage` sandbox section describes Stage 4.83.0: the semantic engine admits ESM v1 to v13 and runs event-triggered reactions (#623)
- **Stage** ([Release v4.89.1](https://github.com/Cratis/Stage/releases/tag/v4.89.1)): Stage, the Stage Host image (`cratis/chronicle:19.54.0-development`) and the rendered backend scaffold use Chronicle 19.54.0, which adds observable read-model queries. (part of #278)
- **Arc** ([Release v22.86.0](https://github.com/Cratis/Arc/releases/tag/v22.86.0)): Generation strategies need Screenplay ESM v15: models that use them select ESM v15, and a `MaximumExecutableModelVersion` below v15 keeps the previous output and reports the withheld strategy. In a v15 model, UUID pins must be version 4 UUIDs; other pins are left out with `SP0039` (part of #3116)
- **Arc** ([Release v22.86.0](https://github.com/Cratis/Arc/releases/tag/v22.86.0)): Factories the generator cannot read as one strategy call, generation that uses the generation context's time or tenant, and concepts with validation rules keep their legacy command and are reported with `SP0073` (part of #3116)
- **Arc** ([Release v22.86.0](https://github.com/Cratis/Arc/releases/tag/v22.86.0)): The Screenplay generator uses Cratis Screenplay 4.148.0 (part of #3116)
- **Stage** ([Release v4.89.0](https://github.com/Cratis/Stage/releases/tag/v4.89.0)): `STAGE-ESM-035` no longer applies to reactions in the semantic renderer. The legacy syntax engine still refuses observer filters with `STAGE-ESM-035`. (#297)
- **Stage** ([Release v4.88.0](https://github.com/Cratis/Stage/releases/tag/v4.88.0)): A command form element placed on a screen is now the runtime command form for its command in the position and with the id it was authored with: it takes the form the screen has for the command (or the form that follows the command's schema), keeps its authored properties such as its label, and that form is no longer appended a second time after the screen's other elements. Before, only a screen's own forms reached the runtime, at the end of the screen. (part of Cratis/Scene#7)
- **Stage** ([Release v4.87.0](https://github.com/Cratis/Stage/releases/tag/v4.87.0)): Stage pins Arc 22.83.0 and Screenplay 4.147.1 and admits ESM v1–v15. Models below v15 render and run as before. (#357)
- **Stage** ([Release v4.87.0](https://github.com/Cratis/Stage/releases/tag/v4.87.0)): At v15, a pinned generated fixture must match its strategy's shape. An implicit UUID pin must be a lowercase version-4 UUID, so a pin such as `11111111-1111-1111-1111-111111111111` fails `STAGE-ESM-011`. (#357)
- **Stage** ([Release v4.87.0](https://github.com/Cratis/Stage/releases/tag/v4.87.0)): Unknown generation strategies fail `STAGE-ESM-028`, and the legacy syntax engine refuses every explicit strategy with `STAGE-ESM-028`. Slices with several commands and conditional productions remain refused (`STAGE-ESM-004`, `STAGE-ESM-006`), tracked in https://github.com/Cratis/Stage/issues/360. (#357)
- **Chronicle** ([Release v19.54.0](https://github.com/Cratis/Chronicle/releases/tag/v19.54.0)): Custom `IReadModels` implementations keep compiling: `Observe<T>()` has a default implementation that throws `ReadModelCannotBeObserved`. Passive read models and read models that target an event sequence throw the same exception, because they have no stored collection to observe (#4759)
- **Stage** ([Release v4.86.0](https://github.com/Cratis/Stage/releases/tag/v4.86.0)): `STAGE-ESM-034` now refuses only `runs as` reactions that invoke commands whose authorization reads claims or uses opaque policies. Arc's system principal carries subject claims that Screenplay treats as unknown, so such a command could be allowed in the rendered application and denied by the model. (#292)
- **Stage** ([Release v4.86.0](https://github.com/Cratis/Stage/releases/tag/v4.86.0)): Reaction appends that fan out to several reactions, cascade further, use `$context`, expect read-model or query state, or produce events that constraints check still fail `STAGE-ESM-011`. (part of #207)
- **Arc** ([Release v22.85.0](https://github.com/Cratis/Arc/releases/tag/v22.85.0)): The Screenplay generator uses Cratis Screenplay 4.146.0 (#3196)
- **Screenplay** ([Release v4.148.0](https://github.com/Cratis/Screenplay/releases/tag/v4.148.0)): Feeding a returned value into another command's generated input still reports PLAY0485 (part of #300)
- **Screenplay** ([Release v4.148.0](https://github.com/Cratis/Screenplay/releases/tag/v4.148.0)): The Invoicing sample navigates to the registered invoice from a returned value, and the forms, interactions and commands documentation describe the continuation scope (part of #300)
- **Arc** ([Release v22.83.0](https://github.com/Cratis/Arc/releases/tag/v22.83.0)): Arc requires Cratis Fundamentals 7.24.0 or later (#3165)
- **Arc** ([Release v22.83.0](https://github.com/Cratis/Arc/releases/tag/v22.83.0)): `ARC0022` accepts concepts that implement `IGeneratableInContext<T>` (#3165)
- **Screenplay** ([Release v4.147.2](https://github.com/Cratis/Screenplay/releases/tag/v4.147.2)): `run-public-acceptance.sh` runs the Studio production vector with Studio's scratch proof (import the published corpus, edit and save a screen, export, Play) instead of the generic-selector harness, when `SCREENPLAY_STUDIO_CHECKOUT` points at a Studio checkout. The Studio URL defaults to the production principal-header proxy on `http://127.0.0.1:5156` when it answers, so the vector no longer reports `blocked-missing-studio-url` (part of #173).
- **Screenplay** ([Release v4.147.2](https://github.com/Cratis/Screenplay/releases/tag/v4.147.2)): The blocked state names what to set (the URL, the checkout and the production proxy) instead of a stale deploy note.
- **Stage** ([Release v4.85.0](https://github.com/Cratis/Stage/releases/tag/v4.85.0)): Secret concepts that aren't text (`Int`, `Decimal`, `Bool`, `Date`, `DateTime`, `Uuid`) are refused with `STAGE-ESM-041`, both when rendering and in the Host, because Chronicle can't yet store them (see https://github.com/Cratis/Chronicle/issues/4813). `pii secret` concepts use personal-data protection and are not affected. (part of #346)
- **Stage** ([Release v4.84.0](https://github.com/Cratis/Stage/releases/tag/v4.84.0)): Stage uses Screenplay 4.146.0 and admits ESM v1–v14. Models without filters render exactly as before. (#348)
- **Stage** ([Release v4.84.0](https://github.com/Cratis/Stage/releases/tag/v4.84.0)): Filters on snapshot collection queries or DateTime properties fail `STAGE-ESM-010`. Filter parameter names that collide with other generated names fail `STAGE-ESM-012`. The specification executor refuses filtered query assertions with `STAGE-ESM-010` instead of ignoring the filters. (#348)
- **cli** ([Release v3.56.0](https://github.com/Cratis/cli/releases/tag/v3.56.0)): The CLI bundles Stage 4.83.0 (from 4.80.0), so `cratis run` defaults to the `cratis/stage:4.83.0` image and `cratis render` plans with the Stage 4.83.0 renderer. The packed-CLI check now also runs Stage's responsive-shell assertions against the rendered application, which keeps the narrow-window menu working in what the CLI renders. (part of #284)
- **Screenplay** ([Release v4.147.0](https://github.com/Cratis/Screenplay/releases/tag/v4.147.0)): Generated values in specifications can be text, not only UUIDs (part of #616)
- **Screenplay** ([Release v4.147.0](https://github.com/Cratis/Screenplay/releases/tag/v4.147.0)): Decision 0054 records the delivery phases of #616 and the encoding details fixed at admission (part of #616)
- **Stage** ([Release v4.83.0](https://github.com/Cratis/Stage/releases/tag/v4.83.0)): The Scene packages are pinned at 4.22.1 (from 4.21.0) in the Stage frontend, the Host and the generated frontend package set.
- **Arc** ([Release v22.81.0](https://github.com/Cratis/Arc/releases/tag/v22.81.0)): Completing a stream from a command now closes it only for the command's event source, so another event source using the same stream type and stream id stays open. A command without a key property or `ICanProvideEventSourceId` still closes the stream for every event source. Completing a stream from a reactor closes it for the observed event's event source. Owner-qualified stream id templates such as `{Owner}:{Month}` are no longer needed to keep a close from reaching other event sources. Requires Chronicle 19.39 or later; an older Chronicle server fails the completion instead of closing the stream for every event source (#3126)
- **cli** ([Release v3.55.0](https://github.com/Cratis/cli/releases/tag/v3.55.0)): The CLI bundles Stage 4.80.0 (from 4.79.1), the release whose live Stage loads approved packages at runtime, so `cratis run` defaults to the `cratis/stage:4.80.0` image.
- **Stage** ([Release v4.82.0](https://github.com/Cratis/Stage/releases/tag/v4.82.0)): Rendered backends and Stage itself pin Arc 22.78.0, including the Cratis metapackage. (part of #175)
- **Stage** ([Release v4.82.0](https://github.com/Cratis/Stage/releases/tag/v4.82.0)): Generated TypeScript proxies for commands with a response are typed with it, for example `Command<IRegisterProject, Guid>` for a scalar UUID response or `Command<IRegisterReceipt, RegisterReceiptResponse>` for a named one, instead of exposing the event wrapper. (part of #175)
- **Stage** ([Release v4.82.0](https://github.com/Cratis/Stage/releases/tag/v4.82.0)): `STAGE-ESM-037` now explains why reactions that both produce events and invoke commands are still refused. A refused command would make Chronicle redeliver the trigger and append the reaction's events again. The refusal stays until reactor appends are idempotent across redelivery (https://github.com/Cratis/Chronicle/issues/4809, https://github.com/Cratis/Arc/issues/3207). (part of #342)
- **AI** ([Release v7.39.0](https://github.com/Cratis/AI/releases/tag/v7.39.0)): Commands that own their event use inline `produces event <Name>`, which defaults its destination to the command identifier; shared events keep a standalone `event` and use `produces <Name>` with an explicit `for`
- **AI** ([Release v7.39.0](https://github.com/Cratis/AI/releases/tag/v7.39.0)): Compliance markers are written as bare `pii` and `secret` throughout
- **AI** ([Release v7.39.0](https://github.com/Cratis/AI/releases/tag/v7.39.0)): The standalone Screenplay pin moves to 4.145.0 with its published contract
- **cli** ([Release v3.54.0](https://github.com/Cratis/cli/releases/tag/v3.54.0)): Bundles Stage 4.79.1 and Screenplay 4.145.1, and runs `cratis/stage:4.79.1` by default. Server-generated UUID values, scalar and named command responses, and event-triggered reactions now render instead of being refused.
- **cli** ([Release v3.54.0](https://github.com/Cratis/cli/releases/tag/v3.54.0)): `cratis ai install` and `cratis ai update` link `.github/instructions` to the corpus's generated Copilot adapters (`.cratis/ai/harnesses/copilot/instructions`), so Copilot applies the Cratis rules by path. An older corpus without those adapters keeps the link to `.cratis/ai/rules`, and `cratis ai update` relinks existing installs. (#341)
- **Stage** ([Release v4.81.0](https://github.com/Cratis/Stage/releases/tag/v4.81.0)): Event-triggered reactions no longer fail `STAGE-ESM-024` in the spec runner. Clock, application, startup and shutdown triggers and opaque reaction bodies still do, and a reaction mapping that reads the occurrence time without a `given clock` is rejected with the reference's message. (part of #207)
- **AI** ([Release v7.38.2](https://github.com/Cratis/AI/releases/tag/v7.38.2)): The screens smoke pins the current public vector: CLI 3.53.1 and `Cratis.Screenplay.CanonicalCorpus` 4.145.0, so the MCP edit and render replay on the vector that carries history, guarded actions, toolbar and module navigation (part of Cratis/AI#536).
- **AI** ([Release v7.38.2](https://github.com/Cratis/AI/releases/tag/v7.38.2)): The screens authoring workflow and UI-composition skills say the browser run passes on CLI 3.53.1 and that it now runs in corpus CI.
- **Scene** ([Release v4.22.0](https://github.com/Cratis/Scene/releases/tag/v4.22.0)): `chart` describes `data` (labels, datasets), `options` and `style`; `treeTable` describes `columns`, `items` (nodes down four levels, a node's `data` a map) and `selection`; `dataScroller` `items` and `multiStateCheckbox` `options`, `icons` and `value` are described. Structured values stay bindable to a data context, a query result or a component property.
- **AI** ([Release v7.38.1](https://github.com/Cratis/AI/releases/tag/v7.38.1)): The Stage rendering skill states that Stage 4.79.1 renders keyed lookups and filtered observable collections whose scalar key concept has validation rules, converting the key inside the query so an out-of-rule key finds no instance; earlier Stage releases, including the one bundled with cratis CLI 3.53.1, still refuse a validated snapshot-lookup key (#635)
- **AI** ([Release v7.38.0](https://github.com/Cratis/AI/releases/tag/v7.38.0)): The standalone Screenplay pin moves to 4.144.0 with its published contract
- **Arc** ([Release v22.79.0](https://github.com/Cratis/Arc/releases/tag/v22.79.0)): For commands routed through an event source definition, appending a returned `EventForEventSourceId` whose legacy routing names a registered definition and a stream it does not declare now fails with `EventStreamDoesNotBelongToEventSource`, as typed routing already did, instead of appending to an undeclared stream. (part of #2987)
- **Arc** ([Release v22.79.0](https://github.com/Cratis/Arc/releases/tag/v22.79.0)): The public constructors of `SingleEventForEventSourceIdCommandResponseValueHandler`, `EventsForEventSourceIdCommandResponseValueHandler` and `EventsWithConcurrencyScopesCommandResponseValueHandler` that do not take `IEventSources` are obsolete; they skip routing validation. Dependency injection uses the new constructors. (part of #2987)
- **Stage** ([Release v4.79.0](https://github.com/Cratis/Stage/releases/tag/v4.79.0)): `STAGE-ESM-024` for event-triggered reactions now applies only to the specification executor, which still does not run reactions. Clock, application, startup and shutdown triggers and opaque reaction bodies still fail `STAGE-ESM-024` in both the Host and the specification executor. (part of #207)
- **Stage** ([Release v4.79.0](https://github.com/Cratis/Stage/releases/tag/v4.79.0)): The reaction rendering reference explains how the Host, rendered Chronicle reactors and the specification executor each handle event reactions: https://github.com/Cratis/Stage/blob/main/Documentation/reference/reaction-rendering.md (part of #207)
- **Chronicle** ([Release v19.53.0](https://github.com/Cratis/Chronicle/releases/tag/v19.53.0)): Analyzer `CHR0039` now reports a discarded awaitable `Should*` assertion from a Cratis testing surface as an **error** instead of a warning. Such an assertion throws on a `Task` nobody observes, so the spec passes whatever the code does. This can turn a test project's build red where it contains such vacuous specs: await each flagged assertion and make the containing member `async Task`. While migrating, you can temporarily downgrade the rule in your repository's `.editorconfig` with `dotnet_diagnostic.CHR0039.severity = warning`; see https://github.com/Cratis/Chronicle/blob/main/Documentation/code-analysis/CHR0039.mdx. (#4177)
- **Screenplay** ([Release v4.144.0](https://github.com/Cratis/Screenplay/releases/tag/v4.144.0)): `open-workspace` and `workspace-state` report the notes revision and whether the notes file is readable. A malformed or conflicted notes file never blocks opening a model; note tools refuse to write until it is fixed (#391)
- **Screenplay** ([Release v4.144.0](https://github.com/Cratis/Screenplay/releases/tag/v4.144.0)): Recovery journals that include notes are written as version 2, which older servers refuse instead of rolling back without the notes file (#391)
- **Chronicle** ([Release v19.52.0](https://github.com/Cratis/Chronicle/releases/tag/v19.52.0)): Conflicting explicit registrations, such as two different identifiers or generations for the same type, or two types sharing an identifier and generation, now fail at startup with `ConflictingArtifactDeclaration` or `ConflictingArtifactKind` instead of registering silently. (#4732)
- **Chronicle** ([Release v19.52.0](https://github.com/Cratis/Chronicle/releases/tag/v19.52.0)): A store registers nothing with the kernel until all of its artifacts have been prepared successfully. A preparation failure is reported through the registration outcome and is not retried as a connection failure. (#4732)
- **AI** ([Release v7.37.0](https://github.com/Cratis/AI/releases/tag/v7.37.0)): The Templates guidance reflects Templates 1.7.4 (toaster placement and port defaults), and the Stage guidance explains semantic execution in Stage 4.78.0, which cratis CLI 3.53.1 does not expose yet (#460)
- **Screenplay** ([Release v4.143.1](https://github.com/Cratis/Screenplay/releases/tag/v4.143.1)): Browser history: selecting a work item and clearing the selection are history entries. Back restores the selection and its comments, forward clears it, and a refresh on the selected address restores the selection from the address alone.
- **Screenplay** ([Release v4.143.1](https://github.com/Cratis/Screenplay/releases/tag/v4.143.1)): Guarded actions on a freshly seeded work item (so no other assertion depends on its state): double click on an open row navigates, Close is offered and enabled only while the item is open and posts `CloseWorkItem` for it, the projection shows it closed, Close is hidden afterwards, and double click on the closed row notifies and stays on the list.
- **Screenplay** ([Release v4.143.1](https://github.com/Cratis/Screenplay/releases/tag/v4.143.1)): Against the installed CLI 3.53.1 and `cratis/stage:4.73.1` with the repository corpus the harness passes with no blockers; the 17 new assertions are `browser.history.*` and `browser.guarded.*`. (part of #173)
- **AI** ([Release v7.36.0](https://github.com/Cratis/AI/releases/tag/v7.36.0)): Concept compliance (`pii`/`personal`, `secret`) is taught as binding in ESM v13 with the standalone compiler, with the remaining PLAY0268 refusals for enum and identity concepts and explicit `subject` marks, report-only reasons (PLAY0270), and the boundaries that cratis CLI 3.53.1 still refuses markers and Stage admits up to v12 (#621)
- **AI** ([Release v7.36.0](https://github.com/Cratis/AI/releases/tag/v7.36.0)): The standalone Screenplay pin moves to 4.142.0 with its published contract
- **Stage** ([Release v4.78.0](https://github.com/Cratis/Stage/releases/tag/v4.78.0)): Clock, application, startup and shutdown triggers and opaque reaction bodies still fail `STAGE-ESM-024`, now naming the trigger kind; reactions that both produce and invoke, including different triggers on the same event, fail `STAGE-ESM-037`. (part of #207)
- **Stage** ([Release v4.78.0](https://github.com/Cratis/Stage/releases/tag/v4.78.0)): A command specification whose events would trigger a reaction fails `STAGE-ESM-011`, because the generated command specification does not settle reactions. (part of #207)
- **Screenplay** ([Release v4.143.0](https://github.com/Cratis/Screenplay/releases/tag/v4.143.0)): PLAY0268 now names the specific reason a query is not executable (a context-sourced filter, a filter on a single-result query, a filter without a matching scalar property, `scoped to` or `performer`) instead of one combined message (part of #140)
- **Screenplay** ([Release v4.143.0](https://github.com/Cratis/Screenplay/releases/tag/v4.143.0)): PLAY0468 reports unknown, repeated or missing required query arguments in both specification forms, and repeated query arguments are no longer silently dropped while parsing (part of #140)
- **Screenplay** ([Release v4.143.0](https://github.com/Cratis/Screenplay/releases/tag/v4.143.0)): The query and specification documentation states that collection results compare without regard to row order (part of #140)
- **Stage** ([Release v4.77.0](https://github.com/Cratis/Stage/releases/tag/v4.77.0)): The compliance rendering reference explains the mapping, the identity rule and its surrogate-identifier fix, and why concepts should be marked before their events are first published. Models without compliance render exactly as before.
- **Stage** ([Release v4.77.0](https://github.com/Cratis/Stage/releases/tag/v4.77.0)): Play and the Stage Host do not encrypt or redact values of personal-data concepts: the Host's own event store keeps them in plain text (see https://github.com/Cratis/Stage/issues/346).
- **AI** ([Release v7.35.0](https://github.com/Cratis/AI/releases/tag/v7.35.0)): Synced with Arc 22.76.0, Chronicle 19.51.0, Fundamentals 7.23.0, Specifications 4.1.1, Orleans 1.16.3, Components 4.26.4, Chronicle.TypeScript 6.51.0, Arc.TypeScript 0.57.2, Chronicle.Kotlin 6.13.0, Arc.Kotlin 7.7.0, Chronicle.Elixir 3.10.2, cratis CLI 3.53.1 and Chronicle.Mcp 2.0.0; each skill's verified sources name the release read (#620)
- **AI** ([Release v7.35.0](https://github.com/Cratis/AI/releases/tag/v7.35.0)): The standalone Screenplay pin moves to 4.141.0 with its published contract; Stage 4.74.0 to 4.76.0 capabilities are taught as standalone Stage, since cratis CLI 3.53.1 still bundles Stage 4.73.1
- **AI** ([Release v7.35.0](https://github.com/Cratis/AI/releases/tag/v7.35.0)): The Chronicle MCP skill states the exact effect of each Chronicle.Mcp 2.0.0 tool, its read-only default and the mutation profile, and warns that it targets the active `cratis` context
- **AI** ([Release v7.35.0](https://github.com/Cratis/AI/releases/tag/v7.35.0)): The CLI operations guard treats `observers remove` and `observers clear-partition-quarantine` as mutating commands
- **AI** ([Release v7.35.0](https://github.com/Cratis/AI/releases/tag/v7.35.0)): Concurrency guidance teaches decision reads (`IStreamReads`, `[ProtectedDecision]` with `DecisionRead<T>`, `IDecisionReads`) instead of advisory read-model injection
- **AI** ([Release v7.35.0](https://github.com/Cratis/AI/releases/tag/v7.35.0)): Scene packages are named `@cratis/scene.*` in the Stage scaffold tables

## Fixed

- **cli** ([Release v3.89.0](https://github.com/Cratis/cli/releases/tag/v3.89.0)): `cratis update` shows the release notes after the CLI, template and Stage results, and builds include the notes of 3.87.0 and 3.88.0, which those releases did not keep. (part of #153)
- **Arc** ([Release v22.129.1](https://github.com/Cratis/Arc/releases/tag/v22.129.1)): Stopping a host whose read-protection measurement queue was already disposed, or stopping it twice, no longer fails shutdown with `ObjectDisposedException: The CancellationTokenSource has been disposed.` (#3442)
- **Chronicle** ([Release v19.90.1](https://github.com/Cratis/Chronicle/releases/tag/v19.90.1)): Changing only the `details` text of a `[ComplianceDetails]`/`[PII]` or `[Encrypted]` marking on an existing event type no longer counts as an event schema change, so the kernel no longer refuses the registration with `EventTypeSchemaChanged`. A change of the compliance metadata type or the encryption scope, or an added or removed marking, still counts as a schema change. (#4660)
- **Arc** ([Release v22.129.0](https://github.com/Cratis/Arc/releases/tag/v22.129.0)): Without a command transaction, events a command returns for one event source on several routes (streams, or a definition route next to a legacy route) are now appended as one batch that carries a guard for each route. A concurrency violation on any route now appends none of them, instead of leaving some appended. This needs a Chronicle kernel 19.84 or later; Arc now requires Cratis.Chronicle 19.90.0. (#3423)
- **Ante** ([Release v1.3.2](https://github.com/Cratis/Ante/releases/tag/v1.3.2)): Signed-in users keep their identity after the update to Arc 22.128: Ante opts in to trusting the identity headers AuthProxy forwards, which Arc no longer trusts by default. Ante must only be reachable through AuthProxy. (part of #174)
- **Ante** ([Release v1.3.2](https://github.com/Cratis/Ante/releases/tag/v1.3.2)): Requests other than GET and HEAD to a path the lobby does not serve, such as a CORS preflight, are refused again instead of receiving the application shell with a 200. (part of #174)
- **Ante** ([Release v1.3.2](https://github.com/Cratis/Ante/releases/tag/v1.3.2)): Projects that reference Ante, such as the integration specifications and the browser end-to-end host, build again in Debug: embedded Screenplay documents are turned off for every project, since Ante has no Screenplay model. (part of #174)
- **Arc** ([Release v22.128.2](https://github.com/Cratis/Arc/releases/tag/v22.128.2)): Embedding Screenplay documents with `Cratis.Arc.Screenplay.Embedded` no longer fails with a circular target dependency (MSB4006) in projects that reference Roslyn (directly or through `Microsoft.CodeAnalysis.Analyzers`) and contain a `.resx` file. Such projects can turn embedding back on if they disabled it with `CratisEmbeddedScreenplayEnabled=false`. (#2979) (#3440)
- **Orleans** ([Release v1.26.0](https://github.com/Cratis/Orleans/releases/tag/v1.26.0)): A job stopped or removed while its silo went down is finished after recovery: steps that never reported are told to stop again, `OnStopped` runs once they have, and a job being removed is removed. See [Rehydration](https://github.com/Cratis/Orleans/blob/main/Documentation/concepts/jobs.md#rehydration). (#118)
- **Orleans** ([Release v1.26.0](https://github.com/Cratis/Orleans/releases/tag/v1.26.0)): A step's stop is counted once per execution, so a late or repeated stop report no longer makes the job's progress count it twice.
- **Scene** ([Release v4.72.0](https://github.com/Cratis/Scene/releases/tag/v4.72.0)): Lists and details of imported Screenplay screens showed only their column headings and labels in the Studio preview although the application's sample data pack held rows for the read model. (Cratis/StudioIssues#895)
- **Specifications** ([Release v4.1.2](https://github.com/Cratis/Specifications/releases/tag/v4.1.2)): CRSPEC0004 and the fact naming rule now recognize test attributes derived from xUnit and NUnit test attributes, such as a conditional `[DockerFact]` built on `[Fact]`, instead of reporting such specs as never running. (#52)
- **Screenplay** ([Release v4.227.1](https://github.com/Cratis/Screenplay/releases/tag/v4.227.1)): Proposing changes through the MCP server no longer slows down sharply as a model grows: fixture references in specifications are resolved against declarations computed once per workspace snapshot instead of rescanning every declaration for each reference. On a 56-file model `propose-source` drops from about 30 seconds of CPU to about 3, and a 260-file model that never finished now completes. (#938)
- **Stage** ([Release v4.177.2](https://github.com/Cratis/Stage/releases/tag/v4.177.2)): A projection with several `from` blocks, a key that is a payload property of events sourced by something else (a movement id on an event sourced by the SKU), or a constant mapping (`increased = true`) renders instead of being refused as STAGE-ESM-008 or STAGE-ESM-009. Screenplay keeps these as flat transitions; the renderer now reads them as the scope that says the same, so the scoped admission and renderer decide (part of #558)
- **release-action** ([Release v1.4.3](https://github.com/Cratis/release-action/releases/tag/v1.4.3)): When GitHub refuses to create the release with 403 because the release commit's `.github/workflows` differ from the default branch (another pull request changed workflows while this release was pending), the action now fails with an error that names that cause and the recovery: run the publish workflow with `workflow_dispatch` from the current default branch with the pull request's release notes instead of re-running. Other 403s keep their original error. (#215)
- **Components** ([Release v4.33.0](https://github.com/Cratis/Components/releases/tag/v4.33.0)): `Dialog` and `CommandDialog` keep keyboard focus inside the dialog while busy: the confirm button stays focusable as `aria-disabled` and ignores activation, so it can no longer drop focus to the page or be submitted twice. After a refused confirm, such as a validation failure, focus returns to the confirm button (or to the title when confirm is disabled), the outcome is announced through a polite status region, and a held Enter or Space no longer submits again. (#424)
- **Stage** ([Release v4.177.1](https://github.com/Cratis/Stage/releases/tag/v4.177.1)): A command whose productions address different event sources (`for orderId` and `for productId`, ESM v30) renders instead of being refused as STAGE-ESM-006: each event is appended to the event source its own destination names, and the generated command specification asserts each event on its own source (part of #503)
- **Stage** ([Release v4.177.0](https://github.com/Cratis/Stage/releases/tag/v4.177.0)): A zero start of a running total (`add delivered by 0`, `subtract x by 0` on a required whole number or decimal) now renders instead of being refused as STAGE-ESM-017; the renderer emits nothing for it because Chronicle's Add builder takes an event property only and a required number is 0 until its first real operation. A concept total does not start at 0 (a never-set concept is null) and is refused (part of #558)
- **Arc** ([Release v22.128.1](https://github.com/Cratis/Arc/releases/tag/v22.128.1)): The generated Screenplay no longer states a scenario fixture value that a concept's implicit conversion changes at runtime. A scalar constant, collection element or expected event value converted to a concept is stated only when the conversion operator and the constructor it calls are proven to pass the value through unchanged, including operators declared in another project of the application and the Cratis framework's own concept conversions; otherwise the whole scenario is left out with `SP0039`. Date comparisons keep their existing, stricter proof. See [Generating a Screenplay](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/generating-a-screenplay.md). (#3385)
- **Arc** ([Release v22.128.0](https://github.com/Cratis/Arc/releases/tag/v22.128.0)): Protected command reads reject empty, whitespace-only, wildcard (`*`), hash-containing and whitespace-padded keys, including invalid composite key parts, before accessing the store. These failures use the same validation outcome as a missing read model rather than an unhandled server error. Composite key parts are checked through the AOT-safe protected-key accessors, so with `ProtectedReadModelKeyOptions.Strict` (or under native AOT) a composite key type without registered accessors fails with `ProtectedReadModelKeyAccessorMissing` instead of being read. (#3347)
- **Arc** ([Release v22.127.0](https://github.com/Cratis/Arc/releases/tag/v22.127.0)): An enumerable observable query over WebSocket now ends when the client disconnects while no item is ready, instead of keeping the connection handler waiting. (part of #2915)
- **Chronicle** ([Release v19.89.0](https://github.com/Cratis/Chronicle/releases/tag/v19.89.0)): .NET client calls that take a `CancellationToken` no longer block the calling thread while the client reconnects, and they honor the token while they wait for the connection. Previously such a call made while disconnected blocked synchronously for up to the connection timeout and ignored cancellation. (#4758)
- **Stage** ([Release v4.169.1](https://github.com/Cratis/Stage/releases/tag/v4.169.1)): The live semantic Host refuses protected command reads with empty, whitespace-only, padded, `*` or `#`-containing keys before looking up projected state, matching the specification executor and the Screenplay reference evaluator, even when an instance exists at that key. (#543)
- **Chronicle** ([Release v19.88.5](https://github.com/Cratis/Chronicle/releases/tag/v19.88.5)): A unit of work that enforces read protection no longer reports a conflict on historical events when its declared routing only matched events older than the read. Against a kernel without support for several guards per event source, the merged guard took the routing's filtered tail instead of the read boundary, so the commit was refused and its events were not stored. (#5070)
- **Arc** ([Release v22.125.4](https://github.com/Cratis/Arc/releases/tag/v22.125.4)): An observable query over MongoDB no longer stays on "Loading…" when the database is unreachable or the change stream fails. The MongoDB watch now ends the observable with an error, logged at Error level, instead of completing silently. Cancellation and normal unsubscribe still complete quietly. (#2916)
- **Arc** ([Release v22.125.4](https://github.com/Cratis/Arc/releases/tag/v22.125.4)): The SSE and WebSocket hub connections in `@cratis/arc` deliver a query error from the server as a failed query result (`hasExceptions` with the error message), so `useObservableQuery` shows the failure instead of only writing it to the console. (#2916)
- **Stage** ([Release v4.167.1](https://github.com/Cratis/Stage/releases/tag/v4.167.1)): Rendered applications no longer contain protected-read commands that are refused at run time (Acme Commerce Sales: `ApproveOrder`, `CheckOut`, `AddToBasket` and others failed 30 generated specifications).
- **Chronicle** ([Release v19.88.4](https://github.com/Cratis/Chronicle/releases/tag/v19.88.4)): An observer no longer keeps partitions marked in flight forever, or undercounts its handled events, when events are handled while it changes state, for example during a large catch-up. Handled counts reset by a replay that starts during the change stay reset. (part of #4972)
- **Arc** ([Release v22.125.3](https://github.com/Cratis/Arc/releases/tag/v22.125.3)): Observable MongoDB queries keep updating after a Chronicle projection replay. When a collection is renamed into place, or the change stream reports `invalidate`, the shared watcher now sends fresh results to the observers of the affected collections. (#3407)
- **Arc** ([Release v22.125.3](https://github.com/Cratis/Arc/releases/tag/v22.125.3)): When MongoDB rejects an expired or invalid resume token, the shared watcher reopens the change stream without the token and resynchronizes every observer. Previously the stream kept retrying with the bad token and observers silently stopped updating. (#3407)
- **Arc** ([Release v22.125.3](https://github.com/Cratis/Arc/releases/tag/v22.125.3)): A failed snapshot for an observable MongoDB query is logged and retried a bounded number of times, and the subscription stays open instead of ending with an error. (#3407)
- **Stage** ([Release v4.167.0](https://github.com/Cratis/Stage/releases/tag/v4.167.0)): Acme Commerce Sales `AnApprovedOrderCannotBeApprovedAgain` (a rejection by the decision read of `ApproveOrder`, whose event triggers `ConfirmApprovedOrder`) was the last refusal of the Catalog + Storefront + Sales slice.
- **Arc** ([Release v22.125.2](https://github.com/Cratis/Arc/releases/tag/v22.125.2)): Data annotation attributes such as `[Range]`, `[Required]`, `[StringLength]` and custom `ValidationAttribute`s on ordinary parameters of model-bound queries are now evaluated, the same way they are on command properties. Previously only concept-typed parameters were validated, so for example `Top([Range(1, 100)] int count)` accepted any value. An omitted parameter with a declared default still uses its default. (#3378)
- **Components** ([Release v4.30.0](https://github.com/Cratis/Components/releases/tag/v4.30.0)): `DataTableForQuery`, `DataTableForObservableQuery` and `DataPage` show the failure message, not the empty message, when a query completes without success, for example on an HTTP 400 problem-details response. The query-bound chat sidebar likewise shows its failed state. An unauthorized result still shows access denied. (#406)
- **Chronicle** ([Release v19.88.3](https://github.com/Cratis/Chronicle/releases/tag/v19.88.3)): Projections no longer fail a partition with "Collection was modified; enumeration operation may not execute." when many events are handled in parallel. Values taken from a projection's initial state or from an event's content are now copied before they become part of one read model's state, so another partition can no longer change them while the MongoDB sink saves. (part of #4965)
- **Arc** ([Release v22.125.1](https://github.com/Cratis/Arc/releases/tag/v22.125.1)): Commands executed inside `ISystemExecution.As(principal)` without an HTTP request, including from Chronicle reactors, now record that authenticated principal as the event's `causedBy` instead of System. Events appended during an HTTP request and identities explicitly selected on Chronicle are recorded as before. (#3152)
- **Stage** ([Release v4.166.1](https://github.com/Cratis/Stage/releases/tag/v4.166.1)): Specifications whose `given` events have no event source now run in Stage like they do in the Screenplay reference evaluator, instead of being refused for identity allocation. The events land at an empty event source; projections that need a typed event source are still refused. (part of #511)
- **Chronicle** ([Release v19.88.1](https://github.com/Cratis/Chronicle/releases/tag/v19.88.1)): SQL observer state now preserves failed-partition quarantine and retry-budget resets when saved and reloaded. (#5039)
- **Stage** ([Release v4.166.0](https://github.com/Cratis/Stage/releases/tag/v4.166.0)): Acme Commerce Sales (`OrderStateProjection`, `ConfirmOrder`) can be planned for rendering without stripping: its projection and decision read of the order lines and shipping address were refused.
- **Chronicle** ([Release v19.88.0](https://github.com/Cratis/Chronicle/releases/tag/v19.88.0)): Registering a reactor, reducer or self-reducing read model whose only handlers take `[EventTypeGenerationFor]` types now fails with `ObserverHasOnlyGenerationHandlers`, naming the artifact and the generation types. Such an observer previously registered without any event types and never became active. (#4922)
- **Chronicle** ([Release v19.88.0](https://github.com/Cratis/Chronicle/releases/tag/v19.88.0)): A projection declaration that uses an `$eventContext` member or path that does not exist on the event context is now rejected when it is compiled. It was previously accepted and failed only when the projection was built. (#4702)
- **Stage** ([Release v4.164.0](https://github.com/Cratis/Stage/releases/tag/v4.164.0)): The semantic Host's JSON binder keeps omitted composite members omitted instead of turning them into `null`, and keeps the supplied member order, so nested concept validation fails only on an explicit `null` and reports failures in the order the members were sent. (#441)
- **AI** ([Release v7.84.2](https://github.com/Cratis/AI/releases/tag/v7.84.2)): The local release-note check (`cratis-check-pr`) and the pull-request body guard recognize repositories that call the combined `verify-pull-request-policy` workflow, and take the release-note rules from that workflow at the caller's pinned ref. Repositories switched to the combined caller had silently stopped getting the local check. (#797)
- **Stage** ([Release v4.163.0](https://github.com/Cratis/Stage/releases/tag/v4.163.0)): A screen that fills a blueprint template slot now replaces that slot's seeded placeholder content instead of appearing next to it, so rendered applications no longer show the template's sample header, search box and empty states beside the authored content. Slots the screen does not fill keep their seeded content. (#506)
- **Screenplay** ([Release v4.221.0](https://github.com/Cratis/Screenplay/releases/tag/v4.221.0)): `SMELL005` no longer counts every known event as a feeder of a read-model property set in a projection `all` block. It counts only the events that actually feed it. (part of #393)
- **Chronicle** ([Release v19.87.0](https://github.com/Cratis/Chronicle/releases/tag/v19.87.0)): The .NET client now connects to the kernel Aspire references with `WithReference(chronicle)`. With no Chronicle connection string configured, it reads `ConnectionStrings:chronicle` (the value Aspire injects) instead of falling back to `localhost:35000`, so a referenced project no longer needs the kernel on host port 35000. A connection string set in `Cratis:Chronicle` or in code still takes precedence. (#4917)
- **Screenplay** ([Release v4.220.2](https://github.com/Cratis/Screenplay/releases/tag/v4.220.2)): Renaming a composite stream-id part whose name equals its type, or an event source or stream whose name also appears in a trailing comment, now succeeds under `PreserveTrivia` and keeps the rest of the line byte-for-byte, instead of refusing with "No unique supported identifier". (#572)
- **Chronicle** ([Release v19.86.0](https://github.com/Cratis/Chronicle/releases/tag/v19.86.0)): A reactor or reducer result now completes only the delivery it answers. The kernel matched results by partition alone, so a late result for a timed-out delivery could complete the wait of that partition's retry, and completing one delivery could drop the next one for the same partition and leave it blocked until the client reconnected. A duplicate result no longer breaks the result stream. (part of #4664)
- **AI** ([Release v7.84.1](https://github.com/Cratis/AI/releases/tag/v7.84.1)): Publishing works again: the check that the GitHub release exists now runs after release-action has created the release, instead of before it, so a release-labelled merge publishes Cratis.AI, @cratis/ai, the Pi package and the images under its own GitHub release. (#785)
- **Stage** ([Release v4.160.0](https://github.com/Cratis/Stage/releases/tag/v4.160.0)): Acme Commerce commands `ApproveProductForSale`, `WithdrawProduct` (reads plus a unique constraint), `AddToBasket` and `CheckOut` (read-backed requirement plus validated concepts) were refused by the renderer although the executor ran them.
- **Chronicle** ([Release v19.85.1](https://github.com/Cratis/Chronicle/releases/tag/v19.85.1)): SQLite: a development reset no longer races with database migrations. Before, the reset could leave a database that failed every later request with `DatabaseMigrationIncomplete` ("table already exists"). Migrations and resets of the same database file are now serialized, and the reset drops its tables in one transaction. (#5007)
- **Chronicle** ([Release v19.85.1](https://github.com/Cratis/Chronicle/releases/tag/v19.85.1)): SQLite: concurrent first-time migrations of the same database through different connection strings no longer fail with `DatabaseMigrationIncomplete`. (#4894)
- **Scene** ([Release v4.70.2](https://github.com/Cratis/Scene/releases/tag/v4.70.2)): The Cratis Components command form's `Generate fields` action, its command property editor and its layout editor submitted `SetProperty` edits addressed by the bare element id, and the action's generated fields carried no item id. A host applies edits to the document by node id (`element:<id>`, `elementNodeId`) and the editing engine refuses a collection item without an id (`'Fields': every item needs an id`), so the editor refused the batch and nothing changed. The edits now address the element by its node id and each generated field has an id, so Generate fields applies and is one undo step in the host's history (part of Cratis/StudioIssues#863)
- **Stage** ([Release v4.158.1](https://github.com/Cratis/Stage/releases/tag/v4.158.1)): Specifications in a rendered application's separate Specs project now compile and run in Release as well as Debug. They are no longer excluded by `#if DEBUG`, while the web application continues to exclude the specification files. (part of #498)
- **Stage** ([Release v4.158.1](https://github.com/Cratis/Stage/releases/tag/v4.158.1)): Rendered specifications declare repeated and complex fixture values once as named fields and use separate facts for expected properties, instead of repeating literals in long predicates. (part of #498)
- **Stage** ([Release v4.158.1](https://github.com/Cratis/Stage/releases/tag/v4.158.1)): Rendered authorization-denial specifications assert that the command is denied and appends no events, rather than merely checking policy registration. (part of #498)
- **Chronicle** ([Release v19.83.4](https://github.com/Cratis/Chronicle/releases/tag/v19.83.4)): The in-memory sink used by the testing scenarios no longer merges distinct composite read-model keys whose parts contain `_`. Each distinct composite key keeps its own instance. (#5057)
- **Scene** ([Release v4.70.1](https://github.com/Cratis/Scene/releases/tag/v4.70.1)): A screen that fills a blueprint template slot now replaces that slot's seeded placeholder content instead of adding to it, so rendered applications no longer show the template's sample header, search box and empty states next to the authored content. Slots the screen does not fill keep their seeded content. See Cratis/Stage#506.
- **Orleans** ([Release v1.25.0](https://github.com/Cratis/Orleans/releases/tag/v1.25.0)): A job whose silo died while it was preparing or starting its steps is recovered: it keeps the same step IDs, prepares only the steps that were not prepared yet, never runs `PrepareSteps` or the start hook twice, and never counts a step's outcome twice. A saved but unstarted job is no longer removed as dead during rehydration, and a job left in a starting state after a restart is no longer reported as already running (#40)
- **Components** ([Release v4.29.1](https://github.com/Cratis/Components/releases/tag/v4.29.1)): `DataTableForQuery` and `DataTableForObservableQuery` show loading when their query arguments change, instead of the previous arguments' rows or unauthorized, failed or loaded status, and show cached results again without a loading flash when returning to earlier arguments. Requires `@cratis/arc` and `@cratis/arc.react` 22.122 or later. (#354)
- **Chronicle** ([Release v19.83.3](https://github.com/Cratis/Chronicle/releases/tag/v19.83.3)): A projection definition change now takes effect on every silo. A silo could keep using the previous definition until it restarted, so events of a newly added event type were skipped during live handling, catch-up and even a full replay, while the observer still advanced past them. (#4935)
- **Chronicle** ([Release v19.83.3](https://github.com/Cratis/Chronicle/releases/tag/v19.83.3)): A silo no longer reads an outdated projection definition after another silo changed or deleted it. Definitions are now always read from shared storage rather than a per-silo cache. (#5021)
- **Chronicle** ([Release v19.83.3](https://github.com/Cratis/Chronicle/releases/tag/v19.83.3)): Replaying or catching up a projection that is not registered now fails instead of reporting success without handling any events. An event the current projection definition does not include is logged at information level rather than debug. (#4935)
- **Orleans** ([Release v1.24.3](https://github.com/Cratis/Orleans/releases/tag/v1.24.3)): Removing or stopping a job no longer hangs when a step's notification fails, for example because the step's grain is still routed to a silo that died. The job retries the notification with backoff (1 s doubling to 60 s) until the step reports, and a repeated `Remove` sends it again to every step that has not reported (#101)
- **Chronicle** ([Release v19.83.2](https://github.com/Cratis/Chronicle/releases/tag/v19.83.2)): Projection futures (child events stored until their parent exists) now resolve when the parent is matched on a composite or object key. Key comparison threw `InvalidCastException: Object must implement IConvertible` for such keys, so the future never resolved, the child event stayed missing from the read model, and the same warning was logged on every pass. A future that keeps failing now logs one warning and then logs at debug level. (#5045)
- **Arc** ([Release v22.122.1](https://github.com/Cratis/Arc/releases/tag/v22.122.1)): In decision mode, `CommandScenario` rebuilds read models from the scenario's appended events with their original `EventContext`. Projections and reducers see each event's real sequence number and occurred time, so specs that compare revisions no longer report false conflicts. (#3351)
- **Arc** ([Release v22.122.1](https://github.com/Cratis/Arc/releases/tag/v22.122.1)): Each decision-mode `CommandScenario` uses its own generated event store name and namespace, so scenarios no longer share one event store identity. (#2991)
- **Screenplay** ([Release v4.216.1](https://github.com/Cratis/Screenplay/releases/tag/v4.216.1)): The TypeScript compiler, Monaco and VS Code now report `PLAY0345`, `PLAY0346` and `PLAY0348` for guarded interaction alternatives (`on click`, `double click` and `select` with `when` branches), including named behaviors attached with `uses`, with the same messages, locations and order as the C# compiler. (#625)
- **Chronicle** ([Release v19.83.1](https://github.com/Cratis/Chronicle/releases/tag/v19.83.1)): An all-event mapping (`[FromEvery]`, `[FromAll]`, a declarative `FromEvery`, or `@fromAllEvents` in TypeScript) no longer clears its read model property when an event without the mapped payload property arrives. The property keeps its last value, as documented, for root mappings, child mappings and projections that subscribe to all events. A source property that is present with a null value still maps null. (#5026)
- **Stage** ([Release v4.154.1](https://github.com/Cratis/Stage/releases/tag/v4.154.1)): Semantic specification runs reject protected command reads with empty, whitespace-only, padded, `*` or `#`-containing keys before looking up projected state, even when an instance exists at that key. Live Host behavior is unchanged. (part of #492)
- **Screenplay** ([Release v4.214.3](https://github.com/Cratis/Screenplay/releases/tag/v4.214.3)): A capture specification that presents a numeric key to an event with a text event source still fails, but the failure now names the capture, the key, its value, the event and the correction, for example `write "1201"`, instead of only reporting `Expected Accepted, got Rejected`. The capture documentation states that the key must match the event source type. (#788)
- **Screenplay** ([Release v4.214.2](https://github.com/Cratis/Screenplay/releases/tag/v4.214.2)): Compilation now reports `PLAY0802` when an event stream's stored name is `All` or an event source's stored name is `Default`, including through an `id` pin, because Chronicle reserves those names. Before, the model compiled and only executable binding or rendering refused it. A pin to another stored name, such as `stream All` with `id "Archive"`, remains valid, and the editors show the error as you type. (#893)
- **Screenplay** ([Release v4.214.1](https://github.com/Cratis/Screenplay/releases/tag/v4.214.1)): `screenplay test` and the MCP run-specifications tool no longer report every specification as unsupported when one projection cannot be executed by the reference evaluator, for example one that maps `$eventContext.occurred`. Only specifications whose events reach that projection, or that supply, read, query or assert its read model, report unsupported; the others run. Plan issues are still listed. (#863)
- **Arc** ([Release v22.122.0](https://github.com/Cratis/Arc/releases/tag/v22.122.0)): The Chronicle sample's Approvals specifications state their approval identity and the whole `ApprovalRequested` event, so both scenarios round-trip into the generated Screenplay instead of being left out with SP0039. (#3383)
- **Stage** ([Release v4.152.0](https://github.com/Cratis/Stage/releases/tag/v4.152.0)): Commands sent from a rendered application lost the API base path, the microservice and the identity headers that Arc adds, so they could reach the wrong route or arrive unauthenticated. (part of #499)
- **Arc** ([Release v22.121.2](https://github.com/Cratis/Arc/releases/tag/v22.121.2)): Data annotations on concept-typed (`ConceptAs<T>`) command properties and model-bound query parameters are now evaluated against the concept's value: `[Required]` rejects a concept wrapping an empty string, `[Range]` accepts valid values, and `[StringLength]` no longer throws. The validation metadata is source-generated, so it stays trim- and AOT-safe. Types without generated metadata, such as types from other assemblies, keep the previous behavior. (#2944)
- **Orleans** ([Release v1.24.2](https://github.com/Cratis/Orleans/releases/tag/v1.24.2)): Automatic job recovery now retries a jobs manager key provider that fails to construct during startup, instead of skipping its scopes until another recovery pass. Construction failures use the existing recovery backoff and stop when the silo shuts down. (#108)
- **Orleans** ([Release v1.24.1](https://github.com/Cratis/Orleans/releases/tag/v1.24.1)): Jobs with some steps that fail to start now enter the running state and keep their watchdog active until the remaining steps finish. They no longer remain stuck starting when a completion report is lost. `FailedStartingSomeJobSteps` still reports the partial failure; the other steps continue running. (#104)
- **Arc** ([Release v22.121.1](https://github.com/Cratis/Arc/releases/tag/v22.121.1)): Controller-based observable queries whose arguments fail validation over a direct WebSocket or SSE connection now accept the connection, send one query result with the validation results and close, instead of answering HTTP 400 before the upgrade, which browsers report only as a failed connection. Plain HTTP requests keep their existing response. (#3230)
- **Screenplay** ([Release v4.213.4](https://github.com/Cratis/Screenplay/releases/tag/v4.213.4)): Events produced only by a reaction's refusal branch (`on refused ...`) now count as producers: the destination type of an event source without an identifier is inferred from them, and a specification's expected route or `for` type is no longer refused as contradicting the command under test when a refusal branch also produces the event. (#744)
- **Orleans** ([Release v1.24.0](https://github.com/Cratis/Orleans/releases/tag/v1.24.0)): Removing a job no longer reports success when the removal cannot be saved. Before, a storage error left the job running in storage, and a silo restart could resume a job you had deleted. Remove now refuses with the new `RemoveJobError.CouldNotPersistRemoval`, and `IJobs.Delete` returns it as a refusal you can retry. (#105)
- **Screenplay** ([Release v4.213.3](https://github.com/Cratis/Screenplay/releases/tag/v4.213.3)): Compilation now reports `PLAY0168` at the second declaration when one document declares the same policy name twice. Before, the duplicate compiled cleanly and surfaced only at executable binding as an unlocated `PLAY0273`. (#787)
- **Screenplay** ([Release v4.213.3](https://github.com/Cratis/Screenplay/releases/tag/v4.213.3)): The TypeScript compiler, and so the editors, now report `PLAY0173` when one policy name is declared in two files, as the C# compiler already did. (#787)
- **Orleans** ([Release v1.23.5](https://github.com/Cratis/Orleans/releases/tag/v1.23.5)): A finished job no longer stays running in storage when clearing or writing its final state fails during a storage outage. The job now writes its final status before clearing its state, and keeps retrying that write (from 1 second up to 60 seconds) until it succeeds. If the clear fails, the job is still recorded as finished and retention cleanup removes the leftover record. A finished job is not completed a second time after a restart. (#100)
- **Arc** ([Release v22.120.1](https://github.com/Cratis/Arc/releases/tag/v22.120.1)): PostgreSQL migrations that add a JSON column with `AddJsonColumn` now run. The CHECK constraint and the GIN index are emitted as separate, terminated statements instead of one invalid statement (`42601`), the index name is quoted, and the index works whatever store type the column uses by indexing `column::jsonb`. Constraint and index names longer than PostgreSQL's 63-byte limit are shortened deterministically with a stable hash suffix. (#3369)
- **Screenplay** ([Release v4.213.2](https://github.com/Cratis/Screenplay/releases/tag/v4.213.2)): `ComparedModel.FromSources` accepts documents in subfolders, such as `Features/Register.play`, so split models can be compared from in-memory sources. Each document keeps its relative path. (#628)
- **Screenplay** ([Release v4.213.1](https://github.com/Cratis/Screenplay/releases/tag/v4.213.1)): Executable binding (`screenplay test`, `cratis screenplay validate --executable`) now reports every independent semantic contract failure (`PLAY0273`) in one run, each at the declaration that failed, instead of only the first failure at line 1 of an unrelated file. (#860)
- **Screenplay** ([Release v4.213.1](https://github.com/Cratis/Screenplay/releases/tag/v4.213.1)): A condition that compares an optional property, such as `require level.status == "active"` on an optional read-model property, is now refused with `PLAY0268` at the comparison instead of a `PLAY0273` without a location. (#860)
- **Orleans** ([Release v1.23.4](https://github.com/Cratis/Orleans/releases/tag/v1.23.4)): Resuming a job no longer stops at the first step whose start fails with an error, for example because its silo is unavailable or the call times out after a pod crash. The remaining steps still start, and the job's watchdog starts the failed step again on its next check, without step leases or another recovery pass. (#102)
- **Chronicle** ([Release v19.82.2](https://github.com/Cratis/Chronicle/releases/tag/v19.82.2)): Unique constraints and closing constraints stay consistent with the event log when updating their index fails after an append, or when the kernel stops in between. Each event sequence persists how far its constraint indexes are confirmed in MongoDB, SQL and in-memory storage. Before validating an append, it repairs any gap from the log, and it catches older indexes up in the background without blocking live appends. (#4895)
- **Chronicle** ([Release v19.82.2](https://github.com/Cratis/Chronicle/releases/tag/v19.82.2)): Constraint index repairs write only the claims that actually differ, report a budget expiry or a failing constraint in their results, and recover from transient storage failures instead of leaving the index partly updated. (#4895)
- **Orleans** ([Release v1.23.3](https://github.com/Cratis/Orleans/releases/tag/v1.23.3)): Job recovery now retries a jobs manager key provider or a manager rehydrate that failed, for example a key catalog that times out while a rolling deployment starts. It retries only the failed providers and managers, after 1 second, doubling the delay up to 60 seconds, until they succeed or the silo stops. Jobs left running by a silo that went away are no longer stuck until another silo dies. (#99)
- **AI** ([Release v7.75.0](https://github.com/Cratis/AI/releases/tag/v7.75.0)): `failFast: false` in a gate configuration is honored. Previously it was read as `true`. (#753)
- **Screenplay** ([Release v4.212.4](https://github.com/Cratis/Screenplay/releases/tag/v4.212.4)): `automap` and `no automap` written on a joined event now decide auto-mapping for that event in the executable model and the reference evaluator, as they do in Chronicle; a joined event without one follows its level's auto-map. Warning `PLAY0380` no longer reports them and now covers only `all` inside `children` or `nested`. (#613)
- **Arc** ([Release v22.117.1](https://github.com/Cratis/Arc/releases/tag/v22.117.1)): MongoDB observations no longer drop updates, replacements and deletions of documents with a composite `_id`: the change-stream id is now read with the id member's own serializer, so it compares with the observed documents for any id type. (#3236)
- **Arc** ([Release v22.117.1](https://github.com/Cratis/Arc/releases/tag/v22.117.1)): Observing a collection inside a single-result query no longer leaks the collection's paging and total count into the query result. `ObserveSingle` and `ObserveById` never apply query paging or counting, and observable query results report paging only for collection results. The `ignoreQueryContext` parameter on `ObserveSingle` and `ObserveById` is kept and has no effect. (#3023)
- **Chronicle** ([Release v19.82.1](https://github.com/Cratis/Chronicle/releases/tag/v19.82.1)): SQL storage now returns the revised content, generation and hash when it reads an event that was revised at a generation lower than the highest generation stored for it, matching MongoDB and in-memory storage. Before, reactors, reducers, webhooks, event-store subscriptions, passive projections, event reads, export and constraint reindexing could see the pre-revision content. Events revised before Chronicle recorded which generation was revised keep returning their highest generation. (#4751)
- **Chronicle** ([Release v19.82.1](https://github.com/Cratis/Chronicle/releases/tag/v19.82.1)): Redacting an event in SQL storage no longer leaves it marked as revised. (#4751)
- **Screenplay** ([Release v4.212.3](https://github.com/Cratis/Screenplay/releases/tag/v4.212.3)): Compilation now reports `PLAY0801` when a projection uses one event more than once at the same level. Before, the error only appeared at executable binding, as the generic `PLAY0273`. A level is the root, one `children` or `nested` block, or one variant. Within a level, `from`, `remove with`, `remove via join` and `clear with` share one set of events, and `join` events have their own. Chronicle allows one use of an event type per projection level. (#675)
- **Screenplay** ([Release v4.212.3](https://github.com/Cratis/Screenplay/releases/tag/v4.212.3)): The task-tracking counter example in the projections documentation no longer uses the same event in two `from` blocks. (#675)
- **AuthProxy** ([Release v2.31.2](https://github.com/Cratis/AuthProxy/releases/tag/v2.31.2)): An identity too large for a cookie (over 3072 encoded characters) is no longer written to `.cratis-identity`: browsers drop such a cookie and a reverse proxy answers 502 "upstream sent too big header" for the whole response. Any stale identity cookie is expired and a warning is logged instead.
- **Chronicle** ([Release v19.81.1](https://github.com/Cratis/Chronicle/releases/tag/v19.81.1)): Projections and captures are subscribed in every namespace, including one created at runtime. Ensuring a namespace returns once its healthy projections and captures are subscribed, and a namespace created implicitly by its first append is subscribed within one watchdog interval, without depending on the namespace-added notification. (#4696) (#4455)
- **Chronicle** ([Release v19.81.1](https://github.com/Cratis/Chronicle/releases/tag/v19.81.1)): A projection that lost its subscription in a namespace, for example after a retirement or replay in the same registration, is subscribed again instead of staying dark until the next change. (#4423)
- **Chronicle** ([Release v19.81.1](https://github.com/Cratis/Chronicle/releases/tag/v19.81.1)): Captures follow the same reliable namespace reconciliation, so a pattern or events capture is subscribed in namespaces an application starts using after registration. (#4521)
- **Chronicle** ([Release v19.81.1](https://github.com/Cratis/Chronicle/releases/tag/v19.81.1)): Automatic reconciliation never lifts an observer's quarantine, never revives a retired observer, and never subscribes a capture that is being stopped or deleted; a failed setup is retried, and one broken projection or capture no longer blocks the others or namespace creation. A Kernel restart and a newly added namespace still end projection quarantine as documented.
- **Scene** ([Release v4.69.3](https://github.com/Cratis/Scene/releases/tag/v4.69.3)): The gallery chrome drew a fixed Contoso logo and name, so a host that gives the preview its own `chrome` could not show the profile's identity. `galleryCompositionFor(identity)` draws the resolved identity - its name, initials, icon or image and whether the name shows - in the topbar, the sidebar and the footer, and `galleryComposition` is unchanged for a host that has no identity
- **Screenplay** ([Release v4.212.2](https://github.com/Cratis/Screenplay/releases/tag/v4.212.2)): `find-specification-obligations` now counts the documented read-only denial form, `then query <Query>` with `arguments` and no result followed by `then denied`, as the authorization denial specification for that query (`SPEC004`), the same as `when query <Query>` with `then denied`. Such a specification no longer counts as asserting the read model (`SPEC006`). (#786)
- **Scene** ([Release v4.69.2](https://github.com/Cratis/Scene/releases/tag/v4.69.2)): `PreviewRegionHandle`, `PreviewRegionRect` and the region helpers were left out of the default blueprint's exports, so a host that passes `regions` to `ScenePreviewHost` could not type the ref. They are exported from `@cratis/scene.blueprint.default` now
- **Orleans** ([Release v1.23.2](https://github.com/Cratis/Orleans/releases/tag/v1.23.2)): A job step that is stopped without a partial result no longer reports an empty string as its partial result: `HasPartialResult` is false and `TryGetPartialResult` returns false for it. (#93)
- **cli** ([Release v3.77.1](https://github.com/Cratis/cli/releases/tag/v3.77.1)): `cratis ai install` and `cratis ai update` link `.pi/agents` to the corpus's Pi-native agent adapters (`.cratis/ai/harnesses/pi/agents`) when the corpus ships them, so Pi agent loaders other than Cratis' own, such as `@tintinweb/pi-subagents`, give Cratis agents their read, search, edit and shell tools. An unchanged Cratis-owned link is moved on update; corpora without the adapters keep the canonical `.cratis/ai/agents` link. (#391)
- **Scene** ([Release v4.69.1](https://github.com/Cratis/Scene/releases/tag/v4.69.1)): Adding the identity, corners, font, sample data pack description, template shell card text and problem severity to positional records removed the constructors an earlier package was compiled against, so `UiProfile`, `ProfileAppearance`, `SampleDataPackReference`, `TemplateMetadata`, `SampleDataCatalogEntry` and `ProfileBlocker` threw `MissingMethodException` for callers built before. Each keeps the constructor it had, the new one is marked for the JSON serializer, and a specification names every shape that must stay
- **Arc** ([Release v22.116.2](https://github.com/Cratis/Arc/releases/tag/v22.116.2)): Aggregate roots resolve event types from the registered event types instead of the `[EventType]` attribute, so events registered explicitly without the attribute can be applied, rehydrated and appended. Applying an event that is not registered still fails. (#3234)
- **Arc** ([Release v22.116.2](https://github.com/Cratis/Arc/releases/tag/v22.116.2)): A command started from an execution context captured during an earlier, finished command is no longer refused because the finished command's identity still looked active. (#2888)
- **Chronicle** ([Release v19.80.0](https://github.com/Cratis/Chronicle/releases/tag/v19.80.0)): Catch-up that produces no work no longer loops between Routing, CatchUp and CaughtUp without backoff. (#4592)
- **Screenplay** ([Release v4.212.1](https://github.com/Cratis/Screenplay/releases/tag/v4.212.1)): `--check query-keys` (PLAY0535) no longer warns when a collection query's `by` parameter names a declared read-model field of a compatible type, or when a `by` parameter is marked `optional`. A single-result query's `by` must still match the read model's identity, and the identity is now inferred only from single-result queries, as executable binding does. (#676)
- **Arc** ([Release v22.116.1](https://github.com/Cratis/Arc/releases/tag/v22.116.1)): `useObservableQuery` subscribes again with the new page, page size or sort order when they change, instead of staying on the first page. Hooks observing different pages of the same query no longer share one subscription. (#2869)
- **Arc** ([Release v22.116.1](https://github.com/Cratis/Arc/releases/tag/v22.116.1)): `useQuery`, `useQueryWithPaging` and `useObservableQuery` no longer show the previous arguments' data or status while results for new arguments, pages or sort order load: they show the cached result for the new arguments, or the initial not-ready state while the request is in flight. (#2872)
- **Orleans** ([Release v1.23.1](https://github.com/Cratis/Orleans/releases/tag/v1.23.1)): Stopping or removing a job after a silo restart, before its steps have started again, now finishes: each step reports its stop to the job, so the job counts it, finishes its stop and, for removal, clears its state. Previously the step reported to no one and the job never completed its stop or removal. (#92)
- **Orleans** ([Release v1.23.1](https://github.com/Cratis/Orleans/releases/tag/v1.23.1)): A step that cannot find its job when it is stopped no longer pretends the stop was reported: a direct stop returns `JobStepError.FailedToReportToJob`, the reason is logged, and the step keeps its state. Removing a step whose job no longer exists deletes it. See [Jobs](https://github.com/Cratis/Orleans/blob/main/Documentation/concepts/jobs.md). (part of #92)
- **Screenplay** ([Release v4.212.0](https://github.com/Cratis/Screenplay/releases/tag/v4.212.0)): Model-note targets that name a Module, Feature or Slice by dotted address resolve on split models, where the container is repeated across files as an import placement or an explicit header, instead of failing with "Unknown or ambiguous note address." (#784)
- **Screenplay** ([Release v4.212.0](https://github.com/Cratis/Screenplay/releases/tag/v4.212.0)): When a note's requested anchor has no identity yet, for example a Slice on a model that does not bind, the proposal reports in `substitutions` the owner the note actually lands on, also for reanchor, instead of silently attaching it to the application. (#795)
- **Orleans** ([Release v1.23.0](https://github.com/Cratis/Orleans/releases/tag/v1.23.0)): `Job.Stop` no longer reports a stop that was not persisted. It restores the job's state and answers the new `StopJobError.CouldNotPersistStop`.
- **AI** ([Release v7.73.1](https://github.com/Cratis/AI/releases/tag/v7.73.1)): Corpus agents such as Screenplay Modeler keep their file and shell tools in Pi when the external `Agent` tool from `@tintinweb/pi-subagents` launches them. `.pi/agents` now points at generated Pi-native copies of the corpus agents with Pi tool names, and the Pi package ships them for that loader. Generating them fails when an agent names a tool that has no Pi equivalent. (#519)
- **Arc** ([Release v22.115.0](https://github.com/Cratis/Arc/releases/tag/v22.115.0)): Rejections from data annotations, and `ValidationResult`s returned from a command's `Provide()` or `Handle()` with `[nameof(Property)]` members, now show under the matching form field instead of disappearing. (#2945)
- **Stage** ([Release v4.141.1](https://github.com/Cratis/Stage/releases/tag/v4.141.1)): Specification runs now resolve `$context.occurred` in event-triggered reactions from the scenario's authored `given clock`, the same way Screenplay's reference execution does. The value reaches direct and cascading productions, invocation arguments, the invoked command and refusal-branch productions. Specifications that combine an authored clock with reactions are no longer refused, and a reaction that maps `occurred` without a clock is rejected as in the reference execution. (#505)
- **Chronicle** ([Release v19.79.0](https://github.com/Cratis/Chronicle/releases/tag/v19.79.0)): During a rolling deploy, an older client that registers its projections after a newer one no longer overwrites the newer definitions. The kernel compares versions by semantic-versioning precedence, prerelease identifiers included. It ignores a definition older than the one it has stored and logs a warning. It also raises a Workbench recommendation naming the projection and both versions. An older full-set registration no longer retires projections that a newer version added, and the kernel no longer writes a stale definition back while it resubscribes projections. To roll back on purpose, give the older release a `SoftwareVersion` higher than the stored one. Clients that send no version register as before. (#5012)
- **Orleans** ([Release v1.22.3](https://github.com/Cratis/Orleans/releases/tag/v1.22.3)): A state machine no longer drops a transition when a second one is requested while another transition is still in progress. Requests made during a transition now run in the order they were made, once the current transition completes. A queued transition is checked again against the state it would leave if another state was entered first, and is skipped if that state does not allow it. A transition the current state refuses still does nothing and is not an error; call `CanTransitionTo` first to branch on it. See [State machines](https://github.com/Cratis/Orleans/blob/main/Documentation/concepts/state-machines.md). (#58)
- **Chronicle.TypeScript** ([Release v6.53.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.53.1)): A child or nested read-model property decorated with `@fromAllEvents` (or `@fromEvery`) is populated again, including on the event that creates the child. The compiler now declares these mappings on the child itself instead of on the root, so root properties are never copied into children and a property with the same name on the root and on a child is mapped independently. Requires Chronicle 19.78.1 or later for root-only all-event mappings to stay off new children; replay affected projections to rebuild child values that were already materialized. (#257)
- **Orleans** ([Release v1.22.2](https://github.com/Cratis/Orleans/releases/tag/v1.22.2)): A failed resume hook now restores a fully accounted-for stopped job to Stopped before any new steps start, so a later resume can retry instead of adopting a job left Running with no new work. Existing running jobs and incomplete stops are not rolled back. (#62)
- **Screenplay** ([Release v4.211.1](https://github.com/Cratis/Screenplay/releases/tag/v4.211.1)): Incompatible property mappings in command productions, reaction productions and reaction invocations now report PLAY0273 at the offending mapping, naming the property and its source and target types, instead of pointing to the first line of an unrelated file. (#785)
- **AI** ([Release v7.72.1](https://github.com/Cratis/AI/releases/tag/v7.72.1)): Completions on Claude models of generation 5 and later (such as `claude-sonnet-5-5`) no longer fail with a 400 saying `thinking.type.enabled` is not supported. Those models are now asked for adaptive thinking with an effort level instead of a thinking budget.
- **Screenplay** ([Release v4.211.0](https://github.com/Cratis/Screenplay/releases/tag/v4.211.0)): A refused authoring proposal now names the offending document and path in the conflict and lists every offending reference occurrence (text, member, document path and line:column, capped at ten), instead of returning a conflict with no location. (#783)
- **Chronicle** ([Release v19.78.1](https://github.com/Cratis/Chronicle/releases/tag/v19.78.1)): A child read-model property marked `[FromAll]` (or `[FromEvery]`) under `[ChildrenFrom<T>]` or `[Nested]` is populated again, including on the event that creates the child. The .NET client now declares these mappings on the child itself, and parent all-event mappings are never copied into children. (#4934) (#4524)
- **Chronicle** ([Release v19.78.1](https://github.com/Cratis/Chronicle/releases/tag/v19.78.1)): Projection definitions registered by older .NET clients (and the current TypeScript client), which declare child all-event mappings on the root, populate the child as long as the root read model does not declare a property with the same name. When both the root and the child declare it, the mapping stays on the root until the client is upgraded. Replay affected projections to rebuild child values that were already materialized. See [From all events](https://github.com/Cratis/Chronicle/blob/main/Documentation/projections/model-bound/from-all.mdx#child-and-nested-properties).
- **AI** ([Release v7.72.0](https://github.com/Cratis/AI/releases/tag/v7.72.0)): A stored tier mapping whose model is absent from the provider's last successfully discovered catalog is refused with a reason instead of calling that model. Pools try the next member without recording a rate limit. Before upgrading, inspect production providers with `ResolveTiersFor` and change or clear refused mappings, including mappings saved automatically during initial discovery. (#345)
- **Arc** ([Release v22.113.1](https://github.com/Cratis/Arc/releases/tag/v22.113.1)): `useQuery`: a component whose request was cancelled by another component reading the same query no longer keeps its query scope performing after it unmounts or starts a newer request, and no longer updates its state after it has unmounted. The other component's request still completes and shows its data. (#3349)
- **Chronicle** ([Release v19.77.6](https://github.com/Cratis/Chronicle/releases/tag/v19.77.6)): In a multi-silo kernel, a projection definition saved through one silo no longer looks missing on the others. A changed projection now evolves and replays as it should, instead of keeping its old definition. Projection grains now start with their stored definition, and removing a projection's observer now also removes the projection. (#4985)
- **AI** ([Release v7.70.1](https://github.com/Cratis/AI/releases/tag/v7.70.1)): The pull-request body guard no longer blocks `gh pr create` or `gh pr edit` when it cannot read a Cratis repository's release workflows, for example because the ambient GitHub credentials are invalid. It warns and checks the body against the bundled reviewed release-note rules instead, so a valid body goes through and an invalid one is still rejected. (#509)
- **Scene** ([Release v4.68.2](https://github.com/Cratis/Scene/releases/tag/v4.68.2)): The darkened tag severity colours were written with `light-dark()`. The Stage's CSS pipeline lowers `light-dark()` for older browsers into a pair of custom properties that stays unset there, so a severity tag had **no background** (white text on the page, 1.09:1) in the Stage. The shell now sets the light values and overrides them under the Scene configuration's `data-scene-color-scheme='dark'` (Lara's own dark values), with no `light-dark()` in the stylesheet (a specification keeps it that way).
- **Scene** ([Release v4.68.2](https://github.com/Cratis/Scene/releases/tag/v4.68.2)): The real-browser template audit did not draw the dark page: its host kept the colour scheme of its first render, so the "dark theme" rows re-judged the light page. The host now remounts per scheme (and a specification alternates light and dark to prove it); the whole dark matrix - every template, state and width - passes.
- **Ante** ([Release v1.3.1](https://github.com/Cratis/Ante/releases/tag/v1.3.1)): Registration and organization setup no longer delete the identity cookie, which nothing writes any more, so Ante builds against current Arc.
- **Ante** ([Release v1.3.1](https://github.com/Cratis/Ante/releases/tag/v1.3.1)): A collection expression is indented as the style analyzer expects.
- **Orleans** ([Release v1.22.1](https://github.com/Cratis/Orleans/releases/tag/v1.22.1)): The error enums nested in `IJobTypes` document their items, so the package update builds again.
- **AI** ([Release v7.70.0](https://github.com/Cratis/AI/releases/tag/v7.70.0)): The provider capacity documentation no longer claims every path parks a provider that ran out of quota: `ProviderAwareLanguageModel` and `PooledChatClient` park it, while the standalone `IAIProviderPoolDispatcher` only fails over. (#569)
- **Arc** ([Release v22.113.0](https://github.com/Cratis/Arc/releases/tag/v22.113.0)): Under read protection `On`, a read model injected outside the command's decision, such as into a custom command filter, is refused with a message that names the fix; a read model marked `[Unprotected("why")]` there is an advisory read (#3242)
- **Chronicle** ([Release v19.77.5](https://github.com/Cratis/Chronicle/releases/tag/v19.77.5)): A new event store is now announced reliably when a client connects while the kernel is still starting. Before, the announcement could be refused because the System event types weren't registered yet. The client's registration then failed and was retried in the background, which could re-apply an older projection definition over a newer one. (#4998)
- **Scene** ([Release v4.68.1](https://github.com/Cratis/Scene/releases/tag/v4.68.1)): The bare `core:button` was 21 pixels high (WCAG 2.2 target size): the shell now gives a button in the content area, in the application and the full-page shell, a 2rem minimum.
- **Scene** ([Release v4.68.1](https://github.com/Cratis/Scene/releases/tag/v4.68.1)): Two `search` landmarks on one page (topbar and list) had no accessible names: `foundation:globalSearch` now names its form with its label.
- **Scene** ([Release v4.68.1](https://github.com/Cratis/Scene/releases/tag/v4.68.1)): A grid item kept `min-width: auto`, so a widget holding a wide table pushed its track past the window: a phone scrolled sideways and, on a desktop, the dashboard's primary column overlapped its secondary one. Every item of a template slot now shrinks to its track and the table scrolls inside itself.
- **Scene** ([Release v4.68.1](https://github.com/Cratis/Scene/releases/tag/v4.68.1)): PrimeReact's Lara tag severities (info, success, warn, danger) paint white on a mid-tone in the light scheme (2.3 to 3.8:1): the blueprint darkens them to meet WCAG AA, the dark scheme's values are unchanged.
- **Chronicle** ([Release v19.77.4](https://github.com/Cratis/Chronicle/releases/tag/v19.77.4)): When two versions of an application are connected at once and the newer one's observer registration replaced the older one, the observer no longer stops when the newer client disconnects: it hands over to the still-connected older client, which carries on from where processing stopped. The newest registration still wins while both are connected, and events of types only the departed client handled are not delivered to the client that takes over. (#4987)
- **Arc** ([Release v22.112.1](https://github.com/Cratis/Arc/releases/tag/v22.112.1)): `useQuery`: when two components read the same query with the same arguments, the one whose request was cancelled by the other now receives the result instead of staying "not ready" with no data. A failed request settles both components as failed, and neither keeps reporting that it is performing. `useQueryWithPaging` gets the same fix. (#3312)
- **Arc** ([Release v22.112.1](https://github.com/Cratis/Arc/releases/tag/v22.112.1)): `useQuery`: a component whose arguments, paging or sorting change no longer shares a query instance, or a cached result, with components that use the previous values, so a request for new arguments can no longer cancel or overwrite another component's request. (#3312)
- **AI** ([Release v7.69.1](https://github.com/Cratis/AI/releases/tag/v7.69.1)): An AI pool now fails over when a member rejects a call outright, such as a 400 for a bad key, a retired model or an account with no credit. Before, the first rejection ended the whole completion and the remaining members were never tried, so one broken provider took down every agent that used the pool. The rejecting provider is remembered as failing so it ranks lower next time, and when every member rejects the call the first rejection is still reported.
- **Chronicle** ([Release v19.77.3](https://github.com/Cratis/Chronicle/releases/tag/v19.77.3)): Strongly consistent per-key projection reads (passive projections, stream-scoped reads, reads with the `*` key and session reads) now fold the key's events from the start on every read. Redactions, revisions and the erasure of personal data joined from another subject show up immediately. Before, a warm read kept returning the old content until the grain was deactivated. (#4844)
- **Chronicle** ([Release v19.77.1](https://github.com/Cratis/Chronicle/releases/tag/v19.77.1)): An event store of a namespace other than the default one asks the kernel whether the namespace still exists when it reconnects. If the kernel no longer lists it, the event store lets go of it instead of registering, and the client creates a new one if the namespace is used again. If the kernel cannot be asked, it registers as before (#4942).
- **Chronicle** ([Release v19.76.1](https://github.com/Cratis/Chronicle/releases/tag/v19.76.1)): `RemoveNamespace` stops listing the namespace before removing its observers, and unsubscribes and removes an observer again, up to five times, if a subscription already on its way subscribed it in between (#4942).
- **AI** ([Release v7.68.1](https://github.com/Cratis/AI/releases/tag/v7.68.1)): Provider error bodies no longer leak secrets: the calling provider's configured key is withheld by exact value (also when echoed URL-encoded) before any pattern runs, long tokens containing `/` are withheld, and only the failed request's exact model and provider ids stay readable, so a short model id inside a longer secret no longer lets that secret through. (#575)
- **AI** ([Release v7.68.1](https://github.com/Cratis/AI/releases/tag/v7.68.1)): A pooled chat call now treats HTTP 402 or a vendor `insufficient_quota` code as a spent quota and fails over to the next provider, instead of failing permanently. (part of #569)
- **AI** ([Release v7.68.1](https://github.com/Cratis/AI/releases/tag/v7.68.1)): Agent-harness workers report a spent Claude Code allowance only for the known subscription-limit phrases, and a Copilot worker reads a spent quota only from its error or result events, not from the agent's own text. (part of #569)
- **AI** ([Release v7.68.1](https://github.com/Cratis/AI/releases/tag/v7.68.1)): When the pull-request body guard cannot read a `--body-file`, it now says which path it tried, whether the file and its folder exist, the working directories and which checker script ran, instead of a bare `ENOENT`. (part of #517)
- **AI** ([Release v7.68.0](https://github.com/Cratis/AI/releases/tag/v7.68.0)): The skills no longer say `cratis screenplay validate` lacks `--open-questions`; the CLI has it.
- **Chronicle** ([Release v19.76.0](https://github.com/Cratis/Chronicle/releases/tag/v19.76.0)): Returning `GetDecisionConflicts()` as a response body, for example with `Results.Conflict(...)`, no longer throws. A `DecisionConflict` now serializes with System.Text.Json as the read model identifier (`ReadModel`), the key and the conflicting event, without the CLR type (#4984)
- **Chronicle** ([Release v19.75.1](https://github.com/Cratis/Chronicle/releases/tag/v19.75.1)): `RemoveNamespace` now finds the namespace's remaining observers through the persistent reminder table and unsubscribes and removes them too, so no reminder is left to bring the namespace back (#4942).
- **Chronicle** ([Release v19.75.0](https://github.com/Cratis/Chronicle/releases/tag/v19.75.0)): A decision read refused because the kernel's projection definition did not match the client's no longer stays refused until the application restarts. Refusals are not cached, a read checks the kernel's definitions once more before refusing, and the agreement is checked again after the client connects or disconnects. Protected reads and Arc protected commands therefore recover by themselves after a kernel restart or upgrade. (#4992)
- **Components** ([Release v4.29.0](https://github.com/Cratis/Components/releases/tag/v4.29.0)): The tree layout of `SchemaEditor` no longer loses schema details when a schema is edited. A property the user did not change is written back exactly as it was read, including:
- **Components** ([Release v4.29.0](https://github.com/Cratis/Components/releases/tag/v4.29.0)): annotations such as `title`, `description` and `deprecated`
- **Components** ([Release v4.29.0](https://github.com/Cratis/Components/releases/tag/v4.29.0)): `default`, `enum`, `const` and `examples`
- **Components** ([Release v4.29.0](https://github.com/Cratis/Components/releases/tag/v4.29.0)): string, number, array and object constraints
- **Components** ([Release v4.29.0](https://github.com/Cratis/Components/releases/tag/v4.29.0)): `integer` and nullable type arrays
- **Components** ([Release v4.29.0](https://github.com/Cratis/Components/releases/tag/v4.29.0)): `format` values other than `date` and `time`
- **Components** ([Release v4.29.0](https://github.com/Cratis/Components/releases/tag/v4.29.0)): `$ref` and composition keywords
- **Components** ([Release v4.29.0](https://github.com/Cratis/Components/releases/tag/v4.29.0)): array `items` in every form
- **Components** ([Release v4.29.0](https://github.com/Cratis/Components/releases/tag/v4.29.0)): the order of keys and of `required`
- **Components** ([Release v4.29.0](https://github.com/Cratis/Components/releases/tag/v4.29.0)): Changing a property's type in either layout now drops only the keywords that no longer apply to the new type: annotations stay, and constraints stay when the new type belongs to the same family. Before, the tree layout dropped everything and the table layout left constraints from the old type behind. (#426)
- **Chronicle** ([Release v19.74.2](https://github.com/Cratis/Chronicle/releases/tag/v19.74.2)): The 19.74.0 and 19.74.1 kernels fail to start (`Unable to resolve service for type 'System.String' while attempting to activate 'Cratis.Chronicle.Configuration.StorageConnectionResolution'`). The storage connection resolution is now created only from the configured storage, so the kernel starts again with MongoDB and with SQL storage. (#4994)
- **Fundamentals** ([Release v7.25.1](https://github.com/Cratis/Fundamentals/releases/tag/v7.25.1)): The type discovery generator no longer emits `typeof` expressions for types nested in open generic types (for example `Key<T>.Part`) declared in referenced Cratis packages, which failed the build with CS0246 (#1188)
- **Stage** ([Release v4.134.0](https://github.com/Cratis/Stage/releases/tag/v4.134.0)): `slot side` no longer replaces the page in the primary outlet (Cratis/Stage#456).
- **Orleans** ([Release v1.18.1](https://github.com/Cratis/Orleans/releases/tag/v1.18.1)): A job that was stopped and then resumed no longer stays `Running` forever when the silo dies before the resume has restarted its steps. Automatic recovery now restarts the steps that were stopped before the resume, using the job's own status history rather than clocks; a durable stop still wins. (#77)
- **Chronicle** ([Release v19.74.1](https://github.com/Cratis/Chronicle/releases/tag/v19.74.1)): **Event stores first created by a read now get their kernel projections.** Until now, if a read reached a new event store before the store was set up, the store was created without its kernel projections, including the event-type statistics projection. A common trigger is the .NET client's identity-drift check, which runs before artifact registration. Those projections then never handled any event, and waiting for completion after an append could stall on them until the kernel restarted.
- **Chronicle** ([Release v19.74.1](https://github.com/Cratis/Chronicle/releases/tag/v19.74.1)): **Setup:** it now runs exactly once per event store, even when several silos ensure the store at the same time.
- **Chronicle** ([Release v19.74.1](https://github.com/Cratis/Chronicle/releases/tag/v19.74.1)): **Existing stores:** stores that were already affected are repaired the next time a client connects.
- **Chronicle** ([Release v19.74.1](https://github.com/Cratis/Chronicle/releases/tag/v19.74.1)): **Reconnects:** reconnecting to a store that is already set up does no extra projection work.
- **Components** ([Release v4.28.0](https://github.com/Cratis/Components/releases/tag/v4.28.0)): The tree layout keeps every `x-` vendor keyword when the schema is edited: on properties, on array `items` and in nested objects. Root keywords, `definitions` and other root keys are kept, and so is the original key order. Before this, only `x-concept` and `x-key` survived an edit. Changing a property's type drops the annotations of its old array items. (#425)
- **Chronicle** ([Release v19.74.0](https://github.com/Cratis/Chronicle/releases/tag/v19.74.0)): SQL table, column and index lookups only consider the schema the connection uses. Before, a table of the same name in another schema of a shared database could be taken for Chronicle's own. (part of #4946)
- **Chronicle** ([Release v19.74.0](https://github.com/Cratis/Chronicle/releases/tag/v19.74.0)): MongoDB clients are no longer shared between different credentials on the same servers. (part of #4950)
- **cli** ([Release v3.70.0](https://github.com/Cratis/cli/releases/tag/v3.70.0)): The changed-profile planning spec follows the corpus' `root template` line instead of the legacy `layout` line it no longer contains.
- **Scene** ([Release v4.67.0](https://github.com/Cratis/Scene/releases/tag/v4.67.0)): Stage's `slot side` item no longer replaces the page in the primary outlet (Cratis/Stage#456).
- **Stage** ([Release v4.130.0](https://github.com/Cratis/Stage/releases/tag/v4.130.0)): Production runtime scenes still carry no sample data (asserted for the new profile members too).
- **Cast** ([Release v0.2.1](https://github.com/Cratis/Cast/releases/tag/v0.2.1)): When a member removes their `cast.json`, their directory card falls back to GitHub data instead of keeping the old title and tagline (#12)
- **Cast** ([Release v0.2.1](https://github.com/Cratis/Cast/releases/tag/v0.2.1)): A merged pull request total that was not fetched from GitHub is labelled self-reported, never live (#12)
- **Cast** ([Release v0.2.1](https://github.com/Cratis/Cast/releases/tag/v0.2.1)): Taglines with accent markup show as text on directory cards and in the terminal, without literal asterisks (#12)
- **Cast** ([Release v0.2.1](https://github.com/Cratis/Cast/releases/tag/v0.2.1)): Stat numbers keep their suffix on the same line, GitHub-only intros read as sentences, the search field shows a focus ring, and the 404 heading fits on small screens (#12)
- **Cast** ([Release v0.2.1](https://github.com/Cratis/Cast/releases/tag/v0.2.1)): Verification badges show the since date as month and year, matching the directory cards (#12)
- **Screenplay** ([Release v4.200.0](https://github.com/Cratis/Screenplay/releases/tag/v4.200.0)): Spec line expectations of the root template specs (they pointed one line off) and the PLAY0799 spec now follows Scene: a dialog template that declares no `scopes` is not restricted at feature scope.
- **AuthProxy** ([Release v2.31.1](https://github.com/Cratis/AuthProxy/releases/tag/v2.31.1)): A signed-in user arriving on `/register` is now passed through to the lobby instead of starting another registration and being sent to sign in again, so the sign-up wizard opens after the provider login.
- **Arc** ([Release v22.109.0](https://github.com/Cratis/Arc/releases/tag/v22.109.0)): MongoDB clients created through `IMongoDBClientFactory` are no longer shared between different credentials on the same server. (part of #3315)
- **Arc** ([Release v22.109.0](https://github.com/Cratis/Arc/releases/tag/v22.109.0)): The scoped `IMongoClient` and `IMongoDatabase` no longer capture the client factory in static fields, which leaked state across hosts. (part of #3315)
- **Chronicle** ([Release v19.73.1](https://github.com/Cratis/Chronicle/releases/tag/v19.73.1)): The Workbench keeps the selected namespace when the page is refreshed or a link is shared, because the address is now the only source of truth for the event store and namespace.
- **Chronicle** ([Release v19.73.1](https://github.com/Cratis/Chronicle/releases/tag/v19.73.1)): Switching namespace now restarts the page you are on, so open queries in event sequences and read models show the data of the namespace you picked.
- **Arc** ([Release v22.108.0](https://github.com/Cratis/Arc/releases/tag/v22.108.0)): ARCCHR0032 no longer reports `[ReadProtection(ReadProtectionMode.On)]` on a `[ProtectedDecision]` command as redundant: `On` changes how validators are built, protects plain read-model parameters and changes the `ReadChanged` refusal (#3330)
- **Arc** ([Release v22.108.0](https://github.com/Cratis/Arc/releases/tag/v22.108.0)): A read through an unsupported reducer now names what made it unprotectable instead of telling you to wait for reducer support (#3330)
- **Arc** ([Release v22.108.0](https://github.com/Cratis/Arc/releases/tag/v22.108.0)): The docs explain that refusal messages with status 500 reach clients only in Development or with `ExposeExceptionDetails`, show how a frontend handles `ReadChanged` and `ReadIncomplete` through `reasonDetail`, and correct the monthly-limit query and the overbooking repair examples (#3330)
- **cli** ([Release v3.69.0](https://github.com/Cratis/cli/releases/tag/v3.69.0)): `cratis render --package-set` of an application that uses a domain blueprint no longer fails with `CLI-RENDER-009`/`CLI-RENDER-002`.
- **Screenplay** ([Release v4.197.1](https://github.com/Cratis/Screenplay/releases/tag/v4.197.1)): A reaction `invokes` mapping such as `= $eventSourceId` (or `$eventContext.eventSourceId`) now binds to the triggering event's source instead of failing with PLAY0268, in both compilers and in the reference evaluator. Models that do not use it keep their executable-model bytes and version. (#790)
- **Screenplay** ([Release v4.197.0](https://github.com/Cratis/Screenplay/releases/tag/v4.197.0)): Part of Cratis/Screenplay#825; epic Cratis/Scene#157. Validator checks against Scene (template/option existence) follow with #826.
- **Scene** ([Release v4.60.0](https://github.com/Cratis/Scene/releases/tag/v4.60.0)): The SC4 acceptance asked for a Storybook story; it was missing from #165.
- **Chronicle** ([Release v19.72.1](https://github.com/Cratis/Chronicle/releases/tag/v19.72.1)): A reactor or reducer whose stream fails with `ClientIsNotConnected` after a kernel node restarts now makes the whole client reconnect, with a new connection id and every reactor and reducer registered again, instead of retrying the same stale registration every two seconds indefinitely (#4941).
- **Scene** ([Release v4.58.0](https://github.com/Cratis/Scene/releases/tag/v4.58.0)): Menu entries, crumbs, logo and user-menu entries were dead hash links in a preview (a click only changed the hash, or nothing); the sidebar/topbar items with no target did nothing and gave no hint.
- **Scene** ([Release v4.58.0](https://github.com/Cratis/Scene/releases/tag/v4.58.0)): Entries pointing at a screen the host does not render are now marked `navTargetMissing` (N8) instead of silently doing nothing.
- **Stage** ([Release v4.125.0](https://github.com/Cratis/Stage/releases/tag/v4.125.0)): `cratis render` of an application using a domain blueprint no longer fails with `CLI-RENDER-009` (dependency on `Cratis.Blueprint.Default` / `PrimeReact` unsatisfied) or `CLI-RENDER-002`.
- **Scene** ([Release v4.53.1](https://github.com/Cratis/Scene/releases/tag/v4.53.1)): `ApprovedPackageSetJson` refused the `blueprint` and `sampleData` members of a domain blueprint package's manifest, so the manifest of `@cratis/scene.blueprint.*` had to be hand-edited before a host could approve it. Both are design-time only: they are now read and left out of the canonical runtime document (sample data never reaches a rendered application). Covered by `when_reading_a_blueprint_manifest`.
- **Chronicle** ([Release v19.71.2](https://github.com/Cratis/Chronicle/releases/tag/v19.71.2)): The Aspire hosting client no longer depends on MessagePack 2.5.302, which has a known vulnerability (GHSA-qhrr-8q5h-9q3h). It uses 2.5.307, so the NuGet packages build and publish again
- **Orleans** ([Release v1.17.0](https://github.com/Cratis/Orleans/releases/tag/v1.17.0)): A persisted `Running` job whose silo crashed is resumed: its unfinished steps are started again under the same job id, scope and namespace, completed steps stay completed and a stopped job stays stopped. Recovery runs when a silo becomes active and, on one surviving silo, when a cluster member is declared dead. A step that was interrupted runs again from the start, so step work must be safe to repeat. (#63)
- **Orleans** ([Release v1.17.0](https://github.com/Cratis/Orleans/releases/tag/v1.17.0)): `Resume()` no longer reports `JobAlreadyRunning` for a job whose steps have no live work, and a job interrupted while it was still being prepared returns an explicit failure instead of success. (#63)
- **Orleans** ([Release v1.17.0](https://github.com/Cratis/Orleans/releases/tag/v1.17.0)): A `Rehydrate()` that arrives while a rehydration is in progress now runs another pass afterwards instead of being dropped.
- **Orleans** ([Release v1.17.0](https://github.com/Cratis/Orleans/releases/tag/v1.17.0)): A step outcome that reaches a job after it already completed no longer changes its progress or recreates its stored state.
- **Chronicle** ([Release v19.71.1](https://github.com/Cratis/Chronicle/releases/tag/v19.71.1)): Switching namespace in the Workbench now takes effect in the Sequences query editor and in Read Models. Previously an open query kept running against the namespace it was opened in, so a namespace with events could show "No events found"
- **Stage** ([Release v4.121.1](https://github.com/Cratis/Stage/releases/tag/v4.121.1)): Generated code no longer silently leaves out a validation rule whose kind Stage does not know. The renderer, the specification executor and the semantic host now refuse such a model with STAGE-ESM-005, naming the rule kind, instead of rendering or running it without that rule. (part of #448)
- **Stage** ([Release v4.121.1](https://github.com/Cratis/Stage/releases/tag/v4.121.1)): The default sandbox engine (`cratis run` without the semantic engine) now refuses a model that uses an unknown rule kind, with a clear reason, instead of ignoring the rule. The rules it already documents as not enforced are unchanged. (part of #448)
- **Scene** ([Release v4.51.0](https://github.com/Cratis/Scene/releases/tag/v4.51.0)): The page header of the foundation shell no longer overflows a phone when it carries several actions: the header and its action row wrap (found by the Chromium audit of the ticket page's four quick actions).
- **Screenplay** ([Release v4.188.0](https://github.com/Cratis/Screenplay/releases/tag/v4.188.0)): `propose-ast` could not add the first child of a member the node JSON leaves out while empty: the first `navigation` region of a module, the first `button` of a toolbar, the first sub-item of an item and the first contribution of a screen were refused with "Unknown typed syntax member". The edit now accepts any member the node kind declares.
- **Screenplay** ([Release v4.188.0](https://github.com/Cratis/Screenplay/releases/tag/v4.188.0)): The TypeScript compiler reported `PLAY0022` or `PLAY0024` for a module or feature `template <Name>` assignment the C# language accepts. It now skips the line like the other constructs it does not model.
- **cli** ([Release v3.67.0](https://github.com/Cratis/cli/releases/tag/v3.67.0)): `cratis render` no longer publishes sample data. The `scene.json` it writes is a content file of the generated application that the .NET SDK copies to the publish folder, and it carried the authored sample data packs and the profile's selection; it is now written without them (spec SD6: production output never includes sample data).
- **Scene** ([Release v4.45.0](https://github.com/Cratis/Scene/releases/tag/v4.45.0)): A `globalSearch` and the `dataList` sharing its address parameter did not follow each other (the address was replaced in place, which raises no event), so typing in a list's search box did nothing. Components writing an address parameter now tell every component using it.
- **Arc** ([Release v22.107.1](https://github.com/Cratis/Arc/releases/tag/v22.107.1)): With `CratisProxiesUseSourceFileAsOutputFile` enabled, generated proxies now import each type from the file generated for that type's full name. Previously, when two types shared a simple name in different namespaces (for example a type from a referenced package and an unrelated type in the application), an import could point at the other type's file and the frontend failed to compile with TS2307. (#3322)
- **Stage** ([Release v4.119.1](https://github.com/Cratis/Stage/releases/tag/v4.119.1)): The specification executor behind `cratis run` and the Stage spec runner now runs commands with composite inputs instead of reporting them as unsupported. Nested concept rules are checked in the same order and with the same messages as Screenplay's reference, malformed composite inputs are rejected before any rule runs, and only composites that are present are validated. (part of #441)
- **Stage** ([Release v4.119.1](https://github.com/Cratis/Stage/releases/tag/v4.119.1)): The renderer, the specification executor and the semantic host now decide which composite values they accept from one shared rule, so a model the renderer accepts is no longer refused when you run its specifications. (part of #441)
- **Stage** ([Release v4.116.2](https://github.com/Cratis/Stage/releases/tag/v4.116.2)): Commands with `==` or `!=` validation rules on a concept with named values now render instead of being refused with STAGE-ESM-005. The generated code compares enum members, including for optional concepts, where an absent value passes. (#420)
- **Stage** ([Release v4.116.2](https://github.com/Cratis/Stage/releases/tag/v4.116.2)): Requirements that compare a named-value concept with one of its members, or with another property of the same concept, now render, including combinations with `and` and `or`. Ordering, other rule kinds, collections and comparisons across different concepts are still refused with a specific reason. (#420)
- **Screenplay** ([Release v4.183.0](https://github.com/Cratis/Screenplay/releases/tag/v4.183.0)): A `matches` rule no longer rejects a valid value, and a generation check no longer reports PLAY0689, because the host was too slow to finish matching within a second. (#800)
- **Stage** ([Release v4.116.1](https://github.com/Cratis/Stage/releases/tag/v4.116.1)): Commands whose composite property contains an optional validated concept now render instead of being refused with STAGE-ESM-005, as long as every rule on that concept accepts an absent value. This includes optional parent composites, collections of composites and recursive types. A concept with `not empty`, a nested collection or named values is still refused. (#418)
- **Stage** ([Release v4.116.1](https://github.com/Cratis/Stage/releases/tag/v4.116.1)): A composite value that omits an optional member now renders that member as `null` instead of failing to render. (#418)
- **Stage** ([Release v4.116.1](https://github.com/Cratis/Stage/releases/tag/v4.116.1)): Specifications that use composite values now render. A rejection specification whose composite input lists members in a different order from the type's declaration is refused, because the reported first failure would otherwise differ from the model. (#418)
- **Stage** ([Release v4.115.0](https://github.com/Cratis/Stage/releases/tag/v4.115.0)): The legacy renderer refuses validation rules it cannot render instead of writing a `// TODO` comment into the generated validator. (part of #414)
- **Screenplay** ([Release v4.181.1](https://github.com/Cratis/Screenplay/releases/tag/v4.181.1)): `TenantId` now formats as its value, so a `generate rule` body that interpolates `context.Tenant` produces the tenant identifier instead of `TenantId { Value = … }` (#798)
- **Stage** ([Release v4.113.1](https://github.com/Cratis/Stage/releases/tag/v4.113.1)): The default sandbox engine now checks `min` and `max` on numbers by value instead of by text length, so `quantity min 1` rejects `0` and `amount max 100` rejects `99999`. Text bounds still measure length. (#425)
- **Stage** ([Release v4.113.1](https://github.com/Cratis/Stage/releases/tag/v4.113.1)): `not empty` on a nested property such as `customer.address.name` no longer rejects every command in the default sandbox engine. (#425)
- **Stage** ([Release v4.113.1](https://github.com/Cratis/Stage/releases/tag/v4.113.1)): The default sandbox engine no longer half-enforces `all >` and `all >=`: they are dropped, like equality and rules with non-literal operands, and rules whose path crosses a collection are skipped instead of refusing every payload. The sandbox documentation now lists which rules the default engine enforces and which it ignores. (#425)
- **Screenplay** ([Release v4.180.2](https://github.com/Cratis/Screenplay/releases/tag/v4.180.2)): Parsing a valid model no longer fails with a regular-expression timeout when the host is busy. The compiler's own patterns now run on .NET's linear-time regular expression engine with no wall-clock timeout, so they stay safe against hostile input without depending on how fast the machine is. Parsing the samples is also about twice as fast. (#796)
- **Screenplay** ([Release v4.180.2](https://github.com/Cratis/Screenplay/releases/tag/v4.180.2)): Import globs are matched folder by folder without regular expressions, so a glob with many wildcards or `**` segments can no longer exhaust memory or the stack. (#796)
- **Stage** ([Release v4.113.0](https://github.com/Cratis/Stage/releases/tag/v4.113.0)): The semantic engine (`cratis run` with the semantic runtime, and the Stage Host) no longer reports Screenplay's informational notes as blocking refusals. Report-only metadata such as descriptions, personas, documentation and deferred screens used to appear among the `Unsupported(Plan) model:` refusals, burying the real errors. Only errors block now. (#430)
- **Stage** ([Release v4.112.1](https://github.com/Cratis/Stage/releases/tag/v4.112.1)): Planning a model whose specification pins a value for a generated concept with an opaque (code) rule no longer throws `InvalidSemanticContract`; the specification is refused with `STAGE-ESM-005`, naming the concept and the rule, like the concept itself. (#429)
- **Chronicle.Elixir** ([Release v3.14.2](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.14.2)): When the commit inside `Chronicle.decide/2` fails, for example because the kernel is unreachable, the unit of work is rolled back. Later appends from the same process go to the event log instead of being buffered into the failed unit of work and lost. (#161)
- **Chronicle.Elixir** ([Release v3.14.2](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.14.2)): `Chronicle.decide/2` and `with_unit_of_work/2` stop the unit of work's process when they return, so a long-lived caller no longer collects one linked process per call. (#161)
- **Chronicle.Elixir** ([Release v3.14.1](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.14.1)): The client's Logger filter now removes the API key, the OAuth bearer token and the gRPC and Mint state that holds request headers from `gen_server`, `proc_lib` and supervisor crash reports, so you no longer need an application-level filter. This covers the Mint connection process, which kept the API key in its HPACK table, and `GRPC.Client.Connection`. See [Crash reports](https://github.com/Cratis/Chronicle.Elixir/blob/main/Documentation/connections/crash-reports.md). (#79)
- **Chronicle.Elixir** ([Release v3.14.1](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.14.1)): Warning and error log text no longer contains the API key, password or tokens the client authenticated with. (#79)
- **Screenplay** ([Release v4.180.1](https://github.com/Cratis/Screenplay/releases/tag/v4.180.1)): The executable binder accepts queries with the same name in different slices, such as Arc's `All` and `GetAll` on several read models, instead of refusing them with PLAY0268. A specification's `then query` and `when query` resolve like other references: its own slice first, then the enclosing feature, module and document, or a qualified name; a reference that still matches several queries is reported as ambiguous (PLAY0198) at that reference. (#624)
- **Screenplay** ([Release v4.180.1](https://github.com/Cratis/Screenplay/releases/tag/v4.180.1)): A specification that asserts an authorized query declared in a later slice now requires `given caller`, like any other authorized specification (PLAY0389 was skipped for such queries). (#624)
- **Stage** ([Release v4.109.1](https://github.com/Cratis/Stage/releases/tag/v4.109.1)): Generated specification classes and test names now split single-letter words and the end of an acronym. For example, `RegisteringAGreeting` renders as `when_registering_a_greeting` instead of `when_registering_agreeting`, and `HTTPRequest` still renders as `http_request`. Re-rendering renames the affected generated specification classes and files. (#417)
- **Stage** ([Release v4.109.0](https://github.com/Cratis/Stage/releases/tag/v4.109.0)): Stage decides whether generated values are guarded for freshness and shape by whether the model declares a generation strategy, matching the reference evaluator, instead of by ESM version. Models that only use implicit UUID generation are no longer guarded. (#393)
- **Screenplay** ([Release v4.173.0](https://github.com/Cratis/Screenplay/releases/tag/v4.173.0)): Generated-concept rule proofs in MCP declaration details use the same UTC assessment year as the compiler, so date patterns get the same proven, refuted or unproven status as the PLAY0688/PLAY0689 diagnostics. (part of #618)
- **AI** ([Release v7.56.2](https://github.com/Cratis/AI/releases/tag/v7.56.2)): `dotnet build` and `dotnet test` inside the agent harness images exit cleanly on multi-project solutions: the images disable MSBuild node reuse and the build server, so leftover worker nodes no longer keep build output open and hang an agent or the harness reading it. (#714)
- **Chronicle** ([Release v19.68.0](https://github.com/Cratis/Chronicle/releases/tag/v19.68.0)): Events revised on SQL storage now report their revised generation to clients, so a client reading over gRPC can tell the content was revised instead of using the stale stored generation (#4888)
- **AI** ([Release v7.56.1](https://github.com/Cratis/AI/releases/tag/v7.56.1)): The agent harness always delivers a result Studio accepts: non-string `gaps` and `selfChecks` items written by the agent are converted to text, nulls are dropped, long text and long lists are capped to Studio's limits, and verbose advisory metadata is trimmed to fit with a marker saying how much was dropped. Usage and correlation values are forwarded byte for byte. (#711)
- **AI** ([Release v7.56.1](https://github.com/Cratis/AI/releases/tag/v7.56.1)): A result that still cannot meet Studio's contract fails the worker with the clause it breaks, instead of being rejected by Studio without a reason. (#711)
- **Screenplay** ([Release v4.171.0](https://github.com/Cratis/Screenplay/releases/tag/v4.171.0)): A specification that appended an event a capture over events reads, and expected `then no events`, passed even though Chronicle would append; the capture now receives the event and its appends are compared. (#483)
- **Arc** ([Release v22.100.2](https://github.com/Cratis/Arc/releases/tag/v22.100.2)): The Screenplay generator no longer emits a model that fails binding when a command's generated value has a generation strategy it cannot recover (`SP0073`) and that value feeds a required event property. Productions that need the value for a required property are withheld (`SP0012`). Mappings to optional properties are omitted with a warning. Dependent responses, conditions, destinations, routes, operations and scenarios are withheld with their existing diagnostics. Everything independent of the value is kept, and the command falls back to its `file` reference only when no production survives. (#3219)
- **cli** ([Release v3.64.0](https://github.com/Cratis/cli/releases/tag/v3.64.0)): `cratis run` no longer reports a model as ready when Stage refuses to run it. It waits for Stage's status, lists every refusal issue, stops the container and exits 5. A routed model refused by the default engine (`STAGE-ESM-030`) suggests `--engine semantic`. (#368)
- **Arc** ([Release v22.100.1](https://github.com/Cratis/Arc/releases/tag/v22.100.1)): The Screenplay generator no longer drops an xUnit `[Theory]` that builds a local `ReadModelScenario`, `CommandScenario`, `EventScenario` or `ReactorScenario` without a trace: it is now reported with Information `SP0076` like every other omitted scenario theory, so the generated document accounts for every specification it leaves out. (#3295)
- **AI** ([Release v7.53.1](https://github.com/Cratis/AI/releases/tag/v7.53.1)): The technical-examples guidance on version notes now uses a placeholder version in its example, so the skill itself stays free of concrete release numbers.
- **Stage** ([Release v4.103.2](https://github.com/Cratis/Stage/releases/tag/v4.103.2)): The plan-from-sources reference links to Screenplay's tool page again; the links pointed at a page that does not exist.
- **Screenplay** ([Release v4.168.0](https://github.com/Cratis/Screenplay/releases/tag/v4.168.0)): The repair-capabilities schema lists PLAY0688 among the repairable diagnostics.
- **Stage** ([Release v4.103.1](https://github.com/Cratis/Stage/releases/tag/v4.103.1)): A freshly scaffolded application's frontend now type-checks and builds before any slice is rendered. The scaffold's entry point loads the Scene module only when it exists, and until the first render creates it, shows "Nothing to show yet" instead of failing with `Cannot find module '../src/stage'`. Fully rendered applications load their Scene module exactly as before. (#399)
- **Chronicle.TypeScript** ([Release v6.52.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.52.1)): A read-model field that no event has set yet now reads as the value the class declares (for example `null`), instead of `undefined`, so a projection and a reducer give the same result for the same history. An absent array still reads as an empty array. Requires `@cratis/fundamentals` 7.24.1. (#251)
- **Fundamentals** ([Release v7.24.1](https://github.com/Cratis/Fundamentals/releases/tag/v7.24.1)): `JsonSerializer` no longer overwrites a class's default value with `undefined` when a field is missing from the input; the field keeps what the constructor gave it. Fields present in the input, explicit `null` values and missing collections (which become empty arrays) behave as before. (#1184)
- **Arc** ([Release v22.95.1](https://github.com/Cratis/Arc/releases/tag/v22.95.1)): A `CommandScenario` that seeds events for an event source and pins the same id as a guarded generated value, without `UseDecisionReads()`, now fails fast with `GeneratedIdentifierCollisionRequiresDecisionReads`. Before, the command silently succeeded, because the default mode does not put seeded events in the event log. The fresh-identifier and generated-value testing docs show the working `new CommandScenario<T>().UseDecisionReads()` setup. (#3280)
- **Chronicle** ([Release v19.64.1](https://github.com/Cratis/Chronicle/releases/tag/v19.64.1)): Resetting a development kernel, and the reset between integration specs, now also clears the in-memory appended-event queues and live observers. Previously they survived the reset, so a projection registered at runtime in a later spec could receive events from an earlier one, skip its own events and return no read model. A reset that cannot clear them now fails instead of continuing with stale delivery. (#4815)
- **Chronicle** ([Release v19.63.0](https://github.com/Cratis/Chronicle/releases/tag/v19.63.0)): The CHR0054 reference and the reactor side-effects documentation no longer say that a synchronous custom side-effect type cannot be used: the runtime accepts it when a registered handler claims the type (#4882)
- **Chronicle** ([Release v19.62.4](https://github.com/Cratis/Chronicle/releases/tag/v19.62.4)): The .NET client sends the global event seeds discovered from `ICanSeedEvents` once per event store on each connection, instead of again for every namespace store it opens. Seeds added through `ForNamespace(...)` and seeds queued by hand are still sent every time (part of #4869)
- **Arc** ([Release v22.91.1](https://github.com/Cratis/Arc/releases/tag/v22.91.1)): The Cratis.Arc NuGet packages for 22.91.0 were never published. This release publishes them. In the default scenario mode, `QueryScenario` observes Chronicle read models built with `[ChildrenFrom<T>]`, joins and reducers, and Arc requires Cratis Chronicle 19.59.1 or later.
- **Chronicle** ([Release v19.62.3](https://github.com/Cratis/Chronicle/releases/tag/v19.62.3)): On PostgreSQL, an event store and its namespace no longer share one database when their names are longer than PostgreSQL's 63-byte limit. Long database names are now a readable prefix plus a hash and stay distinct, so every namespace migration runs and observers no longer fail with `relation "FailedPartitions" does not exist`. On SQL Server, names longer than 128 characters are created the same way instead of failing. (#4849)
- **Chronicle** ([Release v19.62.3](https://github.com/Cratis/Chronicle/releases/tag/v19.62.3)): A migration that reports "already exists" while migrations are still pending now fails with `DatabaseMigrationIncomplete` instead of marking the database as migrated. (#4849)
- **cli** ([Release v3.61.1](https://github.com/Cratis/cli/releases/tag/v3.61.1)): `cratis screenplay baseline check` and `cratis render`'s release-baseline warnings for PATH input no longer refuse a model root whose `.screenplay` folder has mode `0755`, which is what a git checkout creates. They previously failed with `MetadataPermissions` in fresh clones and CI. Folders that are group- or other-writable are still refused. (#360)
- **Stage** ([Release v4.99.0](https://github.com/Cratis/Stage/releases/tag/v4.99.0)): `SemanticModelLoader` and `CratisRendering.PlanFrom` accept a model root's own `.screenplay/identities.json` as `CatalogPath`, the file the Screenplay MCP and `screenplay baseline admit` write, as well as a bare identity catalog. Stage reads it through Screenplay's public `ScreenplayModelRoot` and `PersistedIdentityStateSerializer`. Loading a whole root also computes the release-baseline assessment for the same workspace that is rendered, so `STAGE-BASELINE` warnings work from a real model root. A root that cannot be opened (pending recovery, conflicting identity state, unreadable metadata) reports `STAGE-BASELINE-003` or `STAGE-BASELINE-004` without throwing. (#388)
- **Stage** ([Release v4.99.0](https://github.com/Cratis/Stage/releases/tag/v4.99.0)): In model-root mode, `.play` files under folders Screenplay does not read (`.git`, `.ai-work`, `bin`, `obj`, `node_modules`) are left out of folder selections, as `screenplay baseline check` does. A file named explicitly that the root does not read is refused with `STAGE-PLAN-001` and is never silently dropped. (#388)
- **Chronicle** ([Release v19.62.1](https://github.com/Cratis/Chronicle/releases/tag/v19.62.1)): Read-model watchers and observable queries are no longer notified when a reducer fails to fold an event. Previously they received the state from before the failure, and were told the read model was removed when the first event of a batch failed; successful folds, including removals, notify as before. (#4817)
- **Chronicle** ([Release v19.62.1](https://github.com/Cratis/Chronicle/releases/tag/v19.62.1)): Events forwarded from another event store's outbox into the inbox now keep their tags, so tag-filtered reactors, reducers and projections observing the inbox receive them. Events forwarded before upgrading stay untagged and are not backfilled. (#4823)
- **Stage** ([Release v4.98.2](https://github.com/Cratis/Stage/releases/tag/v4.98.2)): Generated applications now report healthy at `/healthz` only after Chronicle has registered their read models, projections, reactors and reducers. Before this, a client or test harness that queried as soon as the host turned healthy could get HTTP 500 `ReadModelNotFound`. Stage, its Docker images and the generated scaffold now pin Chronicle 19.59.6, which includes Cratis/Chronicle#4872. (#387)
- **Stage** ([Release v4.98.2](https://github.com/Cratis/Stage/releases/tag/v4.98.2)): The compliance and rendering references no longer claim that `[NotAudited]` protects event payloads. It keeps a command input out of the command causation chain; `[Encrypted]` or `[PII]` protects the value on the event. (part of #175)
- **Screenplay** ([Release v4.159.0](https://github.com/Cratis/Screenplay/releases/tag/v4.159.0)): `screenplay baseline check` and other read-only opens of a model root no longer refuse the `.screenplay` directory a git checkout creates (`0755`). Reads now refuse only a directory other users can write; writes and recovery still require owner-only access. (#742)
- **Chronicle** ([Release v19.59.7](https://github.com/Cratis/Chronicle/releases/tag/v19.59.7)): Unique constraints on SQL storage are now settled by the database: two concurrent appends claiming the same value no longer both succeed. Per-event-source constraint tables get a unique index on the value on PostgreSQL, SQL Server and SQLite, and a collision is reported as a constraint violation instead of leaving two holders. (#3744)
- **Chronicle** ([Release v19.59.7](https://github.com/Cratis/Chronicle/releases/tag/v19.59.7)): On SQL storage, moving a claim to a value another event source already holds is rejected and keeps the original claim, instead of losing it. (part of #3744)
- **Chronicle** ([Release v19.59.6](https://github.com/Cratis/Chronicle/releases/tag/v19.59.6)): The ASP.NET Core readiness health check (`chronicle`, tagged `ready`) reports healthy only once the client is connected and artifact registration for the configured event store has succeeded, so a readiness probe no longer routes traffic before reactors, projections and constraints are registered. Until registration completes, or when it fails, the check reports its configured failure status and lists the failed artifacts. Apps that turn off `AutoDiscoverAndRegister` and do not run registration themselves stay healthy once connected. See [health checks](https://github.com/Cratis/Chronicle/blob/main/Documentation/clients/dotnet/health-checks.md) (#4872)
- **Chronicle** ([Release v19.59.5](https://github.com/Cratis/Chronicle/releases/tag/v19.59.5)): Appending a previous event generation declared with `[EventTypeGenerationFor<T>]` no longer fails the build with CHR0001. Both `Append` and `AppendMany` accept either marker, and the diagnostic message and the [CHR0001 reference](https://github.com/Cratis/Chronicle/blob/main/Documentation/code-analysis/CHR0001.mdx) now name both, with an example of appending a previous generation (#4862)
- **AI** ([Release v7.48.2](https://github.com/Cratis/AI/releases/tag/v7.48.2)): The worktree cleanup hook no longer deletes a merged worktree that holds work records: a worktree with a non-empty `.ai-work/` is kept and reported as "has untracked work records (.ai-work/)". Removing it takes an explicit `--include-work-records` run by hand; the automatic hooks never pass it. Locked worktrees (`git worktree lock <path>`) are always kept and reported as locked, and the docs name locking as the way to pin a long-lived worktree. (#670)
- **Screenplay** ([Release v4.156.1](https://github.com/Cratis/Screenplay/releases/tag/v4.156.1)): The event model board shows only the appended event in the WHEN row of a state-view or automation specification, and the expected read model in its THEN row, instead of every event the projection consumes. Specification titles are the specification name; read model fixtures the board does not draw stay in the title. (#724)
- **Chronicle** ([Release v19.59.4](https://github.com/Cratis/Chronicle/releases/tag/v19.59.4)): Stopping a kernel silo now waits for in-flight projection catch-up and replay work and writes its buffered MongoDB bulk writes within the shutdown budget, instead of leaving writes that can land after the silo reported it had stopped; writes cut off by the deadline are logged with their observer and partitions and recorded as failed partitions where time allows (#4790)
- **Chronicle** ([Release v19.59.3](https://github.com/Cratis/Chronicle/releases/tag/v19.59.3)): The in-memory event store enforces unique constraints across event sources: a second event source claiming a value another source holds is rejected as a duplicate and the first claim is kept, a rejected move keeps the old claim, and releasing a claim frees the value (part of #3744)
- **Chronicle** ([Release v19.59.2](https://github.com/Cratis/Chronicle/releases/tag/v19.59.2)): Appending a batch with two concurrency scopes for the same event source no longer fails with a generic error: identical scopes are merged and conflicting ones are rejected with a clear append error (#4712)
- **AI** ([Release v7.47.0](https://github.com/Cratis/AI/releases/tag/v7.47.0)): Corpus verification recognizes nested Screenplay commands such as `screenplay baseline admit` from the pinned contract (part of #655)
- **Chronicle** ([Release v19.59.1](https://github.com/Cratis/Chronicle/releases/tag/v19.59.1)): Reindexing unique constraints over an event history that already contains duplicate values completes instead of failing on the first duplicate: the first claimant in event log order keeps the value and each later duplicate claim is logged and skipped (part of #3744)
- **Stage** ([Release v4.93.0](https://github.com/Cratis/Stage/releases/tag/v4.93.0)): A rendered `all` projection no longer gives a property it does not map a default value (such as `0`, `false` or an empty UUID) on read models it creates for unrelated events, where Screenplay leaves the property unset. Rendering now fails with `STAGE-ESM-017` unless every such property is optional, text or a single object. (part of #117)
- **Arc** ([Release v22.87.2](https://github.com/Cratis/Arc/releases/tag/v22.87.2)): The frontend `notEmpty` rule now treats text as empty exactly when it contains only Unicode whitespace, the same set the backend uses, so a value such as U+0085 or U+FEFF is accepted or rejected identically on the client and the server. (#3224)
- **Arc** ([Release v22.87.2](https://github.com/Cratis/Arc/releases/tag/v22.87.2)): An observable query whose arguments fail validation now delivers the validation results to the subscriber as an invalid query result and ends the subscription, over WebSocket and Server-Sent Events, in direct and hub mode, instead of a bare error message or a failed connection. Plain query requests and the React query hooks already surfaced these results. Controller-based observable queries over a direct WebSocket are tracked in https://github.com/Cratis/Arc/issues/3230. (#3225)
- **Chronicle** ([Release v19.58.0](https://github.com/Cratis/Chronicle/releases/tag/v19.58.0)): Passive reducer reads now apply the reducer's tag, event source and stream filters, so on-demand state matches the state the active reducer builds. (#4785)
- **Chronicle** ([Release v19.58.0](https://github.com/Cratis/Chronicle/releases/tag/v19.58.0)): `ReadModelScenario` now applies reducer tag filters and keeps the tags, event source type and stream metadata of seeded events, so filtered reducers produce the same state in specifications as in production. (#4786)
- **Chronicle** ([Release v19.57.1](https://github.com/Cratis/Chronicle/releases/tag/v19.57.1)): `CHR0024` no longer reports a variant property that is populated by the variant's `[EntersOn<T>]` event or by a `[GlobalFor<T>]` handler of its group, including the documented shared-handler example (#4831)
- **Chronicle** ([Release v19.57.1](https://github.com/Cratis/Chronicle/releases/tag/v19.57.1)): `ReadModelScenario` removes the entity from the other variants when it enters a fluent variant, the same as for model-bound variants and under a running kernel (#4832)
- **Chronicle** ([Release v19.57.1](https://github.com/Cratis/Chronicle/releases/tag/v19.57.1)): `ReadModelScenario` now shows the value of a variant's non-entering event that was appended before the entering event once the variant is created, as a running kernel does (#4833)
- **Chronicle** ([Release v19.57.1](https://github.com/Cratis/Chronicle/releases/tag/v19.57.1)): The variants and `ReadModelScenario` documentation now describes early joins, shared mappings and testing variants. See [Model-bound variants](https://cratis.io/chronicle/projections/model-bound/variants/) (#4834)
- **Chronicle** ([Release v19.57.0](https://github.com/Cratis/Chronicle/releases/tag/v19.57.0)): Captures over public events that do not name a `sequence` no longer fail every batch with an error saying they do not read from their inbox (#4700)
- **Chronicle** ([Release v19.56.1](https://github.com/Cratis/Chronicle/releases/tag/v19.56.1)): With `Workbench:BasePath` set, opening Read Models no longer redirects to a URL without the prefix, which broke reloads and shared links behind a path-routed proxy (#4830)
- **Chronicle** ([Release v19.56.1](https://github.com/Cratis/Chronicle/releases/tag/v19.56.1)): Navigation everywhere in the Workbench now follows the base path, including the breadcrumb, the sidebar and the redirects to and from the sign-in page.
- **Arc** ([Release v22.87.1](https://github.com/Cratis/Arc/releases/tag/v22.87.1)): A command returning events for several event sources (`EventForEventSourceId` collections, including mixed plain and wrapped events) now appends them as one batch when no command transaction is active, so a refused event no longer leaves the events before it appended while the command reports failure. Per-event routing, subject, occurrence time and tags are kept. When one event source id receives events on several streams and the command declares no concurrency guard, the events still append one at a time, because a batch can carry only one guard per event source id (https://github.com/Cratis/Chronicle/issues/4818). (#3216)
- **Chronicle** ([Release v19.55.2](https://github.com/Cratis/Chronicle/releases/tag/v19.55.2)): Projection catch-up and replay on MongoDB no longer lose writes when a kernel silo stops or crashes mid-catch-up: progress is persisted only once every silo has confirmed its buffered writes are stored, and a lost or failed write window makes the job step resume from its last durable position instead of skipping the events (#4814)
- **Screenplay** ([Release v4.149.1](https://github.com/Cratis/Screenplay/releases/tag/v4.149.1)): The reference evaluator no longer fails a specification when a child projection event arrives before its parent instance: like Chronicle, it holds the child until the parent exists and then applies it with its original event values, at any nesting depth and across `given`, `when` and command commits; a child whose parent never arrives stays out of the read model, and an ambiguous parent still fails (part of #132)
- **Screenplay** ([Release v4.149.1](https://github.com/Cratis/Screenplay/releases/tag/v4.149.1)): Removing a child, deferred or not, applies the ancestors' `every` mappings the way Chronicle does (part of #132)
- **cli** ([Release v3.57.1](https://github.com/Cratis/cli/releases/tag/v3.57.1)): `cratis screenplay validate --help` printed the description and examples and then failed with a markup error before listing the options; the full help, including `--scope`, `--check`, `--executable` and `--warnings-as-errors`, is shown again. (part of #339)
- **cli** ([Release v3.57.1](https://github.com/Cratis/cli/releases/tag/v3.57.1)): `--warnaserror`, the standalone `screenplay` tool's spelling, is accepted as an alias of `--warnings-as-errors`; before, it was silently ignored and a model with warnings passed. Any other unknown option now fails with exit code 5 instead of being ignored. (part of #339)
- **cli** ([Release v3.57.1](https://github.com/Cratis/cli/releases/tag/v3.57.1)): An unknown `--check` name fails with exit code 5 and a message listing the valid check names, instead of exit code 255. (part of #339)
- **Chronicle** ([Release v19.55.0](https://github.com/Cratis/Chronicle/releases/tag/v19.55.0)): A client call carrying more than 4 MB, such as appending a large event or a client-side reducer whose read model had grown past it, no longer fails with `ResourceExhausted` (#4821)
- **Chronicle.Kotlin** ([Release v6.13.1](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.13.1)): Messages from the kernel larger than 4 MB no longer fail with `RESOURCE_EXHAUSTED`: the client now accepts 100 MB by default, like the other Chronicle clients (Cratis/Chronicle#4821)
- **Chronicle.TypeScript** ([Release v6.51.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.51.1)): Messages from the kernel larger than 4 MB no longer fail with `ResourceExhausted`: the client now allows 100 MB in both directions by default, like the other Chronicle clients (Cratis/Chronicle#4821)
- **Chronicle** ([Release v19.54.1](https://github.com/Cratis/Chronicle/releases/tag/v19.54.1)): Events with encrypted (secret) properties of non-string types, such as `int` or `bool` concepts marked for subject, namespace or global encryption, can be appended and read back with their original values and types; previously the append failed (#4813)
- **Stage** ([Release v4.89.0](https://github.com/Cratis/Stage/releases/tag/v4.89.0)): A routed `when append` with a UUID or composite stream identifier now generates the stream-identifier type its specification needs. A slice-scoped render now includes the event-source classes that its filters and appended routes refer to. (#297)
- **Arc** ([Release v22.85.1](https://github.com/Cratis/Arc/releases/tag/v22.85.1)): A command that returns a collection of events for one event source with a compliance subject now appends them as one batch: if any event is refused, none is appended and the command reports the refusal, instead of leaving the earlier events in the event log. The subject, routing, tags and concurrency scope of each event are preserved. (#3187)
- **Arc** ([Release v22.84.0](https://github.com/Cratis/Arc/releases/tag/v22.84.0)): The Screenplay generator states a Chronicle unique constraint with every event it covers: all `On<T>` targets and their properties, and every `RemovedWith<T>` release, are read and stated together. A constraint with any part the generator cannot read exactly (an unread target, an aliased or conditional release, settings Screenplay cannot express) is left out as a whole with `SP0017` instead of being stated with fewer events than Chronicle enforces. Events named only by additional targets or releases are imported like the constraint's first event. (#3188)
- **Screenplay** ([Release v4.147.1](https://github.com/Cratis/Screenplay/releases/tag/v4.147.1)): From ESM v15, the reference evaluator no longer rejects a generated command for reusing its identifier just because an earlier fact has no event source; only earlier facts on the same event source count (part of #616)
- **Stage** ([Release v4.83.0](https://github.com/Cratis/Stage/releases/tag/v4.83.0)): On a narrow window the menu toggle changed its label and the navigation never opened, in a live Stage and in a generated application alike. Scene's blueprint stylesheet parked the sidebar off-canvas with a rule the open state could not out-rank; Scene 4.22.1 fixes the rule, and the Stage frontend, the contracts and the pinned frontend package set of generated applications move to it. (part of #237)
- **Arc** ([Release v22.82.0](https://github.com/Cratis/Arc/releases/tag/v22.82.0)): The Screenplay generator no longer drops `MenuItem` and `MenuItems` imported on their own from Cratis Components without a diagnostic, and it now names why each unread menu item, route navigation or after-success callback (`CommandDialog onSuccess`) is not stated, keeping navigation after a command succeeds separate from gestures that open its input. (#3049)
- **Arc** ([Release v22.82.0](https://github.com/Cratis/Arc/releases/tag/v22.82.0)): Generated command proxies type a collection response as an array: a command returning `IEnumerable<ProjectSummary>` now exposes `ProjectSummary[]` in `Command<…>` and `useCommand<…>`, matching what the client already deserializes. (#3174)
- **Chronicle** ([Release v19.53.3](https://github.com/Cratis/Chronicle/releases/tag/v19.53.3)): A nullable concept over `string` or `bool` on a read model is now marked nullable in the read-model schema, so an unset value on a `[Passive]` read model stays `null` instead of becoming a default such as `false`. Event type schemas are unchanged. (#4081)
- **Arc** ([Release v22.81.0](https://github.com/Cratis/Arc/releases/tag/v22.81.0)): Stream-scoped decision reads (`IDecisionReads.Get<T>`, `GetDetached<T>` and `AdmitForStream<T>` with an event source id, stream type and stream id) work inside Arc commands with the same protection, caching and enrollment as key-based decision reads, instead of being refused (#3126)
- **Arc** ([Release v22.81.0](https://github.com/Cratis/Arc/releases/tag/v22.81.0)): The decision-read documentation describes `[Unprotected]` commands consistently: their decision reads are unguarded, not refused (#3208)
- **Scene** ([Release v4.22.1](https://github.com/Cratis/Scene/releases/tag/v4.22.1)): The narrow-window (`max-width: 991px`) rule that parks `.layout-sidebar` off-canvas has the same specificity as the `.layout-mobile-active .layout-sidebar` rule that opens it, and comes later, so the open state never won. A `.layout-wrapper.layout-mobile-active .layout-sidebar` rule inside the media query now out-ranks the parked sidebar, so the toggle brings the navigation into the window on every application built on the default blueprint, including a live Stage. (part of #75)
- **Chronicle** ([Release v19.53.2](https://github.com/Cratis/Chronicle/releases/tag/v19.53.2)): A child join applied by the in-memory storage, which `Cratis.Chronicle.Testing` and in-memory kernels use, now updates every matching child in place, as the MongoDB and SQL sinks do. Before, it replaced the whole read model with the joined child alone, dropping the root's other properties and sibling children. (#4531)
- **Chronicle** ([Release v19.53.2](https://github.com/Cratis/Chronicle/releases/tag/v19.53.2)): Regression specifications confirm that a projection combining `From` with `FromAll` materializes an instance for an event from an unrelated event source the same way in memory and in a running kernel. (#4266)
- **cli** ([Release v3.54.0](https://github.com/Cratis/cli/releases/tag/v3.54.0)): `cratis render --scope` on a module or feature whose slices were all removed now checks only application-level declarations, so errors in unrelated slices no longer block removing the scope's previously rendered files. Application-level errors still refuse the render and leave the published output untouched. (#334)
- **AI** ([Release v7.38.3](https://github.com/Cratis/AI/releases/tag/v7.38.3)): The Claude Code tool server no longer breaks a running server on the same port when a server that never started is disposed, and a failed start now retries on a new port instead of failing with a disposed listener; this removes an intermittent failure where a tool call was lost and the turn silently fell back to another pool member (#638)
- **Chronicle** ([Release v19.53.1](https://github.com/Cratis/Chronicle/releases/tag/v19.53.1)): A children projection identified by a nested member, such as `.IdentifiedBy(child => child.Identity.Id)`, now updates and removes the matching child instead of adding a new child for every event. This works in a running kernel on MongoDB, SQL and in-memory storage, and in `ReadModelScenario`. (#4779)
- **Stage** ([Release v4.80.0](https://github.com/Cratis/Stage/releases/tag/v4.80.0)): The live Stage no longer silently renders a model whose profile names a custom package as if the package were not there: without the package it says so instead of rendering a placeholder.
- **Screenplay** ([Release v4.145.1](https://github.com/Cratis/Screenplay/releases/tag/v4.145.1)): `propose-property` treats `seed` event values as fixtures. Renaming a property rewrites its seed assignments instead of leaving them stale, removing it removes them, and adding a required property writes `fixtureValue` into every seed entry of that event or refuses with `FixtureValueRequired` listing them. `find-references` and `dependencies` with `kind: "Property"` list seed values with role `fixture` (#681)
- **Screenplay** ([Release v4.145.1](https://github.com/Cratis/Screenplay/releases/tag/v4.145.1)): The documentation no longer calls `navigate … by <parameter>` or form `columns` legacy. Both are current: `by` passes the target screen's key, and `columns` sets field order and labels independently of `layout`'s geometry (#688)
- **AI** ([Release v7.38.0](https://github.com/Cratis/AI/releases/tag/v7.38.0)): Harness setup no longer deletes or overwrites files at adapter paths it did not generate; it reports the conflict and only replaces them with `--force` (#630)
- **Stage** ([Release v4.79.1](https://github.com/Cratis/Stage/releases/tag/v4.79.1)): Keyed lookup and filtered live queries whose argument concept has validation rules are rendered again instead of being refused with `STAGE-ESM-010`. The argument is accepted as its underlying primitive and converted inside the query, so a key that breaks the concept's rules finds no instance, matching the Screenplay reference, rather than failing validation. Composite or collection arguments that contain a validated concept are still refused, with a message that names the concept. (#350)
- **AI** ([Release v7.37.0](https://github.com/Cratis/AI/releases/tag/v7.37.0)): The Chronicle Kotlin client skill no longer says transactional appends return `Unit`; inside a unit of work they return a placeholder `AppendResult`, and the real results are on the unit of work after commit
- **Chronicle** ([Release v19.51.2](https://github.com/Cratis/Chronicle/releases/tag/v19.51.2)): A projection future is no longer lost when a catch-up or replay write fails. While a projection catches up or replays, a write that resolves a future is now made immediately with a known outcome instead of being buffered, and the future is removed only after that write succeeded. Failed writes are reported as failed partitions. (#4753)
- **Chronicle** ([Release v19.51.2](https://github.com/Cratis/Chronicle/releases/tag/v19.51.2)): Failures of buffered MongoDB projection writes during catch-up and replay are reported exactly once, and writes queued behind a failed batch are still written. (#4753)
- **Chronicle** ([Release v19.51.2](https://github.com/Cratis/Chronicle/releases/tag/v19.51.2)): A projection future stays registered if storing its resolution fails, instead of disappearing from memory while it is still stored. (#4753)
- **Chronicle** ([Release v19.51.1](https://github.com/Cratis/Chronicle/releases/tag/v19.51.1)): Projections that map nested members now apply the naming policy to every segment of the path. Before, only the first segment was camel-cased, so `.Set(m => m.Topic).To(e => e.Brief.Topic)` read `brief.Topic` from an event stored as `brief.topic` and left the property empty. This affected both a running kernel and `ReadModelScenario`. Nested paths in keys, parent keys, joins, children, counters, `FromAll`/`FromEvery` and the model-bound attributes are fixed the same way. The changed projection definition is rebuilt automatically under the default `Automatic` definition evolution; with `PartialOnly` or `Manual`, Chronicle raises a replay recommendation so you can rebuild it (#4493)
- **Chronicle** ([Release v19.51.1](https://github.com/Cratis/Chronicle/releases/tag/v19.51.1)): Model-bound attributes accept dotted member paths such as `[SetFrom<Briefed>($"{nameof(Briefed.Brief)}.{nameof(Brief.Topic)}")]` and validate every segment against the type, instead of rejecting them before the projection is built (part of #4493)
- **Chronicle** ([Release v19.51.1](https://github.com/Cratis/Chronicle/releases/tag/v19.51.1)): An event type migration's `DefaultValue` or `MapValues` for a `ConceptAs<T>` property now writes the plain underlying value, for example `"global"`, instead of `{"Value": "global"}`. Migrated events then deserialize into the concept as expected (#3941)
- **AI** ([Release v7.36.1](https://github.com/Cratis/AI/releases/tag/v7.36.1)): The Stage rendering, render and gap-fill, UI composition, read-surface and authoring-workflow guidance no longer tell agents that a guarded Close action and a double-click interaction are refused by design. Stage has run both since 4.65; on public CLI 3.53.1 with `cratis/stage:4.73.1` the live browser run offers Close only while the item is open, posts `CloseWorkItem`, hides Close afterwards, and navigates or notifies on a double click depending on the row (Cratis/Screenplay#671). `STAGE-SCENE-ACTION-001` and `STAGE-SCENE-INTERACTION-001` stay documented as the refusal for a guard Stage cannot evaluate. A verification spec now fails if the guidance says otherwise. (part of #536)
- **Arc** ([Release v22.77.0](https://github.com/Cratis/Arc/releases/tag/v22.77.0)): The Screenplay generator no longer states a reactor that returns several events as `produces` when Chronicle could refuse the batch differently from Screenplay: Chronicle appends a returned batch as one unit, while a Screenplay reaction appends each fact separately. When a later event can be rejected by a constraint (a unique property, a class-level `[Unique]`, or an `IConstraint` target), an earlier event closes the stream, or a constraint cannot be read, the reactor keeps its `file` reference and `SP0070` explains why. (part of #3093)
- **Arc** ([Release v22.77.0](https://github.com/Cratis/Arc/releases/tag/v22.77.0)): The Screenplay generator reads screen source with a scanner that understands strings, template literals, regular expressions and JSX text and attributes, so `//` inside a value such as `title="https://example.com"` is no longer cut off as a comment and an `import` inside a template literal is no longer read as an import. A screen that renders other components or HTML beside the Cratis Components it reads now reports each part it does not read with `SP0028`, and a screen whose source cannot be scanned reports that once instead of stating a partial structure. (#3095)
- **AI** ([Release v7.35.0](https://github.com/Cratis/AI/releases/tag/v7.35.0)): Arc identity guidance: forwarded identity headers are trusted only with `TrustForwardedIdentityHeaders=true`, discovery endpoints need authentication outside Development, and the `.cratis-iden

## Removed

- **Arc** ([Release v22.126.1](https://github.com/Cratis/Arc/releases/tag/v22.126.1)): The MongoDB integration no longer configures a Polly retry strategy that could never fire, because the collection interceptors already handle every error themselves. Retry, cancellation and error behavior are unchanged. The interception layer itself stays until the next major release. (part of #2858)
- **Chronicle** ([Release v19.88.2](https://github.com/Cratis/Chronicle/releases/tag/v19.88.2)): `Cratis.Chronicle.Testing` no longer ships the unused internal `InProcessChronicleConnection` and `InProcessServices` types; scenarios keep running on `ChronicleConnectionForTesting` and `TestingServices`, so nothing changes for consumers. (#4929)
- **cli** ([Release v3.73.0](https://github.com/Cratis/cli/releases/tag/v3.73.0)): The one-time automatic restart from `eventmodel` to `semantic` in `cratis run`, and the `engineFallback` member of its JSON output. A refusal now stops the container and exits with `5` on the engine that was selected. (part of #324)
- **AI** ([Release v7.51.1](https://github.com/Cratis/AI/releases/tag/v7.51.1)): Version tables, product-source pages and provenance history from these skills. (part of #662)
- **AI** ([Release v7.48.3](https://github.com/Cratis/AI/releases/tag/v7.48.3)): The toolchain skill's `versions.md`, `doc-contradictions.md` and `provenance.md` references. The documentation contradictions that still hold are tracked as issues on Cratis/Screenplay. (part of #662)

## Security

- **Screenplay** ([Release v4.216.0](https://github.com/Cratis/Screenplay/releases/tag/v4.216.0)): A destination-intent repair is refused, before the proposal is kept and again before files are installed, if any attachment it relies on overlaps a source, identity, journal, staging or backup path, including through physical aliases or uncertain links. A proposal is also refused at apply if its source, catalog, files on disk or attachments changed after review. (#397)
- **Arc** ([Release v22.121.0](https://github.com/Cratis/Arc/releases/tag/v22.121.0)): A non-public static helper on a read model can no longer be reached over HTTP as a query endpoint with caller-chosen arguments. (#3368)
- **Arc** ([Release v22.119.0](https://github.com/Cratis/Arc/releases/tag/v22.119.0)): Query health no longer exposes per-connection user IDs and client addresses to anonymous callers outside Development. (#2873)
- **Arc** ([Release v22.116.0](https://github.com/Cratis/Arc/releases/tag/v22.116.0)): A host `FallbackPolicy`, or Arc Core's requirement that callers authenticate when authentication handlers are registered, can no longer be bypassed by reaching an unannotated query through the observable query hub. (#2952)
- **Arc** ([Release v22.116.0](https://github.com/Cratis/Arc/releases/tag/v22.116.0)): An open hub connection whose session a guard revokes can no longer keep reading non-observable query results. (#2955)
- **Arc** ([Release v22.108.0](https://github.com/Cratis/Arc/releases/tag/v22.108.0)): A command declared with read protection `On` blocks on `Error` and `Unknown` validation results from validators, `Provide()` and `Handle()`, even when the caller sends a more permissive `X-Allowed-Severity`; callers can still accept warnings and information. An explicit `[BlockOnValidationSeverity]` still takes precedence, and `Off` and `Measure` are unchanged: under those modes, declare `[BlockOnValidationSeverity(ValidationResultSeverity.Error)]` on commands whose validators must not be skipped (#3332)
- **Orleans** ([Release v1.17.0](https://github.com/Cratis/Orleans/releases/tag/v1.17.0)): `Cratis.Orleans.Storage.Sql` references `System.Security.Cryptography.Pkcs` 10.0.13, replacing the 9.0.11 that Microsoft.Data.SqlClient brought in, which is affected by GHSA-846f-f764-76mx and GHSA-2fmv-rv2c-59x7.
- **Chronicle** ([Release v19.65.2](https://github.com/Cratis/Chronicle/releases/tag/v19.65.2)): The message of `ConflictingEnrollmentScope` no longer contains the event source identifier or any scope values. It only names the scope dimensions that differ, so a generated or sensitive identifier is not written to logs or responses that show the message. Read the values from the typed properties when you need them. (#4909)
- **Chronicle** ([Release v19.65.1](https://github.com/Cratis/Chronicle/releases/tag/v19.65.1)): The SQL storage provider now references System.Security.Cryptography.Pkcs 10.0.13 directly. Microsoft.Data.SqlClient 7.1.1, the latest release, otherwise brings in version 9.0.18, which is affected by GHSA-2fmv-rv2c-59x7 and GHSA-846f-f764-76mx. (#4912)
- **Arc** ([Release v22.95.2](https://github.com/Cratis/Arc/releases/tag/v22.95.2)): .NET 10 packages are updated from 10.0.12 to 10.0.13, and `System.Security.Cryptography.Pkcs` and `System.Security.Cryptography.Xml` are pinned at 10.0.13. This fixes advisories GHSA-2fmv-rv2c-59x7, GHSA-846f-f764-76mx, GHSA-c399-9853-6jmj, GHSA-7hqp-7c5m-4vq6 and GHSA-r955-8q5j-3h83. `Microsoft.OpenApi` moves to 2.12.2, which `Microsoft.AspNetCore.OpenApi` 10.0.13 requires. (#3282)
- **Chronicle** ([Release v19.64.2](https://github.com/Cratis/Chronicle/releases/tag/v19.64.2)): Move the .NET packages from 10.0.12 to 10.0.13. This clears the advisories against System.Security.Cryptography.Pkcs and System.Security.Cryptography.Xml 10.0.12, which arrive through Microsoft.AspNetCore.DataProtection: GHSA-2fmv-rv2c-59x7, GHSA-846f-f764-76mx, GHSA-7hqp-7c5m-4vq6, GHSA-c399-9853-6jmj and GHSA-r955-8q5j-3h83. (#4897)
- **cli** ([Release v3.59.1](https://github.com/Cratis/cli/releases/tag/v3.59.1)): The Chronicle workbench's terminal UI library, SharpConsoleUI, moves to 2.7.0, which no longer depends on SixLabors.ImageSharp. The five ImageSharp advisories (GHSA-gwg2-r3hj-4w44, GHSA-j3p4-wp97-rph4, GHSA-j9gm-c75j-xc9q, GHSA-jjfr-hcj7-qf5w, GHSA-wmxv-xphr-5c9g) no longer apply, and their NuGet audit suppressions are removed, so a future advisory in the dependency graph fails the build again. (#277)

## Deprecated

- **Arc** ([Release v22.129.0](https://github.com/Cratis/Arc/releases/tag/v22.129.0)): `GeneratedIdentifierEventsCannotBeSplit` is no longer thrown, because events for a generated source now append in one batch with the rest of the command's events. It is marked obsolete. (#3423)
- **Stage** ([Release v4.148.0](https://github.com/Cratis/Stage/releases/tag/v4.148.0)): The `eventmodel` Host engine is deprecated and will be removed in Stage v6. Selecting it logs a warning once at startup. (part of #23)
- **AI** ([Release v7.74.0](https://github.com/Cratis/AI/releases/tag/v7.74.0)): `RecordDecisionUsage`, `DecisionUsageRecorded`, `DecisionUsageByDay`, `RecordAIProviderUsageSnapshot` and `AIProviderUsageSnapshotRecorded` are obsolete. They remain so existing event stores still replay, and are removed in the next major release (part of #767).
- **Arc** ([Release v22.113.0](https://github.com/Cratis/Arc/releases/tag/v22.113.0)): `ReadRegionsCannotBeSuspended` is obsolete; Arc no longer throws it (#3242)
- **Chronicle** ([Release v19.57.0](https://github.com/Cratis/Chronicle/releases/tag/v19.57.0)): The `sequence` line in a capture's `source events` block. Stored declarations that still contain it keep working and log a deprecation warning; remove the line and rely on the `from` events' origin (#4700)
