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

| Repository | Previous version | Current version |
| --- | --- | --- |
| [AI](https://github.com/Cratis/AI) | [v7.1.2](https://github.com/Cratis/AI/releases/tag/v7.1.2) | [v7.6.5](https://github.com/Cratis/AI/releases/tag/v7.6.5) |
| [Ante](https://github.com/Cratis/Ante) | [v0.14.0](https://github.com/Cratis/Ante/releases/tag/v0.14.0) | [v1.2.10](https://github.com/Cratis/Ante/releases/tag/v1.2.10) |
| [Arc](https://github.com/Cratis/Arc) | [v22.31.0](https://github.com/Cratis/Arc/releases/tag/v22.31.0) | [v22.50.5](https://github.com/Cratis/Arc/releases/tag/v22.50.5) |
| [Arc.Kotlin](https://github.com/Cratis/Arc.Kotlin) | [v7.6.0](https://github.com/Cratis/Arc.Kotlin/releases/tag/v7.6.0) | [v7.7.0](https://github.com/Cratis/Arc.Kotlin/releases/tag/v7.7.0) |
| [Arc.TypeScript](https://github.com/Cratis/Arc.TypeScript) | [v0.43.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.43.0) | [v0.57.2](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.57.2) |
| [AuthProxy](https://github.com/Cratis/AuthProxy) | [v2.22.4](https://github.com/Cratis/AuthProxy/releases/tag/v2.22.4) | [v2.30.1](https://github.com/Cratis/AuthProxy/releases/tag/v2.30.1) |
| [Chronicle](https://github.com/Cratis/Chronicle) | [v19.4.9-hotfix.2](https://github.com/Cratis/Chronicle/releases/tag/v19.4.9-hotfix.2) | [v19.31.10](https://github.com/Cratis/Chronicle/releases/tag/v19.31.10) |
| [Chronicle.Elixir](https://github.com/Cratis/Chronicle.Elixir) | [v3.7.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.7.0) | [v3.10.1](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.10.1) |
| [Chronicle.Kotlin](https://github.com/Cratis/Chronicle.Kotlin) | [v6.6.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.6.0) | [v6.13.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.13.0) |
| [Chronicle.TypeScript](https://github.com/Cratis/Chronicle.TypeScript) | [v6.22.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.22.1) | [v6.49.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.49.0) |
| [cli](https://github.com/Cratis/cli) | [v3.21.0](https://github.com/Cratis/cli/releases/tag/v3.21.0) | [v3.27.1](https://github.com/Cratis/cli/releases/tag/v3.27.1) |
| [Components](https://github.com/Cratis/Components) | [v4.19.0](https://github.com/Cratis/Components/releases/tag/v4.19.0) | [v4.25.0](https://github.com/Cratis/Components/releases/tag/v4.25.0) |
| [Fundamentals](https://github.com/Cratis/Fundamentals) | [v7.19.6](https://github.com/Cratis/Fundamentals/releases/tag/v7.19.6) | [v7.22.4](https://github.com/Cratis/Fundamentals/releases/tag/v7.22.4) |
| [Fundamentals.Go](https://github.com/Cratis/Fundamentals.Go) | First release | [v0.3.2](https://github.com/Cratis/Fundamentals.Go/releases/tag/v0.3.2) |
| [Orleans](https://github.com/Cratis/Orleans) | [v1.12.2](https://github.com/Cratis/Orleans/releases/tag/v1.12.2) | [v1.15.2](https://github.com/Cratis/Orleans/releases/tag/v1.15.2) |
| [release-action](https://github.com/Cratis/release-action) | [v1.4.0](https://github.com/Cratis/release-action/releases/tag/v1.4.0) | [v1.4.1](https://github.com/Cratis/release-action/releases/tag/v1.4.1) |
| [Scene](https://github.com/Cratis/Scene) | [v4.2.0](https://github.com/Cratis/Scene/releases/tag/v4.2.0) | [v4.7.0](https://github.com/Cratis/Scene/releases/tag/v4.7.0) |
| [Screenplay](https://github.com/Cratis/Screenplay) | [v4.44.0](https://github.com/Cratis/Screenplay/releases/tag/v4.44.0) | [v4.63.1](https://github.com/Cratis/Screenplay/releases/tag/v4.63.1) |
| [Stage](https://github.com/Cratis/Stage) | [v4.21.0](https://github.com/Cratis/Stage/releases/tag/v4.21.0) | [v4.24.0](https://github.com/Cratis/Stage/releases/tag/v4.24.0) |
| [Templates](https://github.com/Cratis/Templates) | [v1.7.2](https://github.com/Cratis/Templates/releases/tag/v1.7.2) | [v1.7.3](https://github.com/Cratis/Templates/releases/tag/v1.7.3) |

## Added

- **Screenplay** ([Release v4.63.1](https://github.com/Cratis/Screenplay/releases/tag/v4.63.1)): A “See your event model” guide for opening the board in VS Code, an MCP App, an Arc application, the CLI explorer, or Studio, and generating a model from code. (#333)
- **Screenplay** ([Release v4.63.0](https://github.com/Cratis/Screenplay/releases/tag/v4.63.0)): Accepted proposals return `introducedExecutableErrors`, listing only the executable-model errors the proposal adds (code, message, path, line and column), and `executableGuidance` saying to fix them before `apply`. Errors the model already had are not repeated.
- **Screenplay** ([Release v4.63.0](https://github.com/Cratis/Screenplay/releases/tag/v4.63.0)): The server's initialization instructions state the rules a first proposal must follow: a specification that checks one read-model instance needs exactly one keyed query on that read model, an event given or appended `for` an identifier needs a command that produces it, and a specification of an authorized command or query needs `given caller`. Hosts without a Screenplay skill, such as Claude Desktop, now receive them.
- **Screenplay** ([Release v4.62.0](https://github.com/Cratis/Screenplay/releases/tag/v4.62.0)): Declare event sources and streams, then author command-level stream routes with `streamId` mappings and known-type validation. Executable binding rejects these declarations and routes with `PLAY0268` pending allocated ESM v10. (part of #302)
- **Screenplay** ([Release v4.62.0](https://github.com/Cratis/Screenplay/releases/tag/v4.62.0)): Report source/type ambiguity explicitly, preserve route candidates in syntax JSON, and select property syntax with the `@stream` escape. (part of #302)
- **Screenplay** ([Release v4.62.0](https://github.com/Cratis/Screenplay/releases/tag/v4.62.0)): Complete, inspect and navigate source/stream references in Monaco and VS Code, and display authored routes and readable key expressions in event-model board command details. (part of #302)
- **Screenplay** ([Release v4.62.0](https://github.com/Cratis/Screenplay/releases/tag/v4.62.0)): Browse paged source/stream inventories and exact references through MCP, including physical ownership confidence for incomplete documents, and preview typed edits that refuse unsafe changes. (part of #302)
- **Screenplay** ([Release v4.61.0](https://github.com/Cratis/Screenplay/releases/tag/v4.61.0)): Admit controlled occurrence time, reactions, clocks, application triggers and capture records into ESM v6 and reference specification execution. Includes Einar Ingebrigtsen’s implementation of the v6 model and reference evaluator. (#369)
- **Screenplay** ([Release v4.61.0](https://github.com/Cratis/Screenplay/releases/tag/v4.61.0)): Use `given clock` to assert occurrence timestamps and advance deterministic UTC schedules with `when clock`. (part of #304) (part of #87)
- **Screenplay** ([Release v4.60.0](https://github.com/Cratis/Screenplay/releases/tag/v4.60.0)): MCP exposes a versioned `repair-capabilities` contract for clients to discover supported repairs, evidence pinning, limits and cancellation behavior (part of #341)
- **Screenplay** ([Release v4.60.0](https://github.com/Cratis/Screenplay/releases/tag/v4.60.0)): Clients can opt into evidence-pinned repair proposals. The server retains validated attachment inputs and loading diagnostics, rejects drift during review and before installation, and refuses attachment references that overlap planned source or state writes (part of #341)
- **Screenplay** ([Release v4.60.0](https://github.com/Cratis/Screenplay/releases/tag/v4.60.0)): MCP failures include an additive `failureKind` discriminator, including recovery-required outcomes, so clients need not interpret message text (part of #341)
- **Fundamentals.Go** ([Release v0.3.1](https://github.com/Cratis/Fundamentals.Go/releases/tag/v0.3.1)): A compiled package-loading recipe demonstrates constructor planning with coherent type identity, explicit lifetime directives and separate loading errors and planner diagnostics. (#42)
- **cli** ([Release v3.26.0](https://github.com/Cratis/cli/releases/tag/v3.26.0)): Without a path or `.cratis/ai.json`, `cratis screenplay mcp` lets the server pick its workspace: the `path` given to `open-workspace`, then the single workspace root your MCP client offers, then the current directory when it already holds `.play` files. If none applies it asks for a path instead of guessing.
- **Screenplay** ([Release v4.59.0](https://github.com/Cratis/Screenplay/releases/tag/v4.59.0)): `screenplay mcp` can start without a root. It picks the model folder when it first needs one: a `path` given to `open-workspace`, then the single root the MCP client offers (re-read when the client changes its roots), then the folder it was launched from when that already holds `.play` files. If none applies it asks for a path instead of guessing.
- **Screenplay** ([Release v4.59.0](https://github.com/Cratis/Screenplay/releases/tag/v4.59.0)): `open-workspace` accepts an optional `path`, which also switches a session to another folder.
- **Screenplay** ([Release v4.59.0](https://github.com/Cratis/Screenplay/releases/tag/v4.59.0)): Open the board fullscreen and keep prompting: it checks the model on disk every couple of seconds while it is visible and redraws when a file changes, whether the assistant applied a change or you edited one by hand.
- **Screenplay** ([Release v4.59.0](https://github.com/Cratis/Screenplay/releases/tag/v4.59.0)): Workspace readiness reports whether the source is accepted for authoring separately from whether it is in the executable subset, so a full-language model is no longer described as broken.
- **Screenplay** ([Release v4.58.0](https://github.com/Cratis/Screenplay/releases/tag/v4.58.0)): Models can declare named external `system`s and reusable `operation`s, or declare an operation inline with `produces operation`. Operations describe typed inputs, the system they use, and optional execution and compensation intent using existing files, code blocks and implementation hints (part of #301)
- **Screenplay** ([Release v4.58.0](https://github.com/Cratis/Screenplay/releases/tag/v4.58.0)): Specifications can describe operation failure fixtures, requested operations and compensation expectations. Both compilers validate and print the new syntax; executable binding rejects it with `PLAY0268` until operation semantics are supported (part of #301)
- **Screenplay** ([Release v4.58.0](https://github.com/Cratis/Screenplay/releases/tag/v4.58.0)): Monaco and VS Code provide operation-aware completion, hover, highlighting, diagnostics and navigation without treating operations as events or giving them event destinations (part of #301)
- **Screenplay** ([Release v4.58.0](https://github.com/Cratis/Screenplay/releases/tag/v4.58.0)): MCP exposes revision-pinned systems, operation contracts, ordered productions and phase intent for inspection and typed authoring. The event model board presents readable operation intent without inventing event cards or execution results (part of #301)
- **Fundamentals.Go** ([Release v0.3.0](https://github.com/Cratis/Fundamentals.Go/releases/tag/v0.3.0)): `concepts.ParseDotNetGUID` explicitly converts .NET 10.0.12 `Guid.Parse` input forms to RFC-order UUID values. It supports N/D/B/P/X notation and the pinned runtime's compatibility behaviour without widening `ParseUUID`, JSON/text decoding, SQL scanning or consumer admission policies. (#28)
- **Fundamentals.Go** ([Release v0.3.0](https://github.com/Cratis/Fundamentals.Go/releases/tag/v0.3.0)): Pinned C# and typed-JavaScript dictionary-key fixtures, an opt-in reproducer and a compatibility reference covering embedded JSON property names, key equality, escaping and read/write/access differences. This evidence does not introduce a Go dictionary codec or shared serializer. (#18)
- **Screenplay** ([Release v4.57.0](https://github.com/Cratis/Screenplay/releases/tag/v4.57.0)): Command handlers can describe implementation intent with an `implementation` block containing ordered `hint` strings and an optional existing file or fenced-code source. Hints-only blocks represent pending implementation; existing direct attachment forms remain supported (part of #307)
- **Screenplay** ([Release v4.57.0](https://github.com/Cratis/Screenplay/releases/tag/v4.57.0)): MCP exposes a revision-pinned handler-intent inventory showing pending, file-backed and inline handlers, their hints and identity status. Inspection works without a successful executable model and refuses ambiguous ownership instead of choosing a scope (part of #307)
- **Screenplay** ([Release v4.57.0](https://github.com/Cratis/Screenplay/releases/tag/v4.57.0)): Both compilers, typed authoring, Monaco and VS Code support handler implementation blocks, with documentation and an Invoicing example. Handler execution remains unsupported; no AI runs during builds (part of #307)
- **Screenplay** ([Release v4.56.0](https://github.com/Cratis/Screenplay/releases/tag/v4.56.0)): Commands can describe generated UUID-backed values and a scalar `returns <property>` contract. Both compilers parse, validate and print these declarations; executable binding rejects them with `PLAY0268` until their semantics are supported (part of #300)
- **Screenplay** ([Release v4.56.0](https://github.com/Cratis/Screenplay/releases/tag/v4.56.0)): Commands can describe a `returns` block with named fields and inferred or explicit types. Specifications can state generated-value fixtures and scalar or record return expectations; these remain syntax-only (part of #303)
- **Screenplay** ([Release v4.56.0](https://github.com/Cratis/Screenplay/releases/tag/v4.56.0)): Monaco and VS Code provide highlighting, completion, hover and diagnostics for generated values and response contracts, including their syntax-only availability (part of #300)
- **Screenplay** ([Release v4.56.0](https://github.com/Cratis/Screenplay/releases/tag/v4.56.0)): MCP exposes response contracts and generated-value fixtures for inspection and revision-checked typed authoring. The event model board shows response details and excludes generated values from command request fields (part of #303)
- **Scene** ([Release v4.7.0](https://github.com/Cratis/Scene/releases/tag/v4.7.0)): Native PrimeReact renderers and galleries for charts and multi-state checkboxes. (#62)
- **Scene** ([Release v4.7.0](https://github.com/Cratis/Scene/releases/tag/v4.7.0)): Native PrimeReact file upload, data scroller, tree table and rich-text editor controls, accepting the numeric and Pascal case values of the original enums. (#63)
- **Scene** ([Release v4.7.0](https://github.com/Cratis/Scene/releases/tag/v4.7.0)): `FileUploadHandlerProvider` lets a host own file uploads and name the other origins an upload may target; other addresses are refused.
- **Scene** ([Release v4.7.0](https://github.com/Cratis/Scene/releases/tag/v4.7.0)): `QuillLoaderProvider` and the `@cratis/scene.primereact/quill` entry point switch rich-text editing on. Without them the editor shows its content read-only, sanitized, and says why, and the package builds without `quill` installed.
- **Scene** ([Release v4.6.0](https://github.com/Cratis/Scene/releases/tag/v4.6.0)): Native `chart` control rendered by Chart.js. It accepts the stable string types, the numeric values `0` to `7` and the Pascal case names of the earlier .NET chart type, shows an explicit empty state instead of a blank canvas, reports an unsupported type or a chart that cannot be drawn, and redraws only when its type, data or options change in content. Hosts that render charts must install `chart.js`. (#62)
- **Scene** ([Release v4.6.0](https://github.com/Cratis/Scene/releases/tag/v4.6.0)): Native `multiStateCheckbox` control that cycles through every authored state, keeps option values of any JSON type, follows `value` and `options` edits, announces its state without claiming to be checked, supports `readOnly`, and is themed with the PrimeReact checkbox tokens. State icons are PrimeIcons class names or qualified icon references. (#62)
- **Scene** ([Release v4.6.0](https://github.com/Cratis/Scene/releases/tag/v4.6.0)): `json` property value type for free-form configuration such as chart data, validated without being reshaped. (#62)
- **Scene** ([Release v4.6.0](https://github.com/Cratis/Scene/releases/tag/v4.6.0)): Descriptors for both controls, listing the legacy numeric chart types as choices so migrated values stay valid. (#62)
- **Fundamentals.Go** ([Release v0.2.0](https://github.com/Cratis/Fundamentals.Go/releases/tag/v0.2.0)): `concepts/conceptstypes` recognizes domain concepts from `go/types` using the same scalar kinds and declaration rules as runtime recognition, for generators and analysis tools. (#15)
- **Fundamentals.Go** ([Release v0.2.0](https://github.com/Cratis/Fundamentals.Go/releases/tag/v0.2.0)): `dependencyinjection/bindingtypes` plans constructor bindings, lifetimes and interface forwarding from checked Go packages and explicit configuration, with stable diagnostics. Generators own rendering; analysis never runs constructors. (part of #14)
- **Fundamentals.Go** ([Release v0.2.0](https://github.com/Cratis/Fundamentals.Go/releases/tag/v0.2.0)): Package `naming` provides acronym-friendly camel case, Pascal case and non-pluralizing default, camel-case and namespaced policies based on C# Fundamentals. Serializer defaults remain application-owned. (part of #21)
- **Fundamentals.Go** ([Release v0.2.0](https://github.com/Cratis/Fundamentals.Go/releases/tag/v0.2.0)): An unpublished `recipes` module demonstrates UUID-library conversions, resolver-only samber/do and dig bridges, Fx hosting of the Fundamentals provider, and package loading for compile-time concept recognition. Optional dependencies stay outside the core module. (#22)
- **Chronicle** ([Release v19.31.3](https://github.com/Cratis/Chronicle/releases/tag/v19.31.3)): *Attach Python Contract Release Assets* workflow: accepts only an exact `vMAJOR.MINOR.PATCH` tag of a published release, builds from that tag's source with the canonical generator, and attaches the wheel, sdist, `SHA256SUMS` and `provenance.json` to the same release without overwriting any existing asset (part of #4554)
- **Chronicle** ([Release v19.31.3](https://github.com/Cratis/Chronicle/releases/tag/v19.31.3)): Documentation for the temporary release-asset distribution of the Python contracts (part of #4554)
- **Arc** ([Release v22.50.0](https://github.com/Cratis/Arc/releases/tag/v22.50.0)): Screenplay analysis keeps the event source definition name and stream a reactor or reducer is filtered to in the new `ObservedEventSourceModel`, exposed as an optional `EventSource` on `ReactorModel` and `ProjectionModel`. The previous constructors still exist, so existing consumers compile and run unchanged. (part of #3009) (part of #2987)
- **Arc** ([Release v22.50.0](https://github.com/Cratis/Arc/releases/tag/v22.50.0)): `ARCCHR0014` warns when a reactor or reducer observes a stream its event source definition does not declare. Only the definition's own attributes are read, so definitions from referenced assemblies are checked the same way. (part of #3009) (part of #2987)
- **Arc** ([Release v22.50.0](https://github.com/Cratis/Arc/releases/tag/v22.50.0)): `SP0047` and `SP0048` diagnostics: the latest published Screenplay (`Cratis.Screenplay` 4.55.1) has no syntax to narrow a reaction or projection to an event source or stream, so the filter is reported instead of being silently dropped or invented. The observer is still emitted. (part of #3009) (part of #2987)
- **cli** ([Release v3.25.0](https://github.com/Cratis/cli/releases/tag/v3.25.0)): `cratis screenplay mcp install`, `status`, `update`, and `uninstall` for user-level desktop integration, with explicit client selection, version pinning, dry-run previews, and independent per-client results. Project-local AI registrations remain separate. (#229)
- **cli** ([Release v3.25.0](https://github.com/Cratis/cli/releases/tag/v3.25.0)): Claude Desktop MCPB acquisition from matching Cratis Screenplay releases, checksum verification, and a public OS install-dialog handoff. Trust confirmation and actual extension removal remain in Claude's UI; status never claims a private host installation was verified. (#230)
- **cli** ([Release v3.25.0](https://github.com/Cratis/cli/releases/tag/v3.25.0)): ChatGPT Desktop local-plugin source registration that preserves personal marketplace metadata and foreign plugins, rejects modified owned content, and safely resumes interrupted package cleanup. Restart ChatGPT and install/enable the source in Plugins. (#231)
- **cli** ([Release v3.25.0](https://github.com/Cratis/cli/releases/tag/v3.25.0)): [Desktop installation documentation](https://github.com/Cratis/cli/blob/main/Documentation/reference/screenplay-desktop-mcp.md) covering supported platforms, unsigned packages, approvals, ownership, updates, offline behavior, cleanup, and manual fallbacks.
- **Screenplay** ([Release v4.55.0](https://github.com/Cratis/Screenplay/releases/tag/v4.55.0)): Self-contained Screenplay MCP bundles for macOS Apple Silicon/Intel, Windows x64, and compatible Linux clients, with a model-folder setting and verified release downloads. Docker and .NET installation remain available. (part of #355)
- **Screenplay** ([Release v4.55.0](https://github.com/Cratis/Screenplay/releases/tag/v4.55.0)): A local Agent Plugin package with Screenplay instructions and branding for ChatGPT personal/repository marketplaces, without a hosted proxy. Public directory discovery awaits publisher approval for local MCP support. (part of #356)
- **Screenplay** ([Release v4.55.0](https://github.com/Cratis/Screenplay/releases/tag/v4.55.0)): Desktop-first installation guidance and a maintainer runbook for native packages, checksums, signing decisions, releases, and curated-directory submissions. (#357)
- **Screenplay** ([Release v4.54.0](https://github.com/Cratis/Screenplay/releases/tag/v4.54.0)): Monaco and the VS Code extension offer a quick fix for `PLAY0471` that removes an event `id` repeating the event's own name. A trailing comment on the `id` line prevents the fix
- **Chronicle.Kotlin** ([Release v6.13.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.13.0)): `@EventSource` and `@EventStream` definitions with a stable name, description and concurrency dimensions, discovered with the other artifacts and registered at startup. Duplicate source or stream names and blank names are rejected before anything is sent. (part of #123)
- **Chronicle.Kotlin** ([Release v6.13.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.13.0)): Definition-aware appends: `appendThroughEventSource` and `appendManyThroughEventSource`, `AppendOptions.eventSource`/`eventStream` (and `AppendOptionsBuilder.throughEventSource` for Java), and per-event `eventSource`/`eventStream` on `EventForEventSourceId` so one atomic batch can span definitions. Unknown sources, undeclared streams and routing that contradicts the definition fail with specific exceptions. (part of #123)
- **Chronicle.Kotlin** ([Release v6.13.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.13.0)): `EventContext.eventSource` carries the event source name on read and in reactor and reducer delivery. It is empty for events not appended through a definition. (part of #123)
- **Chronicle.Kotlin** ([Release v6.13.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.13.0)): Binary and source compatible with 6.12.0: `IEventStore` and `IClientArtifacts` gained no members (event sources are optional capabilities), and the constructors, `copy` methods and default arguments of `AppendOptions`, `EventForEventSourceId` and `EventContext` are preserved, so code compiled against 6.12.0 runs without recompiling.
- **Chronicle.Kotlin** ([Release v6.13.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.13.0)): Guide: [Event sources and streams](https://github.com/Cratis/Chronicle.Kotlin/blob/main/Documentation/guides/event-sources.md).
- **Chronicle.TypeScript** ([Release v6.49.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.49.0)): `@eventSource({ name?, description?, concurrency? })` and repeatable `@eventStream(name, { description?, concurrency? })` definitions, plus `ConcurrencyDimensions`. Definitions are discovered and registered with the Kernel at startup, right after event types. Duplicate source or stream names are rejected. (part of #228)
- **Chronicle.TypeScript** ([Release v6.49.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.49.0)): `AppendOptions.eventSource` / `eventStream` and the same per-event fields on `EventForEventSourceId` for `append` and `appendMany`, including mixed-source batches. The wire `EventSource` key and routing are set from the definition; unknown sources, undeclared streams, a stream without a source and contradicting explicit routing fail before anything is sent. (part of #228)
- **Chronicle.TypeScript** ([Release v6.49.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.49.0)): When no explicit concurrency scope is given, a definition's concurrency dimensions (a stream's, when it declares any) derive the scope; explicit scopes always win. Within `appendMany` and a committing unit of work, one event source id that needs differing guards (for example two stream ids) is rejected before anything is written, because the Kernel accepts one scope per event source id; pass an explicit shared `concurrencyScopes` entry or split the batch. Tracked in core as Cratis/Chronicle#4545. (part of #228)
- **Chronicle.TypeScript** ([Release v6.49.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.49.0)): `EventContext.eventSource` on reads, reactor and reducer deliveries; `undefined` for events appended without a definition. `IEventStore.eventSources` exposes the discovered definitions. (part of #228)
- **Chronicle.TypeScript** ([Release v6.49.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.49.0)): Documentation: [Event sources and streams](https://github.com/Cratis/Chronicle.TypeScript/blob/main/Documentation/event-sources.md). (part of #228)
- **Fundamentals.Go** ([Release v0.1.0](https://github.com/Cratis/Fundamentals.Go/releases/tag/v0.1.0)): Package `concepts` with `UUID`, `DateOnly`, `TimeOnly` and `TimeSpan`, using the canonical .NET wire forms: lowercase dashed UUIDs in RFC byte order, `yyyy-MM-dd` dates, 100 ns `TimeOnly` precision, and `TimeSpan` in the .NET constant format across the full signed tick range. Parsing is strict and failure-atomic, and JSON `null` is rejected for non-nullable values. (#2)
- **Fundamentals.Go** ([Release v0.1.0](https://github.com/Cratis/Fundamentals.Go/releases/tag/v0.1.0)): `concepts.Concept[T]` for declaring a domain value's scalar representation, `concepts.Underlying` for recognizing concepts and shared scalars from type metadata alone (exact scalar type, `ScalarKind`, pointer depth, and inspectable `*TypeError` reasons with stable values), and `concepts.CheckJSON` for validating encoded concept values against their declared representation. See [concept authoring and recognition](https://github.com/Cratis/Fundamentals.Go/blob/main/Documentation/concepts.md). (#4)
- **Fundamentals.Go** ([Release v0.1.0](https://github.com/Cratis/Fundamentals.Go/releases/tag/v0.1.0)): `concepts.UUID` implements `database/sql` `Scanner` and `Valuer`. Use `sql.Null[concepts.UUID]` for nullable columns. (#19)
- **Fundamentals.Go** ([Release v0.1.0](https://github.com/Cratis/Fundamentals.Go/releases/tag/v0.1.0)): Package `correlation` with `WithID` and `FromContext`, sharing one correlation ID through `context.Context` across Arc.Go and Chronicle.Go. Reads never generate an ID. (#8)
- **Fundamentals.Go** ([Release v0.1.0](https://github.com/Cratis/Fundamentals.Go/releases/tag/v0.1.0)): Package `dependencyinjection`, an optional contract with exact-type keys, typed bindings including `BindFunc1`–`BindFunc4` that derive dependencies from parameter types, owned and borrowed lifetimes, scopes, and stable error categories. Plain constructors need none of it. (#11)
- **Fundamentals.Go** ([Release v0.1.0](https://github.com/Cratis/Fundamentals.Go/releases/tag/v0.1.0)): Package `dependencyinjection/container`, a default container with graph validation at build time, singleton, scoped and transient lifetimes, reverse-order cleanup, a scope-factory facade and context guards. (#12)
- **Fundamentals.Go** ([Release v0.1.0](https://github.com/Cratis/Fundamentals.Go/releases/tag/v0.1.0)): Package `dependencyinjection/ditest` with conformance suites, so any container adapter can prove it meets the contract. See [dependency injection](https://github.com/Cratis/Fundamentals.Go/blob/main/Documentation/dependency-injection.md). (#13)
- **Fundamentals.Go** ([Release v0.1.0](https://github.com/Cratis/Fundamentals.Go/releases/tag/v0.1.0)): A [parity map](https://github.com/Cratis/Fundamentals.Go/blob/main/Documentation/parity.md) recording, for every C# Fundamentals area, what is implemented, what is intentionally different and what is planned. (#10)
- **Screenplay** ([Release v4.53.0](https://github.com/Cratis/Screenplay/releases/tag/v4.53.0)): Write an optional value as `Type optional`, for example `note String optional`, `lines InvoiceLine[] optional` or `filter status InvoiceStatus optional from status`. `optional` follows the complete type and comes before `identifier` and `from`; a property or type named `optional` still works (#340)
- **Screenplay** ([Release v4.53.0](https://github.com/Cratis/Screenplay/releases/tag/v4.53.0)): The legacy `Type?` spelling stays valid and reports `PLAY0479` (information), which does not fail `--warnaserror`. A typed repair, available through MCP, rewrites one occurrence or a whole document without reformatting it (#340)
- **Screenplay** ([Release v4.53.0](https://github.com/Cratis/Screenplay/releases/tag/v4.53.0)): Monaco and the VS Code extension highlight `optional`, complete and explain it, and offer quick fixes that rewrite `?` for one occurrence or the whole document. VS Code shows `PLAY0479` as deprecated (#340)
- **Screenplay** ([Release v4.53.0](https://github.com/Cratis/Screenplay/releases/tag/v4.53.0)): `reads X optional as y` reports that optional reads are not supported yet, and `identifier optional` reports that `optional` belongs before `identifier` (#340)
- **Chronicle** ([Release v19.31.0](https://github.com/Cratis/Chronicle/releases/tag/v19.31.0)): Adds typed event-source filters for reactors and reducers, with diagnostics for unknown streams and contradictory metadata.
- **Chronicle** ([Release v19.31.0](https://github.com/Cratis/Chronicle/releases/tag/v19.31.0)): Adds a live Event Sources Workbench view with definitions, owners, concurrency dimensions, and streams.
- **Chronicle** ([Release v19.31.0](https://github.com/Cratis/Chronicle/releases/tag/v19.31.0)): Shows the registered event source in sequence event details when available. (part of #4516)
- **Arc** ([Release v22.49.0](https://github.com/Cratis/Arc/releases/tag/v22.49.0)): Commands can append through registered event source definitions with `[EventSource<TSource>(stream)]`, preserving definition metadata and declared concurrency dimensions. (part of #2987)
- **Arc** ([Release v22.49.0](https://github.com/Cratis/Arc/releases/tag/v22.49.0)): Aggregate roots can declare `[EventSource<TSource>(stream)]`: the source type and stream come from the definition, appended events record the event source, and rehydration reads only the events in the scope the commit guards. `IAggregateRootContext` is unchanged; the declared source is carried by the optional `IAggregateRootEventSourceContext`, so existing custom implementations compile and run as before. (part of #2987)
- **Arc** ([Release v22.49.0](https://github.com/Cratis/Arc/releases/tag/v22.49.0)): Screenplay analysis reads `[EventSource<TSource>(stream)]` on commands, resolves the definition, its stream and declared concurrency, and reports with `SP0044`, `SP0045` and `SP0046` what the language cannot state yet. (part of #2987)
- **Arc** ([Release v22.49.0](https://github.com/Cratis/Arc/releases/tag/v22.49.0)): Analyzer `ARCCHR0013` suggests the event source definition for commands and aggregate roots whose `[EventSourceType]` and `[EventStreamType]` spell out a definition in the compilation. (part of #2987)
- **Chronicle.Elixir** ([Release v3.10.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.10.0)): `use Chronicle.EventSources.EventSource` with `stream/2` declares a named event source, its streams and default concurrency dimensions. Definitions are discovered with event types (or passed as `:event_sources`) and registered at startup; duplicate source or stream names are rejected. (part of #100)
- **Chronicle.Elixir** ([Release v3.10.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.10.0)): `:event_source` and `:event_stream` options on `append/3`, `append_many/3`, units of work and `append_many_for_event_sources/2`, plus per-entry `event_source`/`event_stream` on `EventForEventSourceId` for mixed-source transactions. Unknown sources, undeclared streams and contradicting explicit routing return clear errors before anything is sent. (part of #100)
- **Chronicle.Elixir** ([Release v3.10.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.10.0)): Appends through a definition use its concurrency dimensions as the scope unless an explicit `:concurrency_scope` is given. (part of #100)
- **Chronicle.Elixir** ([Release v3.10.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.10.0)): Reactor and reducer contexts expose `:event_source`, `nil` for events not appended through a registered source. (part of #100)
- **Chronicle.Elixir** ([Release v3.10.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.10.0)): Documentation: https://github.com/Cratis/Chronicle.Elixir/blob/main/Documentation/event-sources.md (part of #100)
- **Chronicle** ([Release v19.30.0](https://github.com/Cratis/Chronicle/releases/tag/v19.30.0)): Register optional event source definitions, their streams, and concurrency dimensions through the Kernel and .NET client.
- **Chronicle** ([Release v19.30.0](https://github.com/Cratis/Chronicle/releases/tag/v19.30.0)): Append events through a registered definition and expose the resolved event source in event metadata.
- **Chronicle** ([Release v19.30.0](https://github.com/Cratis/Chronicle/releases/tag/v19.30.0)): Support MongoDB, SQL, in-memory storage, scenarios, and .NET client documentation.
- **Chronicle** ([Release v19.30.0](https://github.com/Cratis/Chronicle/releases/tag/v19.30.0)): Reject duplicate sequence numbers inside an in-memory append batch without partially appending it. (part of #4516)
- **Screenplay** ([Release v4.52.0](https://github.com/Cratis/Screenplay/releases/tag/v4.52.0)): A typed repair for `PLAY0471` removes an event `id` that only repeats the event's own name (#299)
- **Screenplay** ([Release v4.52.0](https://github.com/Cratis/Screenplay/releases/tag/v4.52.0)): Renaming an event through the workspace or MCP pins the previous name with `id "<old name>"` by default, so stored events keep their identity. Setting `eventNeverPersisted` skips the pin and drops a redundant one, renaming back removes the pin, and all generations of an event keep the same identity (#299)
- **Screenplay** ([Release v4.52.0](https://github.com/Cratis/Screenplay/releases/tag/v4.52.0)): An explicit refactoring, available through MCP as `propose-extract-inline-event`, moves an inline `produces event` into a standalone event in its slice. The event keeps its identity, description, documentation, tags and comments, and the executable model is unchanged (#299)
- **Screenplay** ([Release v4.52.0](https://github.com/Cratis/Screenplay/releases/tag/v4.52.0)): A typed repair for `PLAY0469` on an inline event removes the identifier copied into its payload. It is marked as a change to the event contract, is never part of a bulk fix, and is not offered when anything else uses the event (#299)
- **Screenplay** ([Release v4.51.0](https://github.com/Cratis/Screenplay/releases/tag/v4.51.0)): `produces event <Name>` declares an event inside a command with an indented body of typed mappings, tags, an optional `for`, `description` and `documentation`. It compiles to the same executable model as a standalone event plus a `produces`, and the event belongs to its slice (#299)
- **Screenplay** ([Release v4.51.0](https://github.com/Cratis/Screenplay/releases/tag/v4.51.0)): An omitted `for` on an inline production means the command's identifier when every production targets the same event source; mixing an inline and a plain omission, or targeting another source without stating every `for`, reports `PLAY0470` (#299)
- **Screenplay** ([Release v4.51.0](https://github.com/Cratis/Screenplay/releases/tag/v4.51.0)): Standalone and inline events accept `description` (one line, or a fenced `text` or `markdown` block) and `documentation` (a fenced `markdown` block). They are authoring metadata and do not change the executable model (#299)
- **Screenplay** ([Release v4.51.0](https://github.com/Cratis/Screenplay/releases/tag/v4.51.0)): An optional `id "<old name>"` on an event keeps its identity after a rename; an `id` equal to the event's own name is reported as redundant (#299)
- **Screenplay** ([Release v4.51.0](https://github.com/Cratis/Screenplay/releases/tag/v4.51.0)): New diagnostics `PLAY0469` to `PLAY0477` report identifier payload copies, missing destinations, redundant or malformed `id`, inline name collisions, inline events outside commands, inline `generation`, reserved system metadata and malformed documentation (#299)
- **Screenplay** ([Release v4.51.0](https://github.com/Cratis/Screenplay/releases/tag/v4.51.0)): Monaco and the VS Code extension highlight, complete, hover and validate inline events, navigate to them, and show an inlay hint for the implied `for` when the destination is certain (#299)
- **Screenplay** ([Release v4.51.0](https://github.com/Cratis/Screenplay/releases/tag/v4.51.0)): The event model board and the MCP server's declaration index and details include inline events, with a `declares` relationship from their command (#299)
- **Screenplay** ([Release v4.51.0](https://github.com/Cratis/Screenplay/releases/tag/v4.51.0)): The TypeScript compiler parses command productions, including inline events, with the same syntax and diagnostics as the C# compiler (#299)
- **Screenplay** ([Release v4.50.0](https://github.com/Cratis/Screenplay/releases/tag/v4.50.0)): A typed repair for `PLAY0166` declares an undeclared produced event in the producing slice, with property types taken from the command properties it maps (concepts are kept) and `DateTime` for `$context.occurred`. The repair is not offered when a type is uncertain or conflicting, the producers are in other files, or the workspace has parse errors (#298)
- **Screenplay** ([Release v4.50.0](https://github.com/Cratis/Screenplay/releases/tag/v4.50.0)): `PLAY0478` (information) reports a plain `produces <Event>` without `for` in a command that has one required scalar identifier, in the compiler, Monaco and the VS Code extension (#305)
- **Screenplay** ([Release v4.50.0](https://github.com/Cratis/Screenplay/releases/tag/v4.50.0)): A typed repair for `PLAY0478` states `for <identifier>` on the production. It is not offered when it would change the model's language or semantic version, or where any other production's events land (#305)
- **Screenplay** ([Release v4.50.0](https://github.com/Cratis/Screenplay/releases/tag/v4.50.0)): Both repairs are available through the MCP server's repair tools, and the repairs view lists only repairs that a proposal will accept (#298)
- **Screenplay** ([Release v4.50.0](https://github.com/Cratis/Screenplay/releases/tag/v4.50.0)): The command examples in the commands documentation are compiled by the test suite so they stay valid (#305)
- **Chronicle.TypeScript** ([Release v6.48.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.48.0)): Add `readModels.createWatcher(Model, options?)` with subscription readiness, `onResubscribed` callbacks, opt-in resumption through a callback or `resume: true`, cancellation and disposal, change kind and context, and an optional `maxBuffered` overflow-failure limit. Changes from `watch()` now also carry optional change kind and context. (#200)
- **Scene** ([Release v4.5.0](https://github.com/Cratis/Scene/releases/tag/v4.5.0)): `SceneDocumentChangeValidation.Validate` in `Cratis.Scene.Engine` checks that a changed Scene document stays within what its screen, template or layout may change: inherited content is unchanged, a screen sets only what its template exposed, collection operations and editable fields stay within what was granted, and a re-exposure never passes on more than its owner. A server can now hold a client that bypassed the editor to the same rules. See https://github.com/Cratis/Scene/blob/main/Documentation/editing/server-validation.md (Cratis/StudioIssues#464)
- **Scene** ([Release v4.5.0](https://github.com/Cratis/Scene/releases/tag/v4.5.0)): `EditingScope`, `ExposureDeclaration`, `ExposedProperty`, `InstanceContribution`, `ContributedItem` and `CollectionOperation` in `Cratis.Scene.Model`, mirroring `@cratis/scene.model` (Cratis/StudioIssues#464)
- **Scene** ([Release v4.5.0](https://github.com/Cratis/Scene/releases/tag/v4.5.0)): A shared fixture corpus (`document-change-fixtures.json`) that the TypeScript editing engine and the .NET validator both run, so they agree on what is allowed and why (Cratis/StudioIssues#464)
- **Chronicle.TypeScript** ([Release v6.47.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.47.0)): Reactors and reducers can be limited to an event source type and event stream type with the `@eventSourceType('...')` and `@eventStreamType('...')` class decorators, alongside tag filters. A reactor's declared source and stream types are also applied to the events it returns, unless an `EventForEventSourceId` sets its own. Defaults are unchanged. (#198)
- **Chronicle.TypeScript** ([Release v6.46.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.46.0)): Composite key parts in projections can come from event context properties, the event source id or constant values with `set(target).toEventContextProperty(...)`, `.toEventSourceId()` and `.toValue(...)`, alongside event properties with `.to(...)` or the existing `set(target, accessor)`. They produce the same key expressions as the .NET client. Chronicle 19.26.2 ignores custom keys on root joins, resolves composite parent keys only in limited cases and uses a child-join key as the root document key; see the [composite keys guide](https://github.com/Cratis/Chronicle.TypeScript/blob/main/Documentation/composite-keys.md). (#193)
- **Chronicle.TypeScript** ([Release v6.45.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.45.0)): Reactor handlers receive a `ReactorDelivery` as their fourth argument, an identity for the delivery made of the reactor, event store, namespace, event sequence, partition and sequence number. It stays the same across retries and replays and uses the same key format as the .NET client, so applications can keep their own receipts. `ReactorScenario` supplies the same identity. It does not make delivery exactly-once. (#197)
- **Chronicle.TypeScript** ([Release v6.44.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.44.0)): `@fromAllEvents` subscribes a model-bound read model to every event type and applies its mappings to children, matching fluent `fromAll()` and .NET `[FromAll]`. Adopting it changes the projection definition and can trigger a replay, and because a model shares one all-event block, unrelated events can create rows or clear mapped properties, including those of the model's other `@fromEvery`/`@fromAll` mappings. Declared only on a child model, it does not populate the child's values yet ([Cratis/Chronicle#4524](https://github.com/Cratis/Chronicle/issues/4524)). (#192)
- **Screenplay** ([Release v4.49.0](https://github.com/Cratis/Screenplay/releases/tag/v4.49.0)): `cratis/screenplay` Docker image with the `screenplay` CLI and MCP server for linux/amd64 and linux/arm64, published to Docker Hub on release: `docker run -i --rm -v "$PWD/specifications:/model" cratis/screenplay mcp /model`
- **Screenplay** ([Release v4.49.0](https://github.com/Cratis/Screenplay/releases/tag/v4.49.0)): MCP documentation section with setup for Claude Code, Codex, VS Code and Claude Desktop, and guides with prompts to create, explore, view and edit a model
- **Screenplay** ([Release v4.49.0](https://github.com/Cratis/Screenplay/releases/tag/v4.49.0)): Documentation for the event model board the MCP server draws in hosts that render MCP Apps, with which clients show it
- **Chronicle.Elixir** ([Release v3.9.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.9.0)): Read-model keys can combine parts with `{:composite, parts}` and map a part to an event-context property with `{:event_context, path}`, such as the ISO week number `"Occurred.Week"`, producing the same projection definition as the .NET client. (#59)
- **Arc.TypeScript** ([v0.57.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.57.0)): Turn off command/query catalogs and HTTP OpenAPI in any environment with `introspection.enabled: false` or `Cratis:Arc:Introspection:Enabled=false` (`Cratis__Arc__Introspection__Enabled=false` in deployment environment variables), while retaining identity-discovery access rules and in-process metadata APIs. (#164)
- **Arc.TypeScript** ([v0.56.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.56.0)): Configure discovery with `introspection.requireAuthentication` and `introspection.roles`. Roles are a comma-separated list, any one of which grants access, and imply authentication in every environment. (#158)
- **Arc.TypeScript** ([v0.56.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.56.0)): Override the discovery environment in code with `environmentName`, taking precedence over `DOTNET_ENVIRONMENT`, `ASPNETCORE_ENVIRONMENT`, and `NODE_ENV`. This option is code-only and does not change exception exposure. (#158)
- **Chronicle.TypeScript** ([Release v6.42.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.42.0)): Fluent `fromAll(...)` subscribes projections to every event type, including undeclared types, with property mappings, event-context mappings, and counters. (part of #192)
- **AI** ([Release v7.6.0](https://github.com/Cratis/AI/releases/tag/v7.6.0)): `cratis-arc-command-operation` skill: when to return an `ICommandOperation` from a model-bound command instead of calling a service inside `Handle()`, how to declare `Execute()`/`Compensate()`, the supported return shapes including `CommandOperations`, commit-aware compensation and recovery, the runtime rejections to expect, and how to specify the decision, the operation and the pipeline with `CommandScenario`. Selected by the `cratis/arc/core` profile. (#474)
- **Chronicle.TypeScript** ([Release v6.41.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.41.0)): `EventScenario` and `ReactorScenario` builders accept routing and append options with `forEventSource(id, options)`, so `given` history and `when` actions can target an event source type, event stream type and event stream id. Routed events go through the same validation, scoped constraints and rollback as `append` and `appendMany`, and reactors see the recorded route in their event context. `ReadModelScenario.given.forEventSource(id, options)` accepts only the default route. (part of #129)
- **Screenplay** ([Release v4.48.0](https://github.com/Cratis/Screenplay/releases/tag/v4.48.0)): `import "<path or glob>"` imports `.play` files relative to the importing file, with `**`, `*`, `?` and `..`. At the top level it brings in whole documents; inside a `module` or `feature` it places each imported file there, so a file can hold just a `slice`. A file matched by several imports is imported once, at the deepest placement. See [Imports](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/imports.md).
- **Screenplay** ([Release v4.48.0](https://github.com/Cratis/Screenplay/releases/tag/v4.48.0)): `screenplay <file>` compiles the application that file is the root of, and `IPlayFileCompiler.CompileApplication(path)` does the same from code. Folder compilation, workspaces and the executable semantic model resolve imports the same way.
- **Screenplay** ([Release v4.48.0](https://github.com/Cratis/Screenplay/releases/tag/v4.48.0)): Specification actions: `given clock` and `when clock`, `when trigger`, `given capture` and `when capture`, and `when query` with `then result [exactly]` and `then no result`. `when query` binds to the executable model today; the others are checked against the application and fail closed until the executable model admits them.
- **Screenplay** ([Release v4.48.0](https://github.com/Cratis/Screenplay/releases/tag/v4.48.0)): Diagnostics `PLAY0454`–`PLAY0460` for file imports and `PLAY0461`–`PLAY0468` for specification actions.
- **Screenplay** ([Release v4.48.0](https://github.com/Cratis/Screenplay/releases/tag/v4.48.0)): The VS Code extension validates a workspace folder as one application: names declared in other files are not reported as unknown, and a file an import places is checked in its placement. Import paths and specification steps are highlighted, explained on hover and completed in VS Code and Monaco.
- **Screenplay** ([Release v4.48.0](https://github.com/Cratis/Screenplay/releases/tag/v4.48.0)): The event model board shows what sets off a specification that is not a command.
- **Screenplay** ([Release v4.48.0](https://github.com/Cratis/Screenplay/releases/tag/v4.48.0)): Sample applications in [`Samples`](https://github.com/Cratis/Screenplay/tree/main/Samples): Library, Invoicing (every construct in the language), Commerce and TimeTracking (focused files composed with imports).
- **Screenplay** ([Release v4.48.0](https://github.com/Cratis/Screenplay/releases/tag/v4.48.0)): The `@cratis/screenplay-compiler` package parses file imports and specification actions, and `compileApplication` assembles an application from a map of documents.
- **cli** ([Release v3.24.0](https://github.com/Cratis/cli/releases/tag/v3.24.0)): `cratis chronicle observers clear-partition-quarantine <observer> <partition>` clears the quarantine of a single failed partition that exhausted its retry attempts, resets its retry budget and starts the retry; `--no-retry` only clears. It needs Chronicle 19.29.0 or later and says so when the server does not support it. (#223)
- **Screenplay** ([Release v4.47.0](https://github.com/Cratis/Screenplay/releases/tag/v4.47.0)): `visualize-model` draws the model on disk as an event model board in the host's view, for hosts that advertise the MCP Apps extension (`io.modelcontextprotocol/ui`). Other clients see the server unchanged. See [See a model as an event model board with MCP](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/mcp-visualization.md).
- **Screenplay** ([Release v4.47.0](https://github.com/Cratis/Screenplay/releases/tag/v4.47.0)): `visualize-model` with a `proposalId` shows what an outstanding proposal would make of the application, before `apply`.
- **Screenplay** ([Release v4.47.0](https://github.com/Cratis/Screenplay/releases/tag/v4.47.0)): `visualize-model` with a `sketch` of whole `.play` documents draws a what-if over the model on disk without validating it as a proposal or writing it.
- **Screenplay** ([Release v4.47.0](https://github.com/Cratis/Screenplay/releases/tag/v4.47.0)): The board switches between the current and the proposed model, offers detail level, properties and connection style, draws again from the model, and goes fullscreen where the host allows it. The model is told what the change adds and removes; the documents go only to the board.
- **Components** ([Release v4.25.0](https://github.com/Cratis/Components/releases/tag/v4.25.0)): `ToolbarFolder` `presentation='drawer'`: a visible heading, a close button and labeled icon tiles driven by a host-supplied `items` catalogue and/or `ToolbarButton` children. Tile payloads are delivered unchanged on activation and on drag, disabled tiles stay focusable with a reason, and the drawer flips and shifts to stay inside the viewport. The icon-only grid and list presentations are unchanged. (#358)
- **Components** ([Release v4.25.0](https://github.com/Cratis/Components/releases/tag/v4.25.0)): `OrderedItemEditor`: edits an ordered collection of items with a label, an icon and a destination. It lists locked fixed items separately, enforces per-operation and per-field capabilities, validates entries, and reorders by dragging, with the handle's arrow keys, or with labeled move buttons while keeping focus and announcing the new position. The icon field is the Components icon picker, fed by an `iconCatalog` and restricted by `allowedIcons`, with `renderIconField` as an override. (#358)
- **Components** ([Release v4.25.0](https://github.com/Cratis/Components/releases/tag/v4.25.0)): `PropertyControls`: text, number, on/off and choice controls described by host descriptors in titled groups, for flow, grid-placement, freeform-placement and responsive settings. (#358)
- **Components** ([Release v4.25.0](https://github.com/Cratis/Components/releases/tag/v4.25.0)): `ConfigurationEditorProvider`, `ConfigurationEditor` and `useConfigurationEditor`: register a component-specific editor under a host-defined component type, with generic controls as the fallback. (#358)
- **Components** ([Release v4.25.0](https://github.com/Cratis/Components/releases/tag/v4.25.0)): `messages.toolbar.closeDrawer` on `CratisComponentsProvider` for the drawer's close button, and styling parts for the drawer and both editors.
- **Chronicle** ([Release v19.29.0](https://github.com/Cratis/Chronicle/releases/tag/v19.29.0)): `ClearPartitionQuarantine` operation on the `Observers` service (with `ClearPartitionQuarantineResponse`) clears the quarantine of a single failed partition, starts a new retry budget for it while keeping its attempt history, and can retry it immediately. Every refusal has its own outcome: not found, not quarantined, or the observer itself being quarantined. (#4407)
- **Chronicle** ([Release v19.29.0](https://github.com/Cratis/Chronicle/releases/tag/v19.29.0)): `ClearFailedPartitionQuarantineFor<TReactor>()` in the .NET client clears and optionally retries a quarantined reactor partition.
- **Scene** ([Release v4.4.0](https://github.com/Cratis/Scene/releases/tag/v4.4.0)): `IconReference` (`{ library, key, variant? }`) in `@cratis/scene.model` and `Cratis.Scene.Model.Icons`, with text form, parsing and equality shared between C# and TypeScript. (#52)
- **Scene** ([Release v4.4.0](https://github.com/Cratis/Scene/releases/tag/v4.4.0)): `PackageKind.IconLibrary` and `ScenePackage.iconLibrary` for declaring an icon library's variants, supported renderers and attribution, plus `IconEntry` for renderer-neutral catalog records. (#52)
- **Scene** ([Release v4.4.0](https://github.com/Cratis/Scene/releases/tag/v4.4.0)): `resolveIconLibraries` and `EffectiveIconCatalog` in `@cratis/scene.engine`: active icon libraries with provenance, on-demand catalogs, search by text, category, library and variant, and diagnostics for missing library, icon or variant, incompatible version and unavailable catalog. (#52)
- **Scene** ([Release v4.4.0](https://github.com/Cratis/Scene/releases/tag/v4.4.0)): `EditingContext.iconCatalog` (optional): setting an icon as a template instance, or adding or editing a collection item's icon, is refused when the library, icon or variant is missing or the library version is incompatible. `inspect` and `diagnoseIcons` report stored icons that no longer resolve as warnings and keep the values. (#52)
- **Scene** ([Release v4.4.0](https://github.com/Cratis/Scene/releases/tag/v4.4.0)): `analyzeIconImpact` and `collectIconUsages` report which stored icon references, including instance overrides and collection-item icons, a library removal or upgrade would break, and list legacy icon strings with migration candidates, without rewriting anything. (#52)
- **Scene** ([Release v4.4.0](https://github.com/Cratis/Scene/releases/tag/v4.4.0)): `SceneIcon`, `IconAdapter`, `IconAdapterRegistry` and `IconAdapterProvider` in `@cratis/scene.react` draw a reference through the adapter for its library with size, color and accessible label, loading artwork per icon. `core:navigationBar` draws item icons through them. (#52)
- **Scene** ([Release v4.4.0](https://github.com/Cratis/Scene/releases/tag/v4.4.0)): `ScenePackageBundle.iconLibrary` and `mergeIconAdapters`; `validatePackageBundle` checks an icon-library bundle against its manifest. (#52)
- **Scene** ([Release v4.4.0](https://github.com/Cratis/Scene/releases/tag/v4.4.0)): Documentation for packaging an icon library, looking up and rendering icons, icons in editing, migrating existing icon values and the reasoning behind library-qualified references. (#52)
- **Components** ([Release v4.24.0](https://github.com/Cratis/Components/releases/tag/v4.24.0)): `IconPicker` in `@cratis/components/IconPicker`: a controlled icon property control whose closed trigger shows the selected glyph and name and whose popout offers search by name, tag and alias, category groups with Show all, and library filtering over a host-supplied catalog. (#359)
- **Components** ([Release v4.24.0](https://github.com/Cratis/Components/releases/tag/v4.24.0)): Selections are qualified `library`, `key` and optional `variant` values, so the same icon name in two libraries stays distinct. A selection missing from the catalog is shown by its raw identity with a warning instead of being replaced. (#359)
- **Components** ([Release v4.24.0](https://github.com/Cratis/Components/releases/tag/v4.24.0)): Read-only, disabled and `allowed` restrictions that never emit an unauthorized change, plus loading, empty, no-results and provider-failure states. (#359)
- **Components** ([Release v4.24.0](https://github.com/Cratis/Components/releases/tag/v4.24.0)): Lazily drawn previews, a library credit line, a contained sheet on narrow viewports, keyboard navigation with focus return, and stable `data-cratis-part` styling parts with an `IconPicker/styles` stylesheet. (#359)
- **Chronicle** ([Release v19.28.0](https://github.com/Cratis/Chronicle/releases/tag/v19.28.0)): Chronicle records an alert in its system event sequence when a partition keeps failing past the grace period, escalates it when the partition runs out of retries, and raises one when an observer is quarantined. Each incident is cleared when the partition recovers or is cleared, or when the quarantine ends. The `Alerts` configuration section now takes effect. Delivering alerts to email or chat comes later. [Understand recorded incidents](https://github.com/Cratis/Chronicle/blob/main/Documentation/hosting/alerting-on-observer-failures.md) describes what is recorded and when. (part of #4424)
- **Chronicle.Kotlin** ([Release v6.12.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.12.0)): Composite-key builders can map a key part to an event-context property with `toEventContextProperty`, such as the ISO week number `Occurred.Week`, producing the same projection definition as the .NET client. (#89)
- **Orleans** ([Release v1.14.0](https://github.com/Cratis/Orleans/releases/tag/v1.14.0)): `JobsOptions.MaxConcurrentRehydration` (default 8), `MaxConcurrentCleanup` (default 4) and `MaxConcurrentStepStarts` (default 16) bound how many jobs are resumed, how many dead jobs are deleted and how many steps of one job are started at once.
- **Orleans** ([Release v1.14.0](https://github.com/Cratis/Orleans/releases/tag/v1.14.0)): `MongoDBJobsStorageOptions.TransientRetryCount` (default 5) and `TransientRetryBaseDelay` (default 200 ms): job and job step storage retry `MongoWaitQueueFullException`, `TimeoutException`, `MongoConnectionException` and `MongoExecutionTimeoutException` with exponential backoff and jitter, log each retry, and surface the original exception when the attempts run out. Non-transient errors are never retried.
- **Orleans** ([Release v1.14.0](https://github.com/Cratis/Orleans/releases/tag/v1.14.0)): Documentation of the new options and of the MongoDB connection pool settings that matter for jobs (`MaxConnectionPoolSize`, `MaxConnecting`, one shared client).
- **AuthProxy** ([Release v2.30.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.30.0)): Bearer routes configured through `Services:<name>:BearerRoutes[]`, with path prefixes, issuers, audiences, required scopes, protected-resource metadata URLs, tenant claims, identity providers and claim mappings. The deployment's proxy-wide and service `Authorization.RequiredClaims` apply to bearer-token principals after claim mappings; a route can add its own `RequiredClaims` and set `IgnoreDeploymentRequiredClaims` to leave the deployment's requirements out, which is logged at startup. Invalid route configuration stops AuthProxy at startup, including resource-metadata paths at or below any bearer-route prefix, bearer routes on a service with `StripPathPrefix`, and bearer prefixes that overlap another service's `PathPrefix` on any host. Surrounding whitespace in configured issuer identifiers and tenant claim names is trimmed. (#143)
- **AuthProxy** ([Release v2.30.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.30.0)): Access-token validation with exact issuer and metadata matching, JWKS signature verification, RS256 or ES256, an issuer-configured access-token `typ` (`at+jwt` and `application/at+jwt` by default), exact route audiences (a trailing slash names a different audience), required expiry and a single subject. Encrypted, unsigned and HMAC tokens are refused. (#143)
- **AuthProxy** ([Release v2.30.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.30.0)): Cached issuer keys, with rate-limited unknown-key refresh awaited by the requesting caller before validation is retried. Automatic refreshes run in the background while ordinary callers use cached keys. Failed metadata retrieval backs off for 30 seconds, including before the first success, and preserves previously trusted keys during an outage. (#143)
- **AuthProxy** ([Release v2.30.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.30.0)): Tenancy read only from the route's tenant claim (`tid` by default); a missing usable tenant gives 403. Claim mappings cannot overwrite the tenant claim or declare targets differing only by case, and mapped identity fields must be single-valued. (#143)
- **AuthProxy** ([Release v2.30.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.30.0)): API-style refusals: 401 with `resource_metadata` or `invalid_token`, 403 for insufficient scope or denied access, 400 for ambiguous paths (`%`, `\`, `;`, repeated `/` separators or dot segments), and 503 when trusted issuer keys are unavailable. Refusals, including unsupported methods on resource-metadata paths, are `no-store`. (#143)
- **AuthProxy** ([Release v2.30.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.30.0)): Forwarded `x-cratis-token-scope` and `x-cratis-token-client-id` headers, plus bearer-route configuration and authentication guides with a Direct example. (#143)
- **AuthProxy** ([Release v2.30.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.30.0)): Bearer requests honor the backend, service and root `ActivityTimeout` settings in that order, falling back to five minutes and applying configuration reloads to subsequent requests. (#143)
- **Chronicle.TypeScript** ([Release v6.40.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.40.0)): Opt a client into the shared Cratis convention span names with `telemetry.spanNames: 'convention'` (for example `cratis.chronicle.client.event_sequence.append`); the default stays `'legacy'`, so existing span names are unchanged until the next major. `WellKnownTelemetryNames.conventionSpans` exports the new names. (part of #171)
- **Chronicle.TypeScript** ([Release v6.40.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.40.0)): Spans carry `cratis.chronicle.event_sequence.has_events`, `cratis.chronicle.event_stream.type` and `cratis.chronicle.event_stream.id` next to their `chronicle.*` counterparts, and the [observability guide](https://github.com/Cratis/Chronicle.TypeScript/blob/main/Documentation/observability.md) maps every legacy span, attribute and metric to its convention name so dashboards and alerts can move before the next major. (part of #171)
- **Scene** ([Release v4.3.0](https://github.com/Cratis/Scene/releases/tag/v4.3.0)): Property and component descriptors that packages ship next to their components, with a `descriptors` list on the package bundle and descriptors for the `core` and `Cratis.Components` components. (#51)
- **Scene** ([Release v4.3.0](https://github.com/Cratis/Scene/releases/tag/v4.3.0)): `inspect` and `applyEdit` in `@cratis/scene.engine`: node provenance, effective values and editability, and pure immutable edits for properties, layout type changes, and inserting, moving and removing nodes. Refused edits return the original document and diagnostics. (#51)
- **Scene** ([Release v4.3.0](https://github.com/Cratis/Scene/releases/tag/v4.3.0)): Layout type capabilities and conversions, with lossy conversions refused until the author accepts what is dropped. (#51)
- **Scene** ([Release v4.3.0](https://github.com/Cratis/Scene/releases/tag/v4.3.0)): Exposure and instance configuration: templates expose properties and collection operations, nested templates re-expose and only narrow, screens store their own contributions apart from the template, and `resolveEffectiveConfiguration` merges them for both the editor and the renderer. (#51)
- **Scene** ([Release v4.3.0](https://github.com/Cratis/Scene/releases/tag/v4.3.0)): `QueryCandidate` and `QueryBinding` contracts with `validateBinding`, and `IconReference` and `DestinationReference` value types. (#51)
- **Scene** ([Release v4.3.0](https://github.com/Cratis/Scene/releases/tag/v4.3.0)): A `core:navigationBar` component whose items a template can expose to its screens. (#51)
- **Scene** ([Release v4.3.0](https://github.com/Cratis/Scene/releases/tag/v4.3.0)): `SceneElementView` accepts a resolved `configuration` to render a configured template. (#51)
- **Scene** ([Release v4.3.0](https://github.com/Cratis/Scene/releases/tag/v4.3.0)): Documentation for editing, exposure and query binding. (#51)
- **cli** ([Release v3.23.0](https://github.com/Cratis/cli/releases/tag/v3.23.0)): `cratis view` opens a .NET application as an event model in the browser. Run it in the folder of a `.csproj`: it serves the read-only event model explorer Arc ships on a local web server and opens a browser window on it
- **cli** ([Release v3.23.0](https://github.com/Cratis/cli/releases/tag/v3.23.0)): The documents shown are the Screenplay documents embedded in the project's built output assembly (Debug by default) and the assemblies it references; when there are none, or the project has not been built, they are generated from the project's source in memory
- **cli** ([Release v3.23.0](https://github.com/Cratis/cli/releases/tag/v3.23.0)): `--configuration`, `--framework`, `--port`, `--from-source` and `--no-browser` options for `cratis view`
- **Arc** ([Release v22.48.0](https://github.com/Cratis/Arc/releases/tag/v22.48.0)): `Cratis.Arc.Screenplay.Embedded.Generation` package: generates the Screenplay documents an application embeds - the same documents the event model explorer serves - from one or more Roslyn compilations, without writing them anywhere
- **Arc** ([Release v22.48.0](https://github.com/Cratis/Arc/releases/tag/v22.48.0)): `EventModelExplorer` answers the explorer's hierarchy, document sources and board models independent of HTTP, so another host can serve the same viewer over its own documents
- **Arc** ([Release v22.48.0](https://github.com/Cratis/Arc/releases/tag/v22.48.0)): `IEventModelResources`, with `AssemblyEventModelResources` and `InMemoryEventModelResources`, lets `EventModelCatalog` read documents generated in memory the same way it reads embedded ones
- **Arc** ([Release v22.48.0](https://github.com/Cratis/Arc/releases/tag/v22.48.0)): `EmbeddedDocumentGeneration.ToResources` turns generated documents into resources the explorer can serve directly
- **Arc** ([Release v22.48.0](https://github.com/Cratis/Arc/releases/tag/v22.48.0)): `EmbeddedViewerAssets.Viewer` and `TryReadIndex` give access to the viewer's own page and assets
- **Arc.TypeScript** ([v0.55.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.55.0)): Configure or disable proxy-generator fallback scans with `--watch-poll-interval <ms>` or `watchPollInterval`; `0` turns them off. (#159)
- **Chronicle.TypeScript** ([Release v6.39.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.39.0)): `EventScenario` checks unique constraints on single Guid and safe-integer properties the way the kernel does, including Guid casing and `1`/`1.0` equivalence, as captured from the Chronicle kernel; date, object, fractional and other unproven keys remain rejected. See #173.
- **Orleans** ([Release v1.13.0](https://github.com/Cratis/Orleans/releases/tag/v1.13.0)): `IJobTypesCatalog`, implemented by the built-in job type registry, lets job storage restrict queries to registered job types. (#30)
- **Arc.TypeScript** ([v0.54.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.54.0)): Command and query duration metrics and execution spans report canonical outcome attributes: `cratis.arc.command.outcome` and `cratis.arc.query.outcome`, with `success`, `validation`, `authorization`, `append_rejected`, `cancelled`, and `error` values. Query measurements and spans also report `cratis.arc.query.transport` as `snapshot`, `observable`, or `unknown`, based on the returned result rather than the delivery protocol. (#153)
- **Arc.TypeScript** ([v0.54.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.54.0)): `cratis.arc.command.outcomes` counts completed command executions by command type and outcome, using the same attributes as command duration. Validate-only commands do not increment it. (#153)
- **Arc.TypeScript** ([v0.54.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.54.0)): `WellKnownTelemetryNames` exposes span-name and outcome/transport attribute constants; exported `OperationOutcome` and `QueryTransport` enums provide the supported values. (#153)
- **Chronicle.TypeScript** ([Release v6.38.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.38.0)): `ReadModelScenario` now evaluates a single root `.join()` or `@join` in-process when the joining event's event source id matches a string property of the read model, as captured from the Chronicle kernel: a new read model picks up the latest earlier joining event, a joining event updates every read model with that key, key changes and removal followed by recreation behave like the kernel, and AutoMap inheritance, overrides and exclusions apply. Multiple or child joins, `removedWithJoin`, joins combined with arithmetic, children or initial state, and joins on custom, context or constant keys are rejected before replay with an `UnsupportedProjectionOperation`. (part of #106)
- **Chronicle.TypeScript** ([Release v6.37.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.37.0)): Query established behavior through `eventStore.patterns`: `getPatternsAt(scope, moment?, { alsoConstraining })` answers what a scope usually does at a moment, deriving `Day` and `TimeBucket` from the moment's own offset (defaulting to now), while `getPatterns(scope, facetSet)`, `getUsualActions`, `getPatternsForScope` and `getScopes` expose the lower-level queries. `toTimeBucket`, `toDayOfWeek`, `FacetSet`, `FacetName`, `TimeBucket` and `DayOfWeek` share the same day and time-bucket rule the kernel mines with. (#57)
- **AuthProxy** ([Release v2.29.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.29.0)): Forward the signed-in user's access token to a service's backend for its own audience by setting `AccessToken.Scopes` or `AccessToken.Resource`. Tokens remain server-side, and cached and renewed per session and audience. Backend requests receive `Authorization: Bearer`, or `401` when no token can be obtained. Requests that capture mismatched token policies and destinations during a reload receive `503` before a token is obtained; retry after the reload completes. Frontend routes, anonymous paths and machine callers with their own bearer token remain unchanged. See [Forwarding the user's access token](https://github.com/Cratis/AuthProxy/blob/main/Documentation/configuration/services.md#forwarding-the-users-access-token). (#155)
- **AuthProxy** ([Release v2.29.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.29.0)): Keep token sessions active with authenticated cookie activity when `Session.SlidingExpiration` is enabled, remove them on logout, and back off for 30 seconds per audience after `invalid_grant`. (#155)
- **Chronicle.TypeScript** ([Release v6.36.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.36.0)): `ReadModelScenario` now evaluates root projection arithmetic in-process: add, subtract, count, increment and decrement, declared through fluent builders or legacy and standard decorators, with the kernel's starting values, decimal precision and AutoMap behavior, as captured from the Chronicle kernel. (part of #106)
- **Chronicle.TypeScript** ([Release v6.36.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.36.0)): Arithmetic the in-process evaluator cannot reproduce — `uint32`, nullable or non-numeric accumulators, cleared accumulators, nested, context or literal operands, operand names with a non-leading underscore (Cratis/Chronicle#4491), arithmetic inside children, and joins — is rejected before replay with an `UnsupportedProjectionOperation` naming the reason. (part of #106)
- **AuthProxy** ([Release v2.28.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.28.0)): OIDC providers can use certificate files, certificate stores, Key Vault certificates, federated token files or managed identity instead of a client secret. Configure `ClientCredential.Source`; `ClientSecret` remains the default, and conflicting or incomplete credentials prevent startup. Certificate files preserve configured PFX passwords, including whitespace-only passwords. See [Client credentials](https://github.com/Cratis/AuthProxy/blob/main/Documentation/configuration/authentication.md#client-credentials-certificates-and-federated-credentials) for configuration, rotation and Key Vault requirements. (#149)
- **AuthProxy** ([Release v2.28.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.28.0)): Certificate and federated credentials authenticate authorization-code redemption and pushed authorization requests using `client_assertion`. Expired certificate reloads retry at most once per minute, including unavailable replacements and loading failures. Managed identity defaults to the token-exchange audience for the authority's national cloud unless overridden. (#149)
- **Arc.TypeScript** ([v0.53.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.53.0)): Arc records command and query durations as `cratis.arc.command.duration` and `cratis.arc.query.duration`, histograms in seconds tagged with `cratis.arc.command.type` or `cratis.arc.query.name`, using the same names, units and bucket boundaries as Arc for .NET. Arc for .NET's outcome and transport attributes are not recorded yet. Failed executions are measured; validate-only requests are not. (#148)
- **Arc.TypeScript** ([v0.53.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.53.0)): Arc's spans carry `cratis.arc.command.type` and `cratis.arc.query.name` beside the existing `command_type` and `query_name` attributes. (#148)
- **Arc.TypeScript** ([v0.53.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.53.0)): The `Cratis.Arc` tracer and meter report the `@cratis/arc.core` package version. (#148)
- **Arc.TypeScript** ([v0.53.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.53.0)): `WellKnownTelemetryNames`, exported from `@cratis/arc.core`, holds the instrumentation scope and metric names. (#148)
- **Arc.TypeScript** ([v0.53.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.53.0)): `ChronicleRegistration.readModelNamingPolicy` overrides the collection name Chronicle stores a read model in. Passing it together with your own `client` throws, because Arc can't apply it to a client it doesn't create.
- **Chronicle** ([Release v19.27.0](https://github.com/Cratis/Chronicle/releases/tag/v19.27.0)): Opt-in MongoDB database isolation with `storage.databaseNamePrefix`, covering Chronicle databases, read models, jobs, and Orleans cluster state while leaving existing names unchanged by default. Connection strings are used unchanged. See [MongoDB database-name prefix configuration](https://github.com/Cratis/Chronicle/blob/main/Documentation/hosting/configuration/storage.mdx#database-name-prefix). (part of #4126)
- **Chronicle** ([Release v19.27.0](https://github.com/Cratis/Chronicle/releases/tag/v19.27.0)): `Storage.MongoDB.Specs` can run against an external MongoDB through `CHRONICLE_MONGODB_CONNECTION_DETAILS`, using unique database names and removing only the databases they create. See [Running against an external MongoDB](https://github.com/Cratis/Chronicle/blob/main/Documentation/contributing/integration-tests.md#running-against-an-external-mongodb). (part of #4126)
- **Chronicle.TypeScript** ([Release v6.35.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.35.0)): Add the `@handles(EventType)` method decorator so a reactor or reducer handler can name the event type it handles instead of relying on a camelCase method name. It works with both legacy (`experimentalDecorators`) and standard decorators, together with `@onceOnly`, `@replay` and `ReactorScenario`; the camelCase convention remains the default. (#166)
- **Chronicle.TypeScript** ([Release v6.34.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.34.0)): Trace context is propagated over every gRPC call to the kernel, including streams, keep-alive and reconnects, with baggage restricted to `cratis.correlation_id`. Client-owned background work (keep-alive, reactor and reducer observation, reconnects, token refresh, compatibility checks) no longer inherits the trace or correlation of whichever call started it. (part of #171)
- **Chronicle.TypeScript** ([Release v6.34.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.34.0)): Spans carry the shared `cratis.*` attributes (for example `cratis.event_store.name`, `cratis.event_sequence.id`, `cratis.event_type.id`) next to the existing `chronicle.*` attributes, and new seconds-based metrics are recorded next to the existing millisecond metrics. `WellKnownTelemetryNames` exports the names. (part of #171)
- **Chronicle.TypeScript** ([Release v6.34.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.34.0)): A per-client `logger` option accepts an `IChronicleLogger` for structured client diagnostics; without one, diagnostics still go through OpenTelemetry `diag` via `DiagChronicleLogger`. Logged gRPC failures include `rpc.grpc.status_code`. (part of #171)
- **Chronicle.TypeScript** ([Release v6.34.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.34.0)): A per-client `telemetry.eventSourceId` option records event source ids on spans either raw or as an HMAC-SHA256 with your key. (part of #171)
- **Chronicle.TypeScript** ([Release v6.33.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.33.0)): Add `readModels.releaseDocument(type, document)` to release the personal data in a stored read model document, honoring both its default `__subject` and per-property `__subjects` like the kernel. It returns a new released document without `__subject`/`__subjects`, leaves the input untouched, and rejects the whole call if any release the kernel reports as failed. (#151)
- **Chronicle.TypeScript** ([Release v6.32.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.32.0)): `EventScenario` in `@cratis/chronicle/testing` now checks scoped constraints kernel-free: single-string property constraints, single-event-type constraints and two-type removal cycles in every scope combination, with ownership, replacement, removal, cycle release and atomic batch rollback applied per scope, as captured from the Chronicle kernel. (part of #129)
- **Chronicle.TypeScript** ([Release v6.32.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.32.0)): `EventScenario.append` now accepts the `sourceType`, `streamType` and `streamId` routing options. (part of #129)
- **AuthProxy** ([Release v2.27.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.27.0)): Services can declare `Hosts` and/or `PathPrefix` alongside `x-cratis-microservice` (or legacy `Service-ID`) and `?service=` selection. A path prefix takes precedence over explicit service selection, which takes precedence over a host-only route. Prefix API routes target the backend and other prefix routes target the frontend, falling back to the backend when no frontend is configured. `StripPathPrefix` removes the prefix and announces it in `X-Forwarded-Prefix`, including on anonymous paths. Set `ClientCredentials.RoutePrefix` to the external API prefix, such as `/reporting/api`, for bearer requests under `/reporting`. Host declarations accept Unicode and punycode names; ambiguous host and prefix declarations are refused at startup. See [Routing by host or path prefix](https://github.com/Cratis/AuthProxy/blob/main/Documentation/configuration/services.md#routing-by-host-or-path-prefix). (#150)
- **AI** ([Release v7.5.0](https://github.com/Cratis/AI/releases/tag/v7.5.0)): Claude Code and Pi now guard `gh pr create` and `gh pr edit` for target Cratis repositories with release-note or release-intent workflow callers, including targets selected by PR URLs, `--repo`, or `GH_REPO`, and current-branch edits without a PR selector. Use a prewritten `--body-file` when submitting a description and exactly one `major`/`minor`/`patch`/`no-release` label; Dependabot's generated descriptions remain exempt. (#470)
- **AI** ([Release v7.5.0](https://github.com/Cratis/AI/releases/tag/v7.5.0)): `cratis-check-pr.mjs` offers the same checks directly and warns on offline fallbacks. Floating `@main` callers still validate descriptions using bundled release-note rules when the shared rules cannot be fetched. Summary-only `no-release` descriptions are accepted without inventing a change list; other release-note contract violations are rejected. (#470)
- **AuthProxy** ([Release v2.26.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.26.0)): `Cratis:AuthProxy:DataProtection:Store` selects where the key ring is persisted: `FileSystem` (the default, still driven by `DataProtectionKeysPath`), `AzureBlob` or `Redis`. Azure Blob Storage supports managed identity authentication through `DefaultAzureCredential`. Existing deployments are unaffected. (#151)
- **AuthProxy** ([Release v2.26.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.26.0)): `Cratis:AuthProxy:DataProtection:KeyVault:KeyIdentifier` encrypts newly generated Data Protection keys with an Azure Key Vault key before storage, in any of the three stores. Existing plaintext keys remain usable and are not retroactively encrypted; existing encrypted keys still require their original vault keys and versions. (#151)
- **AuthProxy** ([Release v2.26.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.26.0)): AuthProxy refuses to start when the key store configuration is incomplete, contradictory or names an unsupported store, including undefined numeric values, and the message names the setting. Configuring an `AzureBlob` or `Redis` section requires selecting that store explicitly rather than leaving `Store` at its `FileSystem` default. (#151)
- **AuthProxy** ([Release v2.26.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.26.0)): Documentation of the multi-replica setup for each store and how to retain an existing ring or deliberately start a fresh encrypted ring. See [Data Protection keys](https://github.com/Cratis/AuthProxy/blob/main/Documentation/configuration/data-protection.md). (#151)
- **Fundamentals** ([Release v7.22.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.22.0)): Add the independent `Cratis.OpenTelemetry` package with `AddCratisOpenTelemetry` and composable `WithCratis` setup for `Cratis.*` traces and metrics, ASP.NET Core and HttpClient instrumentation, runtime metrics, and scoped, formatted logs. (#1142)
- **Fundamentals** ([Release v7.22.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.22.0)): Configure service identity, sampling, metric export intervals, and conditional OTLP export through standard `OTEL_*` settings supplied by the environment or `IConfiguration`. Nonempty environment values take precedence, including SDK disablement for application-registered telemetry pipelines; empty values are treated as unset. Export supports per-signal endpoints, protocols, headers, and disable controls, and no OTLP exporter is added without an endpoint. (#1142)
- **Fundamentals** ([Release v7.22.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.22.0)): Resolve host configuration lazily when composing with `WithCratis()`, or supply separate telemetry configuration without replacing the application's `IConfiguration`. Compose with DI-backed resource detectors and keyed instrumentation services, preserving existing service names and versions unless overridden by standard telemetry settings. (#1142)
- **Fundamentals** ([Release v7.22.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.22.0)): Provide assembly service-version fallbacks, provider-level Cratis instrumentation subscriptions, and callbacks for optional application instrumentation; see the [OpenTelemetry setup guide](https://github.com/Cratis/Fundamentals/blob/main/Documentation/csharp/opentelemetry.md). (#1142)
- **Fundamentals** ([Release v7.21.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.21.0)): Support explicit metric and span tag names with `Cratis.Diagnostics.TagAttribute` and UCUM unit arguments for counters and gauges. Existing two-argument counter and gauge declarations remain supported, and units and explicit tag keys preserve quotes, backslashes, and line breaks. (#1140)
- **Fundamentals** ([Release v7.21.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.21.0)): Support generated scoped and unscoped histogram measurements, recording through the supplied meter instance even when the same method is used with differently named or versioned meters. (#1140)
- **Fundamentals** ([Release v7.21.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.21.0)): Support instrumentation scope versions in `AddNamedActivitySource` and `AddNamedMeter`, retaining the existing overloads and their default versions. Per-type activity sources must be explicitly subscribed to by your telemetry provider. (#1140)
- **AuthProxy** ([Release v2.24.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.24.0)): `ActivityTimeout` at the root (`Cratis:AuthProxy:ActivityTimeout`), per service under `Services` and per `Backend`/`Frontend` endpoint; the most specific value wins and the default stays five minutes. Values must be between one millisecond and 2,147,483,647 milliseconds (about 24 days), inclusive; values outside this range stop AuthProxy at startup with a message naming the setting. (#153)
- **AuthProxy** ([Release v2.24.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.24.0)): Unsupported activity timeout settings stop AuthProxy at startup with a message naming each setting: `Registration:ActivityTimeout` and `ActivityTimeout` on `Invite:Lobby` or any of its endpoints. Remove these settings and configure the proxied service's `Backend` or `Frontend` timeout under `Services` instead. (#153)
- **AuthProxy** ([Release v2.24.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.24.0)): Aspire `WithActivityTimeout` and `WithServiceActivityTimeout` to set the limit from an app host. (#153)
- **AuthProxy** ([Release v2.24.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.24.0)): Documentation of streaming through AuthProxy: heartbeats, interaction with platform idle limits, and when a stream is authorized. See [Timeouts and streaming](https://github.com/Cratis/AuthProxy/blob/main/Documentation/configuration/services.md#timeouts-and-streaming). (#153)
- **Components** ([Release v4.23.0](https://github.com/Cratis/Components/releases/tag/v4.23.0)): `MarkdownEditor` (`@cratis/components/MarkdownEditor`): a markdown editor with a formatting toolbar, keyboard shortcuts, a write/preview toggle and file uploads, styled through `--cratis-*` tokens and `pt` parts (part of Cratis/Direct#1275)
- **Components** ([Release v4.23.0](https://github.com/Cratis/Components/releases/tag/v4.23.0)): Configurable completion for `MarkdownEditor`: give it trigger characters or patterns (for example `#`) and a callback that returns suggestions. The editor shows the list and inserts the chosen item (part of Cratis/Direct#1275)
- **AI** ([Release v7.4.0](https://github.com/Cratis/AI/releases/tag/v7.4.0)): `SetAIProviderHarnesses` sets the complete list of agent harnesses a provider may run jobs through, rejecting duplicates, unknown providers and harnesses the provider's vendor or credential cannot run. An empty list disables harness dispatch for that provider without affecting chat completions (Cratis/Direct#936)
- **AI** ([Release v7.4.0](https://github.com/Cratis/AI/releases/tag/v7.4.0)): `AIProvider` and `ConfiguredAIProvider` expose `SupportedHarnesses` and `HasHarnessSelection`, so a consumer can tell a provider that was never configured apart from one that was deliberately disabled (Cratis/Direct#936)
- **AI** ([Release v7.4.0](https://github.com/Cratis/AI/releases/tag/v7.4.0)): Copilot providers now appear in `ConfiguredAIProvider`, with their credential kept current as they connect and disconnect (Cratis/Direct#936)
- **Screenplay** ([Release v4.46.4](https://github.com/Cratis/Screenplay/releases/tag/v4.46.4)): Each persona gets its own row on the board, with its description shown when hovering its name. A slice's screens are drawn in the rows of the personas whose policies satisfy the slice's `authorize` gates. A screen nothing gates, or that no persona may use, stays with the generic user.
- **Screenplay** ([Release v4.46.4](https://github.com/Cratis/Screenplay/releases/tag/v4.46.4)): Clicking a prototype thumbnail opens it full size, and hovering a slice's name says what type of slice it is.
- **Screenplay** ([Release v4.46.4](https://github.com/Cratis/Screenplay/releases/tag/v4.46.4)): The TypeScript compiler (`@cratis/screenplay-compiler`) reads personas, `authorize` on modules, features, commands and queries, captures, the events a reaction trigger produces and the commands it invokes, and projection mappings and automap settings. It reports the same diagnostics as the C# compiler.
- **Arc** ([Release v22.44.0](https://github.com/Cratis/Arc/releases/tag/v22.44.0)): `Cratis.Arc.Screenplay.Embedded` package: generates Screenplay documents from your application during the build, organizes them into assembly, module and feature documents, and embeds them in the assembly. Source generators run first, so generated commands and queries are included, and Screenplay diagnostics are reported in the build with their severity. (#2942)
- **Arc** ([Release v22.44.0](https://github.com/Cratis/Arc/releases/tag/v22.44.0)): Event-model explorer at `/.cratis/event-model`: a hierarchy of the embedded documents, the event-model board with zoom controls and a View menu (detail level, properties, arrows or lines) whose choices are remembered in the browser, and the source of each document, read-only in Monaco with Screenplay syntax highlighting. Map it with `app.MapCratisEventModel()`, optionally requiring authorization. See [Embedded event-model explorer](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/embedded-event-model.md).
- **Arc** ([Release v22.44.0](https://github.com/Cratis/Arc/releases/tag/v22.44.0)): The `Cratis` package now includes the explorer: Debug builds embed the documents and `UseCratis()` serves the explorer when the application is a debug build. Release builds do neither unless enabled. Configure it, require authorization or turn it off with `AddCratisEventModelViewer(...)`.
- **Screenplay** ([Release v4.46.3](https://github.com/Cratis/Screenplay/releases/tag/v4.46.3)): Modules, features and slices on the event model board in VS Code can be collapsed and expanded from their headers.
- **Arc** ([Release v22.42.0](https://github.com/Cratis/Arc/releases/tag/v22.42.0)): `WellKnownDiagnostics.ActivitySourceName` and `WellKnownDiagnostics.MeterName` for registering Arc with OpenTelemetry without repeating `"Cratis.Arc"` (part of #2915)
- **Arc** ([Release v22.42.0](https://github.com/Cratis/Arc/releases/tag/v22.42.0)): `WellKnownTelemetryNames` and `WellKnownOperationOutcomes` with every span, attribute, event, metric and outcome name Arc records, for dashboards, alerts and tests (part of #2915)
- **Arc** ([Release v22.42.0](https://github.com/Cratis/Arc/releases/tag/v22.42.0)): Child spans for authorization (`cratis.arc.command.authorize`), validators (`cratis.arc.validator.invoke`), `Provide()` (`cratis.arc.command.provide`) and `Handle()` (`cratis.arc.command.handle`), each carrying the command or validator type. A validator gets one span per validation rather than one per item it validates, and one validation adds at most 16 (part of #2915)
- **Arc** ([Release v22.42.0](https://github.com/Cratis/Arc/releases/tag/v22.42.0)): Command and query spans carry `cratis.arc.command.type` or `cratis.arc.query.name`, `cratis.arc.query.transport` (`snapshot` or `observable`), `cratis.correlation_id`, `cratis.tenant` once the pipeline has established it, and an outcome of `success`, `validation`, `authorization`, `append_rejected`, `cancelled` or `error` (part of #2915)
- **Arc** ([Release v22.42.0](https://github.com/Cratis/Arc/releases/tag/v22.42.0)): With the Chronicle integration, command spans carry `cratis.arc.command.key.type`, the type the command declares its event source id as and never the id itself (part of #2915)
- **Arc** ([Release v22.42.0](https://github.com/Cratis/Arc/releases/tag/v22.42.0)): Rejected commands and queries add `cratis.arc.validation.failed` events (member, severity and reason, never the message) or a `cratis.arc.authorization.denied` event, and an exception adds an `exception` event with the exception type only. Only an `error` sets a span's status to `Error`: validation, authorization and append rejections, an `IValidationFailure` thrown from `Handle()`, `Provide()` or a validator, and a cancelled operation leave it unset (part of #2915)
- **Arc** ([Release v22.42.0](https://github.com/Cratis/Arc/releases/tag/v22.42.0)): Metrics on the `Cratis.Arc` meter: `cratis.arc.command.duration` and `cratis.arc.query.duration` histograms and a `cratis.arc.command.outcomes` counter, limited to a fixed 1,000 command types or query names each, with the rest recorded as `_other`. HTTP requests turned away while Arc prepares authorization are traced and measured too. See [Observability](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/observability.md) (part of #2915)
- **Chronicle** ([Release v19.26.0](https://github.com/Cratis/Chronicle/releases/tag/v19.26.0)): A `chronicle-observer-quarantined` counter records each time an observer is quarantined, so you can alert on observer quarantine as well as on partitions that ran out of retries. (#4427)
- **Screenplay** ([Release v4.46.1](https://github.com/Cratis/Screenplay/releases/tag/v4.46.1)): Screens declared in a slice are drawn as prototypes in a User row on the board: titles, actions, tables, summaries, sections, template slots and inline code, laid out as a sketch of the screen.
- **Screenplay** ([Release v4.46.1](https://github.com/Cratis/Screenplay/releases/tag/v4.46.1)): A View toolbar in the upper right of the board chooses the detail level (Full or Overview), whether properties are shown, and whether slices are connected with arrows or lines. The choice is kept while the board is open.
- **Screenplay** ([Release v4.46.1](https://github.com/Cratis/Screenplay/releases/tag/v4.46.1)): The white Cratis mark watermarks the upper left of the board.
- **Screenplay** ([Release v4.46.1](https://github.com/Cratis/Screenplay/releases/tag/v4.46.1)): `@cratis/screenplay-compiler` reads screens, with the same syntax and diagnostics as the C# compiler.
- **Screenplay** ([Release v4.46.0](https://github.com/Cratis/Screenplay/releases/tag/v4.46.0)): A `.play` file opens on the event model board by default and redraws as you edit. **Show Source** opens the text beside the board, **Open Event Model Board** goes back, and **Reopen Editor With…** still offers the text editor. See [VS Code extension](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/vscode.md). (#322)
- **Screenplay** ([Release v4.46.0](https://github.com/Cratis/Screenplay/releases/tag/v4.46.0)): A file inside a folder application, the folder holding an `application.play`, shows the whole application on the board. This includes unsaved edits to any of its files.
- **Screenplay** ([Release v4.46.0](https://github.com/Cratis/Screenplay/releases/tag/v4.46.0)): Errors in the model are listed above the board and link to the line, while the board still draws everything that could be read.
- **Screenplay** ([Release v4.46.0](https://github.com/Cratis/Screenplay/releases/tag/v4.46.0)): A TypeScript compiler for Screenplay, shipped with the extension. It parses `.play` documents and folders into the same syntax tree as the C# compiler, with the same visitors and walker. It reports the same diagnostics as the C# compiler for the constructs it reads. See [TypeScript compiler](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/typescript-compiler.md).
- **Stage** ([Release v4.23.0](https://github.com/Cratis/Stage/releases/tag/v4.23.0)): `SemanticImplementationBodies.Resolve` resolves the inline and file implementation bodies of a `SemanticDocumentSet` and the implementation requirements of its compilation. A host that compiles its own document set calls it instead of copying the loader's body resolution, and `SemanticModelLoader.LoadFromPathAsync` now uses the same resolver. (#159)
- **Arc** ([Release v22.41.0](https://github.com/Cratis/Arc/releases/tag/v22.41.0)): `DecisionReadAdmissions` in `Cratis.Arc.Chronicle.Testing` checks, without executing any command, that Chronicle admits every `DecisionRead<T>` parameter of the `Handle` and `Provide` methods of `[ProtectedDecision]` commands, including inherited ones. `DecisionReadAdmissions.ShouldAdmitDecisionReadsIn(assembly)` throws `DecisionReadsAreRefused`, listing each command, read model and `DecisionReadRefusalReason`, so a refused shape such as children or a reducer fails a spec instead of every execution. See [Check that Chronicle admits the decision reads](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/testing/chronicle.md#check-that-chronicle-admits-the-decision-reads). (#2929)
- **AI** ([Release v7.3.1](https://github.com/Cratis/AI/releases/tag/v7.3.1)): The corpus verification fails when a rule, prompt or agent names a skill that has no directory in `.cratis/ai/skills`
- **Screenplay** ([Release v4.45.0](https://github.com/Cratis/Screenplay/releases/tag/v4.45.0)): `then no readmodel <ReadModel> for <key>` asserts that the instance with that key does not exist. The key is required and must match the read model's identifier type, and a present and an absent assertion for the same instance are reported as a contradiction. See [Specifications](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/specifications.md). (#284)
- **Screenplay** ([Release v4.45.0](https://github.com/Cratis/Screenplay/releases/tag/v4.45.0)): Models that use the assertion compile to ESM v5 (language and semantics `5.0`, `schemaVersion` 5). Models without it keep their v1–v4 canonical bytes and revisions. ESM consumers must admit v5 explicitly before they read such a model.
- **Screenplay** ([Release v4.45.0](https://github.com/Cratis/Screenplay/releases/tag/v4.45.0)): The reference runner checks absence for projection-backed read models. For read models built by a reducer it returns `SemanticUnsupported`, so a target provider must check the deletion instead of reporting a pass.
- **Screenplay** ([Release v4.45.0](https://github.com/Cratis/Screenplay/releases/tag/v4.45.0)): The editor grammar, completion and keyword help, and the MCP inspection tools recognise absence assertions.
- **Screenplay** ([Release v4.45.0](https://github.com/Cratis/Screenplay/releases/tag/v4.45.0)): Typed workspace authoring binds each member of a composite absence key to the read model's identifier type. Safe authoring rejects new key members that don't resolve, keeps unchanged existing ones, and accepts explicit repairs of a key member, an enclosing member or the keyed query's `by` identifier. A declaration edit, such as changing a property's type, can repair an unresolved key member but is refused in both modes if it would retarget or unbind a resolved one. Draft authoring accepts new unresolved key members and reports them as reference debt.
- **Screenplay** ([Release v4.45.0](https://github.com/Cratis/Screenplay/releases/tag/v4.45.0)): Renaming a composite-type property also renames the absence-key members bound to it. A rename is refused while an absence key in the workspace is unresolved.
- **Chronicle** ([Release v19.24.0](https://github.com/Cratis/Chronicle/releases/tag/v19.24.0)): The namespace dashboard - the page an event store opens on - is laid out like the CLI workbench overview: a server health rail (connection, version, CPU and memory, the store, namespace and tail sequence number, and the event types, projections, read models and namespaces in the catalog), observer, failure, recommendation and job tiles, event throughput over the last hour, day or week, observers over time, the top event types, a list of what needs attention and the jobs that are running.
- **Chronicle** ([Release v19.24.0](https://github.com/Cratis/Chronicle/releases/tag/v19.24.0)): The event store dashboard adds the same figures up across its namespaces and lists every namespace with its events, observers, lag, failed partitions, recommendations and jobs, each leading to its own dashboard.
- **Chronicle** ([Release v19.24.0](https://github.com/Cratis/Chronicle/releases/tag/v19.24.0)): Every tile and list entry leads to the page where the figure can be acted on.
- **AI** ([Release v7.3.0](https://github.com/Cratis/AI/releases/tag/v7.3.0)): Arc for TypeScript server skills for the Node.js implementation in Cratis/Arc.TypeScript, mirroring the Kotlin/Java set: `cratis-arc-command-typescript`, `cratis-arc-query-typescript` and `cratis-arc-validation-typescript`. They state that the server packages are an unpublished source preview, separate from the published `@cratis/arc` client. (#424)
- **AI** ([Release v7.3.0](https://github.com/Cratis/AI/releases/tag/v7.3.0)): `cratis/arc/server-typescript`, which exposes the skills, and `cratis/arc/typescript`, which composes them with the TypeScript language conventions.
- **Components** ([Release v4.22.0](https://github.com/Cratis/Components/releases/tag/v4.22.0)): `Message` accepts `live={false}` to render without its `alert`/`status` role, so it can be composed inside an existing live region without being announced twice (#385)
- **Ante** ([Release v1.2.7](https://github.com/Cratis/Ante/releases/tag/v1.2.7)): Real-browser end-to-end and accessibility coverage of the lobby's three journeys (join by invitation, invited organization setup, self-service registration), using Playwright and axe. It runs against a real Ante and Chronicle kernel nightly and on pull requests labelled `run-integration` (#118)
- **Arc** ([Release v22.39.0](https://github.com/Cratis/Arc/releases/tag/v22.39.0)): `[ProtectedDecision]` commands read the read models their decision depends on through Chronicle decision reads (`DecisionRead<T>` / `IDecisionReads`) inside the command's transaction. If another command changes what the decision read before this one commits, the commit is rejected as a concurrency violation (a validation result, HTTP 400) instead of overwriting it (#2828)
- **Arc** ([Release v22.39.0](https://github.com/Cratis/Arc/releases/tag/v22.39.0)): `[Unprotected]`, `CommandDecisionMode`, command dependency safety checks, decision scenario helpers for `CommandScenario` (`UseDecisionReads`, `AppendConcurrently`), and the ARCCHR0011/ARCCHR0012 analyzers that point out decisions made outside protection (part of #2828)
- **Chronicle** ([Release v19.23.0](https://github.com/Cratis/Chronicle/releases/tag/v19.23.0)): A constraint can declare the event sequences it applies to, with `ForEventSequences(...)` or `ForEventLog()` on the constraint builder, or `EventSequences` on `[Unique]`. The kernel then neither validates nor indexes it for any other sequence, so facts forwarded to the outbox no longer claim values there (#4398)
- **Chronicle** ([Release v19.23.0](https://github.com/Cratis/Chronicle/releases/tag/v19.23.0)): When declarations for one constraint are combined, one that names no sequence (meaning every sequence) wins over ones that name some (#4398)
- **Chronicle** ([Release v19.23.0](https://github.com/Cratis/Chronicle/releases/tag/v19.23.0)): Changing a constraint's sequences takes effect at registration. For every newly covered sequence in every namespace, the kernel first makes that sequence validate against the new definitions, then rebuilds its index from its existing events, whether or not the sequence was active. A sequence no longer covered stops validating and reading its index (#4398)
- **Chronicle** ([Release v19.23.0](https://github.com/Cratis/Chronicle/releases/tag/v19.23.0)): Known limits: sequences are enumerated from the well-known sequences plus those with persisted state, so a custom or inbox sequence whose state was never persisted can be missed. A crash between saving the definitions and starting the rebuild loses the rebuild. While a rebuild runs, validation sees a partially rebuilt index, and a concurrent append's newer entry can be overwritten (see #4408)
- **Arc.Kotlin** ([Release v7.7.0](https://github.com/Cratis/Arc.Kotlin/releases/tag/v7.7.0)): An `arcReadModelNamingPolicy` bean that adapts Arc's `NamingPolicy` into Chronicle's `ReadModelNamingPolicy`; Chronicle's starter hands it to the `ChronicleOptions` it builds. It names the container only; the read model identifier is unchanged.
- **Arc.Kotlin** ([Release v7.7.0](https://github.com/Cratis/Arc.Kotlin/releases/tag/v7.7.0)): The bean is registered only when exactly one Arc `NamingPolicy` exists and the application has not declared its own `ReadModelNamingPolicy`; an application policy wins. The auto-configuration now runs after the MongoDB one, so it sees Arc's default policy.
- **Arc** ([Release v22.38.0](https://github.com/Cratis/Arc/releases/tag/v22.38.0)): The generator emits member walkers for the reachable graph of command and query argument types, and `ModelGraphValidator` reads their properties through generated, statically typed getters instead of reflection. Validation is unchanged: the same validators run in the same order with the same member paths. Walkers are generated only where they are provably identical to reflection: the type and all its property-declaring bases are declared in source in the same compilation, none of them is partial (another generator could add properties), and no two public properties in the hierarchy share a name. Every other type, and runtime-typed values behind `object` or interfaces, keeps the reflection walk (Refs #2854)
- **Arc** ([Release v22.38.0](https://github.com/Cratis/Arc/releases/tag/v22.38.0)): `ModelGraphWalkers` and `ModelGraphMember`, for generated code (Refs #2854)
- **Chronicle.TypeScript** ([Release v6.31.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.31.0)): Child key read from a string event property; parent key empty or `$eventSourceId`.
- **Chronicle.TypeScript** ([Release v6.31.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.31.0)): `identifiedBy` a plain string property.
- **Chronicle.TypeScript** ([Release v6.31.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.31.0)): A child event adds the child when its key is new and updates it in place otherwise; `removedWith` removes the matching child.
- **Chronicle.TypeScript** ([Release v6.31.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.31.0)): Same-name AutoMap into typed children.
- **Chronicle.TypeScript** ([Release v6.31.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.31.0)): Both the fluent `.children(...)` builder and `@childrenFrom`, including the options form (`{ childType, key, identifiedBy, parentKey }`).
- **Chronicle.TypeScript** ([Release v6.31.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.31.0)): Explicit child property mappings other than the identifier (renames, `$eventContext`, `$value`, `$null`, ...).
- **Chronicle.TypeScript** ([Release v6.31.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.31.0)): Children combined with initial model state.
- **Chronicle.TypeScript** ([Release v6.31.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.31.0)): Nested children, nested projections inside children, child joins, `removedWithJoin`, `fromEvery`, and `FromEventProperty` value children.
- **Chronicle.TypeScript** ([Release v6.31.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.31.0)): Arithmetic, and child keys from `$eventSourceId`, context, constants or non-string properties.
- **Chronicle.TypeScript** ([Release v6.31.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.31.0)): Disabled child AutoMap or AutoMap exclusions, and one event feeding several children operations.
- **Chronicle.TypeScript** ([Release v6.30.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.30.0)): `ReadModelScenario.observe(source)` reads the accepted history of an `EventScenario` or `ReactorScenario`; later appends are visible without syncing.
- **Chronicle.TypeScript** ([Release v6.30.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.30.0)): `ReactorScenario.appendedEvents`.
- **Chronicle.TypeScript** ([Release v6.30.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.30.0)): Mixing seeded events with an observed history, observing twice, and routed events reject with `UnsupportedProjectionOperation`.
- **Chronicle.TypeScript** ([Release v6.30.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.30.0)): Events a reactor handler returns are recorded but not appended, so read models do not see them.
- **Chronicle.TypeScript** ([Release v6.30.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.30.0)): Non-ASCII keys under `ignoreCasing` stay rejected.
- **Arc** ([Release v22.37.0](https://github.com/Cratis/Arc/releases/tag/v22.37.0)): `ArcOptions.AddJsonTypeInfoResolver(...)` adds an application's source-generated `JsonSerializerContext` (or any `IJsonTypeInfoResolver`) ahead of Arc's own metadata, for trimmed and NativeAOT applications. NativeAOT applications register their query data, change-set item and `CommandResult<TResponse>` types there (Refs #2854)
- **Arc.TypeScript** ([v0.52.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.52.0)): The source proxy generator can import a type from another package instead of generating it. Pass `--type-mapping <Type>=<package>[#<export>]` (repeatable) or `typeMappings` to `generateFromSource`/`analyzeSource`. A mapped class or enum works as a field, array element, result or base class.
- **Arc.TypeScript** ([v0.52.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.52.0)): Limits: the package must export a class usable as a runtime constructor, and is installed separately. Only types below the artifacts root match, the fields of a mapped type are not analyzed, each type maps once, and a mapping that matches nothing is reported as a warning.
- **Arc** ([Release v22.36.0](https://github.com/Cratis/Arc/releases/tag/v22.36.0)): `<CratisArcControllersSupport>false</CratisArcControllersSupport>` in an application's project file turns MVC off through a feature switch, so a trimmed or NativeAOT publish removes Arc's MVC registration. In a trimmed test app this dropped trim warnings from 140 to 16 on net10.0 and from 130 to 18 on net8.0, and MVC assemblies from 6 to 2. Controllers stay on by default, and `WithoutControllers()` still works at runtime (Refs #2895)
- **Arc.TypeScript** ([v0.51.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.51.0)): `--skip-react-hooks` (programmatic option `skipReactHooks`) for the proxy generator: emits server-only proxies with no `@cratis/arc.react` import and no static `use*`/`when` hooks on commands and queries, so projects that only need the typed HTTP client do not need React installed. Default output is unchanged.
- **Arc** ([Release v22.35.0](https://github.com/Cratis/Arc/releases/tag/v22.35.0)): The command generator registers a typed `CommandResult<T>` factory for each model-bound command's response types (looking through `Task`, `ValueTask`, nullable, value tuples, `System.Tuple`, `OneOf` and `Result`), so the command pipeline builds `CommandResult<T>` for them without reflection. NativeAOT applications get typed command results for every response type the generator can name (Refs #2854)
- **Arc** ([Release v22.35.0](https://github.com/Cratis/Arc/releases/tag/v22.35.0)): `CommandResultFactories` (for generated code) and `MissingCommandResultFactory`, thrown only when a response type has no factory and the code is ahead-of-time compiled (Refs #2854)
- **Chronicle** ([Release v19.22.0](https://github.com/Cratis/Chronicle/releases/tag/v19.22.0)): `IJsonSchemaGenerator.GenerateForReadModel` generates the JSON schema for a read model. Its default implementation returns `Generate`, so existing custom generators keep working. (#4330)
- **Arc.TypeScript** ([v0.50.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.50.0)): Scoped activation with a caller-owned Chronicle client: create the client with `chronicleArtifactActivator(...)` as `artifactActivator` and `reactorCommandResultHandler(...)` as `reactorResultHandler`, then set `activateArtifactsInScopes` when registering it. Arc never changes the client's options and never disposes the client. (#93)
- **Arc** ([Release v22.34.0](https://github.com/Cratis/Arc/releases/tag/v22.34.0)): `IArcBuilder.WithoutControllers()` turns off MVC and controller discovery, for applications that only use model-bound commands and queries. Controllers stay on by default (Refs #2880)
- **Arc.TypeScript** ([v0.48.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.48.0)): Preview option `withChronicle({ ..., activateArtifactsInScopes: true })` for an Arc-owned Chronicle connection. Each delivered batch gets its own Arc service scope, and the reactor or reducer is resolved from it with its constructor dependencies. Handlers run inside Arc with the delivery's tenant (the Chronicle namespace, `Default` in single-tenant apps) and correlation, and no principal. A failure while disposing the scope fails the delivery before it is acknowledged. Shutdown stops new deliveries and waits for active ones before services are disposed. Requires `@cratis/chronicle` 6.17.0 or later; registration fails on older versions. See [Activate reactors and reducers in Arc scopes](https://github.com/Cratis/Arc.TypeScript/blob/main/Documentation/chronicle/reactors/scoped-activation.md). (part of #93)
- **Arc.TypeScript** ([v0.48.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.48.0)): `chronicleArtifactActivator(server, eventStore)` and the `ChronicleArtifactActivator` type, to use the same activation with a Chronicle client you create yourself. (part of #93)
- **Arc.TypeScript** ([v0.48.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.48.0)): `normalizeCorrelationId` in `@cratis/arc.core`, and `deferredFallbackError` on application services. (part of #93)
- **Arc.TypeScript** ([v0.47.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.47.0)): `MongoReadModels` options `readModel` and `subjectFor`. Documents read through a typed `MongoReadModels` (`find`, `findById`, `queryPage` and observable queries) are released through Chronicle before they are served, over Express, Fastify and Hono. The subject is taken from `subjectFor` when configured, otherwise from the stored `__subject`, otherwise from a string or numeric `_id`; the release requires it to match any stored `__subject` and the model's `@subject()` or `id`. The model must be registered with `withChronicle`; otherwise documents are served as stored. (#111)
- **Arc.TypeScript** ([v0.47.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.47.0)): `ReadModelInterceptor.interceptRawDocument` and `isReleased`, for interceptors that release raw documents and protect a model wherever it appears in a query result. (#111)
- **Ante** ([Release v1.1.0](https://github.com/Cratis/Ante/releases/tag/v1.1.0)): Waiting invitations are recorded (`InvitationTokenIssuanceDeferred`, read model `InvitationAwaitingSigningKey`). Instances with a signing key resume them at startup and every 15 seconds (`InvitationTokenIssuanceResumed`). Concurrency checks stop two replicas from resuming the same invitation. An invitation that was revoked, accepted, or replaced by a later receipt while it waited gets no token.
- **Arc** ([Release v22.33.0](https://github.com/Cratis/Arc/releases/tag/v22.33.0)): An executable that references Arc now registers each referenced project's generated type-discovery metadata from generated code, so single-file and trimmed applications no longer depend on `DependencyContext` and `Assembly.Load` to find it. Applications built without the generator keep the existing runtime path (Refs #2857)
- **Components** ([Release v4.21.0](https://github.com/Cratis/Components/releases/tag/v4.21.0)): `ToolbarFocusMode.SingleTabStop` for `Toolbar` and `ActionMenubar` implements the WAI-ARIA toolbar pattern. The toolbar's own tools share one Tab stop, which starts at the first available tool, moves with the arrow keys and returns to the last focused tool. When that tool is disabled, hidden or removed, the Tab stop moves to the next available tool. Controls you add yourself, widgets such as inputs, tools rendered outside the toolbar's markup (for example through a portal), and tools with an explicit tab index keep their own Tab stop. `Arrows` remains the default until the next major release. (#353)
- **Components** ([Release v4.21.0](https://github.com/Cratis/Components/releases/tag/v4.21.0)): `ChatConversation.renderMessageExtra` renders your content under a message body, for example reactions or a notice that a reply failed. `ChatSidebar` forwards it. (#194)
- **Components** ([Release v4.21.0](https://github.com/Cratis/Components/releases/tag/v4.21.0)): `ChatSidebar.renderHeaderActions` renders your content between the sidebar title and its close button, and receives the open topic. Neither slot adds markup when you leave it unset. (#194)
- **Components** ([Release v4.21.0](https://github.com/Cratis/Components/releases/tag/v4.21.0)): `DataTableCore` accepts `sort` with `onSortChange`, `filters` (reported through the existing `onFilter`), and `globalFilter` with `onGlobalFilterChange`, so the host can own that state. When a value is left undefined, the table keeps managing it as before. Set `rowProcessing={DataTableRowProcessing.None}` to render rows exactly as given when the source has already filtered and sorted them. `DataTableSort`, `DataTableSortDirection` and `DataTableRowProcessing` are exported from `@cratis/components/DataTables`. (#178)
- **Arc.TypeScript** ([v0.46.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.46.0)): `withChronicle` registers each discovered reactor and reducer as a scoped service in Arc's dependency injection, but only when nothing else registers that class: a registration in `builder.services` (before or after `withChronicle`), an entry in `options.services`, or an Arc lifetime decorator always wins, and repeated discovery adds nothing. With a caller-supplied `ServiceRegistry`, no registrations are added. The Chronicle SDK still constructs reactors and reducers; this prepares resolving them with constructor dependencies through Arc in a later release. (#93)
- **Arc.TypeScript** ([v0.46.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.46.0)): `builder.services.addScopedFallback(type)` records such a deferred scoped fallback registration.
- **Ante** ([Release v1.0.2](https://github.com/Cratis/Ante/releases/tag/v1.0.2)): A specification that fails if any read model relies on auto-mapping from an event generation above 1.
- **Chronicle.TypeScript** ([Release v6.28.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.28.0)): `@childrenFrom(Event, { childType, key, identifiedBy, parentKey })`: an options form that declares the child type together with an explicit child key, so children can be keyed by an event property on runtimes without emitted type metadata (tsx, esbuild). All options are optional; the existing positional forms are unchanged. This matches the key, identifiedBy and parentKey options of the .NET `ChildrenFrom` attribute.
- **Arc.TypeScript** ([v0.45.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.45.0)): `ServiceRegistry.addShutdownParticipant({ stop, drain })` registers a shutdown participant on `server.services` or on your own registry, and returns a function that removes it. With participants, shutdown closes new execution and scope admission, releases observable producers (bounded by the one-second cancellation window) and closes transports, calls every `stop()`, awaits every `drain()`, and only then joins admitted work, disposes scopes and disposes singletons. Direct registry disposal and a failing singleton factory use the same order. Participant, transport and disposal errors are reported together. See [Dependency injection](https://github.com/Cratis/Arc.TypeScript/blob/v0.45.0/Documentation/dependency-injection.md). (part of #93)
- **Arc.TypeScript** ([v0.45.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.45.0)): Coordinated host shutdown: `host.shutdown({ timeoutMs, registry? })` on `runArc`, `middleware.shutdown(listener, registry?)` on the Express middleware, and `shutdownArcHost(server, closeListener, registry?)` from `@cratis/arc.core/hosting` for other hosts. With participants on an Arc-owned registry, or on a caller-owned registry you pass explicitly, it closes Arc admission before closing the listener; otherwise it keeps the original listener-first order. A caller-owned registry is only disposed when you pass it explicitly. See [Shut down without dropping work](https://github.com/Cratis/Arc.TypeScript/blob/v0.45.0/Documentation/core/index.md#shut-down-without-dropping-work). (part of #93)
- **Arc.TypeScript** ([v0.45.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.45.0)): When an `ArcApplication` owns its registry and participants are registered, `app.stop()` and `app.dispose()` use the same coordinated order. (part of #93)
- **Arc.TypeScript** ([v0.45.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.45.0)): With participants, Fastify and Hono direct query WebSockets close before participants stop, and new direct upgrades are refused with 503 once coordinated shutdown has started. (part of #93)
- **Chronicle.TypeScript** ([Release v6.27.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.27.0)): `EventScenario` and `ReactorScenario` support kernel-verified composite unique-property keys: one to three flat string properties per event type, joined in declared order as the kernel does. A violation reports one entry per property, each with that property's own value.
- **Chronicle.TypeScript** ([Release v6.27.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.27.0)): `ignoreCasing` unique keys are supported for ASCII values: `Alice`, `ALICE` and `alice` collide, violation details keep the original casing, and replacement and removal release the folded key.
- **Chronicle.TypeScript** ([Release v6.27.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.27.0)): As in the Chronicle kernel, composite values are joined with an unescaped `-`, so values containing `-` can collide across components (for example `['a-b', 'c']` and `['a', 'b-c']`). The scenarios reproduce this behavior (Cratis/Chronicle#4131).
- **Chronicle.TypeScript** ([Release v6.27.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.27.0)): Nested, indexed or repeated key paths, more than three properties, non-string or missing parts, `ignoreCasing` on booleans, non-ASCII characters under `ignoreCasing` and scoped constraints reject with `UnsupportedEventSequenceOperation`. Use a kernel-backed test for these cases.
- **Arc.TypeScript** ([v0.44.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.44.0)): Transparent recovery for `DrizzleObservation.PostgreSQLNotify`: when the dedicated listener connection fails (connection `error`/`end` or a failed heartbeat), Arc keeps each subscriber's last snapshot, reconnects with bounded backoff (500 ms, 1, 2, 4 and 8 seconds), re-acknowledges `LISTEN`, revalidates every live table mapping and trigger, and then forces a fresh read of every live subscription, including an unused `current()` prime. New subscriptions wait for recovery before their first read. See [Observe PostgreSQL tables across processes](https://github.com/Cratis/Arc.TypeScript/blob/v0.44.0/Documentation/sql/observing-postgresql.md). (#92)
- **Arc.TypeScript** ([v0.44.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.44.0)): Recovery catches up to the committed state: changes made while the listener was down are reflected in the next snapshot. PostgreSQL `NOTIFY` is not a durable log, so intermediate states are not replayed. (#92)
- **Chronicle.TypeScript** ([Release v6.26.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.26.0)): `EventScenario` and `ReactorScenario` support kernel-verified unique-event-type constraints that span several event types with removal cycles, for unscoped constraints: a source is blocked from a second covered event until one of the constraint's removal events releases the cycle; a removal on another source releases nothing; an event type that is both covered and a removal is checked before it releases, so a blocked one releases nothing. Within a batch, a release recorded by an earlier event lets a later covered event on the same source succeed, and a rejected batch rolls back its releases.
- **Chronicle.TypeScript** ([Release v6.26.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.26.0)): The supported definitions are one covered type without removal types, two covered types with two separate removal types, and three covered types with three removal types where one type is both. A multi-type definition must be the only constraint definition in the scenario.
- **Chronicle.TypeScript** ([Release v6.26.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.26.0)): Other combinations of covered and removal types, multi-type definitions alongside other definitions, removal event types without fields, and scoped constraints reject with `UnsupportedEventSequenceOperation`. Use a kernel-backed test for these cases.
- **Arc** ([Release v22.32.0](https://github.com/Cratis/Arc/releases/tag/v22.32.0)): `[ExcludeFromDiscovery]` (`Cratis.Arc`) on a command type, read model, query method, controller or controller action. It leaves the operation out of `/.cratis/commands`, `/.cratis/queries` and the generated OpenAPI descriptions, including command validation endpoints. It does **not** unmap or authorize the endpoint. The marker is inherited.
- **Arc** ([Release v22.32.0](https://github.com/Cratis/Arc/releases/tag/v22.32.0)): Model-bound commands can use the existing `[Path]` attribute (`Cratis.Arc.Queries.ModelBound`). The explicit path is used consistently by endpoint mapping, the `/validate` endpoint, introspection and the generated TypeScript proxy. A command's path is not inherited and must be a literal route.
- **Ante** ([Release v1.0.0](https://github.com/Cratis/Ante/releases/tag/v1.0.0)): Tokens carry a `kid` header (RFC 7638 thumbprint) naming the key that signed them. `Ante:Invitations:Token:PreviousPublicKeyPems` keeps earlier keys trusted during a rotation.
- **Ante** ([Release v1.0.0](https://github.com/Cratis/Ante/releases/tag/v1.0.0)): Integration specs restart Ante mid-onboarding and while a host publishes (#67). No state was lost, so Ante needs no extra activation worker.
- **Ante** ([Release v1.0.0](https://github.com/Cratis/Ante/releases/tag/v1.0.0)): Durable, host-signed provisioning outcomes (#60) and the "needs a new invitation" state (#61). These are opt-in and additive, planned for a minor release. The host-outcome check (`Ante:HostOutcomeUrl`) covers the need until then.
- **Ante** ([Release v1.0.0](https://github.com/Cratis/Ante/releases/tag/v1.0.0)): The operator diagnostics API (#62) is built when a host adopts it. Automated erasure (#64) remains the documented manual procedure. The Norwegian translation awaits native review (#84).
- **Components** ([Release v4.20.0](https://github.com/Cratis/Components/releases/tag/v4.20.0)): `ChatTopicList` and `ChatSidebar` accept `topicActions`: labeled buttons next to each topic, such as Rename, Pin or Archive, with an optional `isAvailable` check per topic. Each button's accessible name includes its topic, the buttons can be reached with the keyboard, and activating one does not open the topic. When an action hides itself or removes its topic, focus moves to that topic, to the topic that took its place, or to New topic, unless your handler already moved focus. `ChatSidebar`'s existing `actions` prop still means message actions. Topics without actions render as before. The `ChatTopicAction` type is exported. (#206)
- **Screenplay** ([Release v4.44.1](https://github.com/Cratis/Screenplay/releases/tag/v4.44.1)): Regression coverage that annotates every line of the canonical corpus and a sample model with a unique comment and checks that each comment survives exactly once, never shares a printed line with another, and prints the same way twice.
- **Ante** ([Release v0.17.0](https://github.com/Cratis/Ante/releases/tag/v0.17.0)): `Ante:Registration:Enabled` closes `/register` per deployment: the page shows a "sign-up is not available" notice (optional `ClosedUrl` link) and the server rejects `BeginRegistration`/`RegisterOrganization`. Use it for invitation-only deployments and as an incident kill switch. (#88)
- **Ante** ([Release v0.17.0](https://github.com/Cratis/Ante/releases/tag/v0.17.0)): `InvitationReissueRequested` (host → Ante) asks for a fresh token for a pending invitation; Ante answers with a new `InvitationTokenIssued`, or `InvitationRejected(InvitationNotPending)` when the invitation was never received, was revoked or was accepted. (#89)
- **Ante** ([Release v0.17.0](https://github.com/Cratis/Ante/releases/tag/v0.17.0)): `OrganizationNameReserved` / `OrganizationNameReleased` (host → Ante) seed existing tenant names and free deleted ones; `Ante:Organization:ReservedNames` blocks names such as `admin` or `app`. Organization names are now compared ignoring case. (#90)
- **Ante** ([Release v0.17.0](https://github.com/Cratis/Ante/releases/tag/v0.17.0)): Self-service registration can use the host-outcome completion screen (`Ante:HostOutcomeUrl`), so a new owner waits until the host has provisioned instead of landing before the organization exists. Only the sign-in recorded as the registration's owner sees the answer. (#91)
- **Ante** ([Release v0.17.0](https://github.com/Cratis/Ante/releases/tag/v0.17.0)): `OrganizationRegistrationCompleted` generation 2 carries `SignupContext`: query-string keys allowlisted by `Ante:Registration:ContextKeys` (for example `offer`, `utm_source`), kept for the tab across the sign-in round trip. Generation 1 upcasts to an empty context. (#92)
- **Ante** ([Release v0.17.0](https://github.com/Cratis/Ante/releases/tag/v0.17.0)): `Ante:Registration:MaxPerIdentity`/`Window` limit registrations per sign-in; `RequestsPerMinutePerClient` (with `TrustForwardedFor`) rate limits the registration endpoints with HTTP 429. (#93)
- **Ante** ([Release v0.17.0](https://github.com/Cratis/Ante/releases/tag/v0.17.0)): `Ante:Registration:Content:{locale}` adds host-authored plain-text copy to the registration page: title, offer text, highlights, pricing and log-in links, completion message. (#94)
- **Ante** ([Release v0.17.0](https://github.com/Cratis/Ante/releases/tag/v0.17.0)): `Deployment/kubernetes/ante.yaml` and `Deployment/README.md`: a reference deployment with every production setting, probes, the fronting-proxy checklist and a compatibility table. (#95)
- **Stage** ([Release v4.22.0](https://github.com/Cratis/Stage/releases/tag/v4.22.0)): The specification runner now runs specifications that assert read models or unprotected keyed snapshot queries. Each run defines its own projections from the admitted scalar `from`/`set` subset using Chronicle's per-run testing artifacts, so runs don't see each other's projections. A projected result that differs from the expectation fails the specification. Every canonical-corpus form that now runs agrees with Screenplay's reference runner.
- **Chronicle.TypeScript** ([Release v6.25.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.25.0)): `EventScenario` and `ReactorScenario` now support kernel-verified unique-property replacement and removal for unscoped constraints. When an event source replaces its claimed value, its old value becomes available to another source. Removal events declared with `@removeConstraint` or fluent `removedWith` release only that source's claim; a wrong-source or repeated removal does not free another owner's value.
- **Chronicle.TypeScript** ([Release v6.25.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.25.0)): In atomic batches, a release takes effect only after the whole batch succeeds, matching the kernel: a second source cannot reclaim a value released earlier in the same batch, but can reclaim it in a later append.
- **Chronicle.TypeScript** ([Release v6.25.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.25.0)): Scenarios still reject unresolved removal names, removal event types shared by several definitions, removal of unique-event-type constraints, and scoped, composite, case-insensitive or overlapping definitions with `UnsupportedEventSequenceOperation`. Use a kernel-backed test for these cases.
- **Chronicle.Kotlin** ([Release v6.7.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.7.0)): `ReadModelsJavaBridge.observeMaterializedInstancesPublisher(service, readModelClass, skip, take)` returns a `java.util.concurrent.Flow.Publisher<List<T>>` of materialized read-model pages. It honors demand, cancels the underlying observation when the subscription is cancelled, and reports failures through `onError`. Java frameworks that treat a `Flow.Publisher` as an observable query, such as Arc, can now stream Chronicle read models to the browser (#102)
- **Chronicle.TypeScript** ([Release v6.24.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.24.0)): `EventScenario` and `ReactorScenario` now accept a wider, kernel-verified domain for unique-property keys: digits, `.`, `@`, `_`, `-`, `:`, `|`, `{`, `}`, `$`, empty and padded strings, `é`, and schema-backed booleans. Boolean `true` conflicts with the string `"True"` but not `"true"`, as in the kernel. Other values still reject with `UnsupportedEventSequenceOperation`.
- **Chronicle** ([Release v19.21.0](https://github.com/Cratis/Chronicle/releases/tag/v19.21.0)): `UnitOfWork.RollbackAsOwner` lets a protected command transaction owner abandon enrolled decision reads with its opaque owner capability.
- **Chronicle** ([Release v19.20.0](https://github.com/Cratis/Chronicle/releases/tag/v19.20.0)): A kernel option `Events.CausationPropertyRetention` (`events.causationPropertyRetention` in `chronicle.json`, `Cratis__Chronicle__Events__CausationPropertyRetention` in the environment) with values `Retain` (default, unchanged behavior) and `Omit`.
- **Chronicle** ([Release v19.20.0](https://github.com/Cratis/Chronicle/releases/tag/v19.20.0)): `Omit` stores each causation entry's type and time but empties its property values, on single and batch appends, revisions, redaction and forwarding to other event stores.
- **Chronicle** ([Release v19.20.0](https://github.com/Cratis/Chronicle/releases/tag/v19.20.0)): It prevents new retention only; values stored earlier are not rewritten. #4238 stays open for the classification-based follow-up (#4238)
- **Chronicle** ([Release v19.20.0](https://github.com/Cratis/Chronicle/releases/tag/v19.20.0)): `ReactorScenario` accepts a per-run `Defaults`, so reactor specs can use event types generated for that run.
- **Chronicle** ([Release v19.20.0](https://github.com/Cratis/Chronicle/releases/tag/v19.20.0)): Each in-process test event store registers its own event types instead of the process-wide set (#4162)
- **Chronicle.TypeScript** ([Release v6.23.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.23.0)): `EventScenario` and `ReactorScenario` enforce unscoped unique constraints from event and property `@unique` decorators and fluent `@constraint` definitions, discovered by default or supplied through `artifacts.constraints`. Scenarios reject conflicting appends and preserve atomic batch rollback; committed fixtures verify the supported behavior against the pinned Chronicle kernel.
- **Chronicle.TypeScript** ([Release v6.23.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.23.0)): The supported subset covers case-sensitive, unscoped unique string properties whose values are nonempty ASCII letters and spaces, and one event type per unique-event constraint. Other key values, such as ones containing digits, `@`, `.` or accented letters, reject with `UnsupportedEventSequenceOperation`. Scoped, case-insensitive, composite or nested, removal, replacement, overlapping, and multi-type unique-event constraints reject with `UnsupportedEventSequenceOperation` instead of being partially simulated. Use a kernel-backed test for those shapes, or set `constraints: 'disabled'` only when the test does not depend on constraints.
- **Chronicle** ([Release v19.18.0](https://github.com/Cratis/Chronicle/releases/tag/v19.18.0)): **Cleartext HTTP/2 behind a proxy.** `Tls.Enabled=false` is now honored as an explicit opt-in: the kernel serves cleartext HTTP/2 (h2c) only, behind an HTTPS-terminating reverse proxy. TLS stays enabled by default. With TLS enabled, a missing or invalid certificate still stops startup and never falls back to cleartext. A dedicated health port with TLS still requires a certificate. Authenticated h2c requires an explicit HTTPS external authority, because Chronicle's internal `/connect/token` is not served over cleartext. (#3681)
- **Chronicle** ([Release v19.18.0](https://github.com/Cratis/Chronicle/releases/tag/v19.18.0)): **Trusted proxies setting.** New options `forwardedHeaders.knownProxies` and `forwardedHeaders.knownNetworks` list the reverse proxies whose `X-Forwarded-*` headers the kernel trusts. This also holds when `ASPNETCORE_FORWARDEDHEADERS_ENABLED=true` is set. (#3681)

## Changed

- **cli** ([Release v3.27.1](https://github.com/Cratis/cli/releases/tag/v3.27.1)): `cratis screenplay mcp` help text and the Screenplay reference now describe the event model views alongside the authoring tools, and the MCP reference explains the `io.modelcontextprotocol/ui` capability a host must advertise to receive `visualize-model`. (#226)
- **Screenplay** ([Release v4.63.1](https://github.com/Cratis/Screenplay/releases/tag/v4.63.1)): Screenplay documentation no longer labels the language experimental, while preserving downstream tools' status and the limits of visualization and generation. (#333)
- **Screenplay** ([Release v4.63.1](https://github.com/Cratis/Screenplay/releases/tag/v4.63.1)): The VS Code Marketplace and Screenplay Tool package READMEs now show the board and provide quickstarts and documentation links. (#333)
- **Screenplay** ([Release v4.61.0](https://github.com/Cratis/Screenplay/releases/tag/v4.61.0)): Models using the new behavior select ESM v6; existing v1–v5 canonical bytes and revisions remain unchanged. Consumers must explicitly admit v6 before realizing its behavior.
- **Screenplay** ([Release v4.61.0](https://github.com/Cratis/Screenplay/releases/tag/v4.61.0)): Require `given clock` before `when clock`; compare reaction consequences without the initiating `when append` fact. Reactions run in semantic-identity order, their triggers in authored order, and invoked commands use the full command pipeline without a caller.
- **cli** ([Release v3.27.0](https://github.com/Cratis/cli/releases/tag/v3.27.0)): The CLI now bundles Screenplay 4.60.1, Arc's Screenplay packages 22.50.2 and Stage 4.24.0, so `cratis screenplay` and the Stage commands render models through the default blueprint with the real screens and templates
- **cli** ([Release v3.27.0](https://github.com/Cratis/cli/releases/tag/v3.27.0)): Updated Chronicle client packages to 19.31.6, Spectre.Console.Cli to 0.57.2 and the remaining NuGet dependencies
- **Fundamentals.Go** ([Release v0.3.2](https://github.com/Cratis/Fundamentals.Go/releases/tag/v0.3.2)): The enum compatibility reference distinguishes historical source behavior, newer source behavior and packaged Chronicle serializer/schema outcomes, without treating them as equivalent or implying Go enum support. (part of #17)
- **Stage** ([Release v4.24.0](https://github.com/Cratis/Stage/releases/tag/v4.24.0)): The Stage frontend renders the model through `@cratis/scene.blueprint.default`: the blueprint's application shell, topbar, sidebar menu, breadcrumb, footer, themes (light and dark) and components, with each screen placed inside the screen template it names.
- **Stage** ([Release v4.24.0](https://github.com/Cratis/Stage/releases/tag/v4.24.0)): Bare component names in templates are resolved against the model's UI profile (plus `core`, `PrimeReact` and the blueprint) so templates draw real components rather than placeholders.
- **Stage** ([Release v4.24.0](https://github.com/Cratis/Stage/releases/tag/v4.24.0)): Screens are addressable by `#/<ScreenName>`, and the menu and breadcrumb navigate between them.
- **Stage** ([Release v4.24.0](https://github.com/Cratis/Stage/releases/tag/v4.24.0)): Updated Screenplay to 4.60.0, Scene to 4.7.0, Arc to 22.50.1, Chronicle to 19.31.6, Templates to 1.7.3, and the frontend's React, PrimeReact, Vite and Vitest packages.
- **Stage** ([Release v4.24.0](https://github.com/Cratis/Stage/releases/tag/v4.24.0)): Added a reference page describing how the Stage renders a model.
- **Arc** ([Release v22.50.2](https://github.com/Cratis/Arc/releases/tag/v22.50.2)): `Cratis.Screenplay` is 4.60.0, so Screenplay documents that Arc generates write a value that may be absent as `Type optional` instead of `Type?`.
- **Arc** ([Release v22.50.2](https://github.com/Cratis/Arc/releases/tag/v22.50.2)): The embedded event-model explorer uses `@cratis/event-models` and `@cratis/scene` 0.115.0 and `@cratis/screenplay-language` 4.60.0.
- **Screenplay** ([Release v4.60.1](https://github.com/Cratis/Screenplay/releases/tag/v4.60.1)): The VS Code extension, the MCP board viewer and the event-model mapping now use `@cratis/event-models` and `@cratis/scene` 0.115.0, Arc 22.50.1, and the latest React, Vite, Vitest and tooling releases.
- **Screenplay** ([Release v4.60.1](https://github.com/Cratis/Screenplay/releases/tag/v4.60.1)): The Monaco editor stays on 0.55 and TypeScript stays on 6.0 for now, because newer releases break syntax highlighting and the TypeScript tooling.
- **cli** ([Release v3.26.0](https://github.com/Cratis/cli/releases/tag/v3.26.0)): The embedded Screenplay compiler and MCP server are Screenplay 4.59.0: authoring readiness is reported separately from executable readiness, rejected proposals list their diagnostics, `apply` is no longer marked destructive, and the board follows the model on disk.
- **cli** ([Release v3.26.0](https://github.com/Cratis/cli/releases/tag/v3.26.0)): Explicit paths, `--project-root`, `--project-root-env` and a configured `.cratis/ai.json` root behave as before.
- **cli** ([Release v3.26.0](https://github.com/Cratis/cli/releases/tag/v3.26.0)): The managed AI corpus is refreshed to Cratis AI 7.6.5.
- **AI** ([Release v7.6.5](https://github.com/Cratis/AI/releases/tag/v7.6.5)): The Screenplay modelling skill tells assistants to open the workspace without asking for a folder first, and to pass a `path` only when the server asks for one. It covers the client's workspace roots, the launch directory and desktop hosts that manage files.
- **AI** ([Release v7.6.5](https://github.com/Cratis/AI/releases/tag/v7.6.5)): It says to apply a proposal once it checks out when the user has asked for the change to be applied, and not to ask again each time.
- **AI** ([Release v7.6.5](https://github.com/Cratis/AI/releases/tag/v7.6.5)): It notes that the event model board follows the files while it is open, and that authoring acceptance and executable readiness are separate verdicts.
- **Screenplay** ([Release v4.59.0](https://github.com/Cratis/Screenplay/releases/tag/v4.59.0)): `apply` and `recover-workspace` are no longer marked destructive, so clients that confirm every destructive call stop asking each time. Both stay journaled and recoverable.
- **Screenplay** ([Release v4.59.0](https://github.com/Cratis/Screenplay/releases/tag/v4.59.0)): A rejected proposal now lists the diagnostics (code, location, message) instead of a generic compilation failure.
- **Screenplay** ([Release v4.58.0](https://github.com/Cratis/Screenplay/releases/tag/v4.58.0)): Operation authoring documentation explains the syntax-only boundary, current supported surfaces and manual promotion from inline to standalone declarations. Execution and automatic operation refactoring remain unavailable (part of #301)
- **Fundamentals.Go** ([Release v0.3.0](https://github.com/Cratis/Fundamentals.Go/releases/tag/v0.3.0)): Developer guides and installation references cover the v0.3.0 compatibility release while keeping historical fixture profiles and unsupported runtime/schema claims distinct. (#28)
- **Fundamentals.Go** ([Release v0.3.0](https://github.com/Cratis/Fundamentals.Go/releases/tag/v0.3.0)): Repository-local quality gates select native Go build, vet and test phases for the root and recipes modules by default, rather than treating opt-in contract reproducers as a managed frontend application. (#29)
- **Screenplay** ([Release v4.56.0](https://github.com/Cratis/Screenplay/releases/tag/v4.56.0)): The command, specification, grammar and MCP documentation describe generated values and response contracts, with examples and the current execution limitations (part of #300)
- **Fundamentals.Go** ([Release v0.2.0](https://github.com/Cratis/Fundamentals.Go/releases/tag/v0.2.0)): Module gates cover explicitly allow-listed nested modules. Publishable modules have independent releases and protected tag prefixes; unpublished recipes cannot be released and may use the narrowly scoped local-root replacement. (part of #16)
- **Chronicle** ([Release v19.31.3](https://github.com/Cratis/Chronicle/releases/tag/v19.31.3)): The Python contracts package now supports Python 3.10 through 3.14 (previously 3.12+), matching the idiomatic Python clients; `grpcio` 1.83 and `protobuf` 7.35 both support 3.10. The build verifies the wheel declares `Requires-Python: >=3.10`, and CI and the release-asset smoke run on 3.10, 3.11, 3.12, 3.13 and 3.14 (part of #4554)
- **Arc** ([Release v22.49.1](https://github.com/Cratis/Arc/releases/tag/v22.49.1)): Chronicle packages now use 19.31.2, which rejects incompatible definition-derived guards in same-id batches. (part of #3005)
- **AI** ([Release v7.6.3](https://github.com/Cratis/AI/releases/tag/v7.6.3)): Clarify bounded read-model design, passive-state access, observable query costs, nested-command transactions, and timely failure transitions in the Cratis guidance. (#484)
- **Screenplay** ([Release v4.54.0](https://github.com/Cratis/Screenplay/releases/tag/v4.54.0)): Selecting several lines offers a quick fix for every eligible diagnostic in the selection, not only the first
- **Screenplay** ([Release v4.54.0](https://github.com/Cratis/Screenplay/releases/tag/v4.54.0)): Requesting code actions without a specific kind returns the individual quick fixes together with the document-wide `optional` migration
- **Chronicle.Kotlin** ([Release v6.13.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.13.0)): Requires a Chronicle 19.30.0 or later kernel; the client now uses `chronicle-contracts` 19.30.0.
- **Chronicle.Kotlin** ([Release v6.13.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.13.0)): When an append goes through a definition and no concurrency scope is given, the definition's dimensions (the stream's, else the source's) build the scope. An explicit scope always wins, and a definition without dimensions stays unchecked like a plain append.
- **Chronicle.Kotlin** ([Release v6.13.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.13.0)): Batches holding several events for one event source id whose definitions derive different concurrency scopes are rejected with `ConflictingEventSourceConcurrency` before anything is appended; pass an explicit scope for that id or split the batch.
- **Chronicle.TypeScript** ([Release v6.49.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.49.0)): Requires `@cratis/chronicle.contracts` 19.30.0 and a Chronicle 19.30.0 Kernel to use event sources.
- **AI** ([Release v7.6.2](https://github.com/Cratis/AI/releases/tag/v7.6.2)): The Screenplay skills teach inline `produces event` declarations with typed mappings, tags, `description`, `documentation` and rename-only `id` pins, and when an omitted `for` means the command identifier (#481)
- **AI** ([Release v7.6.2](https://github.com/Cratis/AI/releases/tag/v7.6.2)): The Screenplay skills explain where a plain `produces` without `for` lands, and recommend stating `for` on every production that targets the identifier (#481)
- **AI** ([Release v7.6.2](https://github.com/Cratis/AI/releases/tag/v7.6.2)): The Screenplay skills cover the new repairs and refactorings through MCP: declaring a missing event, stating a destination, removing a redundant `id`, removing an identifier copied into an inline event's payload, extracting an inline event, and renames that pin the previous name (#481)
- **AI** ([Release v7.6.2](https://github.com/Cratis/AI/releases/tag/v7.6.2)): The Screenplay skills write optional values as `Type optional`, and describe the legacy `Type?` spelling and its `PLAY0479` information diagnostic (#481)
- **AI** ([Release v7.6.2](https://github.com/Cratis/AI/releases/tag/v7.6.2)): Examples no longer copy an event's source identity into its payload (#481)
- **Screenplay** ([Release v4.53.0](https://github.com/Cratis/Screenplay/releases/tag/v4.53.0)): The printer, documentation and samples write `optional` instead of `?`. The executable model is unchanged (#340)
- **Screenplay** ([Release v4.53.0](https://github.com/Cratis/Screenplay/releases/tag/v4.53.0)): A repeated `by` on a query is reported instead of silently keeping the last one
- **Arc** ([Release v22.49.0](https://github.com/Cratis/Arc/releases/tag/v22.49.0)): A returned `EventForEventSourceId` that routes with the legacy `EventSourceType` or `EventStreamType` is now appended by those strings instead of through the command's definition, which previously dropped them. (part of #2987)
- **Chronicle.Elixir** ([Release v3.10.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.10.0)): Requires `cratis_chronicle_contracts` `~> 19.30`.
- **Screenplay** ([Release v4.52.0](https://github.com/Cratis/Screenplay/releases/tag/v4.52.0)): Renaming an event also updates `on event` triggers in screen behaviors and `released by` in constraints
- **Screenplay** ([Release v4.52.0](https://github.com/Cratis/Screenplay/releases/tag/v4.52.0)): The diagnostics documentation explains why `PLAY0470` has no automatic repair: the destination of a plain production cannot be chosen safely for you
- **Chronicle** ([Release v19.29.5](https://github.com/Cratis/Chronicle/releases/tag/v19.29.5)): Upgrade the embedded Cratis.Orleans job-system packages to 1.15.0, including bounded terminal-job retention. (#4534)
- **Screenplay** ([Release v4.51.0](https://github.com/Cratis/Screenplay/releases/tag/v4.51.0)): `PLAY0478` is reported only for plain productions; inline productions already state or imply their destination (#299)
- **Screenplay** ([Release v4.51.0](https://github.com/Cratis/Screenplay/releases/tag/v4.51.0)): The Invoicing sample declares one of its events inline, with a description and documentation
- **Screenplay** ([Release v4.50.0](https://github.com/Cratis/Screenplay/releases/tag/v4.50.0)): Diagnostic repairs are verified by finding the selected repair again and comparing it, so repairs that add or replace syntax nodes can be proposed, not only self-replacements
- **Screenplay** ([Release v4.50.0](https://github.com/Cratis/Screenplay/releases/tag/v4.50.0)): Proposing a repair through MCP returns the transaction's conflicts and diagnostics when the repair fails, and reports an unknown repair only when no repair matches the code and subject
- **Chronicle.TypeScript** ([Release v6.47.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.47.0)): `ReactorScenario` and `ReadModelScenario` reject reactors and reducers with non-default source or stream filters, and `ReadModelScenario` rejects reducers filtered by tag, instead of ignoring the filters. See #198.
- **Chronicle.TypeScript** ([Release v6.46.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.46.0)): Setting the same composite key part twice now throws when the projection is defined, instead of registering a definition the kernel rejects. See #193.
- **Chronicle** ([Release v19.29.4](https://github.com/Cratis/Chronicle/releases/tag/v19.29.4)): Upgrading to this version replays each reducer once under automatic reducer evolution, because the fingerprint is calculated differently; later releases that don't change a reducer keep its fingerprint (#4502)
- **Screenplay** ([Release v4.49.0](https://github.com/Cratis/Screenplay/releases/tag/v4.49.0)): The MCP pages moved under `/screenplay/mcp/`: Install the MCP server is now `mcp/install`, Create and edit a model with MCP is now Authoring with the MCP tools at `mcp/authoring-tools`, and the reference is `mcp/reference`. Update bookmarks to the old addresses.
- **Chronicle.TypeScript** ([Release v6.43.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.43.0)): Built-in client spans now use the `cratis.chronicle.client.*` convention names, completing the revised timetable announced in the previous release. `telemetry.spanNames` still accepts both values but no longer selects legacy names. (part of #171)
- **Chronicle.TypeScript** ([Release v6.43.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.43.0)): Built-in telemetry no longer emits the legacy `chronicle.*` attributes or the legacy metric instruments (millisecond histograms and counters); `chronicle.sequence_number` remains as an exact string. Move dashboards, alerts and SDK Views to the convention names before upgrading, and divide duration thresholds and histogram boundaries by 1,000 when moving from milliseconds to seconds; counter scales are unchanged. See the [migration guide](https://github.com/Cratis/Chronicle.TypeScript/blob/main/Documentation/observability.md). (part of #171)
- **Chronicle.TypeScript** ([Release v6.42.2](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.42.2)): The telemetry naming timetable is revised: instead of waiting for a major release as announced in v6.40, built-in instrumentation stops emitting the legacy span names, `chronicle.*` attributes and legacy metric instruments (millisecond histograms and counters) in an upcoming minor release, following the one-minor overlap in the shared Cratis OpenTelemetry convention. Move dashboards, alerts and SDK Views to the convention names now, or opt in early per client with `telemetry.spanNames: 'convention'`. The TypeScript compatibility APIs (legacy constants, `telemetry.spanNames` and `ChronicleMetrics`) stay available with no scheduled removal. See the [migration guide](https://github.com/Cratis/Chronicle.TypeScript/blob/main/Documentation/observability.md). (part of #171)
- **cli** ([Release v3.24.1](https://github.com/Cratis/cli/releases/tag/v3.24.1)): `Cratis.Arc.Screenplay`, `Cratis.Arc.Screenplay.Embedded` and `Cratis.Arc.Screenplay.Embedded.Generation` updated to 22.48.2.
- **cli** ([Release v3.24.1](https://github.com/Cratis/cli/releases/tag/v3.24.1)): `Cratis.Screenplay`, `Cratis.Screenplay.Mcp` and `Cratis.Screenplay.CanonicalCorpus` updated to 4.48.1.
- **cli** ([Release v3.24.1](https://github.com/Cratis/cli/releases/tag/v3.24.1)): `Cratis.Stage.Contracts` and `Cratis.Stage.Rendering.Cratis` updated to 4.23.0.
- **cli** ([Release v3.24.1](https://github.com/Cratis/cli/releases/tag/v3.24.1)): `Cratis.Chronicle.Connections` and `Cratis.Chronicle.Contracts` updated to 19.29.1.
- **cli** ([Release v3.24.1](https://github.com/Cratis/cli/releases/tag/v3.24.1)): `Cratis.Fundamentals` updated to 7.22.0.
- **Arc.TypeScript** ([v0.56.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.56.0)): **Breaking default:** hosts and tools that read discovery anonymously outside Development must now authenticate or explicitly opt out with `introspection: { requireAuthentication: false }` or `Cratis__Arc__Introspection__RequireAuthentication=false`. Follow the [migration guide](https://github.com/Cratis/Arc.TypeScript/blob/main/Documentation/upgrading/secure-defaults.md). The `development` fixture-provider flag does not bypass discovery authentication. (#158)
- **AI** ([Release v7.6.0](https://github.com/Cratis/AI/releases/tag/v7.6.0)): The Arc command, command execution and Chronicle reactor skills, and the vertical slice, application profile, reactor, C# and scenario spec rules now route inline command side effects to command operations, and durable after-commit work to reactors. (#474)
- **Chronicle** ([Release v19.29.2](https://github.com/Cratis/Chronicle/releases/tag/v19.29.2)): SQL read-model storage records completed replay promotions in a `chronicle_replay_promotions` table in each read-model database. A replay that would overwrite an unrecognized backup table now stops with an error instead of dropping it; on PostgreSQL, an older backup whose shortened name collides with a new one is kept as `chronicle_replay_backup_<id>` and logged for manual cleanup (#4476)
- **Arc** ([Release v22.48.2](https://github.com/Cratis/Arc/releases/tag/v22.48.2)): The embedded Screenplay explorer uses `@cratis/event-models` and `@cratis/scene` 0.110.0, `@cratis/screenplay-language` 4.48.1 and `@cratis/components` 4.25.0.
- **Arc** ([Release v22.48.2](https://github.com/Cratis/Arc/releases/tag/v22.48.2)): `Cratis.Screenplay` updated to 4.48.1.
- **Arc** ([Release v22.48.2](https://github.com/Cratis/Arc/releases/tag/v22.48.2)): `Cratis.Chronicle`, `Cratis.Chronicle.AspNetCore` and `Cratis.Chronicle.Testing` updated to 19.29.1.
- **Screenplay** ([Release v4.48.1](https://github.com/Cratis/Screenplay/releases/tag/v4.48.1)): `@cratis/event-models` and `@cratis/scene` updated to 0.110.0.
- **Screenplay** ([Release v4.48.1](https://github.com/Cratis/Screenplay/releases/tag/v4.48.1)): `@cratis/arc` and `@cratis/arc.react` updated to 22.48.1.
- **Screenplay** ([Release v4.48.1](https://github.com/Cratis/Screenplay/releases/tag/v4.48.1)): `@cratis/components` updated to 4.25.0.
- **AI** ([Release v7.5.2](https://github.com/Cratis/AI/releases/tag/v7.5.2)): `cratis-screenplay-event-modeling` shows composing a model from focused files with `import "<path or glob>"` - a root file that imports the rest, and a module or feature that places the files it imports - and compiling the application from its root file.
- **AI** ([Release v7.5.2](https://github.com/Cratis/AI/releases/tag/v7.5.2)): `cratis-screenplay-model-authoring` lists where file imports may be written, how placement and deduplication work, and how the CLI and the VS Code extension compile an application from its root.
- **AI** ([Release v7.5.2](https://github.com/Cratis/AI/releases/tag/v7.5.2)): `cratis-screenplay-specifications` covers `when query` with `then result` and `then no result`, and `given clock`, `when clock`, `when trigger`, `given capture` and `when capture`, saying which execute today and which fail closed until the executable model admits them. Its worked example performs its lookup with `when query`.
- **AI** ([Release v7.5.2](https://github.com/Cratis/AI/releases/tag/v7.5.2)): `cratis-screenplay-captures-and-reactions` shows how to specify what sets a reaction or a capture off.
- **AI** ([Release v7.5.2](https://github.com/Cratis/AI/releases/tag/v7.5.2)): `cratis-screenplay-read-surface` specifies a view a query performer composes with `when query`, and says a query's key belongs on its own `by` line.
- **AI** ([Release v7.5.2](https://github.com/Cratis/AI/releases/tag/v7.5.2)): `cratis-screenplay-command-surface` and `cratis-screenplay-specifications` note that bare enumeration members and plain ISO 8601 instants bind from Screenplay 4.48.0.
- **Arc** ([Release v22.48.1](https://github.com/Cratis/Arc/releases/tag/v22.48.1)): The embedded event model viewer's *View* menu now comes from `@cratis/event-models` 0.109.0, which draws it in the board's own toolbar in the upper right. The choices, their position and how they are remembered are unchanged; the viewer no longer draws a toolbar of its own over the board.
- **cli** ([Release v3.24.0](https://github.com/Cratis/cli/releases/tag/v3.24.0)): `observers retry-partition` now points at `clear-partition-quarantine` when the partition is quarantined, and `observers clear-quarantine` states that it clears the observer only.
- **cli** ([Release v3.24.0](https://github.com/Cratis/cli/releases/tag/v3.24.0)): Chronicle client packages are updated to 19.29.0.
- **Screenplay** ([Release v4.47.0](https://github.com/Cratis/Screenplay/releases/tag/v4.47.0)): The VS Code extension's board takes its Cratis logo and *View* menu from `@cratis/event-models` 0.109.0; the choices are still remembered across boards and sessions.
- **Chronicle** ([Release v19.29.0](https://github.com/Cratis/Chronicle/releases/tag/v19.29.0)): `maxRetryAttempts` now applies per retry budget, so a partition whose quarantine was cleared gets a full set of attempts again. Alert evaluation counts attempts against the current budget.
- **Scene** ([Release v4.4.0](https://github.com/Cratis/Scene/releases/tag/v4.4.0)): There is a single `IconReference` type in `@cratis/scene.model`, now with format, parse and equality helpers. (#52)
- **AI** ([Release v7.5.1](https://github.com/Cratis/AI/releases/tag/v7.5.1)): The documentation rules now spell out how to link to another product's page: use its root-relative site route (`/arc/backend/csharp/embedded-event-model/`), not an absolute `cratis.io` or GitHub `blob/` URL that the site build never checks
- **AI** ([Release v7.5.1](https://github.com/Cratis/AI/releases/tag/v7.5.1)): The documentation rules state that DocFX `xref:` symbol links are not supported: the site converts them to plain text, so link to the page that documents the type instead
- **AI** ([Release v7.5.1](https://github.com/Cratis/AI/releases/tag/v7.5.1)): The documentation rules explain how a product's own link gate should skip site-absolute links by rule rather than by product name, so a product's internal links stay checked
- **Chronicle** ([Release v19.28.0](https://github.com/Cratis/Chronicle/releases/tag/v19.28.0)): Retiring a projection and removing an observer now clear the observer's open incidents first, and fail if they cannot. Retrying the operation continues from where it stopped: a retired observer stays retired, and automatic recovery after a restart no longer reactivates it. Registering it again starts it fresh. (part of #4424)
- **Orleans** ([Release v1.14.0](https://github.com/Cratis/Orleans/releases/tag/v1.14.0)): `JobsManager.Rehydrate` resumes jobs oldest first through a bounded pool and resolves each job grain from the state it already loaded, so it no longer reads every job a second time.
- **Orleans** ([Release v1.14.0](https://github.com/Cratis/Orleans/releases/tag/v1.14.0)): `JobsManager` cleanup of dead jobs deletes through a bounded pool, and starting or resuming a job starts its steps in bounded batches.
- **AuthProxy** ([Release v2.30.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.30.0)): Bearer routes use tokens alone, never browser sessions or interactive redirects. Tokens naming a bearer-route issuer are refused on other routes regardless of `Authorization` casing
- **Scene** ([Release v4.3.0](https://github.com/Cratis/Scene/releases/tag/v4.3.0)): A data table's `query` property now also accepts a `QueryBinding`; a plain query name still works. (#51)
- **Arc** ([Release v22.48.0](https://github.com/Cratis/Arc/releases/tag/v22.48.0)): The routes `MapCratisEventModel` maps are now a thin translation of `EventModelExplorer` and `EmbeddedViewerAssets`; their paths and responses are unchanged
- **Chronicle** ([Release v19.27.4](https://github.com/Cratis/Chronicle/releases/tag/v19.27.4)): Child-only `FromEventProperty` events now leave the root read model uninitialized on MongoDB, PostgreSQL, SQLite and SQL Server until a root event arrives. Replay rebuilds child-only roots without root initial values; values already materialized are not removed in place. Existing SQL rows are treated as initialized on upgrade to preserve their values, including legitimate nulls; replay them to adopt the new placeholder behavior. (part of #4436)
- **Arc** ([Release v22.47.0](https://github.com/Cratis/Arc/releases/tag/v22.47.0)): FluentValidation rules guarded by `When`/`Unless` (including async and block conditions) are no longer projected to the client, where they used to run unconditionally; the server still enforces them. (#2894)
- **Arc** ([Release v22.47.0](https://github.com/Cratis/Arc/releases/tag/v22.47.0)): Getter-only nullable reference properties (for example computed `string? DisplayName => ...`) are now emitted as optional in generated TypeScript types. (#2894)
- **Arc.TypeScript** ([v0.54.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.54.0)): Metric cardinality is capped at 1,000 distinct command types and 1,000 query names per meter, with additional names folded into `_other`. Query and subscription metrics share the query-name cap; legacy metric names and routes are bounded too. (#153)
- **Arc.TypeScript** ([v0.54.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.54.0)): `cratis.arc.subscription.duration` records `cratis.arc.query.name` alongside the legacy `query_name` attribute. Migrate subscription dashboards to the canonical key. (#153)
- **Arc.TypeScript** ([v0.54.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.54.0)): Core supports Node.js 22 again. Package versions are compiled into generated constants instead of importing package manifests, and published packages no longer include `dist/package.json`. (#153)
- **Arc.TypeScript** ([v0.54.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.54.0)): Arc for TypeScript is built and tested against `@cratis/fundamentals` 7.22.0 and `@cratis/chronicle` 6.35.0; the supported peer ranges stay `^7.19.6` and `^6.29.0`. (#157)
- **Arc.TypeScript** ([v0.54.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.54.0)): The samples, tutorial and docs use `@cratis/arc` and `@cratis/arc.react` 22.45.0 and `@cratis/components` 4.23.0, and the docs suggest pinning the Chronicle kernel image `cratis/chronicle:19.26.3-development`. (#157)
- **Arc.TypeScript** ([v0.54.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.54.0)): The HTTP contract reference follows Arc for .NET 22.45.0, which by default requires authentication outside Development for its discovery endpoints (command and query catalogs, users, tenants and the identity schema); Arc for TypeScript still serves them anonymously. (#157)
- **Chronicle** ([Release v19.27.2](https://github.com/Cratis/Chronicle/releases/tag/v19.27.2)): When a base event registration and an explicit derived event registration overlap, both sets of non-conflicting property mappings apply. The explicit derived registration wins conflicting mappings and keeps its key and parent key, regardless of registration order. (#4442)
- **Chronicle** ([Release v19.27.2](https://github.com/Cratis/Chronicle/releases/tag/v19.27.2)): Model-bound variants with a join attribute on an event also covered by a From attribute now keep the join's mappings and routing. When `On` is omitted, the join uses the annotated member rather than the variant's key; specify `On` explicitly to join on that key. (#4442)
- **Arc** ([Release v22.46.0](https://github.com/Cratis/Arc/releases/tag/v22.46.0)): Arc's identity endpoint no longer writes the readable `.cratis-identity` cookie. `IProvideIdentityDetails` now runs on every identity request instead of being skipped while the cookie exists; requests without an authenticated principal return 401. `ModifyDetails` changes only the current response. Stop reading the cookie directly and expose `/.cratis/me` to the frontend; see the [migration guide](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/identity/migrating-from-the-identity-cookie.md). (#2939)
- **Arc** ([Release v22.46.0](https://github.com/Cratis/Arc/releases/tag/v22.46.0)): `IdentityProvider.getCurrent()` in `@cratis/arc` fetches `/.cratis/me` and caches the answer in memory. It reads the legacy cookie only after a 404, with a warning; a 401 or 403 is never overruled by the cookie. Cookies restored after a refresh use `SameSite=Lax` and remain `Secure` on HTTPS. (#2939)
- **Arc.TypeScript** ([v0.53.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.53.0)): When an app uses `withMongoDB` and `withChronicle` together, Chronicle now stores each projected read model in the collection Arc reads it from, in either registration order. With the default naming policy that is the pluralized collection; replay the projection to populate it, and the previously written collection is left as it is. Apps using the `collectionName: type => type.name` workaround get the same names as before, and a throwing or empty `collectionName` override now fails when the Chronicle client registers its read models.
- **Arc.TypeScript** ([v0.53.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.53.0)): `@cratis/arc.chronicle` and `@cratis/cratis` require `@cratis/chronicle` 6.29.0 or later.
- **Arc.TypeScript** ([v0.53.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.53.0)): `@cratis/arc.core` requires Node.js 22.12 or later. (#148)
- **Arc.TypeScript** ([v0.53.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.53.0)): Arc for TypeScript is built and tested against `@cratis/fundamentals` 7.20.0 and `@cratis/chronicle` 6.31.2; the supported peer ranges stay `^7.19.6` and `^6.29.0`. (#150)
- **Arc.TypeScript** ([v0.53.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.53.0)): The samples, tutorial and docs use `@cratis/arc` and `@cratis/arc.react` 22.44.0 and `@cratis/components` 4.22.1, and the docs suggest pinning the Chronicle kernel image `cratis/chronicle:19.26.2-development`. (#150)
- **Arc.TypeScript** ([v0.53.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.53.0)): The HTTP contract reference is now compared against Arc for .NET 22.44.0, which binds numeric concept GET arguments, applies GET sorting and rejects invalid GUID query arguments with a 400, as Arc for TypeScript does. (#150)
- **Chronicle.TypeScript** ([Release v6.35.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.35.0)): Registering an event store now fails before anything is registered with the kernel when a reactor or reducer names an unregistered event type with `@handles`, handles the same event type in more than one method, or overrides a `@handles` method without redecorating it (including with an instance field). A failed `getEventStore` is no longer cached, so retrying it registers again. See #166.
- **Chronicle.TypeScript** ([Release v6.35.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.35.0)): Two registered event classes sharing one event type id each with a handler in the same reactor or reducer are now rejected as duplicate handlers; previously only the first handler was ever invoked. See #166.
- **Chronicle.TypeScript** ([Release v6.34.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.34.0)): Traces and metrics are reported under the instrumentation scope `Cratis.Chronicle.Client` with the package version instead of `@cratis/chronicle`; update any scope filters. (part of #171)
- **Chronicle.TypeScript** ([Release v6.32.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.32.1)): `ReadModelScenario` validates typed children like the kernel does: a non-string child identifier or an AutoMap between mismatched property types is rejected, while AutoMap of the identifier from the child's own key is accepted. (#156)
- **Arc** ([Release v22.45.0](https://github.com/Cratis/Arc/releases/tag/v22.45.0)): Discovery endpoints (`/.cratis/commands`, `/.cratis/queries`, `/.cratis/users`, `/.cratis/tenants` and `/.cratis/identity-details/schema`) were anonymous in every environment; they are now anonymous in Development and require authentication elsewhere by default, using the host's `IHostEnvironment`. Hosts without authentication leave them unmapped and log a warning once per host; explicitly requiring authentication fails startup. Keep the previous behavior with `builder.AddCratisArc(options => options.Introspection.RequireAuthentication = false);` or `Cratis:Arc:Introspection:RequireAuthentication=false`. `RequireAuthentication` remains a `bool`; leaving it unset selects the environment default, and `Roles` implies authentication. See [Migrating to secure defaults](https://github.com/Cratis/Arc/blob/main/Documentation/upgrading/secure-defaults.md) and [supported configuration binding](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/configuration/index.md#three-ways-to-configure). (#2834)
- **Chronicle.TypeScript** ([Release v6.32.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.32.0)): `EventScenario.append` and `appendMany` now accept empty route strings, which resolve to `Default`, `All` and `Default` like the kernel; an empty per-entry route overrides the shared route. Previously they were rejected. (part of #129)
- **AI** ([Release v7.5.0](https://github.com/Cratis/AI/releases/tag/v7.5.0)): Release-note guidance separates upgrade information from reviewer instructions and requires notes to match the current changes. (#470)
- **AuthProxy** ([Release v2.26.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.26.0)): Data Protection readiness warnings point operators to the configured key store and optional Key Vault key rather than always suggesting a file-system path. (#151)
- **AuthProxy** ([Release v2.25.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.25.0)): `IdentityVerification` now defaults to `Required` rather than `BestEffort` for services with an identity-details endpoint. Under the previous default, only HTTP `403` denied a caller; services that omit this setting now also deny missing, unreachable, timed-out, invalid or negative answers unless the endpoint explicitly authorizes the caller. To keep the previous enrichment-only behavior for a service, set `Cratis__AuthProxy__Services__<name>__IdentityVerification=BestEffort`. See the [upgrade note](https://github.com/Cratis/AuthProxy/blob/main/Documentation/upgrading/identity-verification-required-by-default.md). (#163)
- **AuthProxy** ([Release v2.25.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.25.0)): Because `Required` is now the default, a participating service that states no `IdentityVerification` also refuses startup when `TenantResolutions` is empty, denies authenticated application requests with no resolved tenant, defaults the `/.cratis/me` wait to ten seconds, and writes no remembered authorization cookie when `IdentityRevalidationInterval` is zero or negative. The independent in-memory result cache still applies. (#163)
- **Arc** ([Release v22.44.3](https://github.com/Cratis/Arc/releases/tag/v22.44.3)): Convention binding no longer registers enum types, which the container can never construct (#2958)
- **Ante** ([Release v1.2.10](https://github.com/Cratis/Ante/releases/tag/v1.2.10)): Upgraded the lobby's frontend to Arc 22.44.2 and Components 4.23.0; legal-acceptance errors and error summaries now use the upstream accessibility support instead of local workarounds. (#154)
- **Chronicle** ([Release v19.26.3](https://github.com/Cratis/Chronicle/releases/tag/v19.26.3)): Chronicle.Testing, Chronicle.XUnit.Integration, Chronicle.Workbench and the Chronicle server now use Cratis.Arc 22.41.2 (including Cratis.Arc.Core and Cratis.Arc.MongoDB); Workbench's Cratis.Arc.Swagger dependency is aligned to the same version. The [matching versions guide](https://github.com/Cratis/Chronicle/blob/main/Documentation/testing/index.mdx#matching-versions) explains how to select Chronicle and Arc package versions and override transitive dependencies with central package management. (#4370)
- **cli** ([Release v3.22.0](https://github.com/Cratis/cli/releases/tag/v3.22.0)): `cratis chronicle diagnose` supports `--all-namespaces` and `--all-event-stores`, with findings identified by event store and namespace. (#216)
- **Chronicle.TypeScript** ([Release v6.31.3](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.31.3)): `@cratis/chronicle` now builds against `@cratis/chronicle.contracts` 19.26.2 and requires `@cratis/fundamentals` ^7.20.0 as its peer dependency. (#172)
- **AuthProxy** ([Release v2.23.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.23.0)): AuthProxy now forwards the resolved tenant under both `x-cratis-tenant-id` and the previous `Tenant-ID` name, including calls to identity endpoints. Existing backends need no configuration change; Arc applications can remove `options.UseHeaderTenancy("Tenant-ID")` to use Arc's default, or keep that line to retain legacy-header tenancy. See the [upgrade note](https://github.com/Cratis/AuthProxy/blob/main/Documentation/upgrading/tenant-and-service-headers.md). (part of #154)
- **AuthProxy** ([Release v2.23.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.23.0)): `Service-ID` is still accepted inbound, and `x-cratis-microservice` is now accepted too and wins when both are sent. Both headers are forwarded with the routed service's configured name and original casing, including query-only requests using `?service=` and single-service requests with no selector. Arc HTTP service selection works with its default header; multi-service WebSocket and SSE connections still need `Globals.microserviceWSQueryArgument = 'service';` because `?x-cratis-microservice=` is not routed yet. See the [service selection upgrade guidance](https://github.com/Cratis/AuthProxy/blob/main/Documentation/upgrading/tenant-and-service-headers.md#service-selection). (part of #154)
- **Arc** ([Release v22.44.0](https://github.com/Cratis/Arc/releases/tag/v22.44.0)): Screenplay generation keeps members named after Screenplay keywords, such as `Description`, `Concurrency` or `Tag`, writing them as `@name` instead of dropping them; `SP0032` is now reported as information.
- **Arc** ([Release v22.43.0](https://github.com/Cratis/Arc/releases/tag/v22.43.0)): Arc previously accepted unsigned `x-ms-client-principal*` identity headers from any caller; it now ignores them unless the host opts in. Requests remain anonymous unless another authentication scheme authenticates them. Apps behind a trusted EasyAuth or AuthProxy ingress retain the previous behavior with `builder.AddCratis(options => options.TrustForwardedIdentityHeaders = true);` or `Cratis:Arc:TrustForwardedIdentityHeaders=true`. See [Migrating to secure defaults](https://github.com/Cratis/Arc/blob/main/Documentation/upgrading/secure-defaults.md). (#2946)
- **Arc** ([Release v22.43.0](https://github.com/Cratis/Arc/releases/tag/v22.43.0)): ASP.NET Core hosts calling `AddMicrosoftIdentityPlatformIdentityAuthentication()` (including through `AddCratis()`) without the opt-in receive a startup warning. The built-in header handlers also warn once per process when a request carries untrusted identity headers. (#2946)
- **Arc** ([Release v22.42.0](https://github.com/Cratis/Arc/releases/tag/v22.42.0)): The `query_name` attribute on `cratis.arc.query.perform` spans is `_other` for a query name that matches no query, instead of the name the caller sent (part of #2915)
- **Chronicle** ([Release v19.26.0](https://github.com/Cratis/Chronicle/releases/tag/v19.26.0)): The observer failure counters (`chronicle-observer-partitions-failed`, `chronicle-observer-partition-retry-attempts`, `chronicle-observer-partitions-quarantined`) no longer carry a `partition` tag. That tag held the event source id, which could identify a person and created one series per failing partition. They now have one series per observer, tagged by event store, namespace, observer and event sequence.
- **Chronicle** ([Release v19.26.0](https://github.com/Cratis/Chronicle/releases/tag/v19.26.0)): Their exported names no longer carry their description as a unit suffix: in Prometheus they are `chronicle_observer_partitions_failed_total`, `chronicle_observer_partition_retry_attempts_total` and `chronicle_observer_partitions_quarantined_total`, and the description is now the metric's help text. Update dashboards and alert rules that use the old suffixed names; the rules in [Get alerted when observers stop processing](https://github.com/Cratis/Chronicle/blob/main/Documentation/hosting/alerting-on-observer-failures.md) match both.
- **Chronicle** ([Release v19.26.0](https://github.com/Cratis/Chronicle/releases/tag/v19.26.0)): The counters' descriptions now say what they count: `chronicle-observer-partitions-failed` counts every failed attempt, including each retry, not failed partitions.
- **Screenplay** ([Release v4.46.2](https://github.com/Cratis/Screenplay/releases/tag/v4.46.2)): The event model board in VS Code keeps your view options - detail level, properties and arrows or lines - for you: every board, and every later session, opens with your last choice, and changing them on one open board changes the others.
- **Screenplay** ([Release v4.46.2](https://github.com/Cratis/Screenplay/releases/tag/v4.46.2)): The event model board in VS Code is watermarked with the full Cratis logo.
- **AI** ([Release v7.3.4](https://github.com/Cratis/AI/releases/tag/v7.3.4)): The Arc authentication, authorization and identity skill now matches Arc 22.41.1 (it pinned 22.16.0): it documents named and guest authorization policies, fallback baselines, the method-replaces-type rule, Microsoft attribute enforcement, observable-query emission guards, the anonymous discovery and introspection endpoints with the `Cratis:Arc:Introspection` options, and the trusted forwarded-identity header requirement. It qualifies older behavior by Arc version and names the current defaults tracked in Cratis/Arc#2834, Cratis/Arc#2946 and Cratis/Arc#2939 (#467)
- **Chronicle.Kotlin** ([Release v6.11.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.11.0)): Correlation ids read from events appended by earlier versions of the client now come back in a different form from the UUID your application supplied: the first three groups of the UUID have their bytes reversed. Ids recorded outside Chronicle for those events, such as in logs, your application's own database or tracing, will no longer match what the client returns for events appended before the upgrade. Events appended after the upgrade round-trip the UUID you supplied and match the value a .NET service logs for the same operation.
- **Chronicle.Kotlin** ([Release v6.11.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.11.0)): Captures saved by earlier versions of the client stay where they are. Those versions stored a capture under its id with the first three groups of the UUID byte-reversed. Saving, starting, stopping and deleting a capture now use the id you supply when the kernel holds a capture under it, otherwise the byte-reversed id when the kernel holds that, and otherwise the id you supply, so a new capture is created under it. An existing capture is never moved or recreated, so it keeps the kernel's record of what it has already captured and does not append those items again. Listing captures still shows such a capture under the byte-reversed id. To decide which id to use, each of these calls first lists the event store's captures.
- **cli** ([Release v3.21.3](https://github.com/Cratis/cli/releases/tag/v3.21.3)): The documentation now states that a corpus extension may own additional top-level sections of `.cratis/ai.json`, and `cratis ai install` and `update` keep them unchanged. (#208)
- **Arc** ([Release v22.41.0](https://github.com/Cratis/Arc/releases/tag/v22.41.0)): A `CommandScenario` now resolves a read model, or a reducer's `current` state, the way production does, in every scenario and not only with `UseDecisionReads()`. A read model whose projection or reducer handles none of the events seeded for its event source now resolves as `null` instead of as an empty instance, so a non-nullable injected read model receives `null`; and a reducer receives `null` as `current` for its first event instead of a default instance. A spec that relied on the old behavior should seed an event the read model handles, pin the read model with `.ReadModel(...)`, or have the reducer handle a `null` `current`. (#2928)
- **Chronicle** ([Release v19.25.0](https://github.com/Cratis/Chronicle/releases/tag/v19.25.0)): Clearer messages for conflicting concurrency scopes and refused decision reads: (#4432)
- **Chronicle** ([Release v19.25.0](https://github.com/Cratis/Chronicle/releases/tag/v19.25.0)): Reading an event source with a decision read and also giving it an explicit concurrency scope in the same unit of work throws `DecisionReadConflictsWithConcurrencyScope`, a `ConflictingConcurrencyScopesForLabel`, whose message names the event source and says to remove the explicit scope or read it without a decision read.
- **Chronicle** ([Release v19.25.0](https://github.com/Cratis/Chronicle/releases/tag/v19.25.0)): Other conflicting scopes for one event source are described in words, such as "expects no events yet", instead of dumping `ConcurrencyScope` records with sentinel sequence numbers. `ConflictingConcurrencyScopesForLabel` exposes the event source as `ScopeLabel`.
- **Chronicle** ([Release v19.25.0](https://github.com/Cratis/Chronicle/releases/tag/v19.25.0)): `DecisionReadRefused` explains each `DecisionReadRefusalReason` and what to do, for example that a `Hierarchy` projection has children or nested objects and a flat read model should be read instead.
- **cli** ([Release v3.21.1](https://github.com/Cratis/cli/releases/tag/v3.21.1)): Bundle Screenplay 4.45.0 (Screenplay, MCP and canonical corpus), which adds the `then no readmodel <ReadModel> for <key>` assertion; models that use it compile to ESM v5, which ESM consumers must admit explicitly.
- **Arc** ([Release v22.40.0](https://github.com/Cratis/Arc/releases/tag/v22.40.0)): A `[ProtectedDecision]` command now runs discoverable validators, including `ConceptValidator<T>` and `CommandValidator<T>`, whose only public constructor is parameterless and that Arc constructed itself. A validator with constructor dependencies is still refused before anything is resolved. A validator registered explicitly through a factory, an instance or another registration that supplies an instance Arc did not construct is resolved first, because only resolving it reveals what it supplies, and then refused: the command still fails and nothing the registration produced is used. Let convention discovery register the validator. Arc certifies only that it ran the parameterless constructor and that the rules and rule components are unchanged by reference; state changed after construction (including by a decorator that returns the original instance), property injection, `ApplyCondition`, cascade mode, nested child validators, static members and service locators are not covered and stay the developer's responsibility. See [protected-mode validator boundary](https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/chronicle/read-models/injecting-into-commands.md#decision-reads-for-event-dependent-commands) (part of #2831)
- **Arc** ([Release v22.40.0](https://github.com/Cratis/Arc/releases/tag/v22.40.0)): The refusal messages and the ARCCHR0011 validator advice now say why a validator was refused and what to do instead (part of #2831)
- **AI** ([Release v7.3.0](https://github.com/Cratis/AI/releases/tag/v7.3.0)): `cratis/full/typescript` composes `cratis/arc/typescript`. The Arc for TypeScript server skills are opt-in (`cratis/arc/typescript` or `cratis/full/typescript`), so C# and React applications do not load them.
- **AI** ([Release v7.3.0](https://github.com/Cratis/AI/releases/tag/v7.3.0)): `profiles.md` documents the Arc for TypeScript profiles and skills.
- **Chronicle.TypeScript** ([Release v6.31.2](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.31.2)): Dependency refresh: `@cratis/chronicle.contracts` 19.6.1 → 19.8.1, `@cratis/fundamentals` 7.19.2 → 7.19.6 (pin and peer range together), `@grpc/grpc-js` 1.14.4 → 1.14.5, plus `undici`, `@types/node`, `vite`, `vitest` and `tsx` patch bumps.
- **Chronicle.TypeScript** ([Release v6.31.2](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.31.2)): A workspace resolution now forces a single `@grpc/grpc-js` for every dependent; advancing that package from now on also means updating the resolution range in the root `package.json`.
- **Stage** ([Release v4.22.2](https://github.com/Cratis/Stage/releases/tag/v4.22.2)): Update dependency versions and required runtime compatibility settings.
- **Arc** ([Release v22.39.0](https://github.com/Cratis/Arc/releases/tag/v22.39.0)): Chronicle packages are updated from 19.13.0 to 19.23.0 and Fundamentals to 7.19.6 (part of #2828)
- **Arc** ([Release v22.39.0](https://github.com/Cratis/Arc/releases/tag/v22.39.0)): Arc claims ownership of each command's Chronicle unit of work and commits it as owner. A failed command whose unit has enrolled decision reads is rolled back as owner (`RollbackAsOwner`); a failed command without decision reads, including every unmarked command, is rolled back through the public `Rollback()` exactly as before. A direct SDK `Rollback()` or `Commit()` (including an aggregate root commit) of a protected unit is refused with `ProtectedUnitOfWorkRequiresOwner` (part of #2828)
- **Arc** ([Release v22.39.0](https://github.com/Cratis/Arc/releases/tag/v22.39.0)): `AddReadModels` registers Arc's command-aware `IDecisionReads` and `DecisionRead<T>` for every read model. In unmarked commands `IDecisionReads.GetDetached<T>` and `Admit<T>` behave exactly as Chronicle's reader; `IDecisionReads.Get<T>` and `DecisionRead<T>` are refused with a message pointing to `[ProtectedDecision]` (on 19.13 an enrolled read in an unmarked command already failed at commit) (part of #2828)
- **Arc** ([Release v22.39.0](https://github.com/Cratis/Arc/releases/tag/v22.39.0)): **Unique constraints honour `IgnoreCasing`.** The .NET client now sends `IgnoreCasing` when it registers a unique constraint. Before, the kernel stored every unique constraint as case-sensitive, so a constraint marked `IgnoreCasing` now rejects a value that differs only in casing (Cratis/Chronicle#4368, 19.22.0)
- **Arc** ([Release v22.39.0](https://github.com/Cratis/Arc/releases/tag/v22.39.0)): **Constraint indexes are rebuilt at registration when a constraint's sequences change.** A constraint can declare the event sequences it applies to (`ForEventSequences(...)`, `ForEventLog()`, `EventSequences` on `[Unique]`). For each newly covered sequence the kernel rebuilds the index from existing events; a sequence no longer covered stops validating. See the known limits in Cratis/Chronicle#4408 (Cratis/Chronicle#4398, 19.23.0)
- **Arc** ([Release v22.39.0](https://github.com/Cratis/Arc/releases/tag/v22.39.0)): **The ASP.NET Core event store falls back to the client options.** `UseCratisChronicle` now uses the client's configured event store unless a web-specific one is set (Cratis/Chron
- **Chronicle** ([Release v19.22.2](https://github.com/Cratis/Chronicle/releases/tag/v19.22.2)): Known limitation: during a replay, a lookup by key still reads the replay collection while lists read the primary one, as with the SQL sink (see #4391).
- **Chronicle** ([Release v19.22.2](https://github.com/Cratis/Chronicle/releases/tag/v19.22.2)): Known limitation: materialized observation of a globally scoped projection may read the wrong namespace (see #4392).
- **Chronicle** ([Release v19.22.2](https://github.com/Cratis/Chronicle/releases/tag/v19.22.2)): Known limitation: under sustained writes, pages queue behind each other; latest-wins delivery is proposed (see #4378).
- **Chronicle** ([Release v19.22.2](https://github.com/Cratis/Chronicle/releases/tag/v19.22.2)): Each shared change stream watches its read-model database, which needs the `changeStream` and `find` actions there. The built-in `read`/`readWrite`/`dbOwner` roles grant both. See Cratis/Documentation#19.
- **AI** ([Release v7.2.2](https://github.com/Cratis/AI/releases/tag/v7.2.2)): **Verify checks skill frontmatter against a real YAML parser.** It uses `yaml`, a devDependency of `Source/Verification` only, which does not reach `@cratis/pi`. Verify now checks four things:
- **AI** ([Release v7.2.2](https://github.com/Cratis/AI/releases/tag/v7.2.2)): The frontmatter is valid YAML with no duplicate keys, and errors are reported at the `SKILL.md` line.
- **AI** ([Release v7.2.2](https://github.com/Cratis/AI/releases/tag/v7.2.2)): Top-level keys are within the Agent Skills set.
- **AI** ([Release v7.2.2](https://github.com/Cratis/AI/releases/tag/v7.2.2)): `metadata` maps strings to strings.
- **AI** ([Release v7.2.2](https://github.com/Cratis/AI/releases/tag/v7.2.2)): The runtime reader's globs equal the YAML value for every skill. This cross-check means a spelling the runtime reads differently can't silently lose a hint.
- **AI** ([Release v7.2.2](https://github.com/Cratis/AI/releases/tag/v7.2.2)): **Messages name the actual cause.** Unsupported forms get a specific message (block scalar, unquoted, trailing comment, list, flow map, wrong indentation, and so on), chosen from the YAML parse when the YAML is valid. For invalid YAML, the parser error comes first.
- **AI** ([Release v7.2.2](https://github.com/Cratis/AI/releases/tag/v7.2.2)): **Local gate** (CI's `verify` job): `yarn install --immutable`, the three `check` scripts, `verify`, `test` (168 tests, 167 pass, 1 unrelated skip), `yarn pack --dry-run` and `git diff --check`.
- **AI** ([Release v7.2.2](https://github.com/Cratis/AI/releases/tag/v7.2.2)): **Strategy's validator** (`tools/lib/validate-agent-setup.rb`) reports no skill errors on the new corpus. It flags the seven skills on `main`.
- **AI** ([Release v7.2.2](https://github.com/Cratis/AI/releases/tag/v7.2.2)): **A real pi subagent** still receives the `cratis-specifications-csharp` hint.
- **AI** ([Release v7.2.2](https://github.com/Cratis/AI/releases/tag/v7.2.2)): **Review workflow:** 9 rounds, with a final `passed: true` and no findings. It was **Anthropic-only**: two independent Opus 5.5 reviewers, each cross-checking the other. Earlier rounds found parser gaps that could lose hints silently; the YAML cross-check now closes them.
- **Arc.Kotlin** ([Release v7.7.0](https://github.com/Cratis/Arc.Kotlin/releases/tag/v7.7.0)): Updated to Chronicle.Kotlin 6.10.0, which adds `ReadModelNamingPolicy` (Cratis/Chronicle.Kotlin#105).
- **Arc.Kotlin** ([Release v7.7.0](https://github.com/Cratis/Arc.Kotlin/releases/tag/v7.7.0)): Apps on Arc's default Mongo policy now get the pluralized collection Arc was already reading. Apps using `pluralizeReadModelNames = false` get identical names, so the workaround can be removed.
- **Arc.Kotlin** ([Release v7.7.0](https://github.com/Cratis/Arc.Kotlin/releases/tag/v7.7.0)): Upgrade action: the kernel keeps the new container name but does not replay the projection for a container-only change, and the previous, unread collection is not deleted. Replay affected projections after upgrading and drop the old collection yourself. A running kernel may keep writing to the old container until its projection pipeline is rebuilt, for example on restart.
- **Arc.Kotlin** ([Release v7.7.0](https://github.com/Cratis/Arc.Kotlin/releases/tag/v7.7.0)): The camel-casing setup snippets (Kotlin and Java) no longer include the workaround. The read-model naming documentation explains how the policy reaches Chronicle, the override, the case without Arc's policy, and the own-`ChronicleOptions` case, where the app calls `withReadModelNamingPolicy` itself (Cratis/Documentation#19).
- **Ante** ([Release v1.2.3](https://github.com/Cratis/Ante/releases/tag/v1.2.3)): **Chronicle packages:** Ante now uses the Chronicle client 19.22.0. Its integration suite runs against kernel 19.22.1. That kernel is now the minimum for the behavior below, and `Documentation/deployment.md` says so.
- **Ante** ([Release v1.2.3](https://github.com/Cratis/Ante/releases/tag/v1.2.3)): **Organization names:** a name that differs only in casing from one already held is refused by the unique constraint when it is appended. Before, only Ante's read-model checks caught it (Cratis/Chronicle#4368).
- **Ante** ([Release v1.2.3](https://github.com/Cratis/Ante/releases/tag/v1.2.3)): Chronicle rebuilds the constraint's index when it becomes case-insensitive.
- **Ante** ([Release v1.2.3](https://github.com/Cratis/Ante/releases/tag/v1.2.3)): Resolve any existing names that differ only in casing before upgrading, as `deployment.md` describes. Chronicle's handling of such collisions is tracked in Cratis/Chronicle#4382.
- **Ante** ([Release v1.2.3](https://github.com/Cratis/Ante/releases/tag/v1.2.3)): **Consent time:** with kernel 19.22.1, a host's inbox copy of an Ante event keeps the time Ante recorded it, not the forwarding time. For example, `LegalTermsAccepted` keeps the consent time (Cratis/Chronicle#4375).
- **Ante** ([Release v1.2.3](https://github.com/Cratis/Ante/releases/tag/v1.2.3)): **Later generations:** projections auto-map properties from later event generations (Cratis/Chronicle#4367). Ante's explicit mapping from #104 stays, for deployments on older kernels.
- **AI** ([Release v7.2.1](https://github.com/Cratis/AI/releases/tag/v7.2.1)): `rules/pull-requests.md` is the single source of the contract: an optional first `## Summary` or one lead paragraph, then only `## Added`, `## Changed`, `## Fixed`, `## Removed`, `## Security`, `## Deprecated`; `(#n)` at the end of the bullet that delivers the issue, `(part of #n)` or `see #n` for one that must stay open; no `Closes`/`Fixes`/`Refs` lines, test plans, verification, review or provenance notes, internal status, or relative links. Reviewer information goes in a pull request comment. Includes a before/after example and a short self-check. (#444)
- **AI** ([Release v7.2.1](https://github.com/Cratis/AI/releases/tag/v7.2.1)): `ship-changes` writes and re-reads the description against the contract before creating or editing a pull request, and fixes a failing `verify-release-notes` check by editing the description. (#444)
- **AI** ([Release v7.2.1](https://github.com/Cratis/AI/releases/tag/v7.2.1)): The `cratis-release-notes` skill follows the contract and explains how to repair an already-published release. (#444)
- **AI** ([Release v7.2.1](https://github.com/Cratis/AI/releases/tag/v7.2.1)): Statements that `(#n)` closes issues apply only to repositories released by cratis/release-action. (#444)
- **AI** ([Release v7.2.1](https://github.com/Cratis/AI/releases/tag/v7.2.1)): The pull request template states the contract and no longer carries a literal example issue number. (#444)
- **Arc** ([Release v22.37.0](https://github.com/Cratis/Arc/releases/tag/v22.37.0)): Arc's JSON options carry a type-info resolver chain: resolvers the application added, then one Arc resolver that asks any resolvers appended to the chain later, then a source-generated context for Arc's own wire types (query and command results, change sets, paging, observable query hub and WebSocket messages, identity, introspection), then reflection only when it is enabled. Arc serializes these types through resolved `JsonTypeInfo` instead of runtime-type overloads. The JSON on the wire is byte-for-byte unchanged, and resolvers an application appends to `TypeInfoResolverChain` keep deciding the contracts as before. The trim/AOT baseline drops from 488 to 332 (Refs #2854)
- **Arc** ([Release v22.37.0](https://github.com/Cratis/Arc/releases/tag/v22.37.0)): `ArcOptions.JsonSerializerOptions.TypeInfoResolver` is no longer `null` by default, and an appended resolver that does not know one of Arc's types now falls back to Arc's metadata instead of failing. An application that appends `JsonTypeInfoResolver.Combine(options.TypeInfoResolver, x)` to the chain now has Arc's resolver answer before `x` for types Arc or reflection knows; wrapping with `WithAddedModifier` and plain appends behave as before (Refs #2854)
- **Arc.TypeScript** ([v0.50.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.50.0)): The `@cratis/arc.chronicle` peer dependency now requires `@cratis/chronicle` 6.17.0 or later. (#93)
- **Arc.TypeScript** ([v0.50.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.50.0)): An Arc-owned Chronicle client is closed only once, even if disposal runs twice. (#93)
- **Arc.TypeScript** ([v0.50.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.50.0)): The documentation clarifies class-level versus method-level `@onceOnly` and what registration verifies for a caller-owned client. (#93)
- **Arc** ([Release v22.34.3](https://github.com/Cratis/Arc/releases/tag/v22.34.3)): Observable query handling, HTTP delivery and the WebSocket demultiplexer close over each element type once, through a cached typed helper, instead of building generic calls through reflection on every subscription. The handler now creates observables with typed activation, and the element-type lookup that ran on every empty emission is gone. Five trim/AOT diagnostics are removed outright; the remaining dispatch reflection is consolidated in one place. The trim/AOT baseline drops from 526 to 492 (Refs #2855)
- **Arc** ([Release v22.34.2](https://github.com/Cratis/Arc/releases/tag/v22.34.2)): Observable query change sets look up an item type's identity property once per type instead of on every emission (Refs #2856)
- **Arc** ([Release v22.34.2](https://github.com/Cratis/Arc/releases/tag/v22.34.2)): The runtime-typed JSON serialization and reflection in change set computation and subscription scope snapshots now sit behind single call sites, ready for a resolver-based fix once Arc's JSON options carry a type-info resolver (#2854). This does not make them trim- or AOT-safe yet; it merges repeated unsafe calls, which lowers the trim/AOT baseline by 51 diagnostics (577 to 526 after merging main) (Refs #2856)
- **Arc.TypeScript** ([v0.49.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.49.0)): With the preview `activateArtifactsInScopes` option, reactors and reducers read, resolve command read models, rehydrate aggregates and append events against the event store Chronicle delivered from, instead of looking the store up again through the application's client. A mismatched registry, tenant or event store fails the delivery. (#93)
- **Arc.TypeScript** ([v0.49.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.49.0)): Commands returned by reactors under scoped activation receive the delivery's cancellation signal and stop before the next command once the delivery is cancelled or Arc shuts down. (#93)
- **Arc.TypeScript** ([v0.49.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.49.0)): `ChronicleReadModels`, the read-model interceptor, the command read-model resolver and the response handler accept a `ChronicleStoreSource`; existing constructor calls keep working. (#93)
- **Arc** ([Release v22.34.1](https://github.com/Cratis/Arc/releases/tag/v22.34.1)): Arc serializes its own identity results through a source-generated `JsonSerializerContext` chained in front of the application's resolver, so they need no runtime reflection. The JSON written to the identity cookie and endpoint is byte-for-byte unchanged. Application-defined identity details still go through the application's resolver, falling back to reflection only when none is configured (Refs #2854)
- **Arc** ([Release v22.34.1](https://github.com/Cratis/Arc/releases/tag/v22.34.1)): Value conversion consolidates its parsing and default-value paths, with unchanged results. The trim/AOT baseline drops from 625 to 577 diagnostics (Refs #2856)
- **Arc** ([Release v22.34.0](https://github.com/Cratis/Arc/releases/tag/v22.34.0)): Arc registers ASP.NET Core authorization itself instead of relying on MVC to do it (Refs #2880)
- **Arc** ([Release v22.34.0](https://github.com/Cratis/Arc/releases/tag/v22.34.0)): With controllers on, MVC is now registered after the `configureBuilder` callback; configure `MvcOptions` and MVC's `JsonOptions` after `AddCratisArc` returns (Refs #2880)
- **Arc** ([Release v22.34.0](https://github.com/Cratis/Arc/releases/tag/v22.34.0)): `AddControllersFromProjectReferencedAssembles` is annotated `[RequiresUnreferencedCode]`/`[RequiresDynamicCode]` (Refs #2880)
- **Arc.TypeScript** ([v0.48.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.48.0)): With `activateArtifactsInScopes` on, building the application checks every reactor's and reducer's constructor dependencies and fails for one Arc cannot bind, and Chronicle artifacts discovered before `withChronicle` are also registered. Without the option, nothing changes. (part of #93)
- **Arc** ([Release v22.33.1](https://github.com/Cratis/Arc/releases/tag/v22.33.1)): Query paging, counting and sorting, and read model interception, call typed generic helpers instead of building `Queryable` and interceptor calls through reflection, which trimming and NativeAOT cannot follow. The trim/AOT baseline drops from 674 to 625 diagnostics (Refs #2855, Refs #2856)
- **Arc** ([Release v22.33.1](https://github.com/Cratis/Arc/releases/tag/v22.33.1)): An open generic read model interceptor must implement `IInterceptReadModel<T>` over its own type parameter; any other shape now fails at startup with `OpenGenericReadModelInterceptorMustInterceptItsTypeParameter` naming the type. Such an interceptor already made every query fail (Refs #2856)
- **Arc.TypeScript** ([v0.47.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.47.0)): A query fails instead of serving protected data when a raw document or instance of a protected model cannot be released: nested inside another shape, under another tenant, with a mismatching subject, with per-property subjects (`__subjects`), with fields the read model does not declare, or with BSON values that are not JSON. Error messages name fields, never values. `MongoPage` results from `page()` fail; use `queryPage`. (#111)
- **Arc.TypeScript** ([v0.47.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.47.0)): Chronicle's bookkeeping fields (`__subject`, `__subjects`, `__initialized`, `__lastHandledEventSequenceNumber`) are removed from released documents of protected models. (#111)
- **Arc.TypeScript** ([v0.47.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.47.0)): An interceptor that returns a replacement instance of a protected model keeps working: Arc runs the model's protecting interceptors on the replacement, so Chronicle releases it. An instance of another protected model returned by an interceptor gets that model's protecting interceptors, and the query fails if it is still not released. Protecting interceptors can therefore see `intercept` called a second time on a replacement, and a replacement must keep its `@subject()` value or `id` unless it holds no protected value. (#111)
- **Arc.TypeScript** ([v0.47.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.47.0)): Reducer models from `ChronicleReadModels` that are protected only in nested or `@encrypted()` fields are released when returned directly, in an array or in a query page, and fail the query when nested in another shape. (#111)
- **Arc.TypeScript** ([v0.47.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.47.0)): For protected reducer read models, a removed change from `ChronicleReadModels.watch()` and `watchIterable()` carries an empty instance of the read-model type, because Chronicle does not release that payload; only its key and `removed` flag carry information. Projections and unprotected models keep their payload. (#111)
- **Ante** ([Release v1.2.0](https://github.com/Cratis/Ante/releases/tag/v1.2.0)): Ante no longer needs MongoDB to start. It creates its exchange indexes in the background, plus the attested staging and session indexes in Attested mode, and loads the token upgrade window there too. Before, Ante crash-looped while MongoDB was unavailable.
- **Ante** ([Release v1.2.0](https://github.com/Cratis/Ante/releases/tag/v1.2.0)): Timeouts, write-concern errors, connection errors and MongoDB's transient error codes are retried every second.
- **Ante** ([Release v1.2.0](https://github.com/Cratis/Ante/releases/tag/v1.2.0)): Wrong credentials, invalid connection settings, an incompatible driver and other rejected commands (such as an index-option conflict) are logged as critical, with the server code where there is one, and stop the host.
- **Ante** ([Release v1.2.0](https://github.com/Cratis/Ante/releases/tag/v1.2.0)): Until the indexes exist:
- **Ante** ([Release v1.2.0](https://github.com/Cratis/Ante/releases/tag/v1.2.0)): `POST /_invite/exchange` answers **503**. The legacy exchange returns it after parsing the JSON body and before validating the token.
- **Ante** ([Release v1.2.0](https://github.com/Cratis/Ante/releases/tag/v1.2.0)): The attested `/_invite/stage` and `/_invite/exchange` answer **503** before reading the body.
- **Ante** ([Release v1.2.0](https://github.com/Cratis/Ante/releases/tag/v1.2.0)): `/healthz/ready` reports the new `exchange-indexes` check as unhealthy.
- **Ante** ([Release v1.2.0](https://github.com/Cratis/Ante/releases/tag/v1.2.0)): Tokens issued before 1.0 are refused until the upgrade window has loaded. The window's activation time is now recorded on the first successful MongoDB contact rather than at process start.
- **Ante** ([Release v1.2.0](https://github.com/Cratis/Ante/releases/tag/v1.2.0)): Identity-provider reads are not gated. They return 500 while MongoDB is down.
- **AI** ([Release v7.1.5](https://github.com/Cratis/AI/releases/tag/v7.1.5)): `cratis-documentation-writing`: when a page shows several backends, state their differences once in a table near the start, and keep a series' backend limitations in one table on its index. Adding a backend also means checking cross-product and site-level pages for single-language claims (#442)
- **AI** ([Release v7.1.5](https://github.com/Cratis/AI/releases/tag/v7.1.5)): `cratis-documentation-writing` site reference: site-owned pages can use the language tab macros, tabs can't sit inside `Steps`, the variant-docs audit covers site-owned pages, and a preview variant is labeled on the first screen of every page that shows it (#442)
- **AI** ([Release v7.1.5](https://github.com/Cratis/AI/releases/tag/v7.1.5)): `cratis-technical-examples`: a compiling tab isn't a working tab. Check discovery, generated proxies and claimed runtime behavior, never publish failing code with a workaround in the prose, and keep id types and domain names consistent across tabs (#442)
- **Arc.TypeScript** ([v0.45.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.45.0)): Registering a shutdown participant after shutdown has started throws.
- **Arc.TypeScript** ([v0.45.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.45.0)): Repeated or concurrent `server.dispose()` calls return the outcome of the first shutdown instead of repeating it, including when that outcome is a rejection.
- **Arc.TypeScript** ([v0.45.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.45.0)): Without participants, the first shutdown behaves as before.
- **Arc.TypeScript** ([v0.44.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.44.0)): A lost listener connection no longer fails observations immediately. They fail only when every reconnect attempt is exhausted; the error keeps the underlying cause. A successful heartbeat resets the retry budget, and Arc never falls back to in-process notifications.
- **Arc.TypeScript** ([v0.44.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.44.0)): During recovery, a changed table mapping, a different database, an invalid trigger or a catalog permission error fails only the affected observation; transient reader errors and timeouts count as a failed reconnect attempt instead.
- **Arc.TypeScript** ([v0.44.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.44.0)): Disposing the observation manager completes open subscriptions, including while a reconnect is in progress.
- **Stage** ([Release v4.22.1](https://github.com/Cratis/Stage/releases/tag/v4.22.1)): Reducers are no longer refused when a sibling read model, event or namespace shares a name with a concept or composite property type; emitted property types are qualified, so these models render and compile.
- **Arc** ([Release v22.32.0](https://github.com/Cratis/Arc/releases/tag/v22.32.0)): The lightweight OpenAPI document now drops every route marked `ExcludeFromApiDescription`, including the generated HTTP `QUERY` reader, which OpenAPI 3.0 cannot represent. Apps with `EnableQueryHttpMethod = true` no longer see `query` operations in that document.
- **Arc** ([Release v22.32.0](https://github.com/Cratis/Arc/releases/tag/v22.32.0)): An application's *own* class named `PathAttribute` is no longer honored on read models or query methods; only Cratis' `PathAttribute` is.
- **Arc** ([Release v22.32.0](https://github.com/Cratis/Arc/releases/tag/v22.32.0)): Introspection defaults. The proposal for a future major release is to make `RequireAuthentication` default to `true` and require apps to opt back in to anonymous catalogs. Hosts without an authentication scheme would then fail at startup until configured. This protects only the two catalog routes; see also #2873.
- **Arc** ([Release v22.32.0](https://github.com/Cratis/Arc/releases/tag/v22.32.0)): Release build: 0 warnings.
- **Arc** ([Release v22.32.0](https://github.com/Cratis/Arc/releases/tag/v22.32.0)): All 15 spec projects pass (Core 3,008; Screenplay 1,432; Chronicle 837; others).
- **Arc** ([Release v22.32.0](https://github.com/Cratis/Arc/releases/tag/v22.32.0)): ProxyGenerator specs: 1,562 pass.
- **Arc** ([Release v22.32.0](https://github.com/Cratis/Arc/releases/tag/v22.32.0)): Screenplay end-to-end reads back clean on the AspNetCore, Chronicle and Layered test apps.
- **Arc** ([Release v22.32.0](https://github.com/Cratis/Arc/releases/tag/v22.32.0)): An Opus review of the fix commits found no critical or major issues. Its documentation findings are addressed in the last commit.
- **Arc** ([Release v22.32.0](https://github.com/Cratis/Arc/releases/tag/v22.32.0)): The name-clash guard: a spec imports both ModelBound namespaces and uses `[Path]`.
- **Ante** ([Release v1.0.0](https://github.com/Cratis/Ante/releases/tag/v1.0.0)): **Invitation tokens are isolated per deployment by default** (#69). Every token carries this deployment's issuer and audience, and exchange always requires them. Leave `Ante:Invitations:Token:Issuer`/`Audience` empty and Ante derives `urn:cratis:ante:{EventStore}:{Namespace}` (and `…:lobby`), so two deployments never accept each other's tokens, even when they share a key. The effective values are logged at startup. If your proxy checks issuer and audience, set the proxy to those values, or set them explicitly in Ante.
- **Ante** ([Release v1.0.0](https://github.com/Cratis/Ante/releases/tag/v1.0.0)): **Upgrade without draining.** A token issued before 1.0 has no issuer or audience. It keeps working for one token lifetime (`Expiry`) after the deployment first starts on 1.0, as long as a trusted key signed it and it predates that start. After that it is refused.
- **Ante** ([Release v1.0.0](https://github.com/Cratis/Ante/releases/tag/v1.0.0)): A deployment without a signing key starts with a warning, as before. `/healthz/ready` now reports an `invitation-signing` check as degraded (still HTTP 200), and incoming invitations wait until a key is configured. Deployments that only do self-service registration need no key.
- **Components** ([Release v4.20.0](https://github.com/Cratis/Components/releases/tag/v4.20.0)): `tsyringe` is now an optional peer. Components never imports it, and Arc React installs it as its own dependency, so you no longer need to install it yourself. `reflect-metadata` stays a required peer: keep installing it and importing it at your entry point. The package check now fails if a published file imports either package. (#248)
- **Chronicle.Elixir** ([Release v3.8.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.8.0)): The client now uses grpc 1.x: `grpc ~> 1.0`, Mint 1.11 or later, `cratis_chronicle_contracts` 19.19 or later (the first contracts release on grpc 1.x), and Elixir 1.18 or later. Applications that also call `GRPC.Stub.connect/2` themselves should pass `adapter: GRPC.Client.Adapters.Mint` (or add Gun), and no longer need to supervise `GRPC.Client.Supervisor`.
- **Chronicle.Elixir** ([Release v3.8.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.8.0)): Each Chronicle connection owns and supervises its own gRPC transport, so stopping, restarting or killing a client closes its channels and sockets, and no orphaned connection is left under grpc's global supervisor.
- **Chronicle.Elixir** ([Release v3.8.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.8.0)): HTTP/2 server push is disabled on Chronicle channels. An application-level Mint `client_settings` that does not keep `enable_push: false` is rejected at startup.
- **Ante** ([Release v0.17.0](https://github.com/Cratis/Ante/releases/tag/v0.17.0)): `InvitationRejected` is generation 3 (adds `InvitationNotPending = 3`); generations 1 and 2 upcast unchanged. Hosts should register generation 3 before upgrading Ante.
- **Stage** ([Release v4.22.0](https://github.com/Cratis/Stage/releases/tag/v4.22.0)): The semantic specification executor no longer needs to run in a process isolated from an Arc host. The host's global service provider is left untouched after a run.
- **Stage** ([Release v4.22.0](https://github.com/Cratis/Stage/releases/tag/v4.22.0)): Generated C# now qualifies framework and cross-namespace types with `global::` and escapes contextual keywords such as `await`, so authored names can no longer shadow them.
- **Arc** ([Release v22.31.2](https://github.com/Cratis/Arc/releases/tag/v22.31.2)): Arc checks the caller's identity before and after each authorization policy, including policy construction, for both Arc and ASP.NET policies. A policy that changes the identity now denies the request immediately, and later policies are no longer run against the changed identity, so a later policy cannot restore an earlier change unnoticed (#2830)
- **Arc** ([Release v22.31.2](https://github.com/Cratis/Arc/releases/tag/v22.31.2)): The authorization documentation and decision 0006 state what the identity check covers: claims, authentication type, name and role claim types and the actor chain. They also state what it does not cover: hidden state in custom principal types, or a change undone within a single policy (#2830)
- **Arc** ([Release v22.31.1](https://github.com/Cratis/Arc/releases/tag/v22.31.1)): ASP.NET model validation no longer builds `ValidationContext<T>` through `MakeGenericType` and `Activator.CreateInstance`, which NativeAOT and trimming cannot preserve. Command-only and query-only rules behave as before (#2853)
- **Chronicle.Kotlin** ([Release v6.7.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.7.0)): The Java "observe a live page" snippet shows the publisher (#102)
- **Chronicle.TypeScript** ([Release v6.24.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.24.0)): A unique-property key must hold a primitive value of its declared type; a `Date` or concept value on a constrained key rejects with `UnsupportedEventSequenceOperation`. Unconstrained properties are unaffected.
- **Chronicle** ([Release v19.21.0](https://github.com/Cratis/Chronicle/releases/tag/v19.21.0)): Application `Rollback()` and `Dispose()` refuse open owner-claimed units with enrolled decision reads, keeping their ambient transaction and guard intact. Owner rollback and public rollback during an in-flight protected commit refuse with `UnitOfWorkIsCompleting`. Plain legacy units keep their Compatibility behavior.
- **Chronicle** ([Release v19.21.0](https://github.com/Cratis/Chronicle/releases/tag/v19.21.0)): ASP.NET Core middleware uses owner rollback on request failure, preserving the action exception across concurrent commit/rollback completion races.
- **Chronicle** ([Release v19.21.0](https://github.com/Cratis/Chronicle/releases/tag/v19.21.0)): Reconciled with Chronicle#4258 lifecycle policies: preserves Strict/Compatibility late-staging behavior, in-flight Dispose no-op, locked commit snapshots, and named-tag append routing.
- **Chronicle** ([Release v19.21.0](https://github.com/Cratis/Chronicle/releases/tag/v19.21.0)): Whole Release solution build: zero warnings. Affected DotNET/AspNetCore/Testing specs pass. CI-filtered non-integration Release suite passes in serial execution (all projects, including Mongo and SQL). Nine client packages plus Contracts build for shipped frameworks, and documentation/format checks pass.
- **Chronicle** ([Release v19.21.0](https://github.com/Cratis/Chronicle/releases/tag/v19.21.0)): Final full cross-provider review of the exact feature diff passed with no findings. A subsequent rebase over Elixir-only main changes preserved the binary diff hash exactly. Local targeted Mongo integration timed out; **fresh PR CI integration must pass before merge**.
- **Chronicle** ([Release v19.20.0](https://github.com/Cratis/Chronicle/releases/tag/v19.20.0)): Test fixtures wait for PostgreSQL's final server instead of the temporary initialization server. They pin SQL Server to `2022-CU20-ubuntu-22.04` with 3 GB of memory, retry a SQL Server container that exits during startup once, and reserve the kernel ports from the ephemeral range where the container runtime allows it. This removes CI flakes (#4174)
- **Chronicle** ([Release v19.19.0](https://github.com/Cratis/Chronicle/releases/tag/v19.19.0)): The Elixir contracts package (`cratis_chronicle_contracts`) now requires `grpc ~> 1.0`, `mint ~> 1.11` and Elixir 1.18 or later. The generated contracts API is unchanged. If you use the contracts directly (#4214):
- **Chronicle** ([Release v19.19.0](https://github.com/Cratis/Chronicle/releases/tag/v19.19.0)): `GRPC.Stub.connect/2` still defaults to the Gun adapter, which is optional in grpc 1.x. Pass `adapter: GRPC.Client.Adapters.Mint` or add `:gun` to your dependencies.
- **Chronicle** ([Release v19.19.0](https://github.com/Cratis/Chronicle/releases/tag/v19.19.0)): Remove any `{GRPC.Client.Supervisor, []}` child; grpc 1.x starts its own client supervisor.
- **Chronicle** ([Release v19.19.0](https://github.com/Cratis/Chronicle/releases/tag/v19.19.0)): Server modules now live in the separate `grpc_server` package.
- **Chronicle** ([Release v19.19.0](https://github.com/Cratis/Chronicle/releases/tag/v19.19.0)): The `cratis_chronicle` client keeps resolving an earlier contracts release until its own grpc 1.x release. See the [grpc changelog](https://github.com/elixir-grpc/grpc/blob/v1.0.5/grpc/CHANGELOG.md#v100-2026-06-15).
- **Chronicle** ([Release v19.18.0](https://github.com/Cratis/Chronicle/releases/tag/v19.18.0)): **Forwarded headers are trusted only from loopback or configured proxies.** Before, they were trusted from any caller, which let anyone spoof the client IP and scheme. Existing TLS deployments behind a proxy keep working; the only difference is that `RemoteIpAddress` becomes the proxy's address until the proxy is configured. h2c deployments, and a shared cleartext health port reached through a proxy, need the proxy configured before upgrading. (#3681)
- **Chronicle** ([Release v19.18.0](https://github.com/Cratis/Chronicle/releases/tag/v19.18.0)): **Ignored identity-provider certificate.** `identityProvider.certificate` has never been applied. The kernel now logs a startup warning when it is set, and the documentation explains that the top-level `tls` certificate serves `/connect/token`. The setting will be rejected in the next major. (#4204)
- **Chronicle** ([Release v19.18.0](https://github.com/Cratis/Chronicle/releases/tag/v19.18.0)): SDKs can't obtain tokens from an external authority yet, so SDK ClientCredentials mode doesn't work with authenticated h2c. (see #4350)

## Fixed

- **Arc** ([Release v22.50.5](https://github.com/Cratis/Arc/releases/tag/v22.50.5)): `AddCratis` and the ASP.NET Core `WithChronicle` now resolve `IUnitOfWorkManager` to the selected event store's manager, like `Cratis.Arc.Chronicle`. An explicitly registered `IUnitOfWorkManager` is kept in any order, and resolving all `IUnitOfWorkManager` services no longer also constructs a separate convention-bound manager. (#2983)
- **Fundamentals** ([Release v7.22.4](https://github.com/Cratis/Fundamentals/releases/tag/v7.22.4)): `JsonSerializer` now writes `DateOnly`, `TimeOnly` and `TimeSpan` `ValueMap` keys as their plain string form, matching C# dictionaries, and reads both the plain and the previously written quoted form. Malformed keys are rejected with a clear error (#1154)
- **Fundamentals** ([Release v7.22.3](https://github.com/Cratis/Fundamentals/releases/tag/v7.22.3)): `EnumConverter` now reads and writes plain enums through their underlying type, so enums with any backing type (including `uint`, `long` and `ulong` values outside the `int` range) deserialize from numbers instead of throwing `ArgumentException`, and out-of-range or non-integer numbers raise a `JsonException` naming the enum, its backing type and the value (#1155)
- **Arc** ([Release v22.50.4](https://github.com/Cratis/Arc/releases/tag/v22.50.4)): Automatic embedded event-model hosting now requires both a non-optimized (Debug) build and the Development hosting environment by default, preventing Debug deployments to Production or Staging from unintentionally exposing application structure. Explicit mapping and `Enabled = true` remain available for deliberate opt-in. (#2988)
- **Arc** ([Release v22.50.4](https://github.com/Cratis/Arc/releases/tag/v22.50.4)): Embedded event-model documentation now starts with a quickstart and explains development-only hosting and authorization-protected opt-in.
- **Fundamentals** ([Release v7.22.2](https://github.com/Cratis/Fundamentals/releases/tag/v7.22.2)): `JsonSerializer` now writes `Guid` keys of a `ValueMap` as the plain Guid string, matching C# dictionaries, and reads them back as the original Guid so `get(originalKey)` works. Keys written in the earlier quoted form are still accepted, and malformed Guid keys are rejected with a clear error. (#1151)
- **Fundamentals** ([Release v7.22.1](https://github.com/Cratis/Fundamentals/releases/tag/v7.22.1)): Enum-backed concepts with a non-`int` underlying type (`byte`, `uint`, `long`, …) now serialize to and deserialize from JSON, including boundary values; `int`-backed output is unchanged. (#1150)
- **Screenplay** ([Release v4.63.1](https://github.com/Cratis/Screenplay/releases/tag/v4.63.1)): MCP guidance now distinguishes CLI hosting, board support, and multi-file sketch requirements, and describes live refresh and noninteractive desktop status correctly. (#333)
- **Screenplay** ([Release v4.63.1](https://github.com/Cratis/Screenplay/releases/tag/v4.63.1)): Repository README links now reach the language index, and the editor quickstart correctly describes starting the local server. (#333)
- **Chronicle** ([Release v19.31.10](https://github.com/Cratis/Chronicle/releases/tag/v19.31.10)): A reducer's cached pipeline no longer trusts a read model's container name (or any other aspect of its definition) indefinitely. A reducer's pipeline is built once, at partition activation, and that activation can live for as long as the client stays connected; a read model renamed after that point was never reflected back into an already-active partition, so recovered/updated state silently stopped reaching the read model's current container. The pipeline is now rebuilt from the read model's current definition at most once a minute. (#4569)
- **Screenplay** ([Release v4.63.0](https://github.com/Cratis/Screenplay/releases/tag/v4.63.0)): Rejecting a `then no readmodel` assertion on a read model without a keyed query now says how to fix it: give the slice a query returning that read model with `by <property> <Type>`, or use the Draft reference policy to keep it as deliberate reference debt.
- **Screenplay** ([Release v4.63.0](https://github.com/Cratis/Screenplay/releases/tag/v4.63.0)): The [Create a model](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/mcp/create.md) tutorial asks for the keyed query the books-on-loan view needs and explains why a list query alone cannot identify an instance.
- **Screenplay** ([Release v4.62.1](https://github.com/Cratis/Screenplay/releases/tag/v4.62.1)): The Claude Desktop extension no longer asks for a required **Screenplay model folder** when installed. It works in the folder Claude shares with it, or opens the model folder you name in the conversation, so one installation serves any model.
- **Chronicle** ([Release v19.31.9](https://github.com/Cratis/Chronicle/releases/tag/v19.31.9)): A projection's cached pipeline no longer keeps writing to a read model's superseded container name (or any other stale aspect of its definition) after the read model was re-registered with a changed definition. A projection's own re-registration is a no-op whenever its field mappings are unchanged, so a change to the read model it targets — registered through a separate call — never reached the engine; the pipeline, once built, kept its original binding for the rest of the silo's uptime. (#4569)
- **Chronicle** ([Release v19.31.8](https://github.com/Cratis/Chronicle/releases/tag/v19.31.8)): A reducer replayed or caught up over a partition with more events than one batch now folds every batch from the state the previous batch produced. Previously each later batch started over from the state before the partition began: totals lost earlier events, and a reducer that relied on state set by an earlier event received an empty instance and failed the partition. (part of #4335)
- **Chronicle** ([Release v19.31.7](https://github.com/Cratis/Chronicle/releases/tag/v19.31.7)): A full reducer replay now rebuilds the reducer's read model from the event log. Previously the replay completed without rewriting existing documents, so a changed reducer was never applied to read models already built. (#4335)
- **Chronicle** ([Release v19.31.7](https://github.com/Cratis/Chronicle/releases/tag/v19.31.7)): A reducer replay in which any partition fails is abandoned rather than promoted, so the read model keeps its previous, complete state instead of being replaced by a partial rebuild. The failed partitions are recorded on the reducer as before.
- **Screenplay** ([Release v4.61.0](https://github.com/Cratis/Screenplay/releases/tag/v4.61.0)): Reject reactions whose direct or opaque effects declare unprotected reads. Reached opaque bodies, unsupported capture evaluation and unavailable identity allocation return typed Unsupported rather than passing with omitted effects.
- **Screenplay** ([Release v4.61.0](https://github.com/Cratis/Screenplay/releases/tag/v4.61.0)): Preserve capture field shapes and typed keys, reject missing or duplicate child identities, and retain previously accepted facts when a later capture append or reaction fails. Capture appends settle their constraints, projections and reactions before the next effect is evaluated.
- **Screenplay** ([Release v4.61.0](https://github.com/Cratis/Screenplay/releases/tag/v4.61.0)): Reject malformed semantic values and incomplete reaction guards instead of admitting models that cannot round-trip or silently ignoring conditions. Honor host trigger registrations and return typed Unsupported for reached projection arithmetic outside the supported range.
- **Screenplay** ([Release v4.61.0](https://github.com/Cratis/Screenplay/releases/tag/v4.61.0)): Keep invoked command batches atomic when a cascade reaches its fact limit, and evaluate audit requirements only as each effect is reached. (part of #309)
- **Arc** ([Release v22.50.3](https://github.com/Cratis/Arc/releases/tag/v22.50.3)): A paged MongoDB observation re-reads its page and total on every change, so `totalItems` no longer drifts when documents outside the filter are deleted or documents on other pages are edited. A document that changes its sort value moves to its correct place, and a document that sorts onto an earlier page no longer appears on the observed one. (#2970)
- **Arc** ([Release v22.50.3](https://github.com/Cratis/Arc/releases/tag/v22.50.3)): Deleting a document outside an unpaged observation's filter no longer lowers its `totalItems`. (#2970)
- **Arc** ([Release v22.50.3](https://github.com/Cratis/Arc/releases/tag/v22.50.3)): Paging is stable: MongoDB queries break ties on `_id`, and a paged query with no sort is ordered by `_id`, so a document never shows up on two pages or on none. (#2970)
- **Arc** ([Release v22.50.3](https://github.com/Cratis/Arc/releases/tag/v22.50.3)): In delta transfer mode, a sorted or paged observable query sends the full snapshot when the change set alone would put the client's rows out of order. (#2970)
- **Fundamentals.Go** ([Release v0.3.2](https://github.com/Cratis/Fundamentals.Go/releases/tag/v0.3.2)): Constructor-planning diagnostics for duplicate aliased existing registrations remain stable when registration order changes, while preserving duplicate rejection. (#45)
- **Screenplay** ([Release v4.60.0](https://github.com/Cratis/Screenplay/releases/tag/v4.60.0)): An MCP server launched with a fixed model root refuses attempts to switch to another directory while accepting proven aliases of the same physical root. Dynamic-root behavior is unchanged (part of #341)
- **Screenplay** ([Release v4.60.0](https://github.com/Cratis/Screenplay/releases/tag/v4.60.0)): The `PLAY0478` repair is labelled as an explicit routing change and is not eligible for fix-all (part of #341)
- **Fundamentals.Go** ([Release v0.3.1](https://github.com/Cratis/Fundamentals.Go/releases/tag/v0.3.1)): Concurrent service resolution shares failed construction errors when owned-result cleanup reports cancellation, instead of silently retrying. Genuine construction cancellation still permits retry, and cleanup errors remain inspectable. (#43)
- **Screenplay** ([Release v4.59.1](https://github.com/Cratis/Screenplay/releases/tag/v4.59.1)): MCP `visualize-model` sketches can replace a document or the application root in a multi-file model without invalid document-key or missing-import failures. Replacements retain their existing document identity, and imported files are discovered relative to their containing folder (#332)
- **Screenplay** ([Release v4.59.0](https://github.com/Cratis/Screenplay/releases/tag/v4.59.0)): `add-document` no longer demands an internal `stableKey`; it is derived from the file name.
- **Screenplay** ([Release v4.59.0](https://github.com/Cratis/Screenplay/releases/tag/v4.59.0)): `diagnostics` and `describe-application` answer for a new, empty folder instead of failing.
- **Screenplay** ([Release v4.59.0](https://github.com/Cratis/Screenplay/releases/tag/v4.59.0)): The documented authoring flow no longer stops at an empty folder, a missing `stableKey` or an unexplained rejection.
- **Chronicle** ([Release v19.31.6](https://github.com/Cratis/Chronicle/releases/tag/v19.31.6)): Reactor and reducer registration no longer times out over and over after a client restarts. Every observer subscribe and unsubscribe loaded every job in the namespace, finished ones included, to find its own. A reconnecting client re-subscribes all of its observers at once, so the kernel spent a quarter of its time in garbage collection, observer calls outlived the client's 30 second timeout, and each retry started the same work again. Observers now ask only for unfinished jobs. (#4559)
- **Chronicle** ([Release v19.31.6](https://github.com/Cratis/Chronicle/releases/tag/v19.31.6)): Failed-partition retry jobs that complete with failures are no longer kept. The failed partition already records each attempt, and the retained jobs had grown into thousands of entries in every job listing. (#4559)
- **Screenplay** ([Release v4.57.0](https://github.com/Cratis/Screenplay/releases/tag/v4.57.0)): Workspace indexing retains scoped import placement, so imported handlers remain visible. Hierarchy renames, optionality repairs and produced-event mapping edits retain the resolved placement and original source formatting.
- **Arc** ([Release v22.50.1](https://github.com/Cratis/Arc/releases/tag/v22.50.1)): Generated TypeScript proxies no longer emit unused ESLint suppression directives and pass strict linting with the supported Cratis configuration, while preserving public empty interfaces and output module order. (#3008)
- **Arc** ([Release v22.50.1](https://github.com/Cratis/Arc/releases/tag/v22.50.1)): Generated React command hooks preserve the response type for commands that return a result, without TypeScript error suppression.
- **Arc** ([Release v22.50.1](https://github.com/Cratis/Arc/releases/tag/v22.50.1)): Nested React command and query scopes resolve without circular module initialization.
- **Arc** ([Release v22.50.1](https://github.com/Cratis/Arc/releases/tag/v22.50.1)): The embedded Screenplay viewer keeps a selected feature when the initial assembly response arrives later, and loads its editor and worker correctly from production bundles.
- **Chronicle** ([Release v19.31.5](https://github.com/Cratis/Chronicle/releases/tag/v19.31.5)): An observer with many failed partitions no longer blocks a reconnecting client's reactor or reducer registration. Each subscribe used to trigger a full recovery of every failed partition in one long turn, and a subscribe the client had already timed out on still ran and queued another, so after a reconnect the observer could stay Disconnected for as long as clients kept retrying. Repeated requests now collapse into one recovery that works through the partitions in bounded batches, letting subscribe and unsubscribe calls through in between, and recovery is skipped while the observer has no subscriber. (part of #4559)
- **Chronicle** ([Release v19.31.5](https://github.com/Cratis/Chronicle/releases/tag/v19.31.5)): Unsubscribing an observer no longer stalls for about 30 seconds when one of its catch-up or retry jobs is reporting a failed partition at the moment the client disconnects. Chronicle now uses Cratis.Orleans 1.15.2, where stopping a job no longer waits on a step that is reporting back to it. (part of #4559)
- **Orleans** ([Release v1.15.2](https://github.com/Cratis/Orleans/releases/tag/v1.15.2)): Stopping or removing a job no longer stalls for the grain call timeout (30 seconds by default) when one of its steps is reporting a failure or cancellation to the job at the same moment. The stop now reaches the step while it is reporting, so callers waiting on `IJobsManager.Stop` or `Delete`, such as a Chronicle observer pausing its jobs when a client disconnects, are no longer held up behind it. The step's outcome is still recorded on the job. See https://github.com/Cratis/Chronicle/issues/4559 for the Chronicle symptoms.
- **Chronicle** ([Release v19.31.4](https://github.com/Cratis/Chronicle/releases/tag/v19.31.4)): Projections can read child collections from legacy PascalCase read-model schemas when their child paths use camelCase, instead of failing with a misleading stale-definition error. Exact property matches retain precedence, and genuinely missing properties still fail explicitly. (#4556)
- **AI** ([Release v7.6.4](https://github.com/Cratis/AI/releases/tag/v7.6.4)): Documentation guidance now links required tools to their canonical installation procedures before showing commands, instead of assuming setup or duplicating another product's recipe.
- **AI** ([Release v7.6.4](https://github.com/Cratis/AI/releases/tag/v7.6.4)): Named Markdown cross-product references now show same-page definitions and verified public routes, with a clear distinction from unsupported DocFX symbol links.
- **Screenplay** ([Release v4.55.1](https://github.com/Cratis/Screenplay/releases/tag/v4.55.1)): The grammar reference matches both compilers for declaration order, projection targets and interactions, so people and AI agents generating from it get valid syntax (#354)
- **Screenplay** ([Release v4.55.1](https://github.com/Cratis/Screenplay/releases/tag/v4.55.1)): The glossary no longer lists constructs that do not parse, and the policy and sub-language pages describe precedence and unknown slice constructs as the compilers handle them (#354)
- **Screenplay** ([Release v4.55.1](https://github.com/Cratis/Screenplay/releases/tag/v4.55.1)): The capture grammar explains that a backtick guard is an opaque expression the compiler does not interpret (#354)
- **Screenplay** ([Release v4.55.1](https://github.com/Cratis/Screenplay/releases/tag/v4.55.1)): Monaco highlights and indexes event properties named like clause keywords the same way the compiler does, while still recognizing `file` realization directives (#354)
- **cli** ([Release v3.24.2](https://github.com/Cratis/cli/releases/tag/v3.24.2)): `cratis ai install` and `cratis ai update` preserve the first-line shebang in executable scripts, keeping Node.js hooks valid while retaining managed comments and script line endings. Run `cratis ai update` with the corrected CLI to repair unchanged hooks installed by older versions; no manual hook edits or `--force` are needed. (#232)
- **Arc** ([Release v22.49.1](https://github.com/Cratis/Arc/releases/tag/v22.49.1)): A command returning several `EventForEventSourceId` wrappers for one event source id no longer lets a guard derived from the command's own stream stand in for every event. Events written through a definition now reach the event sequence without a framework-derived scope, so Chronicle derives and validates each event's own guard; wrappers that override the definition with legacy routing and would need different guards for one id fail with `IncompatibleConcurrencyScopesForEventSource` before anything is enrolled or appended. A guard chosen with `concurrency: true` keeps its existing behavior. (part of #3005)
- **AI** ([Release v7.6.3](https://github.com/Cratis/AI/releases/tag/v7.6.3)): Update the Claude worker image to Claude Code 2.1.285 so models requiring version 2.1.251 or later can run. Upgrade the worker image to use the updated CLI. (#483)
- **Chronicle** ([Release v19.31.2](https://github.com/Cratis/Chronicle/releases/tag/v19.31.2)): A .NET batch appended through event source definitions no longer guards only the first event of an event source id. Every event sharing the id is resolved: equivalent guards share one scope, an event with no guard never hides a later guarded one, and explicit caller scopes still take precedence. (part of #4545)
- **Chronicle** ([Release v19.31.2](https://github.com/Cratis/Chronicle/releases/tag/v19.31.2)): A batch whose events need different guards for the same event source id (for example different stream ids, or different definitions) now throws `IncompatibleConcurrencyScopesForEventSource` before anything is appended, instead of silently leaving later events unguarded. Pass an explicit scope that suits every event, or append in separate batches. See https://github.com/Cratis/Chronicle/blob/main/Documentation/clients/dotnet/event-sources.md (part of #4545)
- **Chronicle.Elixir** ([Release v3.10.1](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.10.1)): A batch where one event source id has guarded entries with different guards (different stream ids, or different definitions with different dimensions) now fails with `{:incompatible_concurrency_scopes, event_source_id, guards}` before anything is read or sent, instead of dropping the later guards. Entries with the same effective guard share one scope, entries without dimensions never suppress a later guarded entry, and an explicit `:concurrency_scope` or separate batches remain the remedy. (part of #102)
- **Chronicle** ([Release v19.31.1](https://github.com/Cratis/Chronicle/releases/tag/v19.31.1)): Observers are no longer quarantined for a "stranded catch-up preparation" when the client disconnected while a catch-up was running. Resuming the stopped catch-up job now finishes it, so the observer catches up and keeps observing. (#4363)
- **Orleans** ([Release v1.15.1](https://github.com/Cratis/Orleans/releases/tag/v1.15.1)): Resuming a stopped job whose steps had all already finished now completes the job and runs its completion, instead of leaving it stopped while reporting it as completed. A Chronicle observer whose catch-up job was stopped by a client disconnect was otherwise left preparing catch-up until it was quarantined. (part of Cratis/Chronicle#4363)
- **Orleans** ([Release v1.15.1](https://github.com/Cratis/Orleans/releases/tag/v1.15.1)): A job step that has reported its outcome is no longer handed back to the next resume as a step left to run when unsubscribing it fails.
- **Arc** ([Release v22.48.4](https://github.com/Cratis/Arc/releases/tag/v22.48.4)): A routing value set on an `EventForEventSourceId` (`EventSourceType`, `EventStreamType`, `EventStreamId`, `Subject`) now wins over the command context for every way a command returns one: a single wrapper, a collection, a mixed collection, a tuple such as `(FundsSettled, EventForEventSourceId)`, and `EventsWithConcurrencyScopes`. Values left at their default still fall back to the command context, and plain events keep using it. (#2886)
- **Arc.TypeScript** ([v0.57.2](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.57.2)): In-memory sorting orders concept values by their underlying value, so concepts over numbers sort numerically and concepts over dates chronologically. It also orders `TimeSpan`, `DateOnly` and `TimeOnly` values in their natural order rather than as text. A concept wrapping `null` now sorts with the other null values. (#176)
- **Arc.TypeScript** ([v0.57.1](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.57.1)): In-memory sorting on a complex field (object, array, map, or a concept over one) now answers 400 malformedRequest, or a validation-result frame once an observable stream has started, instead of returning an unreliable order. (#174)
- **Orleans** ([Release v1.15.0](https://github.com/Cratis/Orleans/releases/tag/v1.15.0)): Jobs storage now pages type, status, and age-filtered results, while bounded retention removes old immutable terminal jobs and their steps without touching active jobs. (#53)
- **Chronicle** ([Release v19.29.4](https://github.com/Cratis/Chronicle/releases/tag/v19.29.4)): Unchanged reducers are no longer replayed on every application release: the reducer fingerprint used by automatic reducer evolution ignores assembly versions and build-specific metadata and only changes when the reducer's code or signatures change (#4502)
- **Arc** ([Release v22.48.3](https://github.com/Cratis/Arc/releases/tag/v22.48.3)): Each `CommandScenario` now uses its own event store name and namespace, consistently in the store, its event log and appended events, so application caches keyed by event store and namespace no longer collide between tests running in parallel. (#2967)
- **Screenplay** ([Release v4.49.0](https://github.com/Cratis/Screenplay/releases/tag/v4.49.0)): The first-document example in the MCP authoring guide is accepted by the server: modules and features need `isPlacement`, which the example left out.
- **Chronicle** ([Release v19.29.3](https://github.com/Cratis/Chronicle/releases/tag/v19.29.3)): After a subject is erased, updating a read model that holds their personal data no longer stops the projection; the value is stored as erased. (#4453)
- **AI** ([Release v7.6.1](https://github.com/Cratis/AI/releases/tag/v7.6.1)): The Screenplay skills now show how a split model is composed with quoted imports: `application.play` imports `Shared/*.play` and each module file, module and feature files are barrels that declare their scope and import what is beneath it, and a slice file holds only its `slice`. They no longer tell an assistant that a slice file restates its `module` and `feature`, which produced models whose barrel files imported nothing.
- **AI** ([Release v7.6.1](https://github.com/Cratis/AI/releases/tag/v7.6.1)): The event modeling skill describes `PLAY0459` correctly: it reports a file that declares a module other than the one it is placed in, not one that leaves the module out.
- **Screenplay** ([Release v4.48.2](https://github.com/Cratis/Screenplay/releases/tag/v4.48.2)): The VS Code extension's event model board now draws the file that is open. Inside a folder application every file used to draw the same board, the whole folder; now a slice file draws its slices, a module or feature file draws the slices it imports or that are placed in what it declares, and `application.play` draws the whole application. A file with no slice of its own, such as one that only declares concepts or types, still draws the whole application. Every slice is drawn against everything the application declares, and the problems listed above the board are the ones in the files it draws. See [Folder applications](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/vscode.md#folder-applications).
- **Chronicle.TypeScript** ([Release v6.42.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.42.1)): Projection definitions now carry the tags declared with `@tag`/`@tags` on declarative projection classes and model-bound read models instead of always sending an empty tag list. Chronicle does not store projection tags yet ([Cratis/Chronicle#4512](https://github.com/Cratis/Chronicle/issues/4512)); once it does, adding, removing or changing a tag counts as a definition change and can replay the projection, including once on the first registration after upgrading to a Chronicle version that stores tags, for projections that already carry them. (#207)
- **Chronicle** ([Release v19.29.2](https://github.com/Cratis/Chronicle/releases/tag/v19.29.2)): Finishing a replay of a SQL read model no longer fails, or briefly exposes a missing table, when the read model is queried or written while the replayed table is promoted; the swap now commits atomically and is safe to retry on PostgreSQL and SQL Server (#4476)
- **Chronicle.TypeScript** ([Release v6.41.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.41.1)): Appending an event now uses the subject from its `@subject()` annotation when no explicit subject is given, so its PII is encrypted under that subject's key, as in the .NET client. An explicit subject on the batch entry or the call still wins, and an empty or missing subject falls back to the event source id. Events appended before this fix were encrypted under the event source id's key; if your erasure process deletes that key, erase the subject's key for events appended after upgrading. See the [PII guide](https://github.com/Cratis/Chronicle.TypeScript/blob/main/Documentation/compliance/pii.md). (#202)
- **Screenplay** ([Release v4.48.0](https://github.com/Cratis/Screenplay/releases/tag/v4.48.0)): A query written with its key on the header line (`query X => RM? by id Type`) no longer crashes the compiler when a command reads that view; the diagnostic says to put `by` on its own line in the query body.
- **Screenplay** ([Release v4.48.0](https://github.com/Cratis/Screenplay/releases/tag/v4.48.0)): Bare enumeration members in `produces when` conditions and in specification values, and `DateTime` values written as ISO 8601 instants such as `2026-10-05T08:00:00Z`, now bind in the executable semantic model the way the compiler already accepted them.
- **Orleans** ([Release v1.14.1](https://github.com/Cratis/Orleans/releases/tag/v1.14.1)): Job rehydration returns once the interrupted jobs are loaded and resumes them in the background, so a large backlog no longer times out a silo's startup. A job stopped before its turn is not resumed, and resuming stops when the jobs manager deactivates. (#51)
- **Components** ([Release v4.25.0](https://github.com/Cratis/Components/releases/tag/v4.25.0)): The icon picker's provider name on a selected tile now meets the 4.5:1 contrast ratio.
- **Chronicle** ([Release v19.29.1](https://github.com/Cratis/Chronicle/releases/tag/v19.29.1)): Fixed append completion timing out on pattern capture when using a new namespace with event types already registered in the event store. Pattern capture now starts in new namespaces without requiring a server restart or another event type registration. (#4492)
- **AuthProxy** ([Release v2.30.1](https://github.com/Cratis/AuthProxy/releases/tag/v2.30.1)): When the tenants endpoint is unavailable, users now see a "Service unavailable" page with HTTP 503 instead of being told they have no organization; API requests get a 503. (#137)
- **AuthProxy** ([Release v2.30.1](https://github.com/Cratis/AuthProxy/releases/tag/v2.30.1)): Sessions that no longer have a forwardable identity during tenant selection are signed out. Browser navigations return to provider selection with an invalid-session explanation, while API requests receive HTTP 401. (#137)
- **Orleans** ([Release v1.14.0](https://github.com/Cratis/Orleans/releases/tag/v1.14.0)): Rehydrating or cleaning up hundreds of jobs after a restart exhausted the MongoDB connection pool wait queue and failed job grain activations; the work is now bounded and transient pool errors are retried (#31)
- **Orleans** ([Release v1.14.0](https://github.com/Cratis/Orleans/releases/tag/v1.14.0)): A job that fails while being resumed or deleted no longer stops the other jobs in the same rehydrate or cleanup pass.
- **Arc.TypeScript** ([v0.55.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.55.0)): Keep proxy generation up to date when macOS misses source-change notifications, using adaptive, bounded-concurrency fallback scans instead of rescanning the tree for every notification. Watch mode tolerates inaccessible child entries and detects equal-sized edits with coarse timestamps. (#159)
- **Chronicle** ([Release v19.27.4](https://github.com/Cratis/Chronicle/releases/tag/v19.27.4)): Events that change no read-model property, including propertyless events handled by class-level `[FromEvent<T>]`, now create the instance in immediate projections, decision reads, passive `GetInstanceById`, projection preview, `ReadModelScenario` and `DecisionReadsForTesting`, matching materialized projections. (#4434)
- **Chronicle** ([Release v19.27.4](https://github.com/Cratis/Chronicle/releases/tag/v19.27.4)): A root event now persists missing initial values when it initializes a placeholder on MongoDB, PostgreSQL, SQLite and SQL Server, including read models with protected fields, while preserving existing children. On MongoDB this also applies to existing uninitialized placeholders from other child-only events, and initialization is visible to subsequent events during catch-up and replay before bulk writes finish. (part of #4436)
- **Chronicle** ([Release v19.27.4](https://github.com/Cratis/Chronicle/releases/tag/v19.27.4)): Root derivative events that a child also handles now create an initialized root with its initial values. Deferred children no longer resolve against an uninitialized placeholder. (#4436)
- **Chronicle** ([Release v19.27.4](https://github.com/Cratis/Chronicle/releases/tag/v19.27.4)): Read-model queries no longer return the internal `__initialized` property unless the read model explicitly declares it. (part of #4436)
- **Chronicle** ([Release v19.27.4](https://github.com/Cratis/Chronicle/releases/tag/v19.27.4)): SQL read-model upgrades tolerate concurrent kernel migrations and inserts from older kernels during rolling upgrades. (part of #4436)
- **Arc** ([Release v22.47.0](https://github.com/Cratis/Arc/releases/tag/v22.47.0)): Generated proxies no longer require a value for nullable concept properties and optional concept query arguments; constraints such as length, format and range still apply when a value is supplied, and a direct `[Required]` keeps the value required. (#2894)
- **Arc** ([Release v22.47.0](https://github.com/Cratis/Arc/releases/tag/v22.47.0)): Controller query proxies now mark parameters optional or required from their declared C# nullability, matching model-bound queries: nullable value types such as `int?` are optional and non-nullable reference parameters are required. (#2894)
- **Chronicle.TypeScript** ([Release v6.39.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.39.0)): `EventScenario` in `@cratis/chronicle/testing` now accepts numeric, Guid, date and object event fields, including concepts wrapping them, serialized like the connected client. Malformed Guids, invalid or out-of-range dates and integers outside their declared width are rejected. History, reads, reactor and reducer inputs carry the client-serialized JSON, so compare Guids case-insensitively and dates as instants rather than as kernel-formatted strings. (#173)
- **Orleans** ([Release v1.13.0](https://github.com/Cratis/Orleans/releases/tag/v1.13.0)): A stored job whose type is no longer registered no longer breaks listing, observing and rehydrating every other job. Such jobs are logged and skipped and their stored data is left untouched, in both MongoDB and SQL storage. (#30)
- **Chronicle** ([Release v19.27.3](https://github.com/Cratis/Chronicle/releases/tag/v19.27.3)): Read model index creation on MongoDB no longer fails when an equivalent index already exists under another name, such as MongoDB's default `<field>_1` (#4403)
- **Chronicle** ([Release v19.27.2](https://github.com/Cratis/Chronicle/releases/tag/v19.27.2)): Fluent projections using `From<TBase>()` now handle the base event's registered derived event types at the root, in children, and in nested projections. (#4442)
- **Chronicle** ([Release v19.27.2](https://github.com/Cratis/Chronicle/releases/tag/v19.27.2)): Combining `From` and `EntersOn` for the same event type no longer produces a duplicate registration that prevents the projection from being registered. (#4442)
- **Arc** ([Release v22.46.0](https://github.com/Cratis/Arc/releases/tag/v22.46.0)): Explicit identity refreshes recompute identity, roles and details against earlier backends rather than returning stale cookies, including after credentials expire. The 404 transition fallback survives consecutive refreshes and page reloads, and uses an updated cookie issued by the response; `clearCache()` discards it on logout. (#2939)
- **Arc** ([Release v22.46.0](https://github.com/Cratis/Arc/releases/tag/v22.46.0)): Requests to `/.cratis/me` expire leftover identity cookies on unauthorized and forbidden responses as well as successful responses. (#2939)
- **Chronicle** ([Release v19.27.1](https://github.com/Cratis/Chronicle/releases/tag/v19.27.1)): In-memory event storage used by testing scenarios now finds events of every event type generation when querying by event type (#4364)
- **Components** ([Release v4.23.1](https://github.com/Cratis/Components/releases/tag/v4.23.1)): Builds of apps using Components no longer fail with a missing `observeTimeline` export from `motion-dom`. When upgrading, remove any `resolutions` or overrides from the workaround that pin `motion-dom` to 13.2.0 or `motion-utils` to 13.0.0: `framer-motion` 13.5.0 requires `animateElement`, which `motion-dom` 13.2.0 does not export. (#390)
- **Chronicle** ([Release v19.27.0](https://github.com/Cratis/Chronicle/releases/tag/v19.27.0)): Event-store, namespace, and read-model connections now authenticate using the connection string's authentication database, or `admin` when none is specified, instead of the target database. Credentials without `authSource` now use the original connection string's authentication scope, including when no database-name prefix is configured. (part of #4126)
- **Chronicle.TypeScript** ([Release v6.32.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.32.1)): Read model children declared with `@childrenFrom` under legacy (`experimentalDecorators`) decorators now register a typed item schema when the child type is known, from `childType` or `@field` metadata, so the kernel stores every child property instead of only the identifier. Children whose type or identifier cannot be resolved at runtime keep the untyped item schema; pass `childType` with initialized or `@field`-decorated members to get typed children. (#156)
- **AuthProxy** ([Release v2.25.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.25.0)): Required identity denials emit one warning naming the service, reason and exact opt-out, including unsuccessful status codes, unreadable responses, transport failures and timeouts. Client disconnects log only at Debug, including disconnects during an identity call. (#163)
- **cli** ([Release v3.22.1](https://github.com/Cratis/cli/releases/tag/v3.22.1)): Chronicle login reports unusable token responses and unreadable CLI configuration instead of crashing. (#202)
- **cli** ([Release v3.22.1](https://github.com/Cratis/cli/releases/tag/v3.22.1)): Chronicle login reports interrupted token responses as connection errors instead of crashing. (#202)
- **cli** ([Release v3.22.1](https://github.com/Cratis/cli/releases/tag/v3.22.1)): Saving CLI configuration replaces the file atomically, so a failed write leaves the existing configuration untouched. (#202)
- **Arc** ([Release v22.44.3](https://github.com/Cratis/Arc/releases/tag/v22.44.3)): Fix `WithChronicle()` command transaction resolution so commands use the selected event store's unit-of-work manager, configured lifecycle policy, and active tenant namespace without requiring enum service registrations. (#2958)
- **Fundamentals** ([Release v7.21.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.21.0)): Record generated scoped and unscoped counters and gauges through the supplied meter instance, including when switching meters or disposing a previously used meter. (#1140)
- **Fundamentals** ([Release v7.21.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.21.0)): Generate valid metric implementations for parameters named `tags`, `key`, or `value`. (#1140)
- **Fundamentals** ([Release v7.21.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.21.0)): Avoid duplicating parameter attributes on generated metric and span implementations. (#1140)
- **Fundamentals** ([Release v7.21.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.21.0)): Preserve escaped keyword parameter names, such as `@event`, when recording metric and span tags. (#1140)
- **Chronicle.TypeScript** ([Release v6.31.4](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.31.4)): `EventScenario` in `@cratis/chronicle/testing` now accepts string and boolean concept fields (`ConceptAs`) the same way the connected client does, including in unique and composite constraints, reactor deliveries and observing read models. Guid, numeric and date fields remain unsupported in the in-memory scenario. (#170)
- **cli** ([Release v3.22.0](https://github.com/Cratis/cli/releases/tag/v3.22.0)): Diagnostic sweeps report unavailable checks separately from detected problems and return a non-zero exit code for incomplete checks or quarantined observers. Watch mode returns the last sweep's result. (#216)
- **cli** ([Release v3.22.0](https://github.com/Cratis/cli/releases/tag/v3.22.0)): Watch reports show health and unavailable checks first, mark unavailable checks as failures, and limit findings to three rows with guidance for viewing the complete report. Before the first sweep, every check row shows a neutral checking state and aggregation headers identify all selected stores and namespaces. (#216)
- **cli** ([Release v3.22.0](https://github.com/Cratis/cli/releases/tag/v3.22.0)): Store and namespace discovery failures mark dependent diagnostic checks as unavailable. All-store diagnostics no longer prompt to change the default event store, and completed multi-scope event sequence checks point to per-scope tails. Empty logs are distinguished from failed tail queries, and successful scope tails remain visible in incomplete aggregated reports. Aggregated JSON and plain reports keep event sequence tails per scope; single-scope reports without aggregation no longer duplicate the tail row. (#216)
- **cli** ([Release v3.22.0](https://github.com/Cratis/cli/releases/tag/v3.22.0)): Plain diagnostic output keeps values on one line, quotes and escapes field delimiters, and places scalar keys before repeated records. JSON observer totals count every returned observer, including unknown and quarantined states, in both aggregate and per-namespace results. (#216)
- **Arc** ([Release v22.44.2](https://github.com/Cratis/Arc/releases/tag/v22.44.2)): Guest-policy commands and queries now accept unauthenticated HTTP callers on both Arc hosts, including when ASP.NET Core requires authentication through its fallback policy. Guest policies still decide access, and endpoints without an entirely guest-aware policy declaration retain their existing authentication behavior. (#2948)
- **Fundamentals** ([Release v7.20.1](https://github.com/Cratis/Fundamentals/releases/tag/v7.20.1)): `EnumConverter<T>` refused to deserialize a `[Flags]` combination, while happily serializing one. A combination of flags is a legitimate value of the set, but no single member carries it and `Enum.IsDefined` answers `false` for every one — so any type carrying a combined flags value across a boundary that uses this converter could be written and then not read back.
- **Screenplay** ([Release v4.46.4](https://github.com/Cratis/Screenplay/releases/tag/v4.46.4)): Slices, features and modules collapse and expand on the board again, with a normal pointer instead of the drag hand.
- **Screenplay** ([Release v4.46.4](https://github.com/Cratis/Screenplay/releases/tag/v4.46.4)): The lines view draws the lines between a slice's artifacts.
- **Screenplay** ([Release v4.46.4](https://github.com/Cratis/Screenplay/releases/tag/v4.46.4)): Automation slices show their cogwheel, trigger, the events they produce and the command they invoke, instead of nothing. Only automations and translations show a cogwheel.
- **Screenplay** ([Release v4.46.4](https://github.com/Cratis/Screenplay/releases/tag/v4.46.4)): Translation slices show the system their capture reads from and every event it appends, including from children and nested objects.
- **Screenplay** ([Release v4.46.4](https://github.com/Cratis/Screenplay/releases/tag/v4.46.4)): A read model with no `readmodel` declaration gets the properties its projection sets: automapped event properties, mapped properties, counters, children and nested objects.
- **Fundamentals** ([Release v7.20.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.20.0)): Metrics declared with `[Counter<T>]` and `[Gauge<T>]` now carry their description as the instrument description, not as its unit. Exporters that add the unit to the metric name, such as Prometheus, therefore export the intended name: `chronicle_observer_partitions_failed_total` instead of a name with the whole description appended, and the description becomes the metric's help text. Update dashboards and alert rules that use the old names; see [Exported metric names](https://github.com/Cratis/Fundamentals/blob/main/Documentation/csharp/metrics/roslyn.md). (#1138)
- **Fundamentals** ([Release v7.20.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.20.0)): Metric, gauge and span names and descriptions that contain quotes, backslashes or HTML-special characters are now exported exactly as written, and no longer break the generated code. (#1138)
- **Chronicle** ([Release v19.26.2](https://github.com/Cratis/Chronicle/releases/tag/v19.26.2)): A projection replay in a cluster no longer loses the last writes of the silo it ran on: every silo writes what it holds back before any silo ends the replay and promotes the rebuilt read model (part of #4448)
- **Chronicle** ([Release v19.26.2](https://github.com/Cratis/Chronicle/releases/tag/v19.26.2)): A silo that finds a replay already ended by another silo stops writing to the replay collection, so later changes reach the read model instead of a collection nothing reads (part of #4448)
- **Chronicle** ([Release v19.26.2](https://github.com/Cratis/Chronicle/releases/tag/v19.26.2)): Two replays of the same read model within one second no longer fail promoting the second one with "target namespace exists" (part of #4448)
- **Screenplay** ([Release v4.46.3](https://github.com/Cratis/Screenplay/releases/tag/v4.46.3)): Cards on the event model board in VS Code are centered in their cells, with the arrows between rows showing direction.
- **Screenplay** ([Release v4.46.3](https://github.com/Cratis/Screenplay/releases/tag/v4.46.3)): Rows on the board grow to hold cards showing their properties, instead of the cards running into the row below.
- **Screenplay** ([Release v4.46.3](https://github.com/Cratis/Screenplay/releases/tag/v4.46.3)): The board no longer shows a status on slices, which a model drawn from its text has nothing to provide.
- **Chronicle** ([Release v19.26.1](https://github.com/Cratis/Chronicle/releases/tag/v19.26.1)): The in-process kernel used by `Cratis.Chronicle.XUnit.Integration` no longer runs its own commands through the application's Arc command extension points. A test host that loads `Cratis.Arc.Chronicle` no longer deadlocks on start-up, and an application with deny-by-default authorization no longer gets `Command failed: Unauthorized` from the kernel's internal appends. The application's own commands in that host still run through all of its filters, scopes and authorization. (#4449)
- **Chronicle** ([Release v19.26.1](https://github.com/Cratis/Chronicle/releases/tag/v19.26.1)): The in-process kernel in `Cratis.Chronicle.Testing` now also ignores the application's fallback authorization evaluators, context values providers and response value handlers, and no longer runs the Chronicle client's Arc integration inside the kernel.
- **Components** ([Release v4.22.1](https://github.com/Cratis/Components/releases/tag/v4.22.1)): The dark theme maps `--color-error` to the lighter red the field outline already uses and `--color-error-bg` to a deep red, so a field's validation message and Arc's command exception panel reach the WCAG AA 4.5:1 contrast on the dark surfaces instead of about 2.5:1. Every explicitly light root or subtree keeps the original red on a light background, including a light subtree under a root that is dark only because of the system setting. (#388)
- **Components** ([Release v4.22.1](https://github.com/Cratis/Components/releases/tag/v4.22.1)): The README setup imports the stylesheets from a CSS entry file with `@import`, and documents the ambient declarations a TypeScript project needs to import them from TypeScript, so the documented setup type-checks on TypeScript 6 (TS2882). (#387)
- **release-action** ([Release v1.4.1](https://github.com/Cratis/release-action/releases/tag/v1.4.1)): A merged pull request carrying more than one of `major`, `minor`, `patch` and `no-release` releases nothing and reports the `error` reason with its labels logged, instead of silently letting `no-release` or the highest bump win (#200)
- **Screenplay** ([Release v4.46.2](https://github.com/Cratis/Screenplay/releases/tag/v4.46.2)): Changing a view option no longer crashes the event model board in VS Code.
- **Screenplay** ([Release v4.46.2](https://github.com/Cratis/Screenplay/releases/tag/v4.46.2)): A board that fails to draw now says what failed while the view options stay usable: choosing another one, or the default view, draws the board again.
- **Arc** ([Release v22.41.2](https://github.com/Cratis/Arc/releases/tag/v22.41.2)): A model-bound query can declare a `CancellationToken` parameter. Arc binds it to the request's abort token instead of failing every call with `MissingArgumentForQuery`; it is not a query argument and does not appear in the generated TypeScript proxy. (#2732)
- **Arc** ([Release v22.41.2](https://github.com/Cratis/Arc/releases/tag/v22.41.2)): A new aggregate root now expects no event in its scope when it commits. A concurrent writer creating the aggregate's first event, which could be the very first event of the event log, is reported as a concurrency violation instead of being accepted as seen. (#2797)
- **Chronicle.Kotlin** ([Release v6.11.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.11.0)): GUIDs now cross the wire the way .NET reads and writes them. Correlation ids, job ids and capture ids sent by the client, and correlation ids and partition ids read from the kernel, previously had the first three groups of the GUID byte-reversed, so they did not match the values a .NET service logged for the same operation. (#49)
- **cli** ([Release v3.21.3](https://github.com/Cratis/cli/releases/tag/v3.21.3)): The update hint for a dotnet tool installation picks the highest stable version the NuGet index lists instead of relying on the order of the list, so a reordered index no longer produces a stale or wrong hint. (#203)
- **Chronicle.Kotlin** ([Release v6.10.1](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.10.1)): Two `@Unique` properties that share a constraint name on one event type are now rejected at registration with `EventTypeAlreadyAddedToUniqueConstraint`, naming the constraint, event type and properties, as the .NET client does. Previously the model registered and every append of that event type then failed. (#111)
- **Chronicle** ([Release v19.25.2](https://github.com/Cratis/Chronicle/releases/tag/v19.25.2)): A quarantined observer now stays quarantined when its grain is deactivated or reactivated, for example after it has been idle or the Kernel restarts. Before, it silently showed as `Disconnected`. The quarantine ends when an operator clears it or when the observer is subscribed again, and a subscription then retries failed partitions and resumes stopped jobs as for any reconnecting observer. [When a quarantine ends](https://github.com/Cratis/Chronicle/blob/main/Documentation/hosting/configuration/observers.md) lists exactly what subscribes each kind of observer again. (#4426)
- **AI** ([Release v7.3.3](https://github.com/Cratis/AI/releases/tag/v7.3.3)): The reactors rule no longer tells assistants that a quarantined observer needs an operator to clear it. A quarantine ends when an operator clears it or when the observer is subscribed again, for example when the client connects after a redeploy (#462)
- **cli** ([Release v3.21.2](https://github.com/Cratis/cli/releases/tag/v3.21.2)): `cratis ai install`, `update` and `status`, and the AI update after `cratis new`, delete the Cratis AI corpus they download once they finish, and a failed download removes its partial folder. A corpus given with `--source` or `CRATIS_AI_SOURCE` is never deleted. (#214)
- **cli** ([Release v3.21.2](https://github.com/Cratis/cli/releases/tag/v3.21.2)): The workbench Failures view no longer crashes when a failed partition has several attempts; the detail panel lists the latest attempts, newest first. (#213)
- **cli** ([Release v3.21.2](https://github.com/Cratis/cli/releases/tag/v3.21.2)): The `jobs resume` help and documentation now say only a stopped job can be resumed, as the server refuses a failed one. (#212)
- **Chronicle.Elixir** ([Release v3.8.1](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.8.1)): A migration defined with `use Chronicle.Events.Migration` now compiles in a Mix project when its event modules live in separate files or are compiled after it. Previously `mix compile` failed with "must use Chronicle.Events.EventType" even though the event modules did. (#90)
- **AI** ([Release v7.3.2](https://github.com/Cratis/AI/releases/tag/v7.3.2)): A `cratis ai update` no longer runs a repository's frontend and backend quality gates over the managed `.cratis`, `.pi` and `.claude` files it changes (part of #430)
- **AI** ([Release v7.3.2](https://github.com/Cratis/AI/releases/tag/v7.3.2)): The frontend compile gates are skipped with a message when the repository does not define `g:compile` or `g:compile:specs`, instead of failing with "Couldn't find a script" (part of #430)
- **Screenplay** ([Release v4.45.1](https://github.com/Cratis/Screenplay/releases/tag/v4.45.1)): The Screenplay validator now reports `PLAY0391` for a `unique` constraint that names a property its event does not declare, at the line of the `unique` rule, as `constraints.md` documents. Every property of a composite key and every alternative rule is checked. (#316)
- **Chronicle** ([Release v19.25.1](https://github.com/Cratis/Chronicle/releases/tag/v19.25.1)): A projection replay on MongoDB no longer leaves a silo writing live changes into the `replay-<read model>` collection when the final write of the replay is rejected for some partitions. That silo kept sending every later change to a collection nothing reads until it restarted, so new and changed read model instances never appeared. Ending a replay now always returns the sink to the read model's own collection.
- **Chronicle** ([Release v19.25.1](https://github.com/Cratis/Chronicle/releases/tag/v19.25.1)): When the final write of a replay is rejected for some partitions, the rebuilt read model is still promoted, and the rejected partitions are recorded as failed partitions and retried from the event that failed. This matches the SQL sink and what a silo whose final write succeeded already did. If the final write throws and its outcome is unknown, the sink returns to the read model's collection without promoting the rebuilt one.
- **Chronicle** ([Release v19.25.1](https://github.com/Cratis/Chronicle/releases/tag/v19.25.1)): A sink no longer stays in bulk mode when its final bulk write throws. Before, later writes were held back until a thousand of them had queued up.
- **Chronicle** ([Release v19.25.1](https://github.com/Cratis/Chronicle/releases/tag/v19.25.1)): Failed partitions caused by a rejected MongoDB bulk write now say why: the failure message carries the MongoDB error code, category and server message, for example `MongoDB write error 11000 (DuplicateKey): E11000 duplicate key error …`. Each write error is also logged with its code, server message, operation index and partition, and write concern errors are logged too. Document contents and error detail documents are never logged.
- **Arc** ([Release v22.41.1](https://github.com/Cratis/Arc/releases/tag/v22.41.1)): ARCCHR0011 now reports `GetInstanceById` reads made through an application extension method on `IReadModels` (for example one taking a typed `EventSourceId<T>` identity), including from rule lambdas over the whole command such as `RuleFor(c => c).MustAsync(...)` and from `Provide` (#2935)
- **Arc** ([Release v22.41.1](https://github.com/Cratis/Arc/releases/tag/v22.41.1)): ARCCHR0011 now treats a read model as Chronicle-backed when its model-bound projection attributes (`[ChildrenFrom]`, `[Join]`, `[SetFrom]` and similar) are declared on a property or record parameter, so plain parameters of such models in event-producing commands are reported (#2935)
- **Arc** ([Release v22.41.0](https://github.com/Cratis/Arc/releases/tag/v22.41.0)): A decision-mode `CommandScenario` (`UseDecisionReads()`) now provides the reads that do not guard the decision: injected read models, `IReadModels.GetInstanceById` and an `[Unprotected]` command's `DecisionRead<T>` are projected from the events seeded with `Given.ForEventSource(...).Events(...)`, the same log the decision reads fold, and can be pinned with `.ReadModel(...)`. Pinning a read model that the command takes as a protected `DecisionRead<T>` still throws `PinnedReadModelCannotProvideDecisionToken`, now naming the command and read model. (#2928)
- **Arc** ([Release v22.41.0](https://github.com/Cratis/Arc/releases/tag/v22.41.0)): A concurrency violation now reads "Event source '…' has new events since the command read it: expected no events, but it has events up to sequence number 0. Read it again and resubmit." instead of showing raw sentinel sequence numbers such as `18446744073709551613`. (#2930)
- **Arc** ([Release v22.40.3](https://github.com/Cratis/Arc/releases/tag/v22.40.3)): ARCCHR0011 now recognizes event-producing command handlers that return nested wrappers such as `Task<Result<EventsWithConcurrencyScopes, ValidationResult>>`, `ValueTask<OneOf<…>>` or `object[]`, so unguarded `GetInstanceById` calls and plain read-model parameters in those commands and their validators are reported (#2931)
- **cli** ([Release v3.21.1](https://github.com/Cratis/cli/releases/tag/v3.21.1)): `cratis screenplay generate` now names the declared enumeration member, including a `[Flags]` zero member, when a scenario asserts it, so generated documents no longer fail with SP0034 ("not a declared member of enum"). A scenario value the document cannot state is left out and reported as warning `SP0039`, and events seeded through a command scenario's event scenario are generated as `given` events. The CLI now bundles Arc's Screenplay generation 22.40.2. (#172)
- **Arc** ([Release v22.40.2](https://github.com/Cratis/Arc/releases/tag/v22.40.2)): Screenplay generation now states the events a specification seeds through the event scenario of a command scenario (`scenario.EventScenario.Given.ForEventSource(...).Events(...)`) as `given` events, instead of dropping them. (#2921)
- **Arc** ([Release v22.40.2](https://github.com/Cratis/Arc/releases/tag/v22.40.2)): A rejected command's scenario no longer states an event it asserts is still in the event log as something the command produced, so a duplicate-rejection scenario that seeds an event and asserts it is still the only one generates a document that compiles instead of failing with `PLAY0285`. (#2921)
- **Arc** ([Release v22.40.1](https://github.com/Cratis/Arc/releases/tag/v22.40.1)): Screenplay generation names the declared enumeration member, including a `[Flags]` zero member and a member declared as a combination of others, when a scenario's expected event states it in a `ShouldHaveAppendedEvent` predicate, and does so for enumerations declared over `byte`, `long` and other integral types as well. The generated document no longer fails with "not a declared member of enum". (#2839)
- **Arc** ([Release v22.40.1](https://github.com/Cratis/Arc/releases/tag/v22.40.1)): A scenario that issues a command, starts from an event or expects an event with a value the generated document cannot state is now left out and reported as a warning (`SP0039`) naming the property, the value and why, instead of being written as a number, under an invented name or without the value, and the document no longer fails to compile on such rejection scenarios. The values are a number cast to an enumeration that declares no member with it, `default` for an enumeration that declares no zero member, several `[Flags]` members combined into a value no member is declared with (Screenplay cannot state combined flags), and `null` for a required record or list. `null` is still stated where the property may be absent. (#2920)
- **Fundamentals** ([Release v7.19.8](https://github.com/Cratis/Fundamentals/releases/tag/v7.19.8)): Registering generated type discovery providers no longer slows down as an application loads more assemblies. Each call now walks only the assemblies that are new since the last call, and resolves references through a lookup instead of asking every loaded assembly for its name. Before, a process that loaded or emitted an assembly between calls repeated the full walk under a process-wide lock. This is common in a spec harness that builds a service provider per spec. Cratis Studio's specs ran in 3½ minutes before this change and in 5 seconds after it.
- **AI** ([Release v7.3.1](https://github.com/Cratis/AI/releases/tag/v7.3.1)): Rules, prompts and agents no longer send the agent to skills that do not exist. The `write-specs*` references now point at the `cratis-*` specification skills, and the same stale references to the former `add-*`, `event-modeling`, `query-paging` and similar skill names now point at their `cratis-*` replacements (#394)
- **AI** ([Release v7.3.1](https://github.com/Cratis/AI/releases/tag/v7.3.1)): The slice and feature prompts no longer invoke the removed `new-vertical-slice` and `scaffold-feature` skills; they follow the application profile rules instead
- **Chronicle** ([Release v19.24.1](https://github.com/Cratis/Chronicle/releases/tag/v19.24.1)): An event whose constrained properties are all null or missing no longer claims the empty-string value in a unique constraint, so a later event from another source holding `""` is no longer rejected as a violation. Clearing a constrained value now frees the claim the source held, so another source can then claim it. (#4383)
- **Chronicle** ([Release v19.24.1](https://github.com/Cratis/Chronicle/releases/tag/v19.24.1)): `Observers.MaxConcurrentPartitions` is now documented as what it is, an upper bound on parallel job steps applied together with `Jobs.MaxParallelSteps`, not a limit on live event delivery. The setting is added to the configuration reference. (#4405)
- **Screenplay** ([Release v4.45.0](https://github.com/Cratis/Screenplay/releases/tag/v4.45.0)): A structured value that names a property declared more than once on its composite type now reports a diagnostic instead of failing compilation with an exception.
- **Arc** ([Release v22.39.2](https://github.com/Cratis/Arc/releases/tag/v22.39.2)): An executable that references a project with a file-local type, such as the registration class the Cratis Fundamentals type discovery generator adds to every project, no longer fails to build with CS0234 in the generated `ProjectReferenceModules.g.cs`. The project reference modules generator now only names a type whose full name resolves to that type from the executable. (#2917)
- **Templates** ([Release v1.7.3](https://github.com/Cratis/Templates/releases/tag/v1.7.3)): Generated `main.tsx` in the `cratis`, Aspire, Kotlin and Java templates now mounts `CratisComponentsProvider` inside `<Arc>` and with the `toaster` prop, so `toast(...)` and `toastCommandResult(...)` show notifications in a new project without editing `main.tsx`. (#67)
- **Scene** ([Release v4.2.1](https://github.com/Cratis/Scene/releases/tag/v4.2.1)): The published `@cratis/scene.*` packages no longer contain compiled or source specification modules (`for_*` folders), so a package archive holds only its runtime output, declarations and sources. (#40)
- **Chronicle** ([Release v19.24.0](https://github.com/Cratis/Chronicle/releases/tag/v19.24.0)): The Workbench landing page no longer crashes to a blank screen while the key figures of an event store are loading, and the event stores are laid out across the width of the window.
- **Chronicle** ([Release v19.24.0](https://github.com/Cratis/Chronicle/releases/tag/v19.24.0)): Event statistics now update as events are appended. Observers of all event types, such as the statistics, received nothing live and only moved forward when the server restarted.
- **Chronicle** ([Release v19.24.0](https://github.com/Cratis/Chronicle/releases/tag/v19.24.0)): Event statistics now count each event type and namespace separately instead of folding every event into a single type in a single namespace.
- **Chronicle** ([Release v19.24.0](https://github.com/Cratis/Chronicle/releases/tag/v19.24.0)): An event store created while the server is running now gets the kernel's own projections, such as the event statistics, straight away instead of after the next restart.
- **Chronicle** ([Release v19.24.0](https://github.com/Cratis/Chronicle/releases/tag/v19.24.0)): The kernel's own projections now write to the storage the kernel runs on. On SQL storage they tried to use MongoDB and failed every event.
- **Fundamentals** ([Release v7.19.7](https://github.com/Cratis/Fundamentals/releases/tag/v7.19.7)): A project that references a package with an `[Obsolete]` type no longer fails to build when it treats warnings as errors. Type discovery still lists the type, but listing it no longer reports CS0612 or CS0618 in the generated source, which a project could neither edit nor suppress.
- **Stage** ([Release v4.22.3](https://github.com/Cratis/Stage/releases/tag/v4.22.3)): A played application's components are styled again. Clicking a command's button in a Stage application opens its dialog in front of the screen, instead of rendering it as unstyled content below the screen where it could not be seen, so the command could not be executed from the application.
- **Stage** ([Release v4.22.3](https://github.com/Cratis/Stage/releases/tag/v4.22.3)): Buttons, dialogs, tables and inputs in a Stage application use a dark theme that matches the rest of the application.
- **Chronicle.TypeScript** ([Release v6.31.2](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.31.2)): The daily "Update Packages" run no longer fails `yarn ci` with TS2322/TS2345 in `ChronicleConnection`. The update bumped the direct `@grpc/grpc-js` range while transitive resolutions stayed, leaving two instances whose channel types were not assignable to each other; there is now one instance.
- **Chronicle.TypeScript** ([Release v6.31.2](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.31.2)): `fundamentalsPeerRange` no longer fails after an update that bumps `@cratis/fundamentals` inside its peer range: `.ncurc.yml` enables peer-range updates in npm-check-updates, so the devDependency pin and the peer range move together.
- **Arc** ([Release v22.39.1](https://github.com/Cratis/Arc/releases/tag/v22.39.1)): A custom field error on a command form field is now reported once instead of twice, so screen readers no longer read it twice (#2842)
- **Ante** ([Release v1.2.8](https://github.com/Cratis/Ante/releases/tag/v1.2.8)): Text, field errors, dialogs and the recovery button in the lobby now meet WCAG AA contrast, including in forced-colors and high-contrast modes. The dark theme was applied to `<body>` only, while Cratis Components reads it from `<html>`, so component text followed the operating system's light or dark setting on dark surfaces (#150)
- **Ante** ([Release v1.2.8](https://github.com/Cratis/Ante/releases/tag/v1.2.8)): Screen readers announce a validation error once: the error summary is the only alert, and each field's error is exposed only through its own description. That includes the legal terms checkbox. A repetition that remains for custom field errors comes from Cratis/Arc#2842 (#151)
- **Ante** ([Release v1.2.7](https://github.com/Cratis/Ante/releases/tag/v1.2.7)): The onboarding wizards showed "Setting up..." instead of their form in a real browser, because the placeholder a query starts with was read as a submitted status. A status now counts only once it arrives for the requested invitation or registration. The host outcome screen and the registration page wait for their real answers the same way (#146)
- **Ante** ([Release v1.2.7](https://github.com/Cratis/Ante/releases/tag/v1.2.7)): Wizard step announcements, tab semantics and moving focus to the new step never applied, because the stepper mounts after the page (#147)
- **Ante** ([Release v1.2.7](https://github.com/Cratis/Ante/releases/tag/v1.2.7)): The onboarding wizards could not be submitted when no legal documents are configured (#148)
- **Ante** ([Release v1.2.7](https://github.com/Cratis/Ante/releases/tag/v1.2.7)): The display preferences dialog now closes with Escape (#149)
- **Chronicle** ([Release v19.23.1](https://github.com/Cratis/Chronicle/releases/tag/v19.23.1)): The event serializer and the reactor side-effect handlers are always registered as scoped services, even when convention binding has already bound them as singletons. As singletons they captured the scoped event types registry (#4410)
- **Chronicle** ([Release v19.23.1](https://github.com/Cratis/Chronicle/releases/tag/v19.23.1)): Reducers now log observation stream errors by kind: cancellation at Debug, a lost kernel connection at Warning while reconnecting, and any other failure at Error. Reconnect behavior is unchanged (#4374)
- **Ante** ([Release v1.2.6](https://github.com/Cratis/Ante/releases/tag/v1.2.6)): Ante processes incoming invitations again when it runs in Development. Chronicle's event serializer ended up registered as a singleton that captured the scoped event types, so Development's scope validation failed every delivery. Outside Development, it silently kept the event types of the root scope. Ante now registers the serializer with a scoped lifetime, as Chronicle intends. The underlying registration order is tracked in Cratis/Chronicle#4410 (#142)
- **Ante** ([Release v1.2.5](https://github.com/Cratis/Ante/releases/tag/v1.2.5)): An organization name that a host released can be registered again, and the new registration is now published to the host. Before, the registration succeeded locally but was never forwarded, because the outbox kept its own copy of the name's uniqueness claim (#138).
- **Ante** ([Release v1.2.5](https://github.com/Cratis/Ante/releases/tag/v1.2.5)): Ante's organization-name and one-use invitation constraints now apply only to its event log. The outbox carries only copies the event log has already validated, and #135 made each forward idempotent.
- **Ante** ([Release v1.2.5](https://github.com/Cratis/Ante/releases/tag/v1.2.5)): This needs Chronicle 19.23.0 (constraints scoped to event sequences, Cratis/Chronicle#4398). Ante now uses the 19.23.0 client and requires kernel 19.23.0 or later.
- **Ante** ([Release v1.2.5](https://github.com/Cratis/Ante/releases/tag/v1.2.5)): `deployment.md` explains how registrations stuck before the upgrade get forwarded.
- **Chronicle** ([Release v19.22.2](https://github.com/Cratis/Chronicle/releases/tag/v19.22.2)): **MongoDB:** `ObserveInstances` emits a fresh page after every change to the read model's collection, instead of failing after the first page. (#4365)
- **Chronicle** ([Release v19.22.2](https://github.com/Cratis/Chronicle/releases/tag/v19.22.2)): **One change stream per collection:** observers of the same collection share a single MongoDB change stream. It opens with the first observer and closes with the last, so many observers no longer hold one pooled connection each.
- **Chronicle** ([Release v19.22.2](https://github.com/Cratis/Chronicle/releases/tag/v19.22.2)): **Transient MongoDB errors** (a stepdown, a lost connection, a read cut short by a rename) are retried with a short, bounded backoff. Observers get an error only if the failure persists, and each failure is logged.
- **Chronicle** ([Release v19.22.2](https://github.com/Cratis/Chronicle/releases/tag/v19.22.2)): **Replays:** during a replay, observers and `GetInstances` see the primary collection, and the page and its `TotalCount` come from the same collection, as with the SQL sink. When the replay is promoted, observers get the replayed state without first flashing an empty page. A promoting collection left behind by an interrupted promotion doesn't block observation.
- **Chronicle** ([Release v19.22.2](https://github.com/Cratis/Chronicle/releases/tag/v19.22.2)): **Empty read models:** a read model with no instances yet, including one whose MongoDB collection was never created, emits an empty first page on MongoDB, InMemory and SQL alike.
- **Chronicle** ([Release v19.22.2](https://github.com/Cratis/Chronicle/releases/tag/v19.22.2)): **InMemory:** readers see the primary collection during a replay, observers are told when the replay is promoted, and clearing the primary collection (initial run, removal) is announced.
- **Chronicle** ([Release v19.22.2](https://github.com/Cratis/Chronicle/releases/tag/v19.22.2)): **Page ordering:** observed pages are delivered in the order the sink produced them, both in the kernel's gRPC service and in the .NET client's `IMaterializedReadModels.ObserveInstances`. Before, a slow earlier page could arrive after a newer one.
- **Chronicle** ([Release v19.22.2](https://github.com/Cratis/Chronicle/releases/tag/v19.22.2)): **.NET client:** a failed materialized observation in read-model reactors is logged instead of being rethrown unhandled.
- **AI** ([Release v7.2.2](https://github.com/Cratis/AI/releases/tag/v7.2.2)): **Top-level key rejected by other validators.** Skill path-hint triggers (#446) declared `cratis-hint-paths` as a top-level `SKILL.md` frontmatter key. Agent Skills allows only `name`, `description`, `license`, `compatibility`, `metadata` and `allowed-tools` at the top level, and Cratis/Strategy's validator rejected the corpus-update PR (Cratis/Strategy#310). The triggers now live at `metadata.cratis-hint-paths` as one quoted string of whitespace-separated globs. The globs themselves are unchanged.
- **AI** ([Release v7.2.2](https://github.com/Cratis/AI/releases/tag/v7.2.2)): **The path-guidance extension** reads the hints from `metadata`. Its frontmatter reader stays dependency-free and reads only the one supported form, so an unsupported spelling gives no triggers rather than a bogus glob.
- **Ante** ([Release v1.2.4](https://github.com/Cratis/Ante/releases/tag/v1.2.4)): Ante now publishes each fact to its outbox once per event it handles, even when Chronicle delivers that event again. Chronicle redelivers after an Ante instance stops after publishing but before acknowledging, for example in a rolling deploy with two instances. Before this change:
- **Ante** ([Release v1.2.4](https://github.com/Cratis/Ante/releases/tag/v1.2.4)): `LegalTermsAccepted` and `OrganizationRegistrationCompleted` could reach the host twice.
- **Ante** ([Release v1.2.4](https://github.com/Cratis/Ante/releases/tag/v1.2.4)): A redelivered acceptance was refused by its one-use constraint but failed the forwarding reactor, which kept retrying.
- **Ante** ([Release v1.2.4](https://github.com/Cratis/Ante/releases/tag/v1.2.4)): Rejections were republished on redelivery.
- **Ante** ([Release v1.2.4](https://github.com/Cratis/Ante/releases/tag/v1.2.4)): **How:** each forward checks whether the outbox already holds the fact for this delivery, using the same check token issuance has used since #110. A scoped append keeps two instances from both publishing, and a fact that is already published counts as success. Live status notifications still run.
- **Chronicle.TypeScript** ([Release v6.31.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.31.1)): Class-level `@onceOnly()` reactors are no longer replayed, and webhooks registered with `notReplayable()` or `notActive()` keep those settings. The generated contracts dropped `false` values, which the kernel read as `true` (Cratis/Chronicle#4394).
- **Chronicle** ([Release v19.22.1](https://github.com/Cratis/Chronicle/releases/tag/v19.22.1)): A projection now auto-maps properties from an event type registered at a later generation. The kernel read every event type's schema as generation 1, so a read model built from a generation 2 or later event got none of its properties mapped. Event type storage now returns the latest stored generation, and projections resolve the schema by event type. (#4367)
- **Chronicle** ([Release v19.22.1](https://github.com/Cratis/Chronicle/releases/tag/v19.22.1)): The Workbench's projection declaration editor (preview, save, code generation and schema inference) resolves event types by name at any generation. It uses the named generation when one is given, and otherwise the latest. (#4367)
- **Chronicle** ([Release v19.22.1](https://github.com/Cratis/Chronicle/releases/tag/v19.22.1)): Replayed, caught-up and joined events are always released with the compliance schema of the generation they were stored at, so `[PII]` values are decrypted correctly for event types that have more than one generation. (#4367)
- **Chronicle** ([Release v19.22.1](https://github.com/Cratis/Chronicle/releases/tag/v19.22.1)): An event forwarded from one event store's outbox to another store's inbox keeps the time it originally occurred. Before, the inbox copy was stamped with the forwarding time. (#4375)
- **Chronicle** ([Release v19.22.0](https://github.com/Cratis/Chronicle/releases/tag/v19.22.0)): A unique constraint with `IgnoreCasing` now rejects a value that differs only in casing. The .NET client did not send `IgnoreCasing` when it registered the constraint, so the kernel stored every unique constraint as case-sensitive. (#4368)
- **Chronicle** ([Release v19.22.0](https://github.com/Cratis/Chronicle/releases/tag/v19.22.0)): A reactor that loses its connection to the kernel (gRPC `Unavailable`) now logs a Warning and reconnects, instead of the Error "observation stream errored out". A cancelled stream logs at Debug and does not reconnect, and any other stream error is still an Error. An error thrown by your reactor handler is still an Error, even a gRPC `Cancelled` or `Unavailable` from your own calls. It is logged at Debug only when the reactor itself is stopping, such as during host shutdown. If the kernel stays away, the connection watchdog still logs each failed reconnect attempt at Error. (#4373)
- **Chronicle** ([Release v19.22.0](https://github.com/Cratis/Chronicle/releases/tag/v19.22.0)): A read-model property whose type is a concept, and whose record constructor parameter has a default (for example `OwnerSubject? Owner = null`), now gets its type, format and compliance metadata in the read-model schema. Before, it was untyped: the value was dropped when the read model was read, and a `[PII]` value was stored unencrypted. Event-type schemas are generated exactly as before, so event types that are already registered keep registering. Event types are tracked in #4376. (#4330)
- **Ante** ([Release v1.2.2](https://github.com/Cratis/Ante/releases/tag/v1.2.2)): When Ante shuts down while a reactor is still finishing an event, a status notifier can fail because the host has already disposed its service provider. Ante used to log that as a warning. It is expected shutdown noise, so it is now logged at Debug with a "host is stopping" message, both while Recorded is announced and after the outbox append. Every other notifier failure is still logged as a warning.
- **Components** ([Release v4.21.1](https://github.com/Cratis/Components/releases/tag/v4.21.1)): `@cratis/components.mui`, `@cratis/components.primereact`, `@cratis/components.primereact10` and `@cratis/components.conformance` declared `engines.node >=23.0.0`, so npm and pnpm with `engine-strict` refused to install them on Node.js 22, a maintained LTS release. They now declare `>=22.0.0`. CI installs each adapter on Node.js 22 with `engine-strict` on. (#371)
- **Components** ([Release v4.21.1](https://github.com/Cratis/Components/releases/tag/v4.21.1)): `MIGRATION.md` said the adapters declare a `@cratis/components >=4 <5` peer range. Each published adapter and Conformance release requires exactly the `@cratis/components` version it was released with, so install and upgrade them together. (#370)
- **Ante** ([Release v1.2.1](https://github.com/Cratis/Ante/releases/tag/v1.2.1)): An open onboarding status page now shows **Recorded** as soon as an acceptance is recorded, then **Accepted** once it is published. Before, it went straight from Pending to Accepted. This covers joining a tenant, invited organization setup and self-service registration. The forwarding reactors announce Recorded just before the outbox append:
- **Ante** ([Release v1.2.1](https://github.com/Cratis/Ante/releases/tag/v1.2.1)): A failing subscriber can't fail the reactor or cause a duplicate publish.
- **Ante** ([Release v1.2.1](https://github.com/Cratis/Ante/releases/tag/v1.2.1)): A subscription never moves back from Accepted to Recorded.
- **Ante** ([Release v1.2.1](https://github.com/Cratis/Ante/releases/tag/v1.2.1)): Redelivery or replay doesn't repeat Recorded, and it creates nothing for subscriptions nobody is watching.
- **Arc** ([Release v22.33.1](https://github.com/Cratis/Arc/releases/tag/v22.33.1)): An interceptor class that implements `IInterceptReadModel<T>` for more than one read model now intercepts each of them; before, only the first interface found was used. If such a class is also registered in DI for one of those read models, the discovered type is now used for it instead of the registered instance (Refs #2856)
- **Ante** ([Release v1.1.0](https://github.com/Cratis/Ante/releases/tag/v1.1.0)): An invitation that arrives while no signing key is configured now waits for one without failing Ante's token-issuing reactor. Before, every such invitation left a failed partition. Chronicle stopped retrying after its retry limit, and with quarantine thresholds configured the whole issuing observer could be quarantined, blocking every invitation. After a restart with a key, the host could also receive the token twice.
- **Ante** ([Release v1.1.0](https://github.com/Cratis/Ante/releases/tag/v1.1.0)): Every token or rejection Ante publishes is now checked against the outbox first, so a retry, redelivery or replay publishes an outcome for a receipt or reissue request only once. Each reissue request still gets a new token.
- **Arc** ([Release v22.33.0](https://github.com/Cratis/Arc/releases/tag/v22.33.0)): Registering generated metadata no longer swallows every exception. A referenced assembly that is missing or cannot be loaded is logged as a warning, and any other failure, including a module initializer that throws, now stops startup (Refs #2857)
- **Ante** ([Release v1.0.4](https://github.com/Cratis/Ante/releases/tag/v1.0.4)): A status page opened after a restart, on another replica, or after the in-memory status cache was cleaned up now shows the right onboarding status (Accepted, Recorded or Pending) even while the read models lag. Ante now works out the starting status from the event log and outbox, using the same check that #103 added for live updates. This covers joining a tenant, invited organization setup and self-service registration. Who may see a status is unchanged. (#101)
- **Arc** ([Release v22.32.1](https://github.com/Cratis/Arc/releases/tag/v22.32.1)): A MongoDB call no longer hangs forever when its cancellation token fires while it waits for a connection slot, or is already cancelled when the call starts. The caller's task now completes as cancelled (Refs #2858)
- **Ante** ([Release v1.0.3](https://github.com/Cratis/Ante/releases/tag/v1.0.3)): **Security:** a deployment that sets `Ante:Invitations:Token:Issuer` or `Audience` explicitly no longer accepts tokens without those claims. This restores the pre-1.0 behaviour, where tokens signed with a trusted key but not naming this deployment were refused, even if that key was shared with another deployment.
- **Ante** ([Release v1.0.3](https://github.com/Cratis/Ante/releases/tag/v1.0.3)): Ante no longer resolves a scoped MongoDB collection from the root service provider to load the upgrade window. Development's scope validation rejects that, and it bypassed per-tenant resolution.
- **Ante** ([Release v1.0.3](https://github.com/Cratis/Ante/releases/tag/v1.0.3)): Rolling upgrades: tokens that replicas still running 0.x issue up to 15 minutes after the first 1.0 replica starts are still accepted, and keep their full lifetime.
- **Ante** ([Release v1.0.3](https://github.com/Cratis/Ante/releases/tag/v1.0.3)): A token without an issue or expiry time is refused, and a pre-isolation token's lifetime may not exceed the configured `Expiry`.
- **Ante** ([Release v1.0.3](https://github.com/Cratis/Ante/releases/tag/v1.0.3)): The end of the window is now recorded (`legacyUntil`) when a deployment first starts with isolation, so a later change to `Expiry` no longer moves it. Documents written by 1.0.0 fall back to activation + grace + current `Expiry`.
- **Ante** ([Release v1.0.2](https://github.com/Cratis/Ante/releases/tag/v1.0.2)): A host releasing an organization name now frees it even when an organization registered that name through self-service signup. Before, a registration's name claim was stored without its name, because the Chronicle kernel only auto-maps properties from generation-1 events and `OrganizationRegistrationCompleted` is generation 2 (Cratis/Chronicle#4367). Every later release then failed and was retried forever, so released names stayed taken. The name is now mapped explicitly.
- **Ante** ([Release v1.0.2](https://github.com/Cratis/Ante/releases/tag/v1.0.2)): Name claims stored before this fix are resolved from their events when a release arrives, so releases work whether or not the claims projection has been replayed. Replaying `OrganizationNameClaim` after upgrading also repairs those claims for the case-insensitive duplicate check. Depending on the kernel's projection evolution policy, Chronicle may only record a replay recommendation, in which case an operator should run the replay.
- **Arc.TypeScript** ([v0.45.1](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.45.1)): `server.dispose()` now disposes the service registry and its owned singletons when the host's `closeWebSockets()` throws synchronously, and reports the WebSocket failure together with any disposal failure, as it already did when closing rejected. (#121)
- **Ante** ([Release v1.0.1](https://github.com/Cratis/Ante/releases/tag/v1.0.1)): An open onboarding wizard now reliably moves to Accepted once the acceptance is published. Before, the live status push relied on a read model built from the outbox, which usually hadn't caught up at the moment of publishing, so the wizard could stay on "pending" until the user reloaded. Ante now confirms publication from the event log and outbox directly. This applies to joining a tenant, invited organization setup and self-service registration. (#100)
- **Ante** ([Release v1.0.1](https://github.com/Cratis/Ante/releases/tag/v1.0.1)): A failing status notification (an error, a timeout or a cancellation) no longer makes Ante publish the same acceptance to the host a second time. Everything after a successful publish is isolated and logged. (#100)
- **Stage** ([Release v4.22.1](https://github.com/Cratis/Stage/releases/tag/v4.22.1)): Render admission now also checks read models built by reducers for property names Chronicle cannot persist, members that collide with the record or its queries, and query parameters that collide with the generated `readModels` parameter (STAGE-ESM-017 / STAGE-ESM-012).
- **Stage** ([Release v4.22.1](https://github.com/Cratis/Stage/releases/tag/v4.22.1)): Modules, features and slices can no longer declare a namespace that collides with a type the renderer generates outside the modeled namespaces: `GeneratedPolicies.Registration` (always scaffolded), `GeneratedPolicies.PolicyValues` (with authorization), `GeneratedStrings` (with a strings catalog) and the reducer runtime types.
- **Stage** ([Release v4.22.1](https://github.com/Cratis/Stage/releases/tag/v4.22.1)): Generated policies and `then denied` specifications qualify framework and policy types with `global::`, so a module, feature or slice named like `StringComparison` or like the root namespace no longer breaks compilation.
- **Arc** ([Release v22.32.0](https://github.com/Cratis/Arc/releases/tag/v22.32.0)): Query introspection reports a query's custom `[Path]` route instead of the conventional route.
- **Arc** ([Release v22.32.0](https://github.com/Cratis/Arc/releases/tag/v22.32.0)): The runtime and the proxy generator match the Cratis `PathAttribute` by its full type name.
- **Screenplay** ([Release v4.44.1](https://github.com/Cratis/Screenplay/releases/tag/v4.44.1)): Trailing comments stay on their intended printed lines for the remaining line kinds that were placed by source offset: other descriptions, behavior order, reaction triggers, values and conditions, and interaction triggers, conditions and continuations. The offset fallback is gone.
- **Screenplay** ([Release v4.44.1](https://github.com/Cratis/Screenplay/releases/tag/v4.44.1)): Comments no longer merge into a declaration's header comment, or move onto an opening code fence (where reparsing dropped the whole code block), for repeated interaction directives, `arrangement` headers, legacy code-language lines and multi-line `authorize` / `require … or` continuations.
- **Screenplay** ([Release v4.44.1](https://github.com/Cratis/Screenplay/releases/tag/v4.44.1)): When a single-valued directive is repeated and the last one wins (for example `file`, query `by`, command `handler`, capture `source`, projection `parent`, table `on row-click`, action `label` or `navigate`), comments on the replaced lines keep their own lines instead of joining the header comment.
- **Chronicle.Elixir** ([Release v3.8.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.8.0)): Stopping a client during a stalled compatibility check or an in-flight OAuth token request completes within the shutdown budget.
- **Chronicle.Elixir** ([Release v3.8.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.8.0)): Failed OAuth token requests close their socket.
- **Components** ([Release v4.19.2](https://github.com/Cratis/Components/releases/tag/v4.19.2)): Source maps survive the build step that rewrites relative ESM import specifiers. Before, every rewritten `.js` and `.d.ts` file lost its map. JavaScript maps now embed their original sources, so stack traces and debuggers show the component source. Declaration maps keep go-to-definition working wherever the sources are available, such as linked or monorepo checkouts. The package grows from about 723 KB to about 1.0 MB, all of it source maps; production bundlers ignore them. (#213)
- **Components** ([Release v4.19.2](https://github.com/Cratis/Components/releases/tag/v4.19.2)): A packed-package check verifies the maps of every file the build rewrote: the exact source positions after each edit, that no stale map is left, and TypeScript's go-to-definition. (#213)
- **Stage** ([Release v4.22.0](https://github.com/Cratis/Stage/releases/tag/v4.22.0)): Rendering and specification runs now reject authored names that would produce generated C# that does not compile or serialize. This covers names that collide with record-synthesized members, their own type, query methods and parameters, other generated types in the same namespace, and Chronicle's case-insensitive document `id`. Both paths use the same checks, so a specification can no longer pass while the rendered application fails to build.
- **Components** ([Release v4.19.1](https://github.com/Cratis/Components/releases/tag/v4.19.1)): `FilterPanel` keeps its panel inside the visible area when the page shows classic, non-overlay scrollbars. Before, a panel opened near the right or bottom edge could extend under the scrollbar. Fixed panels now follow the browser's layout viewport, the same way in every browser. Rotated or skewed overlay containers are not supported; translated and scaled ones are. (#356)
- **Components** ([Release v4.19.1](https://github.com/Cratis/Components/releases/tag/v4.19.1)): `ToolbarButton` icons are vertically centered for icon fonts and SVG icons, in regular and list mode, even under an inherited line height. An icon part hidden with the `hidden` attribute through `pt.icon` stays hidden. (#321)
- **Arc** ([Release v22.31.1](https://github.com/Cratis/Arc/releases/tag/v22.31.1)): A discoverable validator that derives from a non-generic intermediate base class no longer fails discovery with an `IndexOutOfRangeException`, and one whose intermediate base has several generic arguments is registered for its own model instead of the first argument (#2853)
- **Chronicle** ([Release v19.21.1](https://github.com/Cratis/Chronicle/releases/tag/v19.21.1)): CommonJS applications can `require('@cratis/chronicle.contracts')`. The CommonJS build is now marked as CommonJS and has matching type declarations, and the packed-consumer check covers `require()` and Node16 CommonJS type-checking. (#4331)
- **AI** ([Release v7.1.4](https://github.com/Cratis/AI/releases/tag/v7.1.4)): Worker harnesses refresh their GitHub installation token immediately before pushing committed work, so long sessions do not lose changes when the dispatch-time token expires. A failed push now reports failed work rather than completion. (#436)
- **Chronicle** ([Release v19.20.0](https://github.com/Cratis/Chronicle/releases/tag/v19.20.0)): The kernel no longer fails to start when another socket briefly holds its port. On Linux, port 35000 lies in the ephemeral source-port range, so an outbound connection made during startup could briefly take it, and the kernel then failed with "address already in use".
- **Chronicle** ([Release v19.20.0](https://github.com/Cratis/Chronicle/releases/tag/v19.20.0)): The kernel now retries only that bind error, for up to 30 seconds (the new `BindTimeout` option; `00:00:00` turns it off). The retry stops as soon as shutdown is requested.
- **Chronicle** ([Release v19.20.0](https://github.com/Cratis/Chronicle/releases/tag/v19.20.0)): The diagnostics name the socket holding the port (#4174)
- **Chronicle** ([Release v19.20.0](https://github.com/Cratis/Chronicle/releases/tag/v19.20.0)): A projection replay is treated as finalized only when at least one silo actually finalizes it.
- **Chronicle** ([Release v19.20.0](https://github.com/Cratis/Chronicle/releases/tag/v19.20.0)): A failed replay setup (`Establish`) is reported instead of ignored.
- **Chronicle** ([Release v19.20.0](https://github.com/Cratis/Chronicle/releases/tag/v19.20.0)): Before this, a replay could be treated as complete and clear failed partitions even though the read-model swap never happened (#4243)
- **Chronicle** ([Release v19.20.0](https://github.com/Cratis/Chronicle/releases/tag/v19.20.0)): Failed partitions from the final MongoDB bulk flush of a catch-up or replay are now recorded as failed partitions. Previously they were discarded and the catch-up reported success (#4257)
- **Chronicle** ([Release v19.20.0](https://github.com/Cratis/Chronicle/releases/tag/v19.20.0)): Projection replays on SQL storage (SQLite, PostgreSQL, SQL Server) no longer fail. This covers replays after a projection definition change and every replay after the first. The replay context's generation column was missing, the replayed-read-model table was mapped under the wrong name (the table is now keyed by observer and replay start), and replayed tables kept their temporary primary-key names after the swap. #4243 exposed these long-standing SQL bugs by no longer ignoring replay start and finalization errors.
- **Chronicle** ([Release v19.20.0](https://github.com/Cratis/Chronicle/releases/tag/v19.20.0)): Primary-key names on PostgreSQL and SQL Server are now
- **AI** ([Release v7.1.3](https://github.com/Cratis/AI/releases/tag/v7.1.3)): The local work artifacts rule tells agents to create task worktrees outside the repository tree. A worktree nested under `.ai-work/` inherits the parent checkout's `.globalconfig`, which breaks .NET builds with `MultipleGlobalAnalyzerKeys` or silently changes analyzer severities (#433)
- **AI** ([Release v7.1.3](https://github.com/Cratis/AI/releases/tag/v7.1.3)): The writing voice skill names the profile that installs each drafting skill it hands off to, so it no longer points documentation-only or content-only repositories at a skill they don't have (#432)
- **Chronicle** ([Release v19.17.0](https://github.com/Cratis/Chronicle/releases/tag/v19.17.0)): `WaitForCompletion()` no longer times out on observers whose tag, event source type, or event stream type filters exclude the appended events. Matching events in the same batch still must be handled before the wait completes. (#4198)
- **Chronicle** ([Release v19.17.0](https://github.com/Cratis/Chronicle/releases/tag/v19.17.0)): Failed partitions are reported only for observers whose filters match the appended events, including observers that are already caught up.
- **Chronicle** ([Release v19.17.0](https://github.com/Cratis/Chronicle/releases/tag/v19.17.0)): Cached subscription matches are refreshed when an observer unsubscribes or changes its filters or event types.
- **Chronicle** ([Release v19.17.0](https://github.com/Cratis/Chronicle/releases/tag/v19.17.0)): The .NET client now says explicitly when it sends the first sequence number (additive proto field 8), so a batch that starts at sequence 0 is handled correctly. Legacy clients, invalid ranges and ranges over 10,000 events fall back to waiting through the target.
- **Chronicle** ([Release v19.17.0](https://github.com/Cratis/Chronicle/releases/tag/v19.17.0)): An explicit `Default` event source type filters the same way in the append queue, in handling and in the wait.
- **Chronicle** ([Release v19.17.0](https://github.com/Cratis/Chronicle/releases/tag/v19.17.0)): Observers that are caught up and have no failed partitions no longer trigger subscription lookups on each poll.
- **Chronicle** ([Release v19.4.9-hotfix.3](https://github.com/Cratis/Chronicle/releases/tag/v19.4.9-hotfix.3)): On-demand read models no longer return empty after a child collection crosses between kernel silos. Nested projected objects keep their shape across silos, and a failed projection rebuilds its engine for the next read. The wire format is unchanged for rolling upgrades. (#4337)
- **Chronicle** ([Release v19.16.1](https://github.com/Cratis/Chronicle/releases/tag/v19.16.1)): On a kernel with more than one silo, on-demand (passive) read models no longer start returning nothing for every instance. Once a read model with children had been projected on one silo and cached on another, the next event for an existing child threw. The projection then returned no read model for any instance, and reported nothing, until the kernel restarted or the projection was registered again. Objects now keep their shape when sent between silos (Cratis.Orleans 1.12.2), and a projection that fails once no longer stays broken for every instance read after it. (#4337)

## Removed

- **Fundamentals** ([Release v7.20.2](https://github.com/Cratis/Fundamentals/releases/tag/v7.20.2)): Stop bringing the OpenTelemetry SDK and its dependency chain into applications through `Cratis.Fundamentals`, while keeping modern diagnostics APIs available through `System.Diagnostics.DiagnosticSource`. Applications using OpenTelemetry SDK or API types, or Microsoft.Extensions logging, configuration or diagnostics packages previously supplied through OpenTelemetry, must reference their chosen packages directly. (#1141)

## Security

- **Arc.TypeScript** ([v0.56.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.56.0)): Discovery and description endpoints, including `/openapi.json`, now require authentication outside Development by default across Express, Fastify, Hono, and fetch hosts. Hosts without authentication leave these endpoints unmapped and log a startup warning; explicitly requiring authentication without configuring it fails startup. Discovery GET responses send `Cache-Control: no-store`. (#158)
- **Arc** ([Release v22.46.0](https://github.com/Cratis/Arc/releases/tag/v22.46.0)): Arc no longer trusts the client-controlled, unsigned `.cratis-identity` cookie on the server. `IIdentityProvider.Get()`, `Get<TDetails>()` and `/.cratis/me` derive identity only from the authenticated principal. (#2939)
- **Chronicle.TypeScript** ([Release v6.34.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.34.0)): Event source ids are no longer recorded in telemetry unless `telemetry.eventSourceId` opts in, on both the `chronicle.event_source_id` and `cratis.event_source.id` attributes. Recorded exceptions carry only their type, without messages or stack traces, and reactor diagnostics no longer include event payload excerpts. (part of #171)
- **AuthProxy** ([Release v2.27.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.27.0)): With host and path-prefix routing, service-specific claim requirements and client-credentials tokens follow the selected route, and a selected route that cannot be mapped to a configured service is denied rather than checked against proxy-wide requirements only. Host routing distinguishes client-credentials services that share the same token route prefix. (#150)
- **AuthProxy** ([Release v2.25.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.25.0)): Required verification accepts remembered authorization only for the participating Required services that verified the caller. Cookies from `BestEffort` or older releases cannot bypass verification, even when Data Protection keys survive an upgrade. Changing the Required service set forces verification again for both cookies and cached results, so a cached `BestEffort` admission cannot become proof of Required verification after a configuration reload. (#163)
- **AuthProxy** ([Release v2.23.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.23.0)): AuthProxy strips client-supplied `x-cratis-tenant-id` and `Tenant-ID` headers regardless of casing, both inbound and again before forwarding, then writes only its resolved tenant under both names. Previously only `Tenant-ID` was stripped, allowing a client value to reach Arc backends on default tenancy settings. All inbound `x-ms-client-principal*` headers are also stripped without normalizing unrelated forwarded header values. (#157)
- **AuthProxy** ([Release v2.23.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.23.0)): Per-service claim requirements now apply to the service selected by the route. An unknown service header can no longer bypass the requirements of a protected service selected by `?service=`. (#172)
- **Arc** ([Release v22.44.1](https://github.com/Cratis/Arc/releases/tag/v22.44.1)): The embedded event-model explorer now bundles DOMPurify 3.4.16 instead of the 3.4.15 copy carried by Monaco, which has a published low-severity advisory.
- **Ante** ([Release v1.2.9](https://github.com/Cratis/Ante/releases/tag/v1.2.9)): The default invitation token issuer and audience now percent-encode the `EventStore` and `Namespace` names, so deployments whose names contain `:` (for example `Ante:Lobby`/`Prod` and `Ante`/`Lobby:Prod`) can no longer derive the same issuer and accept each other's tokens. Names made only of letters, digits, `-`, `.`, `_` and `~` keep their existing issuer. A deployment whose names contain any other character, including spaces and non-ASCII letters such as `Ø`, gets a new issuer: configure the new value in your proxy and expect invitation tokens issued earlier to be rejected, or set `Issuer` and `Audience` explicitly. (#155)
- **Arc.TypeScript** ([v0.47.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.47.0)): Protected (PII) read-model data read through typed raw MongoDB paths is no longer served unreleased. Still served as stored: untyped `MongoReadModels`, typed documents of models not registered with `withChronicle`, documents a handler copies or maps, `MongoDBWatcher.changes()` payloads, and values hidden behind
- **Chronicle.Elixir** ([Release v3.8.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.8.0)): The four grpc 0.x advisories no longer apply to the client ([CVE-2026-48599](https://github.com/advisories/GHSA-mwr4-5g34-j5cq), [CVE-2026-48853](https://github.com/advisories/GHSA-grp7-v8xh-rj7h), [CVE-2026-48854](https://github.com/advisories/GHSA-q8gf-9rvj-gmgj), [CVE-2026-53430](https://github.com/advisories/GHSA-6ccx-9c9f-327w)), nor the Mint 1.10 advisories.
- **Chronicle** ([Release v19.21.1](https://github.com/Cratis/Chronicle/releases/tag/v19.21.1)): A pinned server certificate (the configured client certificate) is now trusted only when its chain is the sole validation failure. A host-name mismatch or a missing server certificate is rejected even when the certificate matches the pin. (#4344)
- **Chronicle** ([Release v19.19.0](https://github.com/Cratis/Chronicle/releases/tag/v19.19.0)): Moves past the grpc 0.x advisories [CVE-2026-48599](https://github.com/advisories/GHSA-mwr4-5g34-j5cq), [CVE-2026-48853](https://github.com/advisories/GHSA-grp7-v8xh-rj7h), [CVE-2026-48854](https://github.com/advisories/GHSA-q8gf-9rvj-gmgj) and [CVE-2026-53430](https://github.com/advisories/GHSA-6ccx-9c9f-327w), all patched in grpc 1.0.0, and requires Mint 1.11, which fixes three advisories in Mint 1.10. (#4214)

## Deprecated

- **Arc.TypeScript** ([v0.57.1](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.57.1)): Generated `sortBy` helpers for record, nested-model, array, map, and polymorphic fields are deprecated and will be removed in the next major release; sort on a scalar field instead. (#174)
- **Chronicle.TypeScript** ([Release v6.44.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.44.0)): `@fromAll` remains a supported, deprecated alias for restricted mappings; prefer `@fromEvery`. Contrary to the earlier "next major" announcement, its behavior will not change; use `@fromAllEvents` to opt into all-event subscriptions.
- **Chronicle.TypeScript** ([Release v6.43.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.43.0)): `telemetry.spanNames` (built-in spans always use the convention names) and `ChronicleMetrics` (use `ChronicleConventionMetrics`) are deprecated, together with `WellKnownTelemetryNames.spans`, `legacyScope`, `legacyAttributes` and `legacyMetrics`; prefer `conventionSpans`, `scope`, `attributes` and `metrics`. They keep working with no scheduled removal. (part of #171)
- **Chronicle.TypeScript** ([Release v6.42.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.42.0)): The current `@fromAll` alias behavior is deprecated but unchanged in this release. In the next major, `@fromAll` subscribes to every event type like fluent `fromAll()` and .NET `[FromAll]`; use `@fromEvery` to keep the current behavior. (part of #192)
- **Chronicle.TypeScript** ([Release v6.40.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.40.0)): `WellKnownTelemetryNames.spans`, `legacyScope`, `legacyAttributes` and `legacyMetrics`, and the legacy span names, `chronicle.*` attributes and millisecond metrics they describe, are removed in the next major. (part of #171)
- **Arc.TypeScript** ([v0.54.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.54.0)): The `query_name` attribute on `cratis.arc.subscription.duration` is retained for one minor release; use `cratis.arc.query.name` instead. (#153)
- **Arc** ([Release v22.46.0](https://github.com/Cratis/Arc/releases/tag/v22.46.0)): `IdentityProvider.IdentityCookieName` in .NET, and `IdentityProvider.CookieName` and `IdentityProvider.clearIdentityCookie()` in `@cratis/arc`. Replace `IdentityProvider.clearIdentityCookie()` with `IdentityProvider.clearCache()`. (#2939)
- **Arc.TypeScript** ([v0.53.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.53.0)): `cratis.arc.operation.duration` is still recorded for one more minor release; move dashboards and alerts to `cratis.arc.command.duration` and `cratis.arc.query.duration`. (#148)
- **AI** ([Release v7.4.0](https://github.com/Cratis/AI/releases/tag/v7.4.0)): The per-agent `Harness` on `ConfigureAgent` is kept for existing callers and as a fallback for providers with no harness selection; configure harnesses on the provider instead (Cratis/Direct#936)
- **AuthProxy** ([Release v2.23.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.23.0)): Forwarding `Tenant-ID` and `Service-ID` is deprecated and will be removed in a future major release. Move backends to `x-cratis-tenant-id` and `x-cratis-microservice` during the compatible transition described in the [upgrade note](https://github.com/Cratis/AuthProxy/blob/main/Documentation/upgrading/tenant-and-service-headers.md). (part of #154)
- **Arc** ([Release v22.43.0](https://github.com/Cratis/Arc/releases/tag/v22.43.0)): `Cratis:Arc:Introspection:TrustForwardedIdentityHeaders` is obsolete but still enables the host-wide trust setting. Move it to `Cratis:Arc:TrustForwardedIdentityHeaders`. (#2946)
- **Arc** ([Release v22.43.0](https://github.com/Cratis/Arc/releases/tag/v22.43.0)): The three-argument `MicrosoftIDentityPlatformAuthHandler` constructor is obsolete but remains compatible with existing subclasses. Use the overload accepting `IOptionsMonitor<ArcOptions>`; the original constructor reads the host's trust setting from request services and defaults to untrusted when it is unavailable. (#2946)
