---
title: Release digest for week of 2026-08-10 to 2026-08-17
---

## Version movement

| Repository | Previous version | Current version |
| --- | --- | --- |
| [Arc](https://github.com/Cratis/Arc) | [v21.1.0](https://github.com/Cratis/Arc/releases/tag/v21.1.0) | [v21.19.0](https://github.com/Cratis/Arc/releases/tag/v21.19.0) |
| [AuthProxy](https://github.com/Cratis/AuthProxy) | [v2.13.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.13.0) | [v2.20.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.20.0) |
| [Chronicle](https://github.com/Cratis/Chronicle) | [v16.20.0](https://github.com/Cratis/Chronicle/releases/tag/v16.20.0) | [v16.34.1](https://github.com/Cratis/Chronicle/releases/tag/v16.34.1) |
| [Chronicle.Kotlin](https://github.com/Cratis/Chronicle.Kotlin) | [v2.9.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v2.9.0) | [v2.10.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v2.10.0) |
| [cli](https://github.com/Cratis/cli) | [v2.4.0](https://github.com/Cratis/cli/releases/tag/v2.4.0) | [v2.8.1](https://github.com/Cratis/cli/releases/tag/v2.8.1) |
| [Components](https://github.com/Cratis/Components) | [v2.6.2](https://github.com/Cratis/Components/releases/tag/v2.6.2) | [v3.4.0](https://github.com/Cratis/Components/releases/tag/v3.4.0) |
| [Fundamentals](https://github.com/Cratis/Fundamentals) | [v7.17.1](https://github.com/Cratis/Fundamentals/releases/tag/v7.17.1) | [v7.18.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.18.0) |
| [Prologue](https://github.com/Cratis/Prologue) | [v1.1.0](https://github.com/Cratis/Prologue/releases/tag/v1.1.0) | [v1.2.0](https://github.com/Cratis/Prologue/releases/tag/v1.2.0) |
| [release-action](https://github.com/Cratis/release-action) | [v1.1.2](https://github.com/Cratis/release-action/releases/tag/v1.1.2) | [v1.2.0](https://github.com/Cratis/release-action/releases/tag/v1.2.0) |
| [Scene](https://github.com/Cratis/Scene) | First release | [v2.0.0](https://github.com/Cratis/Scene/releases/tag/v2.0.0) |
| [Screenplay](https://github.com/Cratis/Screenplay) | [v2.1.0](https://github.com/Cratis/Screenplay/releases/tag/v2.1.0) | [v4.0.1](https://github.com/Cratis/Screenplay/releases/tag/v4.0.1) |
| [Stage](https://github.com/Cratis/Stage) | [v1.2.0](https://github.com/Cratis/Stage/releases/tag/v1.2.0) | [v3.2.0](https://github.com/Cratis/Stage/releases/tag/v3.2.0) |
| [Studio](https://github.com/Cratis/Studio) | [v0.54.4](https://github.com/Cratis/Studio/releases/tag/v0.54.4) | [v0.69.0](https://github.com/Cratis/Studio/releases/tag/v0.69.0) |
| [Synopsis](https://github.com/Cratis/Synopsis) | First release | [v1.1.0](https://github.com/Cratis/Synopsis/releases/tag/v1.1.0) |

## Added
- **Components** ([Release v3.4.0](https://github.com/Cratis/Components/releases/tag/v3.4.0)): `@cratis/components/styled` — `styledMode()` configures the provider for PrimeReact 11's styled mode: `primeReactStyles` (PrimeReact's component styles for every primitive, applied through the provider's `defaults`) together with a `@primeuix/themes` preset, emitted into the `primereact` cascade layer so an application's own CSS overrides the theme as it did on PrimeReact 10. `CratisPreset` is Lara on the blue primary and gray surfaces of `lara-light-blue` / `lara-dark-blue`; any preset can be passed instead. `@primereact/styles` and `@primeuix/themes` are optional peers, needed only for this path.
- **Components** ([Release v3.4.0](https://github.com/Cratis/Components/releases/tag/v3.4.0)): `@cratis/components/primereact-v10-palette` — the `--surface-*`, `--text-color`, `--primary-color`, `--highlight-*`, `--focus-ring`, `--surface-0…900`, `--primary-*` and color-scale variables PrimeReact 10's themes published, with the `lara-blue` values in both schemes, so CSS written against them keeps resolving.
- **Components** ([Release v3.4.0](https://github.com/Cratis/Components/releases/tag/v3.4.0)): `Message` renders the severity glyph PrimeReact 10 showed; an `icon` prop replaces or removes it.
- **Studio** ([Release v0.69.0](https://github.com/Cratis/Studio/releases/tag/v0.69.0)): An anonymous, read-only **Event Model Viewer** at `view.cratis.studio`: open `/?url=<URL-encoded Screenplay document URL>` and the document is fetched, compiled and rendered on Studio's event-model canvas — no sign-in, no organization. Its own service and image (`viewer`), one endpoint (`GET /api/view`), no AuthProxy, and a server-side fetch guard that refuses private, loopback and link-local hosts, oversized documents and slow origins, with per-client throttling at the ingress. (Cratis/StudioIssues#192)
- **Studio** ([Release v0.69.0](https://github.com/Cratis/Studio/releases/tag/v0.69.0)): Guided tours: written, self-paced chapters with screenshots and animations for the **project drawer** and **brainstorming** tours, and a brand-new guided tour for **Concepts** on the same tour engine, launched from the Concepts toolbar. (Cratis/StudioIssues#189)
- **Studio** ([Release v0.69.0](https://github.com/Cratis/Studio/releases/tag/v0.69.0)): The dictation microphone picker asks for microphone access the first time it is opened, so it lists the real microphones right away; hovering the microphone button tells you which microphone is in use. (Cratis/StudioIssues#155)
- **Components** ([Release v3.3.0](https://github.com/Cratis/Components/releases/tag/v3.3.0)): `Button` from `@cratis/components/Common` — preserves PrimeReact 10's `label` / `icon` / `loading` / `tooltip` / `text` / `outlined` authoring model over PrimeReact 11's children-only `Button`. Accepts a PrimeIcons class name or an element for `icon`, renders a spinner while `loading`, and sets `iconOnly` automatically when there is an icon and no label.
- **Chronicle** ([Release v16.34.1](https://github.com/Cratis/Chronicle/releases/tag/v16.34.1)): Workbench-owned wrappers for the PrimeReact 11 primitives that became compositional namespaces with no Cratis equivalent — `Button`, `Card`, `Message`, `ProgressSpinner`, `Paginator`, `Tabs`, `Chart` and a plain-array `DataTable` — so the existing `label`/`icon` and `<Column field header body sortable />` authoring model still applies.
- **Chronicle** ([Release v16.34.1](https://github.com/Cratis/Chronicle/releases/tag/v16.34.1)): Storybook stories for the Workbench `DataTable`, covering sorting, nested fields, filtering, grouping and selection.
- **Components** ([Release v3.2.0](https://github.com/Cratis/Components/releases/tag/v3.2.0)): `Message` — a declarative inline message from `@cratis/components/Display`, preserving PrimeReact 10's flat `<Message severity text />` call shape over PrimeReact 11's compositional `Message.Root`/`Content`/`Text` parts.
- **Components** ([Release v3.2.0](https://github.com/Cratis/Components/releases/tag/v3.2.0)): `ProgressSpinner` — an indeterminate spinner from `@cratis/components/Display`, preserving the flat `<ProgressSpinner />` call shape over PrimeReact 11's `Root`/`Track`/`Range` parts.
- **Components** ([Release v3.1.0](https://github.com/Cratis/Components/releases/tag/v3.1.0)): `DataTableCore` is now exported from `@cratis/components/DataTables`, so an application can render rows it already holds — fetched by hand, computed, or assembled from several sources — with `Column` children, selection, filtering and scrolling, without driving a query through `DataTableForQuery` or `DataTableForObservableQuery`.
- **Studio** ([Release v0.68.0](https://github.com/Cratis/Studio/releases/tag/v0.68.0)): Terms and conditions and privacy policy are written and published from Admin, with a markdown editor, a version, and a plain-language summary of what changed (Cratis/StudioIssues#173)
- **Studio** ([Release v0.68.0](https://github.com/Cratis/Studio/releases/tag/v0.68.0)): The built-in language model can draft that summary by comparing a draft against what is published (Cratis/StudioIssues#173)
- **Studio** ([Release v0.68.0](https://github.com/Cratis/Studio/releases/tag/v0.68.0)): Publishing a revision emails every user individually, with the documents that changed attached as PDFs (Cratis/StudioIssues#173)
- **Studio** ([Release v0.68.0](https://github.com/Cratis/Studio/releases/tag/v0.68.0)): Published revisions are mirrored into the repository the public site is built from (Cratis/StudioIssues#173)
- **Studio** ([Release v0.68.0](https://github.com/Cratis/Studio/releases/tag/v0.68.0)): System has an avatar of its own, shown wherever Studio itself is the one doing the work (Cratis/StudioIssues#177)
- **Studio** ([Release v0.68.0](https://github.com/Cratis/Studio/releases/tag/v0.68.0)): Chat reactions offer the emojis you reached for most recently, kept between visits, with a full emoji picker one click behind them (Cratis/StudioIssues#174)
- **Scene** ([Release v2.0.0](https://github.com/Cratis/Scene/releases/tag/v2.0.0)): 14 abstract names whose PrimeReact component was removed in v11 are now backed by Cratis-owned implementations: `menubar`, `megaMenu`, `tieredMenu`, `panelMenu`, `tabMenu`, `steps`, `dock`, `splitButton`, `confirmDialog`, `column`, `treeSelect`, `blockUI`, `scrollTop` and `image`.
- **Scene** ([Release v2.0.0](https://github.com/Cratis/Scene/releases/tag/v2.0.0)): `MenuItem` and `TreeNode` are exported from `@cratis/scene.primereact`. PrimeReact 11 removed `primereact/menuitem` and `primereact/treenode`, and the authored `{ label, icon, items }` shape was always Scene's vocabulary.
- **Components** ([Release v3.0.0](https://github.com/Cratis/Components/releases/tag/v3.0.0)): `@cratis/components/Notifications` — `Toaster`, the imperative `toast`, and `toastCommandResult(result)` mapping an Arc `ICommandResult` to the right toast (validation → per-field messages, exceptions → generic, never stack traces)
- **Components** ([Release v3.0.0](https://github.com/Cratis/Components/releases/tag/v3.0.0)): `@cratis/components/Display` — `Tag`, `Badge`, `Chip`, `Skeleton`, `Avatar`, `ProgressBar`
- **Components** ([Release v3.0.0](https://github.com/Cratis/Components/releases/tag/v3.0.0)): `@cratis/components/theme` — a license-free Cratis baseline theme (light + dark) that skins every component from the token layer without a PrimeUI key
- **Components** ([Release v3.0.0](https://github.com/Cratis/Components/releases/tag/v3.0.0)): `PasswordField`, `ToggleSwitchField` and `RatingField` for `CommandForm`
- **Components** ([Release v3.0.0](https://github.com/Cratis/Components/releases/tag/v3.0.0)): `Column` (with per-column filter menus), `StepperPanel` and `ActionMenubar` as Cratis-owned replacements for the `primereact` modules v11 removed
- **Components** ([Release v3.0.0](https://github.com/Cratis/Components/releases/tag/v3.0.0)): Per-column filter menus, a global search box and a paginator range report on the data tables
- **Components** ([Release v3.0.0](https://github.com/Cratis/Components/releases/tag/v3.0.0)): `dismissable` and `closeAriaLabel` on `Dialog`
- **Components** ([Release v3.0.0](https://github.com/Cratis/Components/releases/tag/v3.0.0)): `Source/MIGRATION.md` — the consumer upgrade guide
- **Stage** ([Release v3.2.0](https://github.com/Cratis/Stage/releases/tag/v3.2.0)): Stage resolves a **render plan per deployment target** from a translated Screenplay application — one per `ui profile` per platform, with the profile's packages expanded to their transitive closure in override-priority order, every component name a screen references bound to the package that wins it, the selected shell and theme resolved, screen templates nested inside the shell, and every arrangement evaluated at the target's size class. `EventModelLoader.LoadRenderPlanFromDirectoryAsync(directory, catalog)` compiles and resolves in one call; `RenderPlanner.Plan(application, catalog)` resolves an application you already hold. (#39)
- **Stage** ([Release v3.2.0](https://github.com/Cratis/Stage/releases/tag/v3.2.0)): A render plan reports what a target could **not** resolve as build findings on the result rather than throwing — a package the catalog does not declare, a dependency nothing satisfies, a version conflict, a dependency cycle, a shell or theme nothing declares, a theme incompatible with an active package, a component name that binds to nothing, an unplaced or cyclic screen template, a screen left on another shell, and a freeform arrangement with no variant for the target's size class. `IsComplete` is the single check a build gates on. (#39)
- **Stage** ([Release v3.2.0](https://github.com/Cratis/Stage/releases/tag/v3.2.0)): A `ui profile`'s `layout` and `theme` now survive translation into `Cratis.Scene.Model`, so a target's shell and theme are resolved from what the document actually declares instead of being dropped.
- **Stage** ([Release v3.2.0](https://github.com/Cratis/Stage/releases/tag/v3.2.0)): [Render plans](https://github.com/Cratis/Stage/blob/main/Documentation/reference/render-plans.md) documents what a plan contains, every finding and what it means, and the multi-target answer.
- **Scene** ([Release v1.1.0](https://github.com/Cratis/Scene/releases/tag/v1.1.0)): `UiProfile` gained `Layout` and `Theme` — the application shell a target renders inside, and the visual theme it applies. Screenplay's `ui profile` could already state both (`layout AppShell`, `theme Aurora`), but the model had nowhere to hold them, so translation dropped them.
- **Stage** ([Release v3.1.0](https://github.com/Cratis/Stage/releases/tag/v3.1.0)): Translation from a compiled Screenplay application into `Cratis.Scene.Model` instances - the seam between the Screenplay language and the object model Scene's engine and renderers consume (#37)
- **Stage** ([Release v3.1.0](https://github.com/Cratis/Stage/releases/tag/v3.1.0)): `EventModelLoader.LoadSceneApplicationFromDirectoryAsync`, alongside the existing `LoadFromDirectoryAsync`, to load the translated model from a directory of `.play` files
- **Scene** ([Release v1.0.0](https://github.com/Cratis/Scene/releases/tag/v1.0.0)): **Packages.** A `ui profile` lists packages by name; `ScenePackage` is the declaration behind such a name — what it contributes (components, layouts, screen and dialog templates, themes) and what else has to be active for it to work. Kinds are `ComponentLibrary`, `Styling` and `Blueprint`.
- **Scene** ([Release v1.0.0](https://github.com/Cratis/Scene/releases/tag/v1.0.0)): **Dependency resolution.** `PackageDependencyResolver` expands a chosen set of packages into the complete list, ordered so a package always follows what it depends on — which is also the correct override priority. Missing dependencies, version conflicts and cycles are reported rather than guessed at. `PackageCatalog` answers what a package picker asks: which component libraries are a base to build on, and what else fits what is already selected.
- **Scene** ([Release v1.0.0](https://github.com/Cratis/Scene/releases/tag/v1.0.0)): **Screen and dialog templates.** `ScreenTemplate` is a reusable shape that goes inside a layout, at module, feature or slice level; `FitsSlot` names the slot on its parent it fills, and `ScreenTemplateResolver` turns those names into a tree. The same rule applies at every level, so nesting has no depth limit. `DialogTemplate` is the same for overlays, which fill no slot.
- **Scene** ([Release v1.0.0](https://github.com/Cratis/Scene/releases/tag/v1.0.0)): **Themes carry attribution.** `Theme` gained design tokens plus `Author`, `AuthorUrl` and `License`, so a theme adopted from elsewhere credits its original creator.
- **Scene** ([Release v1.0.0](https://github.com/Cratis/Scene/releases/tag/v1.0.0)): **`@cratis/scene.primereact`** — 87 component names across PrimeReact's families, and 25 of PrimeTek's free themes, each credited.
- **Scene** ([Release v1.0.0](https://github.com/Cratis/Scene/releases/tag/v1.0.0)): **`@cratis/scene.components`** — the Arc-bound Cratis Components composites, with a binding registry so a screen can name a query or command that a host resolves to a real class at render time.
- **Scene** ([Release v1.0.0](https://github.com/Cratis/Scene/releases/tag/v1.0.0)): **`@cratis/scene.tailwind`** — the styling package component libraries declare themselves written against.
- **Scene** ([Release v1.0.0](https://github.com/Cratis/Scene/releases/tag/v1.0.0)): **`@cratis/scene.blueprint.default`** — application shells with eight menu modes, 23 screen templates, 3 dialog templates and two themes.
- **Scene** ([Release v1.0.0](https://github.com/Cratis/Scene/releases/tag/v1.0.0)): **`@cratis/scene.blueprint.components`** — whole Arc-bound pages built from Cratis Components, layered on the default blueprint rather than shipping a rival shell.
- **Fundamentals** ([Release v7.18.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.18.0)): Added standard TypeScript decorator support for field and derived-type metadata while retaining legacy decorator compatibility. (Cratis/Arc#2440)
- **Screenplay** ([Release v4.0.0](https://github.com/Cratis/Screenplay/releases/tag/v4.0.0)): `layout <Name>` — a new top level construct declaring the application's base navigational look: named slots, arranged the same way a template's are. Its slots keep `contributes <ContributionPoint>`, which makes the shell the natural home of an application-wide `Navigation` point.
- **Screenplay** ([Release v4.0.0](https://github.com/Cratis/Screenplay/releases/tag/v4.0.0)): `layout <Name>` on a `ui profile`, exactly parallel to the existing `theme <Name>` line — at most one per profile. This is where an application states which shell it uses. Naming a layout the document does not declare is reported as a warning, the way an unknown theme already is.
- **Screenplay** ([Release v4.0.0](https://github.com/Cratis/Screenplay/releases/tag/v4.0.0)): `dialog template <Name>` at module scope — a reusable shape for content that opens over the application. It declares no `fits slot`, because it occupies no slot.
- **Screenplay** ([Release v4.0.0](https://github.com/Cratis/Screenplay/releases/tag/v4.0.0)): `fits slot <name>` on a screen template — names the slot of its parent the template fills. One rule for every level: a module's template fits a slot on the application layout, a feature's fits a slot the module's template declares, a slice's fits one the feature's declares.
- **Screenplay** ([Release v4.0.0](https://github.com/Cratis/Screenplay/releases/tag/v4.0.0)): A `Layouts and templates` documentation page covering the four constructs and how they nest.
- **Arc** ([Release v21.18.0](https://github.com/Cratis/Arc/releases/tag/v21.18.0)): Added opt-in decorator-free metadata registration for generated TypeScript proxies, enabling React Native, Expo, Hermes, and toolchains without legacy decorator transforms. (#2440)
- **Studio** ([Release v0.67.0](https://github.com/Cratis/Studio/releases/tag/v0.67.0)): Settings can now be opened directly from Application, Domain, and Project rows in the hierarchy via a hover-revealed cog icon, consistent across all three levels (#168, #170)
- **Studio** ([Release v0.67.0](https://github.com/Cratis/Studio/releases/tag/v0.67.0)): Application settings now has a Dangerous zone for renaming and permanently deleting an application, matching the existing Project experience (#169)
- **Studio** ([Release v0.67.0](https://github.com/Cratis/Studio/releases/tag/v0.67.0)): Quick emoji reactions and a one-click reply button on chat comments — reactions from different people stack, and clicking a reaction shows who gave it (#171)
- **Studio** ([Release v0.67.0](https://github.com/Cratis/Studio/releases/tag/v0.67.0)): Hover-based relevance highlighting on event-modeling boards now also dims and highlights each slice's specifications, not just the slice itself (#172)
- **Chronicle** ([Release v16.34.0](https://github.com/Cratis/Chronicle/releases/tag/v16.34.0)): Reactors can take a `ReactorDelivery` parameter on a handler method to get a stable identity for that delivery of that event — the same value when a failed partition is recovered and the event is delivered again, and different for every distinct delivery. Use `delivery.Id` as the key for your own record of completed side effects (#3643)
- **Chronicle** ([Release v16.34.0](https://github.com/Cratis/Chronicle/releases/tag/v16.34.0)): Read model members can be cleared. `[ClearWith<TEvent>]` on a scalar property or record parameter, `[SetValue<TEvent>(null)]`, and the fluent `.Clear(m => m.Property)` all write the member back to no value every time the event is observed, replay included — at the root, on a child item, and on a nested object's members (#3711)
- **Chronicle** ([Release v16.34.0](https://github.com/Cratis/Chronicle/releases/tag/v16.34.0)): The fluent projection builder gained `.Clear(m => m.Property)`, available everywhere `.Set(...)` is. It is the recommended way to clear; `.Set(...).ToValue(null)` means the same thing and keeps working (#3711)
- **Chronicle** ([Release v16.34.0](https://github.com/Cratis/Chronicle/releases/tag/v16.34.0)): The projection declaration language gains a `clear` statement. `clear <property>` takes a value away, alongside `increment`, `decrement` and `count`, and accepts a property path so `clear owner.note` clears a member of a nested object. `property = null` still compiles to exactly the same mapping (#3711)
- **Chronicle** ([Release v16.34.0](https://github.com/Cratis/Chronicle/releases/tag/v16.34.0)): `CHR0048` reports a clear declared for a member that cannot hold null — for `[ClearWith]`, a null `[SetValue]`, `.Clear(...)` and `.Set(...).ToValue(null)` alike — as a warning. It is scheduled to become an error in the next major; building the projection refuses the declaration outright, so an unaddressed warning fails at startup rather than at build time (#3711)
- **Chronicle** ([Release v16.34.0](https://github.com/Cratis/Chronicle/releases/tag/v16.34.0)): A unique constraint can be released by more than one event. Declare `RemovedWith<T>()` once for each way the lifecycle ends — accepted, revoked, expired — and every one of them frees the value on its own. The same holds for the attribute form: several event types may carry `[RemoveConstraint]` for one constraint name (#3697)
- **Chronicle** ([Release v16.34.0](https://github.com/Cratis/Chronicle/releases/tag/v16.34.0)): Encryption certificates can be rotated without downtime: `encryptionCertificate.previous` holds an ordered list of previously active certificates, kept for decryption while the active one protects everything new (#3690)
- **Chronicle** ([Release v16.34.0](https://github.com/Cratis/Chronicle/releases/tag/v16.34.0)): `GET /diagnostics/encryption-certificates` reports the certificate ring, which certificate is active, and how many stored Data Protection keys still depend on each — including keys that depend on a certificate no longer in the ring (#3690)
- **Chronicle** ([Release v16.34.0](https://github.com/Cratis/Chronicle/releases/tag/v16.34.0)): The encryption-certificate ring is logged at every boot, one line per certificate, with a warning for any that has expired (#3690)
- **Chronicle** ([Release v16.34.0](https://github.com/Cratis/Chronicle/releases/tag/v16.34.0)): `IEventStore.PII.AllowNewEncryptionKeyFor(subject)` authorizes a fresh encryption key for a subject whose key was erased, so a later lawful lifecycle can protect their data again under an independent key (#3600)
- **Chronicle** ([Release v16.34.0](https://github.com/Cratis/Chronicle/releases/tag/v16.34.0)): Encryption key stores record erasures beside the keys — a revision floor, the fingerprints of the destroyed key material, and whether a new lifecycle is authorized — so "erased" is a state Chronicle can tell apart from "never provisioned" (#3600)
- **Chronicle** ([Release v16.34.0](https://github.com/Cratis/Chronicle/releases/tag/v16.34.0)): Erasing a subject and authorizing a new
- **Screenplay** ([Release v3.1.0](https://github.com/Cratis/Screenplay/releases/tag/v3.1.0)): `clear <property>` in the projection declaration language, for removing the value a read model property holds — the language half of Cratis/Chronicle#3711, from review of Cratis/Chronicle#3713. `<property> = null` keeps parsing exactly as it does today
- **Screenplay** ([Release v3.1.0](https://github.com/Cratis/Screenplay/releases/tag/v3.1.0)): `ClearMappingSyntax` and `ScreenplaySyntaxWalker.VisitClearMapping` for consumers walking the syntax tree, with printing that brings `clear` back out as `clear`
- **Screenplay** ([Release v3.1.0](https://github.com/Cratis/Screenplay/releases/tag/v3.1.0)): `clear` in projection completion, hover and syntax highlighting for the Monaco language service and the VS Code extension
- **Stage** ([Release v3.0.0](https://github.com/Cratis/Stage/releases/tag/v3.0.0)): A reaction set off by the clock, or by a trigger an integration provides, is now reported in the generated file and the diagnostics instead of skipped — a Chronicle reactor is set off by an event, so neither has an equivalent to render
- **Stage** ([Release v3.0.0](https://github.com/Cratis/Stage/releases/tag/v3.0.0)): A reaction's `where` condition is reported, since the rendered handler runs for every occurrence
- **Screenplay** ([Release v3.0.0](https://github.com/Cratis/Screenplay/releases/tag/v3.0.0)): `reaction <Name>` — behavior that runs when something happens, replacing `reactor` (#102)
- **Screenplay** ([Release v3.0.0](https://github.com/Cratis/Screenplay/releases/tag/v3.0.0)): Trigger clauses on a reaction: `when <Name>` for an event or a trigger, `every <n> <seconds|minutes|hours|days>` for an interval, and `at <HH:mm>` optionally narrowed by `on <Weekday>` or `on day <n>` (#102)
- **Screenplay** ([Release v3.0.0](https://github.com/Cratis/Screenplay/releases/tag/v3.0.0)): Bare names under a trigger select the values the occurrence hands the reaction, checked against what the event or trigger declares (#102)
- **Screenplay** ([Release v3.0.0](https://github.com/Cratis/Screenplay/releases/tag/v3.0.0)): `where <condition>` on a reaction, narrowing which occurrences run it (#102)
- **Screenplay** ([Release v3.0.0](https://github.com/Cratis/Screenplay/releases/tag/v3.0.0)): `trigger <Name>` — a top-level declaration of a kind of occurrence and the values it provides (#102)
- **Screenplay** ([Release v3.0.0](https://github.com/Cratis/Screenplay/releases/tag/v3.0.0)): `TriggerDefinition` and `IScreenplayLanguageRegistry.Triggers`, so a consumer can register a trigger and optionally state what an occurrence carries (#102)
- **Screenplay** ([Release v3.0.0](https://github.com/Cratis/Screenplay/releases/tag/v3.0.0)): Built-in `Startup` and `Shutdown` triggers (#102)
- **Screenplay** ([Release v3.0.0](https://github.com/Cratis/Screenplay/releases/tag/v3.0.0)): Reaction and trigger support in the Monaco language service and the VS Code extension, including completing the commands `invokes` can name (#102)
- **Screenplay** ([Release v3.0.0](https://github.com/Cratis/Screenplay/releases/tag/v3.0.0)): Reactions and Triggers documentation pages, with the matching EBNF productions (#102)
- **release-action** ([Release v1.2.0](https://github.com/Cratis/release-action/releases/tag/v1.2.0)): `reason` output telling you why the action published nothing, so a workflow can fail on a release that went missing without failing on the ones that are expected.
- **Screenplay** ([Release v2.6.2](https://github.com/Cratis/Screenplay/releases/tag/v2.6.2)): Catalogue entries for the 58 diagnostic codes the compiler could report but the documentation did not list (#106)
- **cli** ([Release v2.8.0](https://github.com/Cratis/cli/releases/tag/v2.8.0)): A floating filter panel on `F` in the workbench that filters as you type and shows how many rows match
- **cli** ([Release v2.8.0](https://github.com/Cratis/cli/releases/tag/v2.8.0)): Click the store, namespace, theme or refresh interval in the workbench status bar to change it
- **cli** ([Release v2.8.0](https://github.com/Cratis/cli/releases/tag/v2.8.0)): Right-click a row for its actions, with the destructive ones kept apart
- **Scene** ([Release v0.7.0](https://github.com/Cratis/Scene/releases/tag/v0.7.0)): `Layout.Arrangement`: an optional `FlowArrangement`/`FreeformSlotArrangement` describing how a layout's own named slots position relative to each other, filling a gap where Screenplay's `template`/`row`/`column`/`grid`/`variant` constructs (which arrange *slots*) had nowhere to go in the object model - only a single slot's own filled *content* could be arranged before this
- **Scene** ([Release v0.7.0](https://github.com/Cratis/Scene/releases/tag/v0.7.0)): `FlowSlotLeaf`/`SlotPlacement`: the slot-referencing counterparts to `FlowLeaf`/`ElementPlacement`, used only within a `Layout`'s own arrangement tree
- **Scene** ([Release v0.7.0](https://github.com/Cratis/Scene/releases/tag/v0.7.0)): `FreeformSlotArrangementEvaluator` (+ TypeScript `evaluateFreeformSlotArrangement`): selects a `Layout`'s macro placement variant for a size class, mirroring `FreeformArrangementEvaluator`
- **Scene** ([Release v0.6.0](https://github.com/Cratis/Scene/releases/tag/v0.6.0)): `UiStarter` model type: a packaged, versioned UI starting point bundling a package list, compatible themes, and a gallery of sample screen names (#6)
- **Scene** ([Release v0.6.0](https://github.com/Cratis/Scene/releases/tag/v0.6.0)): `StarterProfileBuilder` / `buildStarterProfile`: builds the sandboxed `UiProfile` a starter's gallery boots through, scoped to exactly its own package list (#6)
- **Scene** ([Release v0.6.0](https://github.com/Cratis/Scene/releases/tag/v0.6.0)): `StarterThemeValidation` / `incompatibleStarterThemes`: finds which of a starter's declared themes are incompatible with its own packages, reusing the theme compatibility engine (#6)
- **Scene** ([Release v0.5.0](https://github.com/Cratis/Scene/releases/tag/v0.5.0)): `ThemeCompatibility.IncompatiblePackages()`/`incompatiblePackages()` and `IsCompatible()`/`isThemeCompatible()` - reuse the exact rule Screenplay's compiler already applies (`ValidateThemes`): every package a `ui profile` declares must be in the theme's `compatibleWith` list, with no implicit exemption for `core`. Sharing this rule here means Stage's build-time warning and Studio's design-time theme-picker filtering don't each reimplement it. (#5)
- **Scene** ([Release v0.5.0](https://github.com/Cratis/Scene/releases/tag/v0.5.0)): `ThemeCompatibility.ApplicablePackages()`/`applicableThemePackages()` - the renderer-facing half: the packages a profile activates that a theme also declares compatible, which `Scene.React` scopes token application to (rather than applying a theme's tokens globally). Computing it fresh from the current theme/profile pair, rather than caching a resolved result, is what makes theme switching a live re-resolution with no reload. (#5)
- **Scene** ([Release v0.5.0](https://github.com/Cratis/Scene/releases/tag/v0.5.0)): A shared JSON fixture corpus (`theme-compatibility-fixtures.json`) asserted independently by both the C# and TypeScript specs, following the pattern established in #3/#4.
- **Scene** ([Release v0.4.0](https://github.com/Cratis/Scene/releases/tag/v0.4.0)): `aggregateContributions()` (`@cratis/scene.engine`) - collects every contribution targeting a given contribution point, ordered ascending by its explicit `order` (unordered contributions sort after every ordered one, in their original relative order). Resolving *which* contribution point a `contribute to` targets already happens before a `Contribution` exists in `Scene.Model` (see its own doc comment), so there was no ambiguity left for the engine to resolve here, only ordering - this is narrower than the issue's original proposal, which assumed the engine would still walk a nearest-enclosing resolution; that already happened upstream. (#2)
- **Scene** ([Release v0.4.0](https://github.com/Cratis/Scene/releases/tag/v0.4.0)): `NavBar` widget (`@cratis/scene.react`) - renders the aggregated `Navigation` contributions. How `navigate to <Screen>` becomes a concrete route is a caller-supplied `renderRoute` callback rather than a fixed URL scheme, so the same widget works unmodified across renderers, per the issue's own "configurable per renderer" requirement. (#2)
- **Scene** ([Release v0.4.0](https://github.com/Cratis/Scene/releases/tag/v0.4.0)): `extractNavigationItem()` - reads a `NavigationItem` out of a `Navigation` contribution's `ExternalComponent.properties` bag.
- **Scene** ([Release v0.3.0](https://github.com/Cratis/Scene/releases/tag/v0.3.0)): `SizeClassCalculator.Compute()` (C#) / `computeSizeClass()` (TypeScript) - computes the current width x height size class from actual available dimensions, shared by every renderer so they all agree on when a class boundary is crossed. (#4)
- **Scene** ([Release v0.3.0](https://github.com/Cratis/Scene/releases/tag/v0.3.0)): `FlowArrangementEvaluator.Evaluate()` / `evaluateFlowArrangement()` - selects the most specific matching `when width/height <class>` override's tree for the current size class (both dimensions targeted beats one; the last declared wins among equally specific matches), falling back to the base tree when nothing matches. (#4)
- **Scene** ([Release v0.3.0](https://github.com/Cratis/Scene/releases/tag/v0.3.0)): `FreeformArrangementEvaluator.Evaluate()` / `evaluateFreeformArrangement()` - selects the placement variant with an exact size-class match, or nothing - deliberately no fallback, matching the language's own "warn, don't silently pick" design for a size class with no matching variant. (#4)
- **Scene** ([Release v0.3.0](https://github.com/Cratis/Scene/releases/tag/v0.3.0)): `FlowArrangement` gained an `Overrides` list (C#) / `overrides` (TypeScript) - the model previously had no field at all for Screenplay's `when width/height <class>` override construct, unlike `FreeformArrangement` which was already keyed by size class.
- **Scene** ([Release v0.3.0](https://github.com/Cratis/Scene/releases/tag/v0.3.0)): A shared JSON fixture corpus (`layout-evaluation-fixtures.json`) asserted independently by both the C# and TypeScript specs, following the same pattern established for the package resolver in #3/#9.
- **Scene** ([Release v0.2.0](https://github.com/Cratis/Scene/releases/tag/v0.2.0)): `PackageResolver.Resolve()` (C#, `Cratis.Scene.Engine`) and `resolveComponentName()` (TypeScript, `@cratis/scene.engine`) - resolve a bare or package-qualified component name against a `ui profile`'s package list. A bare name walks the package list from highest to lowest priority (`core` always the lowest-priority fallback); a package-qualified name (e.g. `Internal.Widgets.TrendChart`) resolves directly against its named package, bypassing priority order entirely. (#3)
- **Scene** ([Release v0.2.0](https://github.com/Cratis/Scene/releases/tag/v0.2.0)): Every resolution also reports which other active packages declared the same bare name but were shadowed by the winner, directly answering the issue's own open question ("why did my button render as PrimeReact's and not core's") without needing separate CLI tooling. (#3)
- **Scene** ([Release v0.2.0](https://github.com/Cratis/Scene/releases/tag/v0.2.0)): A shared JSON fixture corpus (`package-resolution-fixtures.json`) asserted independently by both the C# and TypeScript specs, so the two implementations of the algorithm cannot drift apart - the same pattern `scene-model-shape.json` already establishes for `Scene.Model`'s shape.
- **Scene** ([Release v0.2.0](https://github.com/Cratis/Scene/releases/tag/v0.2.0)): New `Cratis.Scene.Engine` C# project, sibling to `Scene.Model`, mirroring the existing TypeScript `model`/`engine` package split - keeps `Scene.Model`'s strict shape-parity manifest free of behavioral types.
- **Screenplay** ([Release v2.6.0](https://github.com/Cratis/Screenplay/releases/tag/v2.6.0)): **`arrangement flow`** (default) - a layout's `template` block can now nest slots under `row`/`column`/`grid` containers with sizing attributes (`width`, `height`, `grow`, `span`, `gap`), and declare `when width <compact|regular>[, height <compact|regular>]` (or `when height ...` alone) overrides that replace the tree for a given size class. A bare `template` of plain slot names still parses exactly as before - this is a purely additive language change.
- **Screenplay** ([Release v2.6.0](https://github.com/Cratis/Screenplay/releases/tag/v2.6.0)): **`arrangement freeform`** - a layout can instead declare `variant width <compact|regular>, height <compact|regular>` blocks, each placing slots at pixel-precise coordinates with `place <Slot> at x,y size w,h` (either dimension may be `fill`) or hiding one with `place <Slot> hidden`. One `screen`/data/action/form contract still applies across every variant - only placement varies.
- **Screenplay** ([Release v2.6.0](https://github.com/Cratis/Screenplay/releases/tag/v2.6.0)): Width/height size classes (`compact`/`regular`) are a new two-dimensional vocabulary scoped to layout arrangement, reused across both modes so phone portrait/landscape, tablet, and desktop narrow/wide fall out of the matrix without an `orientation` primitive.
- **Screenplay** ([Release v2.6.0](https://github.com/Cratis/Screenplay/releases/tag/v2.6.0)): A `freeform` layout's `variant` that omits a slot another variant of the same layout places (or hides) now gets a compile-time warning.
- **Screenplay** ([Release v2.6.0](https://github.com/Cratis/Screenplay/releases/tag/v2.6.0)): New diagnostics `PLAY0233`-`PLAY0244` for the above, documented in the diagnostics catalogue.
- **Screenplay** ([Release v2.6.0](https://github.com/Cratis/Screenplay/releases/tag/v2.6.0)): New [Layout arrangement](https://cratis.io/screenplay/layout-arrangement/) documentation page, cross-linked from Screens.
- **Screenplay** ([Release v2.6.0](https://github.com/Cratis/Screenplay/releases/tag/v2.6.0)): **Scope decision:** arrangement is declared per-layout, not per-slot. Mixing responsive `flow` for most of a layout with one pixel-precise `freeform` region (e.g. a chart in an otherwise-responsive dashboard) is real and common but needs slot-level arrangement - a larger grammar change tracked as a follow-up rather than folded into this PR. Documented as an explicit "out of scope for now" in the new page.
- **Screenplay** ([Release v2.6.0](https://github.com/Cratis/Screenplay/releases/tag/v2.6.0)): Whether a `ui profile` targeting a size class with no matching `variant`/`when` should warn is a build-time concern (it depends on which layouts a profile's screens actually resolve to) - left to Stage's build pipeline, not the Screenplay compiler.
- **Screenplay** ([Release v2.6.0](https://github.com/Cratis/Screenplay/releases/tag/v2.6.0)): The CI `build` (Release) check is expected to fail with `CS9057` - a pre-existing, unrelated issue (`Microsoft.Net.Compilers.Toolset` pinned to `5.6.0`, the GH Actions runner's SDK needs `5.9.0+`). Confirmed `dotnet build`/`dotnet test` pass locally in both Debug and Release.
- **Arc** ([Release v21.17.0](https://github.com/Cratis/Arc/releases/tag/v21.17.0)): The Arc React story kit now ships its stylesheet inside the package — import `@cratis/arc.react/stories/styles.css` once in your Storybook preview and `StoryContainer`, `StorySection`, `StoryGrid`, `StoryDivider` and `StoryBadge` render as documented (#2544)
- **Components** ([Release v2.9.0](https://github.com/Cratis/Components/releases/tag/v2.9.0)): `AutoCommandForm` - generates a `CommandForm`'s field list from the command's own `propertyDescriptors` instead of writing one field per property by hand, choosing each field's component by property type through a `FieldTypeProvider` registry. Built-in providers cover `string`, `number`, `boolean` and `Date`.
- **Components** ([Release v2.9.0](https://github.com/Cratis/Components/releases/tag/v2.9.0)): `registerFieldTypeProvider` - registers a provider for any other property type (a Cratis concept, an enum, a custom value object). Most-recently-registered wins, so a provider registered by consuming application code overrides one of the built-in defaults.
- **Components** ([Release v2.9.0](https://github.com/Cratis/Components/releases/tag/v2.9.0)): `exclude` prop on `AutoCommandForm` to leave specific properties out of the generated field list.
- **Components** ([Release v2.9.0](https://github.com/Cratis/Components/releases/tag/v2.9.0)): New [AutoCommandForm](https://github.com/Cratis/Components/blob/main/Documentation/CommandForm/auto-command-form.md) documentation page and a Storybook story.
- **Screenplay** ([Release v2.5.0](https://github.com/Cratis/Screenplay/releases/tag/v2.5.0)): `theme <Name>` - an application-level block (alongside `ui profile`) declaring a named visual theme and the component packages it is compatible with, via one or more `compatible with <Package>` lines.
- **Screenplay** ([Release v2.5.0](https://github.com/Cratis/Screenplay/releases/tag/v2.5.0)): `ui profile` gains an optional `theme <Name>` line selecting a theme.
- **Screenplay** ([Release v2.5.0](https://github.com/Cratis/Screenplay/releases/tag/v2.5.0)): A `ui profile` selecting a theme not declared compatible with one of the profile's own packages is reported at compile time - the same warning class as an ambiguous or unknown name, naming the incompatible package. Selecting a theme nothing in the document declares gets the same unresolved-name treatment.
- **Screenplay** ([Release v2.5.0](https://github.com/Cratis/Screenplay/releases/tag/v2.5.0)): New [Theme](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/theme.md) documentation page, cross-linked from UI profile.
- **Screenplay** ([Release v2.4.1](https://github.com/Cratis/Screenplay/releases/tag/v2.4.1)): Round-trip specs proving a \`contribute to\` block's \`label\` and a \`form\` field's \`label\` both accept an unquoted \`\$strings.<key>\` token, stored and printed the same way every other localizable operand already is.
- **Screenplay** ([Release v2.4.1](https://github.com/Cratis/Screenplay/releases/tag/v2.4.1)): Both operands added to \`Documentation/screenplay/internationalization.md\`'s operand list, and cross-referenced from the Contributions and Forms pages.
- **Arc** ([Release v21.16.0](https://github.com/Cratis/Arc/releases/tag/v21.16.0)): `CommandForm` accepts `populateFromQuery`/`populateFromObservableQuery` (plus shared `populateFromQueryArgs`) to seed its initial values from a single-instance query's result, matched onto the command's properties by name.
- **Arc** ([Release v21.16.0](https://github.com/Cratis/Arc/releases/tag/v21.16.0)): `usePopulateFromQuery`/`usePopulateFromObservableQuery` - the underlying hooks, usable directly outside `CommandForm`.
- **Arc** ([Release v21.16.0](https://github.com/Cratis/Arc/releases/tag/v21.16.0)): Two new field props (available on every field type, since they flow through `asCommandFormField`): `noInitialValue` skips a field entirely; `initialValue` overrides how a field's value is derived from the population source - either a property accessor matched by name, or a function composing a value from the whole source.
- **Arc** ([Release v21.16.0](https://github.com/Cratis/Arc/releases/tag/v21.16.0)): A query that turns out to return multiple instances throws `QueryReturnsMultipleInstances` - a form's initial values only ever come from one instance.
- **Arc** ([Release v21.16.0](https://github.com/Cratis/Arc/releases/tag/v21.16.0)): The resolved data becomes the form's baseline through the command's own change tracking, not just a value overlay - `hasChanges` reads `false` right after population, and validation only reruns when the resolved data itself changes.
- **Arc** ([Release v21.16.0](https://github.com/Cratis/Arc/releases/tag/v21.16.0)): New "Populating a Form from a Query" documentation section, cross-linked from the existing manual fetch-and-seed pattern.
- **Screenplay** ([Release v2.4.0](https://github.com/Cratis/Screenplay/releases/tag/v2.4.0)): `<slot-name> contributes <ContributionPoint>` - marks a `layout` template slot as the target for a named contribution point, opening it up to many contributors instead of the one parent that fills a plain slot.
- **Screenplay** ([Release v2.4.0](https://github.com/Cratis/Screenplay/releases/tag/v2.4.0)): `contribute to <ContributionPoint>` - one contributed item, declared directly on a `module` (alongside `layout`, `form` and `feature`) or on a `feature` at any nesting depth. Carries an optional `navigate to <Screen> [by <param>]` (reusing the exact navigation shape screens already use), `label "<text>"`, and `order <number>`.
- **Screenplay** ([Release v2.4.0](https://github.com/Cratis/Screenplay/releases/tag/v2.4.0)): A contribution resolves to the **nearest enclosing template that declares a matching contribution point**: its own module first (which stops it bubbling further once found), then every other module in the document. Unknown and ambiguous contribution points are warnings, mirroring how every other reference in the document resolves.
- **Screenplay** ([Release v2.4.0](https://github.com/Cratis/Screenplay/releases/tag/v2.4.0)): New [Contributions](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/contributions.md) documentation page, linked from the Screens page's layout templates section.
- **Screenplay** ([Release v2.3.0](https://github.com/Cratis/Screenplay/releases/tag/v2.3.0)): `form <Name> for <Command>` - a named, module-level input surface bound to a command. Declared alongside `layout` inside a `module`, and discovered by its `for` binding wherever that command is invoked, rather than referenced from a screen's directive tree.
- **Screenplay** ([Release v2.3.0](https://github.com/Cratis/Screenplay/releases/tag/v2.3.0)): `populate via query <Query> [by <param>]` and `populate from item` - seed a form's initial values from a query result or an already-bound item in scope.
- **Screenplay** ([Release v2.3.0](https://github.com/Cratis/Screenplay/releases/tag/v2.3.0)): `field <property> [from <source>|compose using <Callback>] [label "<text>"]` - bind a form field to a command property, with an explicit rename, a compositional callback, or a display label.
- **Screenplay** ([Release v2.3.0](https://github.com/Cratis/Screenplay/releases/tag/v2.3.0)): `on submit navigate to <Screen> [by <param>]` - navigate after a successful submit, reusing the same navigation shape screens already use.
- **Screenplay** ([Release v2.3.0](https://github.com/Cratis/Screenplay/releases/tag/v2.3.0)): The command a form binds to, the query it populates from, and the screen it navigates to on submit resolve the same inside-out way every other bare name in the document does, warning when nothing in scope declares them.
- **Screenplay** ([Release v2.3.0](https://github.com/Cratis/Screenplay/releases/tag/v2.3.0)): Every field a form declares now must bind to a property its command actually has - the same rename-breaks-the-build guarantee AutoMap already gives a projection.
- **Screenplay** ([Release v2.3.0](https://github.com/Cratis/Screenplay/releases/tag/v2.3.0)): New [Forms](https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/forms.md) documentation page, and a correction to the Screens page, which named forms as a screen widget even though no such widget exists.
- **Screenplay** ([Release v2.3.0](https://github.com/Cratis/Screenplay/releases/tag/v2.3.0)): `ModuleSyntax.Forms` was added as a trailing optional parameter (not inserted between `Layouts`/`Features`) to keep the change source- and binary-compatible with existing callers, matching the convention `ApplicationSyntax.UiProfiles` already established.
- **Screenplay** ([Release v2.3.0](https://github.com/Cratis/Screenplay/releases/tag/v2.3.0)): The issue's open questions (compose-using callback scope, reusing one form shape across multiple commands) are left for a follow-up - this PR implements the syntax, printing, and the validations the issue calls out explicitly as required, without pre-deciding those two open design questions.
- **Screenplay** ([Release v2.3.0](https://github.com/Cratis/Screenplay/releases/tag/v2.3.0)): CI's `publish-dotnet-packages` job is expected to fail on this PR - it's a pre-existing, repo-wide `CS9057` analyzer/compiler version mismatch (`Microsoft.Net.Compilers.Toolset` pinned to 5.6.0 vs. the runner SDK's 5.9.0+ codestyle analyzers), unrelated to this change and already occurring on `main`. See PR #97 for the same failure and its investigation.
- **Screenplay** ([Release v2.2.0](https://github.com/Cratis/Screenplay/releases/tag/v2.2.0)): A top-level `ui profile <Name>` block declares a named target: the platform(s) it runs on (`target platform`), its default size class (`target size`, using named `compact`/`regular`/`expanded` classes rather than raw pixel breakpoints), and an ordered `packages` list a build resolves widget names against. A document may declare more than one profile; profile names must be unique.
- **Screenplay** ([Release v2.2.0](https://github.com/Cratis/Screenplay/releases/tag/v2.2.0)): Package declaration order within a `packages` block is override priority — a later package shadows an earlier one on a name collision. `core`, the built-in vocabulary, is always the final fallback.
- **Screenplay** ([Release v2.2.0](https://github.com/Cratis/Screenplay/releases/tag/v2.2.0)): A `screen` never declares which profile it targets — profile selection stays a build/Stage concern, so the same screen resolves against different package chains per build.
- **Screenplay** ([Release v2.2.0](https://github.com/Cratis/Screenplay/releases/tag/v2.2.0)): New diagnostic codes `PLAY0201`–`PLAY0207` for malformed/duplicate `ui profile` declarations.
- **Screenplay** ([Release v2.2.0](https://github.com/Cratis/Screenplay/releases/tag/v2.2.0)): A `ui profile` round-trips through compile → print → recompile byte-identically.
- **Screenplay** ([Release v2.2.0](https://github.com/Cratis/Screenplay/releases/tag/v2.2.0)): Resolving a bare widget name used inside a `screen` against a profile's active packages (the "ambiguous name → named-candidates warning" behavior described in the issue) is a build-time concern owned by Stage and the package resolution engine (`Cratis/Scene#3`) — the Screenplay compiler has no visibility into what widgets an external package like PrimeReact defines, so it cannot check that itself. What this PR validates at compile time is the profile declaration's own shape: duplicate profile names and duplicate packages within one profile are both compile errors.
- **Scene** ([Release v0.1.0](https://github.com/Cratis/Scene/releases/tag/v0.1.0)): `Cratis.Scene.Model` (C#) — the platform-agnostic Screen object model: the `SceneElement → VisualElement → FrameworkElement → Control → Panel/ItemsControl/ContentControl/ExternalComponent` element hierarchy, `Layout` (flow and freeform arrangement per slot, width × height size classes), `Form` (the three population/mapping tiers), contribution points and navigation, and `UiProfile`/`Theme`. No React, DOM or CSS vocabulary anywhere in this project.
- **Scene** ([Release v0.1.0](https://github.com/Cratis/Scene/releases/tag/v0.1.0)): `@cratis/scene.model` — the TypeScript mirror, hand-maintained and guarded by a real cross-language parity spec: a shared `scene-model-shape.json` manifest that both a C# spec (reflection over the assembly) and a TypeScript spec (walking each type's own `PropertyNames` const) assert against independently, so a desync on either side fails its own build.
- **Scene** ([Release v0.1.0](https://github.com/Cratis/Scene/releases/tag/v0.1.0)): `@cratis/scene.engine` — the `Renderer<TOutput>` contract a renderer implements (one method per concrete element kind), and a `renderElement()` tree walk. Binding resolution is injected via a `BindingResolver` callback rather than solved here — the profile/contribution/layout/theme resolution engines are separate, later issues.
- **Scene** ([Release v0.1.0](https://github.com/Cratis/Scene/releases/tag/v0.1.0)): `@cratis/scene.react` — implements the renderer contract against real React/DOM, with a small `core` component set (`core:text`/`button`/`card`) and Storybook wired at the package level.
- **Scene** ([Release v0.1.0](https://github.com/Cratis/Scene/releases/tag/v0.1.0)): Repository scaffold: `.ai/` instruction corpus and its Copilot/Claude/Codex adapters, build/lint/format config, and CI workflows (dotnet + JS build, NuGet + npm trusted publishing, semver label gate) — copied from `Cratis/Arc`, the closest real dual-stack framework repo.
- **Scene** ([Release v0.1.0](https://github.com/Cratis/Scene/releases/tag/v0.1.0)): The design-time editor building on this object model belongs in Studio (`StudioIssues#156`), not here.
- **Scene** ([Release v0.1.0](https://github.com/Cratis/Scene/releases/tag/v0.1.0)): Verified end to end: `dotnet build`/`dotnet test` clean (Debug + Release, 0 warnings), `yarn ci` clean across all three JS packages, `yarn build-storybook` succeeds, and the parity spec genuinely fails on both sides when deliberately desynced (verified, then reverted).
- **Chronicle** ([Release v16.33.0](https://github.com/Cratis/Chronicle/releases/tag/v16.33.0)): Event Type detail view: new **Observers** tab listing every observer consuming the event type, with namespace, observer id, type, and running state (#3147)
- **Chronicle** ([Release v16.33.0](https://github.com/Cratis/Chronicle/releases/tag/v16.33.0)): Observer detail panel: new **Event Types** tab listing every event type the observer consumes, alongside the existing Summary tab (#3147)
- **Chronicle** ([Release v16.32.0](https://github.com/Cratis/Chronicle/releases/tag/v16.32.0)): Stored projection read models transparently preserve PII ownership per property, allowing multiple subjects in one document across MongoDB and SQL. (#3644)
- **Chronicle** ([Release v16.31.0](https://github.com/Cratis/Chronicle/releases/tag/v16.31.0)): Persistent event sequence queries in the Workbench: build a query, keep several open as tabs, and organize them in a resizable tree of folders under "Only me" and "Everyone". Which tabs were open, and how wide the tree was left, are restored on the next visit (#1911)
- **Chronicle** ([Release v16.31.0](https://github.com/Cratis/Chronicle/releases/tag/v16.31.0)): Filtering on event type, event source, event source type, event stream type, correlation, tags and time range, using the same filter panel the pivot viewer uses. The time range is dragged over a histogram the backend counts across the whole sequence, so it shows the real distribution rather than the loaded page (#1911)
- **Chronicle** ([Release v16.31.0](https://github.com/Cratis/Chronicle/releases/tag/v16.31.0)): Sorting the results by clicking a column, and an event sequence picker for targeting any sequence in the store — both saved with the query and applied in storage (#1911)
- **Chronicle** ([Release v16.31.0](https://github.com/Cratis/Chronicle/releases/tag/v16.31.0)): Export of the whole filtered result, produced by the server rather than from the page currently on screen (#1911)
- **Chronicle** ([Release v16.31.0](https://github.com/Cratis/Chronicle/releases/tag/v16.31.0)): REST endpoints for saving, listing and deleting sequence queries and query folders, and for reading a sequence's events per time bucket
- **Chronicle** ([Release v16.31.0](https://github.com/Cratis/Chronicle/releases/tag/v16.31.0)): A paged event sequence query that applies its filter and ordering in storage, so a query over a large sequence only transfers the page being shown
- **Chronicle** ([Release v16.31.0](https://github.com/Cratis/Chronicle/releases/tag/v16.31.0)): A Development Tools page for resetting Chronicle, offered only by servers built with development tools compiled in
- **cli** ([Release v2.7.0](https://github.com/Cratis/cli/releases/tag/v2.7.0)): `cratis render` renders a Screenplay document, or every document beneath a folder, into a Cratis application, reporting everything the document says that the rendered application does not carry. `--target` chooses the directory, defaulting to `./out` (#62)
- **Stage** ([Release v2.4.0](https://github.com/Cratis/Stage/releases/tag/v2.4.0)): `Cratis.Stage.Rendering.Cratis.Scaffolding` — scaffolds the Cratis project a rendered application is placed into, from the Cratis templates. Take it alongside the renderer and pass `TemplateEngineProjectScaffolder` to `CratisRenderer` to keep today's behavior. (#34)
- **Stage** ([Release v2.4.0](https://github.com/Cratis/Stage/releases/tag/v2.4.0)): A Screenplay `specification` exercising its slice's command renders as a Cratis spec — a `CommandScenario<T>` in the `when_` folder layout, wrapped in `#if DEBUG`. Appended events are asserted against the event source the command's identifier names, narrowed to the values the specification states; a rejection asserts both that the command failed and that it failed as validation. (#14)
- **AuthProxy** ([Release v2.20.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.20.0)): Add opt-in local session termination for Required identity-verification denials, including Aspire configuration and real cookie-pipeline coverage. (#103)
- **Chronicle** ([Release v16.30.0](https://github.com/Cratis/Chronicle/releases/tag/v16.30.0)): `[SubjectFrom(nameof(property))]` declares which property holds the subject a read model value's personal data belongs to (#3601)
- **Chronicle** ([Release v16.29.0](https://github.com/Cratis/Chronicle/releases/tag/v16.29.0)): `CHR0046` warns when a passive read model's projection redirects the root document key, which makes the read replay a stream the events were never appended to (#3609)
- **Chronicle** ([Release v16.29.0](https://github.com/Cratis/Chronicle/releases/tag/v16.29.0)): `CHR0047` warns on a `SetValue` declaring null and on `ClearWith` applied to a property or parameter, neither of which the projection builder reads (#3641)
- **Components** ([Release v2.8.1](https://github.com/Cratis/Components/releases/tag/v2.8.1)): A CI check that loads every published export subpath in Node, so a published package that cannot be imported is caught before release rather than by a consumer (#118)
- **Studio** ([Release v0.65.0](https://github.com/Cratis/Studio/releases/tag/v0.65.0)): The Admin organization list shows **how many seats an organization has and how many are in use**, so an administrator can see at a glance whether a tenant is near its limit without opening it. (Cratis/StudioIssues#145)
- **Studio** ([Release v0.65.0](https://github.com/Cratis/Studio/releases/tag/v0.65.0)): It also shows **the email address of whoever signed the organization up**. (Cratis/StudioIssues#145)
- **Studio** ([Release v0.64.0](https://github.com/Cratis/Studio/releases/tag/v0.64.0)): Admin shows an organization's **billing history** — what it was charged, what a mid-term seat change cost, and whether its subscription is paying, past due or cancelled. Core publishes each of these as it happens. (Cratis/StudioIssues#140)
- **Studio** ([Release v0.64.0](https://github.com/Cratis/Studio/releases/tag/v0.64.0)): Admin shows a **scheduled seat reduction** on the purchase it belongs to, so a downgrade taking effect at the end of a period is visible before it happens. (Cratis/StudioIssues#140)
- **Arc** ([Release v21.14.0](https://github.com/Cratis/Arc/releases/tag/v21.14.0)): `useIsCommandExecuting` for reading whether a `CommandForm`'s command is currently executing (#2497)
- **Arc** ([Release v21.14.0](https://github.com/Cratis/Arc/releases/tag/v21.14.0)): `formRef` on `CommandForm`, exposing `execute()` plus `isExecuting`, `isValid` and `isAuthorized` to a parent rendering its own submit control (#2497)
- **Arc** ([Release v21.14.0](https://github.com/Cratis/Arc/releases/tag/v21.14.0)): `onStateChange` on `CommandForm`, notifying a parent when execution, validity or authorization changes (#2497)
- **Arc** ([Release v21.14.0](https://github.com/Cratis/Arc/releases/tag/v21.14.0)): `isExecuting` on the command form context (#2497)
- **Chronicle** ([Release v16.28.0](https://github.com/Cratis/Chronicle/releases/tag/v16.28.0)): `health.exclusive`, which restricts the dedicated health port to the health endpoint so the Workbench, REST API and OAuth endpoints are no longer reachable on it. Off by default (#3604)
- **Arc** ([Release v21.13.0](https://github.com/Cratis/Arc/releases/tag/v21.13.0)): `UseFixedTenancy` and `FixedTenantIdResolver`, giving single-tenant production deployments a registration API that is not named for the development environment (#2478)
- **Arc** ([Release v21.13.0](https://github.com/Cratis/Arc/releases/tag/v21.13.0)): `Tenancy:FixedTenantId` configuration, which `Tenancy:DevelopmentTenantId` now forwards to (#2478)
- **AuthProxy** ([Release v2.19.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.19.0)): `WithInviteEmailBinding` on the Aspire builder, binding an invitation to the address it was issued to so only the invited recipient can redeem it (#85)
- **Arc** ([Release v21.12.0](https://github.com/Cratis/Arc/releases/tag/v21.12.0)): `ICommandResponseValueHandler<TValue>`, an optional typed declaration that marks a command response value type as consumed on the server (#2537)
- **Studio** ([Release v0.63.0](https://github.com/Cratis/Studio/releases/tag/v0.63.0)): Importing a Screenplay document now carries a read model's properties onto the canvas. Screenplay never states a read model's property types, so the schema is synthesized from what the projection maps and what the queries filter on, with each type inferred from a same-named event property. Previously a State View slice arrived with its name alone and the canvas showed a model with no properties for a document describing several.
- **Studio** ([Release v0.62.0](https://github.com/Cratis/Studio/releases/tag/v0.62.0)): **A chat on the event model itself, organized into topics.** The event model board's top-right toolbar opens a list of topics; starting one opens its own thread, and each topic is a conversation in its own right rather than one long thread for the whole model. Topics are listed most-recently-active first. (Cratis/StudioIssues#143)
- **Studio** ([Release v0.62.0](https://github.com/Cratis/Studio/releases/tag/v0.62.0)): **A mentioned agent answers inside the topic.** It is given the model's shape — its modules and their features — so a question about the model as a whole is answered with the model in view, and its reply lands in the topic it was asked in. (Cratis/StudioIssues#143)
- **Arc** ([Release v21.11.0](https://github.com/Cratis/Arc/releases/tag/v21.11.0)): A `RequireRole` component that renders its children only for an identity that is authenticated and allowed, with slots for the loading and forbidden outcomes so an application supplies its own navigation (#2496)
- **Arc** ([Release v21.11.0](https://github.com/Cratis/Arc/releases/tag/v21.11.0)): `isLoading` on the React identity context, separating an identity that has not been fetched yet from one that came back anonymous (#2496)
- **Arc** ([Release v21.10.0](https://github.com/Cratis/Arc/releases/tag/v21.10.0)): The name of the violated constraint on a validation result, so a client can tell one constraint rejection from another without matching on the message text (#2487)
- **Arc** ([Release v21.10.0](https://github.com/Cratis/Arc/releases/tag/v21.10.0)): `ShouldHaveConstraintViolationFor` for asserting a command result names a given constraint, matching the assertion already available against a raw append (#2487)
- **Studio** ([Release v0.61.0](https://github.com/Cratis/Studio/releases/tag/v0.61.0)): A shared **pill button** for the small round icon buttons used across the application. It owns its own centring and requires an accessible label when it carries no text, so an unlabelled icon button is a compile error rather than something found later. (Cratis/StudioIssues#138)
- **Studio** ([Release v0.60.0](https://github.com/Cratis/Studio/releases/tag/v0.60.0)): Properties on commands, events and read models can now be typed as a **concept**. A **Concepts** submenu sits at the bottom of the type menu, after Time, listing the concepts of the surrounding domain with the primitive each behaves as. It reaches the event, command, read-model and projection editors alike, and picking a concept names the property after it. (Cratis/StudioIssues#112)
- **Studio** ([Release v0.60.0](https://github.com/Cratis/Studio/releases/tag/v0.60.0)): An **agent skill now carries the content that describes it**, written in the markdown editor and captured on both the add and the edit path. Skills created before this change keep working and simply have no content yet. (Cratis/StudioIssues#135)
- **Studio** ([Release v0.60.0](https://github.com/Cratis/Studio/releases/tag/v0.60.0)): **Reporting an issue brings its context.** The Report issue button now prefills the organization, project, event model or brainstorming board, the selected item in the project drawer, and the Studio version — each omitted when it does not apply. (Cratis/StudioIssues#132)
- **Studio** ([Release v0.60.0](https://github.com/Cratis/Studio/releases/tag/v0.60.0)): A collaborator's cursor now shows their **full name** beside the avatar, falling back to the username when no name is set. (Cratis/StudioIssues#110)
- **Studio** ([Release v0.59.5](https://github.com/Cratis/Studio/releases/tag/v0.59.5)): A **PR Gate** check that aggregates every other check on a commit and fails if any of them failed. The build workflows are path-filtered, so "everything green" cannot be a fixed list of required checks — it can only be answered by asking what actually ran on this commit.
- **Studio** ([Release v0.59.5](https://github.com/Cratis/Studio/releases/tag/v0.59.5)): A **Runner Image** workflow that builds and publishes the ARC runner image, tagging both `latest` and the commit SHA so a bad rollout can be pinned back. Pull requests build it without pushing, so a broken Dockerfile is caught before it lands.
- **Studio** ([Release v0.59.1](https://github.com/Cratis/Studio/releases/tag/v0.59.1)): The import reports a projection that names no event, such as one using `all` or `every`, so it is visible before committing that the read model arrives with nothing projected into it.
- **Arc** ([Release v21.9.0](https://github.com/Cratis/Arc/releases/tag/v21.9.0)): Chronicle 16.21.0: Allow reactors to return ordered cross-stream events with exact concurrency scopes in one atomic append. (cratis/chronicle#3651)
- **Arc** ([Release v21.9.0](https://github.com/Cratis/Arc/releases/tag/v21.9.0)): Chronicle 16.22.0: `Compliance:Encryption:MigrateFromDefaultStorage` supports read-through migration from default compliance key storage to Vault or Azure Key Vault. (cratis/chronicle#3639)
- **Arc** ([Release v21.9.0](https://github.com/Cratis/Arc/releases/tag/v21.9.0)): Chronicle 16.23.0: A diagnostic reports `[EventSourceType]` and `[EventStreamType]` declared on an event type, where they have no effect (cratis/chronicle#3642)
- **Arc** ([Release v21.9.0](https://github.com/Cratis/Arc/releases/tag/v21.9.0)): Chronicle 16.25.0: `WithTlsCertificate` and `WithEncryptionCertificate` on the Aspire builder, which mount a certificate into the Chronicle container read-only and point the configuration at it (cratis/chronicle#3607)
- **Arc** ([Release v21.9.0](https://github.com/Cratis/Arc/releases/tag/v21.9.0)): Chronicle 16.26.0: Add `IUnitOfWork.AddEvents` for ordered cross-source events and independently labelled exact concurrency scopes in the existing transaction (cratis/chronicle#3683)
- **Chronicle** ([Release v16.26.0](https://github.com/Cratis/Chronicle/releases/tag/v16.26.0)): Add `IUnitOfWork.AddEvents` for ordered cross-source events and independently labelled exact concurrency scopes in the existing transaction (#3683)
- **Arc** ([Release v21.8.0](https://github.com/Cratis/Arc/releases/tag/v21.8.0)): A query returning `ISubject<T>` is now marked `observable` in the generated document, so a live read that keeps pushing as the read model changes is no longer written as though it answers once
- **Stage** ([Release v2.1.0](https://github.com/Cratis/Stage/releases/tag/v2.1.0)): `CommandDefinition` now carries the command's `authorize` requirement, its `require` rules and its `reads` declarations (#23).
- **Stage** ([Release v2.1.0](https://github.com/Cratis/Stage/releases/tag/v2.1.0)): Command authorization is carried as a requirement tree — `PolicyReference` and `LogicalRequirement` — so `A or B and C` stays distinguishable from `(A or B) and C`. `AuthorizationRequirement.Policies()` gives the flat set of names to a consumer that only needs those (#23).
- **Stage** ([Release v2.1.0](https://github.com/Cratis/Stage/releases/tag/v2.1.0)): `ProducedEvent` now carries the event source a `produces … for` clause names (#23).
- **Stage** ([Release v2.1.0](https://github.com/Cratis/Stage/releases/tag/v2.1.0)): `EventDefinition` now carries the tags declared on the event (#23).
- **Stage** ([Release v2.1.0](https://github.com/Cratis/Stage/releases/tag/v2.1.0)): `Specification` now carries `given readmodel` and `then readmodel` steps, which the existing `SpecificationRunStepKind.ThenReadModel` had nothing to feed it (#23).
- **Stage** ([Release v2.1.0](https://github.com/Cratis/Stage/releases/tag/v2.1.0)): A concept's `@pii` and `@sensitive` attributes, and the reason each was declared for, now travel on the schema of every property typed as that concept. They were dropped entirely on import, leaving personal data indistinguishable from any other value (#23).
- **Studio** ([Release v0.59.0](https://github.com/Cratis/Studio/releases/tag/v0.59.0)): Project settings has a new "Dangerous" tab for renaming or permanently deleting the project, guarded by a type-the-name-to-confirm dialog and validated on the backend (Cratis/StudioIssues#118)
- **Studio** ([Release v0.59.0](https://github.com/Cratis/Studio/releases/tag/v0.59.0)): Event models can be deleted from the project hierarchy — a trashcan appears on hover, guarded by the same type-the-name-to-confirm dialog (Cratis/StudioIssues#119)
- **Studio** ([Release v0.59.0](https://github.com/Cratis/Studio/releases/tag/v0.59.0)): Brainstorming boards can be deleted from the project hierarchy the same way (Cratis/StudioIssues#120)
- **Studio** ([Release v0.59.0](https://github.com/Cratis/Studio/releases/tag/v0.59.0)): Explanation dialogs have a regenerate button next to Listen, for getting a fresh explanation instead of the cached one (Cratis/StudioIssues#125)
- **Studio** ([Release v0.59.0](https://github.com/Cratis/Studio/releases/tag/v0.59.0)): Organization member invites can be refreshed, not just revoked, from Settings > Users — mirroring what Admin already offers for invitations to create an organization (Cratis/StudioIssues#128)
- **Studio** ([Release v0.59.0](https://github.com/Cratis/Studio/releases/tag/v0.59.0)): A Discord link was added to the top bar, next to the existing GitHub issue link (Cratis/StudioIssues#127)
- **Studio** ([Release v0.59.0](https://github.com/Cratis/Studio/releases/tag/v0.59.0)): The generation dialog now shows what the model actually returned, underneath the readable progress. The two halves scroll independently, so following one never scrolls the other away, and the output is captured before it is parsed — a payload that fails to parse is still the thing you can look at (Cratis/StudioIssues#105)
- **Chronicle** ([Release v16.25.0](https://github.com/Cratis/Chronicle/releases/tag/v16.25.0)): `WithTlsCertificate` and `WithEncryptionCertificate` on the Aspire builder, which mount a certificate into the Chronicle container read-only and point the configuration at it (#3607)
- **Arc** ([Release v21.6.0](https://github.com/Cratis/Arc/releases/tag/v21.6.0)): `TenancyOptions.BaseDomain`, configured through `UseSubdomainTenancy(baseDomain, fallbackHeaderName)` (#2471)
- **Arc** ([Release v21.6.0](https://github.com/Cratis/Arc/releases/tag/v21.6.0)): `TenancyOptionsValidator`, which validates tenancy configuration while the host starts (#2471)
- **Chronicle.Kotlin** ([Release v2.10.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v2.10.0)): `io.cratis:chronicle-spring-boot-starter` — a connected client, artifacts registered before the first request is served, and an `IEventStore` ready to inject, configured under `cratis.chronicle`.
- **Chronicle.Kotlin** ([Release v2.10.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v2.10.0)): Spring Boot multi-tenancy: the injected `IEventStore` routes to the namespace the current work belongs to, resolved from a fixed value, an HTTP header, the request subdomain, or a claim on the authenticated principal.
- **Chronicle.Kotlin** ([Release v2.10.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v2.10.0)): Spring Boot gives each request an identity taken from the authenticated principal, a causation trail describing the call, and a unit of work that commits on success and rolls back on failure. Each can be switched off on its own.
- **Chronicle.Kotlin** ([Release v2.10.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v2.10.0)): `Chronicle` — the Java-facing Spring bean exposing the everyday operations without coroutines, for Java callers and blocking MVC handlers.
- **Chronicle.Kotlin** ([Release v2.10.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v2.10.0)): `IEventStoreNamespaceResolver` for hosts that decide the namespace themselves.
- **Chronicle.Kotlin** ([Release v2.10.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v2.10.0)): Spring Boot samples for Kotlin and Java, each with a walkthrough.
- **Chronicle.Kotlin** ([Release v2.10.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v2.10.0)): A guide for Spring Boot support.
- **AuthProxy** ([Release v2.18.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.18.0)): The sign-in notification can carry a signed envelope binding its origin, audience, method and target, a digest of the exact bytes posted, its issue time and a single-use identifier, so an application can verify that a sign-in it is told about really came from the auth proxy (#82)
- **AuthProxy** ([Release v2.18.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.18.0)): `SignIn:Attestation` configuration, with rotating signing keys selected by key identifier, enabling the signed envelope (#82)
- **Components** ([Release v2.8.0](https://github.com/Cratis/Components/releases/tag/v2.8.0)): `StepperCommandDialog` can show an opt-in Cancel action in its footer, with a configurable label (#121)
- **Chronicle** ([Release v16.23.0](https://github.com/Cratis/Chronicle/releases/tag/v16.23.0)): A diagnostic reports `[EventSourceType]` and `[EventStreamType]` declared on an event type, where they have no effect (#3642)
- **Arc** ([Release v21.4.0](https://github.com/Cratis/Arc/releases/tag/v21.4.0)): The identity provider the ingress authenticated a caller with is carried on the authenticated principal as a reserved claim, available to the identity details an application provides (#2501)
- **Studio** ([Release v0.58.9](https://github.com/Cratis/Studio/releases/tag/v0.58.9)): The five agents an organization is seeded with — Modeler, Coder, Writer, Analyst and Companion — now arrive with an avatar instead of initials, each given one of the built-in avatars that suits its specialization.
- **Studio** ([Release v0.58.9](https://github.com/Cratis/Studio/releases/tag/v0.58.9)): Organizations that were seeded before agents had avatars get the same faces on their existing default agents, without any agent being created a second time.
- **Studio** ([Release v0.58.7](https://github.com/Cratis/Studio/releases/tag/v0.58.7)): A failed agent turn offers the error itself in a dialog, and a button that opens a prefilled bug report on Cratis/StudioIssues so the failure can be reported without transcribing anything by hand (#106)
- **Studio** ([Release v0.58.6](https://github.com/Cratis/Studio/releases/tag/v0.58.6)): The generate with AI prompt box now has a button next to the spinner that slides up a detail section inside the same box, showing what the model is actually doing as the generation progresses. (#105)
- **Studio** ([Release v0.58.6](https://github.com/Cratis/Studio/releases/tag/v0.58.6)): A failed generation opens that detail section with the error in the model output, and offers a button that opens a prefilled bug report on StudioIssues carrying the activity and the error. (#105)
- **Studio** ([Release v0.58.0](https://github.com/Cratis/Studio/releases/tag/v0.58.0)): Every new organization starts with an agent per specialization — Modeler, Coder, Writer, Analyst and Companion — created automatically when the organization is born, each waiting for a provider and model to be chosen. Organizations that already have agents are never touched.
- **Studio** ([Release v0.58.0](https://github.com/Cratis/Studio/releases/tag/v0.58.0)): First-time users get a welcome on the home page when no AI provider is configured yet: a nudge that setting up a provider and its agents is the first thing worth doing, with a button opening settings straight on the AI page. It disappears the moment a provider exists.
- **Studio** ([Release v0.58.0](https://github.com/Cratis/Studio/releases/tag/v0.58.0)): Every provider dialog links to how to get the API key for that provider — the Anthropic console, the OpenAI platform, Azure's resource guide — and OpenAI-compatible endpoints explain that the operator provides the key.
- **Studio** ([Release v0.57.0](https://github.com/Cratis/Studio/releases/tag/v0.57.0)): The Admin organizations page shows when each organization last had activity, and organizations can be deleted: a double confirmation that requires typing the organization's name, refused while there has been activity in the last 30 days. Teardown takes a final backup first and refuses to proceed without one — databases and the organization's entire Vault subtree are only removed behind a successful backup. (Cratis/StudioIssues#99)
- **Studio** ([Release v0.57.0](https://github.com/Cratis/Studio/releases/tag/v0.57.0)): JSON import and export now use the official community event-modeling schema (dilgerma/event-modeling-spec) instead of the bespoke format, with a round-trip guarantee; old-format uploads get a clear error, and previously recorded imports keep replaying. (Cratis/StudioIssues#102)
- **Studio** ([Release v0.57.0](https://github.com/Cratis/Studio/releases/tag/v0.57.0)): Every guided-tour chapter now has real imagery in the self-paced reading mode — thirteen new captures from the actual components, including animated walkthroughs of adding a schema property and linking modules.
- **AuthProxy** ([Release v2.17.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.17.0)): `ResponseMode` setting per OIDC provider (`Query` default, `FormPost` for providers that mandate it, such as Apple) — choosing `FormPost` switches that provider's handshake cookies to `SameSite=None; Secure`
- **AuthProxy** ([Release v2.17.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.17.0)): Embeddable credential-link flow: `/.cratis/link` serves a provider-selection page for the product to frame, `/.cratis/link/complete` ends a successful link, and the pages report the outcome over a `BroadcastChannel` and an origin-checked `postMessage` to the embedding page
- **AuthProxy** ([Release v2.17.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.17.0)): `Link:EmbedAncestors` setting naming the origins allowed to frame the link pages (`self` for the proxy's own origin); when empty — the default — the link pages send `frame-ancestors 'none'` and `X-Frame-Options: DENY`
- **AuthProxy** ([Release v2.17.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.17.0)): `link-select-provider.html` and `link-complete.html` well-known pages, deployment-replaceable like every other page
- **AuthProxy** ([Release v2.16.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.16.0)): `Cratis:AuthProxy:Logout:AdditionalCookies` — a list of additional cookies the session-termination sweep deletes on top of the cookies AuthProxy issues itself. Each entry names a cookie exactly (`Name`) and may carry the `Domain` it was scoped to (e.g. `.cratis.studio`); when set, the deletion is issued for that domain as well as the request host, which is what it takes to kill a cookie another proxy scoped to a parent domain. Deletions go out with `Path=/` and the `Secure` attribute mirroring the request scheme, and happen on the logout endpoint (both legs of a full-chain logout) and on the sign-in sweep when a provider callback completes — so a fresh sign-in also heals a browser still carrying the stale cookie.
- **AuthProxy** ([Release v2.15.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.15.0)): An opt-in capability-gated admission mode. A closed deployment admits a caller only after a verifier it names accepts a capability the caller presents once; every refusal answers one byte-identical 404, so a wrong capability, an unknown route and an unreachable verifier are indistinguishable. The capability is never stored and never becomes an identity - what is stored is a sealed entry transaction proving a verifier said yes. `Public` remains the default. An entry outlives a provider handshake by default, so a slow sign-in does not come back to a refusal (#81)
- **AuthProxy** ([Release v2.15.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.15.0)): An opt-in private management health listener, off until a deployment names a port and bound to loopback unless told otherwise. Liveness consults nothing, so a storage outage cannot restart the fleet; readiness round-trips the data-protection key ring and nothing else, so a deployment whose backends are all down still becomes ready. The two management paths are refused on the public socket, and everything else is refused on the management one (#83)
- **AuthProxy** ([Release v2.15.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.15.0)): Aspire builders for capability-gated admission and the management listener, as new methods so an app host compiled against an earlier package keeps working (#81, #83)
- **AuthProxy** ([Release v2.15.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.15.0)): An opt-in per-service identity verification mode. In `Required`, an identity service that cannot give an unambiguous positive denies the request instead of authorizing it, clears the sealed authorization record, the identity cookie and the cached result, and logs a bounded reason code. `BestEffort` remains the default and behaves exactly as before, denying only on `403` (#77)
- **AuthProxy** ([Release v2.15.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.15.0)): A configurable verification timeout, applied where a missing answer is a denial. An unstated timeout stays unbounded in `BestEffort` (#77)
- **AuthProxy** ([Release v2.15.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.15.0)): A configurable positive-result cache duration, including a value meaning never cache (#77)
- **AuthProxy** ([Release v2.15.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.15.0)): An explicit trusted-proxy boundary: forwarding headers are believed only from configured addresses or networks, with a configurable forward limit and startup validation that names an unusable entry (#79)
- **AuthProxy** ([Release v2.15.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.15.0)): Aspire builders for identity verification, trusted proxies and the forward limit, as new methods so an app host compiled against an earlier package keeps working (#77, #79)
- **AuthProxy** ([Release v2.15.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.15.0)): A `link-failed` page a deployment can customize (#80)
- **Arc** ([Release v21.3.0](https://github.com/Cratis/Arc/releases/tag/v21.3.0)): An opt-in guard consulted before each observable-query emission, so an application can withhold an emission or end a subscription when authorization changes mid-stream. Authorization was previously evaluated once, when the subscription was established, and never again — nothing ended a stream on token expiry, session end or role revocation. With no guard registered nothing is allocated and no dispatch happens, so existing applications are unaffected (#2476)
- **Studio** ([Release v0.56.0](https://github.com/Cratis/Studio/releases/tag/v0.56.0)): Slices have a new **Analysis** status between Draft and Ready for implementation. (Cratis/StudioIssues#87)
- **Studio** ([Release v0.56.0](https://github.com/Cratis/Studio/releases/tag/v0.56.0)): Projects can run autonomously: an AI settings toggle — enabled only when agents are configured for both Code Generation and Analysis — makes a sound, comment-free analysis automatically assign the Code Generation agent and move the slice to Ready for implementation, entirely on the backend with the board reflecting it live. (Cratis/StudioIssues#86)
- **Studio** ([Release v0.56.0](https://github.com/Cratis/Studio/releases/tag/v0.56.0)): Agents can carry named **skills**, shown as pills under the description with add, edit and remove dialogs. (Cratis/StudioIssues#89)
- **Studio** ([Release v0.56.0](https://github.com/Cratis/Studio/releases/tag/v0.56.0)): The guided tour has a **self-paced reading mode**: a toggle beside the subtitle button stops narration and the clock, hides timings, and opens a per-chapter markdown walkthrough beside the chapter list — all thirteen event-modeling chapters are written. (Cratis/StudioIssues#81)
- **Studio** ([Release v0.56.0](https://github.com/Cratis/Studio/releases/tag/v0.56.0)): The "Start here" arrow is one reusable component and now greets first-time users on the Brainstorming board and the project drawer as well, each suppressed once the user has done anything there. (Cratis/StudioIssues#82)
- **Studio** ([Release v0.56.0](https://github.com/Cratis/Studio/releases/tag/v0.56.0)): Organizations on a trial now show a trial badge with plan and expiry on the Admin seats view instead of reading as having no seats.
- **Studio** ([Release v0.55.3](https://github.com/Cratis/Studio/releases/tag/v0.55.3)): An import of a Screenplay document now reports when a slice declares more than one projection, so the read models the canvas will not hold show up in the preview before the import is accepted. (Cratis/StudioIssues#52)
- **AuthProxy** ([Release v2.14.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.14.0)): Failed remote sign-ins (correlation failure, invalid OAuth state, provider errors, cancelled consent) now redirect to the provider-selection page with a `reason` query parameter (`remote-failure` / `access-denied`) instead of surfacing as a blank 500 error page; the bundled selection pages show a matching message
- **AuthProxy** ([Release v2.14.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.14.0)): A guard in front of the reverse proxy that terminates an authenticated session that cannot be turned into a forwardable identity — the browser is sent to provider selection with `reason=invalid-session`, API callers get `401` — instead of proxying the request without identity headers
- **AuthProxy** ([Release v2.14.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.14.0)): A `Failed Sign-ins` documentation page covering the `reason` contract, handshake-cookie hygiene, and the forwardable-identity guard
- **cli** ([Release v2.5.0](https://github.com/Cratis/cli/releases/tag/v2.5.0)): `--modules-from-namespace-roots` on `screenplay generate`, taking each outermost namespace segment as a module rather than nesting everything under one
- **cli** ([Release v2.5.0](https://github.com/Cratis/cli/releases/tag/v2.5.0)): `.slnf` solution filters are accepted as a generation target
- **Chronicle** ([Release v16.22.0](https://github.com/Cratis/Chronicle/releases/tag/v16.22.0)): `Compliance:Encryption:MigrateFromDefaultStorage` supports read-through migration from default compliance key storage to Vault or Azure Key Vault. (#3639)
- **Chronicle** ([Release v16.21.0](https://github.com/Cratis/Chronicle/releases/tag/v16.21.0)): Allow reactors to return ordered cross-stream events with exact concurrency scopes in one atomic append. (#3651)
- **Stage** ([Release v1.4.0](https://github.com/Cratis/Stage/releases/tag/v1.4.0)): Render a single slice, feature or module, with optional module and feature names for placement
- **Stage** ([Release v1.4.0](https://github.com/Cratis/Stage/releases/tag/v1.4.0)): A rendered file reports what could not be rendered from its source, instead of leaving it unsaid
- **Stage** ([Release v1.3.0](https://github.com/Cratis/Stage/releases/tag/v1.3.0)): A command's `identifier` property resolves the event source id at runtime; a command without one keeps getting a fresh `Uuid`
- **Components** ([Release v2.7.0](https://github.com/Cratis/Components/releases/tag/v2.7.0)): `initialFocus` on `Dialog`, forwarded by `CommandDialog`, choosing where focus lands when the dialog opens: `DialogInitialFocus.Confirm` (the default, unchanged), `Cancel`, or `Content`. `Cancel` degrades to `Content` where no dismissing button exists.

## Changed
- **Components** ([Release v3.4.0](https://github.com/Cratis/Components/releases/tag/v3.4.0)): `Dropdown` reads `label` / `value` off option objects when no `optionLabel` / `optionValue` is given, as PrimeReact 10's Dropdown did, and renders the trigger chevron and clear glyph again.
- **Components** ([Release v3.4.0](https://github.com/Cratis/Components/releases/tag/v3.4.0)): Table column headers render through PrimeReact's title part, so a theme's column-title weight applies, and the empty-message row is padded and bordered like a data row.
- **Components** ([Release v3.4.0](https://github.com/Cratis/Components/releases/tag/v3.4.0)): `--cratis-surface-0` and `--cratis-surface-100` resolve from PrimeReact 11's form-field and hover surface tokens rather than `--p-surface-0/100`, which are white in both color schemes.
- **Studio** ([Release v0.69.0](https://github.com/Cratis/Studio/releases/tag/v0.69.0)): Chat reactions are replaced, not added: picking a different emoji on a message you already reacted to swaps your reaction, and every person has exactly one reaction per message — enforced on the server, and no longer subject to the projection defect that let a reaction be added several times under the same identifier. (Cratis/StudioIssues#197)
- **Studio** ([Release v0.69.0](https://github.com/Cratis/Studio/releases/tag/v0.69.0)): The "Generate with AI" prompt box follows the intended design: the current activity and the engine's progress at the top, the model's raw output in a console underneath, and the spinner and expand/collapse toggle pinned to the bottom of the box; on failure the box turns red, the console carries the error, and the report button sits in the same bottom bar. (Cratis/StudioIssues#105)
- **Studio** ([Release v0.69.0](https://github.com/Cratis/Studio/releases/tag/v0.69.0)): The "Release notes" control in the About dialog is a plain bold text link instead of a button. (Cratis/StudioIssues#193)
- **Studio** ([Release v0.69.0](https://github.com/Cratis/Studio/releases/tag/v0.69.0)): The actor row header's persona button on the event-model canvas uses an identity-card icon (`pi-id-card`) instead of a menu icon, and is labeled "Choose persona". (Cratis/StudioIssues#191)
- **Studio** ([Release v0.69.0](https://github.com/Cratis/Studio/releases/tag/v0.69.0)): The chosen dictation microphone is remembered by name as well as id, so it survives browsers that rotate device identifiers between sessions; a remembered microphone that has disappeared falls back to the system default instead of failing to record. (Cratis/StudioIssues#155)
- **Studio** ([Release v0.69.0](https://github.com/Cratis/Studio/releases/tag/v0.69.0)): The local `docker-compose.yml` Chronicle image is pinned to 16.32.0 to match the client packages.
- **Chronicle** ([Release v16.34.1](https://github.com/Cratis/Chronicle/releases/tag/v16.34.1)): The Workbench now declares `primereact`, `@primereact/core`, `@primereact/headless`, `@primereact/types` and `primeicons` itself, since `@cratis/components` 3.0.0 makes PrimeReact a peer dependency.
- **Chronicle** ([Release v16.34.1](https://github.com/Cratis/Chronicle/releases/tag/v16.34.1)): Component styling comes from `@cratis/components/tokens`, `/styles` and `/theme`, imported once at the app and Storybook entry points. PrimeReact 11 ships no stylesheet, so `primereact/resources/themes/lara-dark-blue` no longer exists; the Cratis baseline theme replaces it and keeps the Workbench's dark look.
- **Chronicle** ([Release v16.34.1](https://github.com/Cratis/Chronicle/releases/tag/v16.34.1)): Tables, dropdowns, tabs, dialogs, tooltips, menubars and status chips are now built on the Cratis wrappers (`Column`, `Dropdown`, `ActionMenubar`, `Tag`/`Badge`/`Chip`/`ProgressBar`, `Tooltip`, `Dialog`) where 3.0.0 provides one.
- **Chronicle** ([Release v16.34.1](https://github.com/Cratis/Chronicle/releases/tag/v16.34.1)): The event-sequence table sorts through the server again, and the read-model instance pager keeps its rows-per-page selector alongside the new pager.
- **Studio** ([Release v0.68.0](https://github.com/Cratis/Studio/releases/tag/v0.68.0)): The legal documents are served from what Admin published rather than from files deployed with each service, so a revision takes effect without a release (Cratis/StudioIssues#173)
- **Studio** ([Release v0.68.0](https://github.com/Cratis/Studio/releases/tag/v0.68.0)): The reaction and reply buttons sit on the bottom edge of a chat bubble instead of taking a row of their own, and neither picker clips at the edge of the chat panel any more (Cratis/StudioIssues#174)
- **Studio** ([Release v0.68.0](https://github.com/Cratis/Studio/releases/tag/v0.68.0)): Hovering a reaction shows who gave it (Cratis/StudioIssues#174)
- **Studio** ([Release v0.68.0](https://github.com/Cratis/Studio/releases/tag/v0.68.0)): The markdown editor is a shared package, so Admin and Studio use the same one
- **Scene** ([Release v2.0.0](https://github.com/Cratis/Scene/releases/tag/v2.0.0)): `@cratis/scene.primereact`, `@cratis/scene.components`, `@cratis/scene.blueprint.default` and `@cratis/scene.blueprint.components` now require `primereact ^11.0.0`, `primeicons ^8.0.0` and `@cratis/components ^3.0.0`, and declare `@primereact/core` and `@primereact/headless` where they import them directly.
- **Scene** ([Release v2.0.0](https://github.com/Cratis/Scene/releases/tag/v2.0.0)): 13 abstract names follow a PrimeReact rename without changing their Scene name — `dropdown` is now `Select`, `calendar` is `DatePicker`, `overlayPanel` is `Popover`, `tabView` is `Tabs`, and so on.
- **Scene** ([Release v2.0.0](https://github.com/Cratis/Scene/releases/tag/v2.0.0)): `multiSelect` is re-expressed over `Select`'s `multiple`; `orderList` and `pickList` over `@primereact/headless` hooks, which ship the behavior but no presentation.
- **Scene** ([Release v2.0.0](https://github.com/Cratis/Scene/releases/tag/v2.0.0)): Theming is rebuilt on `@primeuix/themes` presets. A theme is now an object handed to `PrimeReactProvider` rather than a stylesheet to load, so switching neither fetches nor flashes, and a theme name can no longer 404. `usePrimeReactTheme` returns the provider configuration instead of mutating the DOM.
- **Scene** ([Release v2.0.0](https://github.com/Cratis/Scene/releases/tag/v2.0.0)): The theme catalog is 24 themes across the Aura, Lara, Nora and Material families, replacing the 25 PrimeTek v10 themes. Their license is recorded as PrimeUI Commercial.
- **Scene** ([Release v2.0.0](https://github.com/Cratis/Scene/releases/tag/v2.0.0)): `PrimeReactProvider` is now mandatory anywhere Scene components render — PrimeReact 11 throws without it rather than falling back to a default configuration.
- **Components** ([Release v3.0.0](https://github.com/Cratis/Components/releases/tag/v3.0.0)): **`primereact`, `@primereact/core`, `@primereact/headless` and `primeicons` are now peer dependencies.** Previously `primereact` was a regular dependency, so an app that also depended on it could resolve two copies — and two copies means two `PrimeReactProvider` contexts, which makes overlays stack wrongly and `pt`/`unstyled` silently not apply, with no error. Apps that carried a `resolutions`/`overrides` pin to work around this can delete it (#118)
- **Components** ([Release v3.0.0](https://github.com/Cratis/Components/releases/tag/v3.0.0)): **Component CSS now ships through the `@cratis/components/styles` entry point** instead of being imported by each component. Apps must `import '@cratis/components/tokens'` and `import '@cratis/components/styles'` explicitly. `./styles` also vendors the `allotment` stylesheet `DataPage` needs, so that no longer has to be imported separately (#118)
- **Components** ([Release v3.0.0](https://github.com/Cratis/Components/releases/tag/v3.0.0)): **Theming is token-based.** PrimeReact 11 ships no CSS; `primereact/resources/themes/*.css` is gone. Supply a `@primeuix/themes` preset through `CratisComponentsProvider` (`value={{ theme: { preset } }}`), use the new license-free baseline theme, or stay unstyled-first
- **Components** ([Release v3.0.0](https://github.com/Cratis/Components/releases/tag/v3.0.0)): The package is **ESM-only** — the CommonJS build is gone, as PrimeReact 11 is ESM-only
- **Components** ([Release v3.0.0](https://github.com/Cratis/Components/releases/tag/v3.0.0)): Import `Column` from `@cratis/components/DataTables` and `StepperPanel` from `@cratis/components/CommandDialog`; the authoring model is unchanged
- **Components** ([Release v3.0.0](https://github.com/Cratis/Components/releases/tag/v3.0.0)): Data-table selection reports a `DataTableSelectionChangeEvent` (`event.value` unchanged), replac
- **Stage** ([Release v3.2.0](https://github.com/Cratis/Stage/releases/tag/v3.2.0)): `Cratis.Stage.Contracts` takes `Cratis.Scene.Model` 1.1.0 and adds `Cratis.Scene.Engine` 1.1.0. Every resolution rule — package closure and priority, component binding, theme compatibility, template placement, size classes, arrangement evaluation — is Scene's engine used unmodified, so a build-time plan and a running renderer can never disagree about what a screen resolves to.
- **Stage** ([Release v3.1.0](https://github.com/Cratis/Stage/releases/tag/v3.1.0)): The translation follows Screenplay 4.0.0's taxonomy, which splits what used to share the word "layout": an application-level `layout` (the navigational shell, one in force), a module-scoped `screen template` (a reusable shape inside that shell, naming the slot it fits with `fits slot`), and a `dialog template` (the same, for content that opens over the application). A screen names the template it fills; the shell is resolved once for the application, because a screen never names it.
- **Scene** ([Release v1.0.0](https://github.com/Cratis/Scene/releases/tag/v1.0.0)): **A layout and a template are now different things.** A `Layout` is an application's base navigational look and an application has one; a `ScreenTemplate` goes inside it and an application has many. They were previously the same word for both.
- **Scene** ([Release v1.0.0](https://github.com/Cratis/Scene/releases/tag/v1.0.0)): `FlowContainer` carries its `Kind`. C# distinguished a `FlowRow` from a `FlowColumn` by type, but the TypeScript mirror could not — interfaces with identical members are the same type — so a renderer had no way to tell a row from a column.
- **Screenplay** ([Release v4.0.1](https://github.com/Cratis/Screenplay/releases/tag/v4.0.1)): Package validation is enabled again, with the baseline moved to `4.0.0`. It was switched off for the 4.0.0 major itself, where every API break was deliberate and validating against the 3.x line it was leaving had no answer to give. With 4.0.0 published, the baseline moves to it and the protection resumes — leaving it off past a major is what previously let releases ship without the break being caught.
- **Screenplay** ([Release v4.0.0](https://github.com/Cratis/Screenplay/releases/tag/v4.0.0)): The module-scoped `layout <Name>` is now **`screen template <Name>`**. It was never a layout — it is a reusable shape that goes inside one.
- **Screenplay** ([Release v4.0.0](https://github.com/Cratis/Screenplay/releases/tag/v4.0.0)): A screen names the structure it fills with **`template <Name>`** instead of `layout <Name>`.
- **Screenplay** ([Release v4.0.0](https://github.com/Cratis/Screenplay/releases/tag/v4.0.0)): The arrangement tree hangs **directly off `arrangement`**; the separate `template` block inside it is gone. `arrangement freeform` likewise holds its `variant` blocks directly. This frees the word `template` to mean a screen or dialog template and nothing else.
- **Screenplay** ([Release v4.0.0](https://github.com/Cratis/Screenplay/releases/tag/v4.0.0)): **Slots are declared by name in the body**, and the arrangement positions them:
- **Screenplay** ([Release v4.0.0](https://github.com/Cratis/Screenplay/releases/tag/v4.0.0)): Syntax types renamed to match: `LayoutSyntax` is now the application layout, `ScreenTemplateSyntax` / `DialogTemplateSyntax` are the module-scoped ones, `ModuleSyntax.Layouts` is `ModuleSyntax.ScreenTemplates` (plus `DialogTemplates`), `TemplateSyntax` and its tree are `ArrangementSyntax` / `ArrangementNodeSyntax` / `ArrangementContainerSyntax` / `ArrangementSlotSyntax` / `ArrangementOverrideSyntax` / `ArrangementContainerKind`, `LayoutArrangement` is `ArrangementMode`, and `ScreenLayoutSyntax` is `ScreenTemplateReferenceSyntax`. The matching
- **Studio** ([Release v0.67.0](https://github.com/Cratis/Studio/releases/tag/v0.67.0)): Project deletion (and other entity-deletion confirmations) now use a single dialog: type the exact name to enable the delete button, replacing the previous two-step warn-then-confirm flow. The warning copy now explains that everything is preserved as events in the log, with no recovery tool available yet (#167)
- **Studio** ([Release v0.67.0](https://github.com/Cratis/Studio/releases/tag/v0.67.0)): Organization "last activity" in Admin is now reported directly as work happens instead of being computed by scanning every tenant's event log on each page load — the same information, delivered faster and more reliably (#166)
- **Studio** ([Release v0.67.0](https://github.com/Cratis/Studio/releases/tag/v0.67.0)): Dictation now uploads audio in short rolling segments instead of resending the whole recording on every update, keeping response latency low as a recording gets longer (#163)
- **Studio** ([Release v0.67.0](https://github.com/Cratis/Studio/releases/tag/v0.67.0)): The microphone level meter shown when picking a device starts up faster (#163)
- **Stage** ([Release v3.0.0](https://github.com/Cratis/Stage/releases/tag/v3.0.0)): Upgraded to Cratis.Screenplay 3.0.0, which replaces `reactor` with `reaction` and makes what sets one off a first-class trigger
- **Screenplay** ([Release v3.0.0](https://github.com/Cratis/Screenplay/releases/tag/v3.0.0)): `Slice.Reactors` is now `Slice.Reactions`, and `ReactorSyntax`/`ReactorTriggerSyntax` are now `ReactionSyntax`/`ReactionTriggerSyntax` carrying a `TriggerSourceSyntax` (#102)
- **Screenplay** ([Release v3.0.0](https://github.com/Cratis/Screenplay/releases/tag/v3.0.0)): `ScreenplaySyntaxWalker.VisitReactor`/`VisitReactorTrigger` are now `VisitReaction`/`VisitReactionTrigger`, joined by `VisitTrigger` and `VisitTriggerData` (#102)
- **Screenplay** ([Release v3.0.0](https://github.com/Cratis/Screenplay/releases/tag/v3.0.0)): `IScreenplayLanguageRegistry` gains a `Triggers` member (#102)
- **Screenplay** ([Release v3.0.0](https://github.com/Cratis/Screenplay/releases/tag/v3.0.0)): `PLAY0136`–`PLAY0139` now describe reactions rather than reactors (#102)
- **release-action** ([Release v1.2.0](https://github.com/Cratis/release-action/releases/tag/v1.2.0)): A commit that already has a release no longer publishes a second, higher version when its run is repeated (#103).
- **release-action** ([Release v1.2.0](https://github.com/Cratis/release-action/releases/tag/v1.2.0)): Documented that `cancel-in-progress: false` is required under the `push` trigger.
- **cli** ([Release v2.8.0](https://github.com/Cratis/cli/releases/tag/v2.8.0)): Enter or double-click opens a read-only detail view. Replay, retry, stop and the rest need an explicit key, a button, or the context menu — a reflexive double-click can't change anything now
- **cli** ([Release v2.8.0](https://github.com/Cratis/cli/releases/tag/v2.8.0)): Actions declare whether they're destructive instead of it being guessed from the label, so they're tinted consistently wherever they show up
- **cli** ([Release v2.8.0](https://github.com/Cratis/cli/releases/tag/v2.8.0)): One key for themes instead of three, listing all of them
- **cli** ([Release v2.8.0](https://github.com/Cratis/cli/releases/tag/v2.8.0)): Throughput and observer count are line graphs — bar sparklines rounded 3 and 4 events per tick to the same full-height column
- **cli** ([Release v2.8.0](https://github.com/Cratis/cli/releases/tag/v2.8.0)): Tables and graphs let the background through, and colors follow a theme change straight away instead of on the next refresh
- **Arc** ([Release v21.17.0](https://github.com/Cratis/Arc/releases/tag/v21.17.0)): The story kit documentation states where the styling comes from and which single import brings it in, instead of describing styling as automatic (#2544)
- **Arc** ([Release v21.17.0](https://github.com/Cratis/Arc/releases/tag/v21.17.0)): The story kit's theme contract is now documented precisely: dark by default, switching to light wherever `data-theme="light"` is set on `<html>`, `<body>` or any ancestor (#2544)
- **Screenplay** ([Release v2.4.0](https://github.com/Cratis/Screenplay/releases/tag/v2.4.0)): `LayoutSyntax.Slots` changes from `IEnumerable<string>` to `IEnumerable<SlotSyntax>` to carry the new `contributes` marker - a breaking shape change to that one property. `ScreenplaySyntaxWalker.VisitLayout`/`VisitForm` were also completed to walk their previously-unwalked children (`LayoutSyntax.Slots`, `FormSyntax.Populate`/`OnSubmit`) - a latent gap from #98 caught by this PR's own walker-completeness spec (`for_ScreenplaySyntaxWalker`), fixed here since it's a small, directly-related correction.
- **Screenplay** ([Release v2.4.0](https://github.com/Cratis/Screenplay/releases/tag/v2.4.0)): **Where a `contribute to` block is declared**: the issue's own example wraps it in an unexplained `navigation-item` construct that's never defined anywhere else in the issue. I treated that as illustrative, not literal syntax, and made `contribute to` a bare directive attachable directly to a `module` or `feature`.
- **Screenplay** ([Release v2.4.0](https://github.com/Cratis/Screenplay/releases/tag/v2.4.0)): **Nesting depth**: the issue describes three tiers ("app nav, module subnav, feature sub-subnav"). Since layouts are module-scoped only today, this PR implements the two tiers that are actually expressible (own-module vs. every-other-module) and documents the third as a deliberate gap, not a silent omission - it would need feature-scoped layouts, which don't exist in the grammar.
- **Screenplay** ([Release v2.4.0](https://github.com/Cratis/Screenplay/releases/tag/v2.4.0)): **The explicit `in <ContributionPoint>` override** the issue gestures at (no concrete syntax given, paired with an ambiguity-handling question the issue itself marks open) is deferred rather than guessed at.
- **Screenplay** ([Release v2.4.0](https://github.com/Cratis/Screenplay/releases/tag/v2.4.0)): **`order`** is implemented (used in the issue's own worked example); **`group`** is not (explicitly flagged in the issue as "worth scoping now vs. later," no worked example uses it).
- **Arc** ([Release v21.15.0](https://github.com/Cratis/Arc/releases/tag/v21.15.0)): A specification step that names a value the specification holds is read as the construction that value was put together by, so a scenario stating its event or its command through a member reads the same as one constructing it inline (#2412)
- **Chronicle** ([Release v16.33.1](https://github.com/Cratis/Chronicle/releases/tag/v16.33.1)): Subject guidance now distinguishes managed projection ownership from manual `IReadModels.Release` subject selection. (#3708)
- **Studio** ([Release v0.66.4](https://github.com/Cratis/Studio/releases/tag/v0.66.4)): Backups' filters now live in an action toolbar instead of a plain row, consistent with every other admin page.
- **Studio** ([Release v0.66.3](https://github.com/Cratis/Studio/releases/tag/v0.66.3)): Arc 21.14.1 → 21.14.3
- **Studio** ([Release v0.66.3](https://github.com/Cratis/Studio/releases/tag/v0.66.3)): Chronicle 16.29.0 → 16.32.0, client packages and the kernel image together
- **Studio** ([Release v0.66.2](https://github.com/Cratis/Studio/releases/tag/v0.66.2)): Chronicle's MongoDB connection allows up to 500 pooled connections, so its startup — which touches every namespace's event sequences at once — no longer exhausts the driver's default pool and crash-loops the server
- **Studio** ([Release v0.66.2](https://github.com/Cratis/Studio/releases/tag/v0.66.2)): The onboarding integration specs tell Admin where Core is, so the seat and activity assertions can actually observe what they claim to
- **Chronicle** ([Release v16.32.0](https://github.com/Cratis/Chronicle/releases/tag/v16.32.0)): Historical joins release stored event PII before projecting it, so backfilled values remain readable and erasable under their source subject. (#3644)
- **Chronicle** ([Release v16.31.0](https://github.com/Cratis/Chronicle/releases/tag/v16.31.0)): The Sequences page is now the query workspace rather than a single fixed view of the event log. Append, redact, revise and export remain available on the results (#1911)
- **Chronicle** ([Release v16.31.0](https://github.com/Cratis/Chronicle/releases/tag/v16.31.0)): Saving a query is a deliberate act instead of happening on every edit: the first save asks for a name, who it is visible to and which folder it belongs in, and later saves write it back where it already lives (#1911)
- **Chronicle** ([Release v16.31.0](https://github.com/Cratis/Chronicle/releases/tag/v16.31.0)): A query is renamed where its name is shown — on its node in the tree or by double-clicking its tab — and the new name is saved straight away (#1911)
- **Chronicle** ([Release v16.31.0](https://github.com/Cratis/Chronicle/releases/tag/v16.31.0)): Deleting a query or a folder asks for confirmation first, and deleting a folder deletes the queries filed in it (#1911)
- **Chronicle** ([Release v16.31.0](https://github.com/Cratis/Chronicle/releases/tag/v16.31.0)): The event sequences an event store offers now come from the `EventSequences` grain, which reports the sequences a namespace actually holds rather than a hardcoded set
- **Chronicle** ([Release v16.31.0](https://github.com/Cratis/Chronicle/releases/tag/v16.31.0)): Event sequence storage can narrow on event source type, event stream type and correlation id, and order by any of the columns a query shows
- **Chronicle** ([Release v16.31.0](https://github.com/Cratis/Chronicle/releases/tag/v16.31.0)): Range filters in `@cratis/components` accept pre-counted histogram buckets, so a range picker can reflect a data set larger than the browser holds
- **Stage** ([Release v2.4.0](https://github.com/Cratis/Stage/releases/tag/v2.4.0)): `CratisRenderer.CreateDefault()` renders into the target directory without scaffolding a project around it, which is what regenerating from a document into a project that already exists needs. (#34)
- **Stage** ([Release v2.4.0](https://github.com/Cratis/Stage/releases/tag/v2.4.0)): A specification that cannot be rendered faithfully is reported with the reason instead of being rendered — one that establishes prior state with `given`, states read model state, exercises another slice's command, or asserts nothing. (#14)
- **Stage** ([Release v2.4.0](https://github.com/Cratis/Stage/releases/tag/v2.4.0)): Specifications are no longer counted in a slice's unrendered-construct list, since each one now either renders or says on its own why it does not. (#14)
- **cli** ([Release v2.6.1](https://github.com/Cratis/cli/releases/tag/v2.6.1)): Chronicle moves from 16.19.3 to 16.30.1, which restores connecting to a development server with no certificate setup. (#67)
- **Chronicle** ([Release v16.30.1](https://github.com/Cratis/Chronicle/releases/tag/v16.30.1)): The .NET client skips TLS certificate validation by default again, so a development server and client connect with no certificate setup on either side. Set `skipTlsValidation=false` (or `Tls.SkipCertificateValidation = false`) to require full certificate chain validation against a server whose certificate is verifiable.
- **Studio** ([Release v0.65.4](https://github.com/Cratis/Studio/releases/tag/v0.65.4)): .NET and npm packages upgraded, including Arc 21.14.1, Chronicle 16.29.0 and Stage 2.3.0. The Chronicle server image moves with its client, as it must.
- **Arc** ([Release v21.14.1](https://github.com/Cratis/Arc/releases/tag/v21.14.1)): The proxy generator only inspects assemblies referencing `Cratis.Arc.Core` when discovering declared response value handlers, instead of every managed dependency of the application
- **Studio** ([Release v0.65.2](https://github.com/Cratis/Studio/releases/tag/v0.65.2)): Arc 21.3.1 → 21.14.0, Chronicle 16.22.2 → 16.28.0 and Stage 2.1.0 → 2.2.1, with the deployed Chronicle server moving to 16.28.0 in the same change.
- **Studio** ([Release v0.65.1](https://github.com/Cratis/Studio/releases/tag/v0.65.1)): **CI fails when the solution does not build clean, and publishing waits for it.** Every existing build workflow compiles a single project path, so nothing restored `Studio.slnx` and a vulnerable package or a Release-only analyzer error in any other project was invisible. A new Dependency Audit builds the whole solution in Release — where warnings are errors — on every pull request, and the publish flow now depends on it.
- **Studio** ([Release v0.65.1](https://github.com/Cratis/Studio/releases/tag/v0.65.1)): **A CI runner reserves 2 cores and may use 4.** Memory decides placement, so a runner is effectively alone on its node; it can now use it.
- **Studio** ([Release v0.63.1](https://github.com/Cratis/Studio/releases/tag/v0.63.1)): A CI runner is given 4 GB rather than 2, and now reserves what it is allowed to use. The integration suite stands up six containers and three services and did not fit in 2 GB; more importantly the runner reserved 1 GB while being permitted 2, so three runners could take twice what the scheduler had set aside for them on nodes production already claims most of. This node pool has been brought down by that shape before.
- **Arc** ([Release v21.12.0](https://github.com/Cratis/Arc/releases/tag/v21.12.0)): The proxy generator no longer generates client response models for server-consumed response types, whether returned directly or wrapped in `Result`, `OneOf`, tuples, or collections (#2537)
- **Arc** ([Release v21.12.0](https://github.com/Cratis/Arc/releases/tag/v21.12.0)): Typed handler declarations are discovered from the application and its referenced packages, replacing the fixed built-in list of well-known types (#2537)
- **Arc** ([Release v21.12.0](https://github.com/Cratis/Arc/releases/tag/v21.12.0)): All built-in Arc and Chronicle response value handlers declare their consumed types (#2537)
- **Studio** ([Release v0.63.0](https://github.com/Cratis/Studio/releases/tag/v0.63.0)): The import preview shows a read model's schema, so the dialog no longer understates what the import will produce.
- **Studio** ([Release v0.61.1](https://github.com/Cratis/Studio/releases/tag/v0.61.1)): Sub-features are no longer indented on the event model board. A sub-feature used to be headed a row below its parent's spanning header, which pushed its slice columns out of line with every sibling; every feature is now headed at the same level in one header row. A parent that owns sub-features keeps a column of its own rather than collapsing to nothing. (Cratis/StudioIssues#142)
- **Studio** ([Release v0.61.0](https://github.com/Cratis/Studio/releases/tag/v0.61.0)): Icon-only pill buttons are now round rather than stadium-shaped, matching the convention PrimeReact itself uses for them. (Cratis/StudioIssues#138)
- **Studio** ([Release v0.61.0](https://github.com/Cratis/Studio/releases/tag/v0.61.0)): Deleting an invitation or removing a member now asks for confirmation before it does anything, and says why when the command is rejected instead of leaving the row unchanged with no explanation. (Cratis/StudioIssues#139)
- **Studio** ([Release v0.60.0](https://github.com/Cratis/Studio/releases/tag/v0.60.0)): **Every markdown surface now goes through one shared editor.** The preview no longer sits beside the editor competing for width — a round button in the top-right corner toggles between raw markdown and the rendered preview, one pane at a time. Seven surfaces moved onto it. (Cratis/StudioIssues#136)
- **Studio** ([Release v0.60.0](https://github.com/Cratis/Studio/releases/tag/v0.60.0)): **A collaborator who is off-screen stays visible.** Their avatar and name pill clamp to the nearest viewport edge with the arrow pointing the way you would need to pan to reach them, rotating around the pill as their direction changes. On-screen cursors are unchanged. (Cratis/StudioIssues#110)
- **Studio** ([Release v0.60.0](https://github.com/Cratis/Studio/releases/tag/v0.60.0)): Editing an agent skill is now one **Update** command carrying both name and content, replacing the rename-only command, and records only the facts that actually changed — so saving a rewritten body no longer logs a rename that never happened. (Cratis/StudioIssues#135)
- **Studio** ([Release v0.60.0](https://github.com/Cratis/Studio/releases/tag/v0.60.0)): **An import now reports the later Screenplay constructs it cannot carry** instead of dropping them in silence: application `imports` and `authentication`, slice-level `readmodel` and `reducer`, command-level `reads` and `require`, and a query's `scoped to`, observability and authorization. (Cratis/StudioIssues#52)
- **Studio** ([Release v0.59.5](https://github.com/Cratis/Studio/releases/tag/v0.59.5)): The **Onboarding integration specs run on Testcontainers**. Aspire's DCP gave the `lobby` resource a container-tunnel service in `Proxyless` address-allocation mode — the only service needing one specific host port, published by a tunnel-proxy container DCP leaks on shutdown. Leaked proxies kept their ports bound and accumulated until allocation failed, and `DcpPublisher:EnableAspireContainerTunnel=false` has no effect in Aspire 13.4.6. A full run is now ~50 seconds where it previously hung for its 30-minute timeout, and the suite leaves nothing behind on success, on failure, or on cancellation.
- **Studio** ([Release v0.59.5](https://github.com/Cratis/Studio/releases/tag/v0.59.5)): The integration specs are **back on the `pull_request` trigger** and no longer `continue-on-error`, so a failing spec is a red check rather than a silent one.
- **Studio** ([Release v0.59.5](https://github.com/Cratis/Studio/releases/tag/v0.59.5)): **The runner image carries the toolchain.** The .NET SDK, Node, yarn, the Docker CLI, the GitHub CLI, `jq` and now the Pulumi CLI are baked in, and the workflows no longer install them on our own runners — the setup steps remain only for the hosted fallback that runs when no cluster runner is online.
- **Studio** ([Release v0.59.5](https://github.com/Cratis/Studio/releases/tag/v0.59.5)): Read-model queries in the specs are read as a stream rather than a one-shot request — see the Arc note under Fixed.
- **Stage** ([Release v2.2.0](https://github.com/Cratis/Stage/releases/tag/v2.2.0)): A read model that no declared query returns now renders as requiring an authenticated caller, and reports it as a diagnostic, rather than being left open to everyone. A slice that declares no query at all is unchanged and still renders as `[AllowAnonymous]`.
- **Studio** ([Release v0.59.2](https://github.com/Cratis/Studio/releases/tag/v0.59.2)): The import no longer reports a slice's uniqueness constraints as left behind, and reports a file-backed constraint instead — that is the only kind the canvas still cannot record.
- **Arc** ([Release v21.9.0](https://github.com/Cratis/Arc/releases/tag/v21.9.0)): `Cratis.Chronicle`, `Cratis.Chronicle.AspNetCore` and `Cratis.Chronicle.Testing` are updated to `16.26.0`
- **Arc** ([Release v21.9.0](https://github.com/Cratis/Arc/releases/tag/v21.9.0)): Chronicle 16.24.0: `IReadModels.GetInstanceById` resolves a materialized reducer-backed read model from the materialized store instead of replaying its events, with PII released server-side (cratis/chronicle#3605)
- **Arc** ([Release v21.9.0](https://github.com/Cratis/Arc/releases/tag/v21.9.0)): Chronicle 16.24.0: `IReadModels.GetInstances` returns the stored instances for a materialized read model instead of replaying the event log; passing an explicit event count still replays (cratis/chronicle#3605)
- **Arc** ([Release v21.9.0](https://github.com/Cratis/Arc/releases/tag/v21.9.0)): Chronicle 16.24.0: A reducer-backed read model no longer needs a connected reducer client to be read by key (cratis/chronicle#3605)
- **Arc** ([Release v21.9.0](https://github.com/Cratis/Arc/releases/tag/v21.9.0)): Chronicle 16.24.0: Read model instance reads are eventually consistent unless the read model is marked `[Passive]` — mark it passive where a read must reflect an append that just happened (cratis/chronicle#3605)
- **Arc** ([Release v21.9.0](https://github.com/Cratis/Arc/releases/tag/v21.9.0)): Chronicle 16.24.1: Geospatial documentation now describes the JSON schema Chronicle emits — a leaf carrying only its format, with GeoJSON on the wire — and records that marking a geospatial value `[PII]` is not supported, since an erased subject cannot be materi
- **Chronicle** ([Release v16.26.0](https://github.com/Cratis/Chronicle/releases/tag/v16.26.0)): Materialize and validate ordered events and scope inputs before staging while preserving pure legacy `AddEvent` behavior (#3683)
- **Arc** ([Release v21.7.0](https://github.com/Cratis/Arc/releases/tag/v21.7.0)): A generated slice now carries every projection it declares, instead of the first one and a diagnostic for the rest. An application whose slice builds several read models - the one a screen binds to and the one a command reads to decide - now gets all of them
- **Arc** ([Release v21.7.0](https://github.com/Cratis/Arc/releases/tag/v21.7.0)): A reducer's read model now stands beside the slice's projections instead of competing with them, so a slice mixing projections and reducers no longer loses most of its read side
- **Arc** ([Release v21.7.0](https://github.com/Cratis/Arc/releases/tag/v21.7.0)): `SP0015` no longer reports a second projection in a slice; it is left for the constructs within a projection that the language genuinely has no word for
- **Arc** ([Release v21.7.0](https://github.com/Cratis/Arc/releases/tag/v21.7.0)): `SP0020` now says what is actually lost - the read model is carried as a projection over the events the reducer observes, and only the fold itself goes unstated
- **Arc** ([Release v21.6.2](https://github.com/Cratis/Arc/releases/tag/v21.6.2)): Generating from a single project now reads every project it references as well, instead of only the project named. An application whose events, commands and concepts live in contracts projects below the one named no longer generates a document that leaves all of them out (#2521)
- **Studio** ([Release v0.59.0](https://github.com/Cratis/Studio/releases/tag/v0.59.0)): Deleting an organization in Admin now runs in the background instead of blocking, and the organization stays listed with a "Being deleted" status until teardown actually completes (Cratis/StudioIssues#124)
- **Studio** ([Release v0.59.0](https://github.com/Cratis/Studio/releases/tag/v0.59.0)): The person originally invited to create an organization can be invited again once that organization is deleted (Cratis/StudioIssues#124)
- **Studio** ([Release v0.59.0](https://github.com/Cratis/Studio/releases/tag/v0.59.0)): Generating an event model, or anything within one, now prefers a configured Modeler agent over the general-purpose one, falling back to the built-in model exactly as before when nothing is configured (Cratis/StudioIssues#114)
- **Studio** ([Release v0.59.0](https://github.com/Cratis/Studio/releases/tag/v0.59.0)): The Vault and Backups admin pages use the same page chrome as the rest of Admin, so padding, margins and titles line up (Cratis/StudioIssues#123)
- **Chronicle** ([Release v16.25.0](https://github.com/Cratis/Chronicle/releases/tag/v16.25.0)): An Aspire AppHost configured for production must now supply a TLS certificate, and an encryption certificate when the internal OAuth authority is enabled — without them the production image does not start (#3607)
- **Arc** ([Release v21.6.0](https://github.com/Cratis/Arc/releases/tag/v21.6.0)): Subdomain tenancy resolves a tenant only for a host that sits below the configured base domain, and falls back to the tenant header for anything else — an apex domain, a deeper host, or an address (#2471)
- **Arc** ([Release v21.6.0](https://github.com/Cratis/Arc/releases/tag/v21.6.0)): A host is matched case-insensitively and in punycode form, so one domain is always one tenant regardless of how it was written (#2471)
- **Arc** ([Release v21.6.0](https://github.com/Cratis/Arc/releases/tag/v21.6.0)): A resolved tenant must be a valid DNS label, so a host cannot put a wildcard, user information, a control character or an unbounded string into a tenant identifier (#2471)
- **Chronicle** ([Release v16.24.1](https://github.com/Cratis/Chronicle/releases/tag/v16.24.1)): Geospatial documentation now describes the JSON schema Chronicle emits — a leaf carrying only its format, with GeoJSON on the wire — and records that marking a geospatial value `[PII]` is not supported, since an erased subject cannot be materialized back into one (#3673)
- **Chronicle.Kotlin** ([Release v2.10.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v2.10.0)): The README is rewritten around what the client does for you, with Kotlin and Java shown side by side throughout.
- **Arc** ([Release v21.5.0](https://github.com/Cratis/Arc/releases/tag/v21.5.0)): `QueryFor.perform` resolves with an unsuccessful result when the request never reaches the server, instead of rejecting (#2473)
- **Arc** ([Release v21.5.0](https://github.com/Cratis/Arc/releases/tag/v21.5.0)): A query that fails in transport now surfaces through `useSuspenseQuery`'s error boundary as `QueryFailed`, where it previously left the boundary pending forever (#2473)
- **Arc** ([Release v21.5.0](https://github.com/Cratis/Arc/releases/tag/v21.5.0)): Only a successful query result is cached, so a failed attempt no longer seeds a later mount of the same query (#2473)
- **Chronicle** ([Release v16.24.0](https://github.com/Cratis/Chronicle/releases/tag/v16.24.0)): `IReadModels.GetInstanceById` resolves a materialized reducer-backed read model from the materialized store instead of replaying its events, with PII released server-side (#3605)
- **Chronicle** ([Release v16.24.0](https://github.com/Cratis/Chronicle/releases/tag/v16.24.0)): `IReadModels.GetInstances` returns the stored instances for a materialized read model instead of replaying the event log; passing an explicit event count still replays (#3605)
- **Chronicle** ([Release v16.24.0](https://github.com/Cratis/Chronicle/releases/tag/v16.24.0)): A reducer-backed read model no longer needs a connected reducer client to be read by key (#3605)
- **Chronicle** ([Release v16.24.0](https://github.com/Cratis/Chronicle/releases/tag/v16.24.0)): Read model instance reads are eventually consistent unless the read model is marked `[Passive]` — mark it passive where a read must reflect an append that just happened (#3605)
- **Studio** ([Release v0.58.9](https://github.com/Cratis/Studio/releases/tag/v0.58.9)): An agent that already has an avatar keeps it; a default avatar is only ever put on an agent that has none. Agents that were renamed or scoped to a project are left untouched.
- **Studio** ([Release v0.57.1](https://github.com/Cratis/Studio/releases/tag/v0.57.1)): User activity ("since your last visit") is now recorded by ASP.NET middleware observing accepted POSTs at the HTTP edge, instead of a command filter inside the command pipeline. Presence tracking is a pure cross-cutting concern again — it can never participate in an in-process command scenario, never fail a request, and records only requests that were not rejected. Covered by unit specs for every branch and a smoke spec driving a real POST and GET through ASP.NET's test host with the middleware in the actual pipeline. (Cratis/StudioIssues#100)
- **Studio** ([Release v0.57.0](https://github.com/Cratis/Studio/releases/tag/v0.57.0)): Agent skills are configured in the agent dialog, under the description, instead of on the agents table; the table shows the plain description again.
- **Studio** ([Release v0.57.0](https://github.com/Cratis/Studio/releases/tag/v0.57.0)): AI settings now speak in providers: everything called "AI Model" is now "AI Provider" throughout, AI precedes Agents in the organization settings, and the Teams tab is gone. Agents pick a provider and then a model enumerated live from that provider, with free-text entry as the fallback when a provider cannot be reached. (Cratis/StudioIssues#88)
- **Studio** ([Release v0.57.0](https://github.com/Cratis/Studio/releases/tag/v0.57.0)): Adding another identity opens an embedded dialog instead of a popup: the provider hop still happens top-level, and completion closes the dialog and refreshes the credential list — no spinner, no disabled button. (Cratis/StudioIssues#104)
- **Studio** ([Release v0.57.0](https://github.com/Cratis/Studio/releases/tag/v0.57.0)): Chronicle 16.22.2 and Arc 21.3.0 across backend and frontend, and AuthProxy 2.17.0.
- **AuthProxy** ([Release v2.17.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.17.0)): OIDC providers request the code flow's standard `query` response mode, so the provider callback is a top-level GET the `SameSite=Lax` handshake cookies accompany (Cratis/StudioIssues#104)
- **AuthProxy** ([Release v2.17.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.17.0)): A credential link with no (or an invalid) `returnUrl` ends on the flow's own completion page instead of the application root
- **AuthProxy** ([Release v2.17.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.17.0)): Sign-in selection pages (provider selection, its SPA, invitation selection) always refuse framing
- **AuthProxy** ([Release v2.17.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.17.0)): The selection SPA served at `/.cratis/select-provider` now matches the static selection pages' design instead of its own dark theme (Cratis/StudioIssues#104)
- **AuthProxy** ([Release v2.17.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.17.0)): A challenge navigation identified as framed (`Sec-Fetch-Dest`) is answered with the link selection page instead of a redirect the external identity provider would refuse to render framed
- **AuthProxy** ([Release v2.15.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.15.0)): A failed credential-link exchange no longer redirects to the completion path. Only an explicit success signals completion; every failure answers one generic page, identical for all six causes, so the response is not an oracle for whether a provider identity or an application account exists (#80)
- **AuthProxy** ([Release v2.15.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.15.0)): The client address and scheme are resolved once, from normalized connection state. Geo headers are answered empty unless the immediate peer is trusted (#79)
- **AuthProxy** ([Release v2.15.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.15.0)): A deployment that configures no trusted proxies keeps today's behavior an
- **Components** ([Release v2.7.1](https://github.com/Cratis/Components/releases/tag/v2.7.1)): A data page without a details component no longer renders a split view, and a data page now requires an ancestor with a real height — documented, with a minimum height so a page that does not provide one stays usable rather than collapsing (#126)
- **Studio** ([Release v0.56.0](https://github.com/Cratis/Studio/releases/tag/v0.56.0)): Creating a project, application or domain expands and selects it in the drawer; creating an event model or brainstorming navigates straight to it with its parent chain opened. (Cratis/StudioIssues#83)
- **Studio** ([Release v0.56.0](https://github.com/Cratis/Studio/releases/tag/v0.56.0)): Manually selecting In Progress or Ready for review is disabled while System or an agent is assigned to a slice, as is Done while the system is mid-implementation. (Cratis/StudioIssues#85)
- **Studio** ([Release v0.55.3](https://github.com/Cratis/Studio/releases/tag/v0.55.3)): Screenplay documents are read with Cratis Screenplay 2.1.0 and Cratis Stage 2.0.0.
- **AuthProxy** ([Release v2.14.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.14.0)): A single-provider deployment serves the selection page instead of auto-challenging when a sign-in failure reason is present, so a persistent failure cannot become a redirect loop
- **AuthProxy** ([Release v2.14.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.14.0)): Every provider callback — failed or successful — now sweeps leftover `.AspNetCore.Correlation.*` / `.AspNetCore.OpenIdConnect.Nonce.*` handshake cookies, including legacy callback-path-scoped ones the logout endpoint can never reach, so one sign-in attempt heals a poisoned browser
- **AuthProxy** ([Release v2.14.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.14.0)): The provider-selection page carries the explicit `returnUrl` forward when served on its own path instead of looping back into itself after sign-in
- **cli** ([Release v2.6.0](https://github.com/Cratis/cli/releases/tag/v2.6.0)): `screenplay validate` reports the diagnostic code the compiler assigns, for example `error PLAY0027:`, alongside the file and position it already carried
- **cli** ([Release v2.6.0](https://github.com/Cratis/cli/releases/tag/v2.6.0)): `Cratis.Screenplay` to 2.1.0, `Cratis.Arc.Screenplay` to 21.2.0, the `Cratis.Prologue` packages to 1.2.0 and the `Cratis.Chronicle` packages to 16.19.3 (#64)
- **Studio** ([Release v0.55.1](https://github.com/Cratis/Studio/releases/tag/v0.55.1)): Granting seats to an organization now defaults the expiration to 1 month from today instead of 1 year, giving admins a shorter, more deliberate default.
- **cli** ([Release v2.5.0](https://github.com/Cratis/cli/releases/tag/v2.5.0)): `Cratis.Arc.Screenplay` 20.68.0 to 21.0.1, Chronicle packages 16.11.0 to 16.19.1, `Cratis.Fundamentals` 7.16.6 to 7.17.1
- **Prologue** ([Release v1.2.0](https://github.com/Cratis/Prologue/releases/tag/v1.2.0)): Screenplay documents are generated with Cratis.Screenplay 2.1.0.
- **Stage** ([Release v2.0.0](https://github.com/Cratis/Stage/releases/tag/v2.0.0)): Screenplay documents are compiled with Cratis.Screenplay 2.0.0.
- **Stage** ([Release v2.0.0](https://github.com/Cratis/Stage/releases/tag/v2.0.0)): A slice may now declare more than one projection. The first renders as the read model; the rest are reported as not rendered rather than dropped in silence.
- **Stage** ([Release v2.0.0](https://github.com/Cratis/Stage/releases/tag/v2.0.0)): An `authentication` provider carries an optional alias instead of a settings block — how to reach a provider belongs to whatever runs the document.
- **Arc** ([Release v21.2.0](https://github.com/Cratis/Arc/releases/tag/v21.2.0)): `Cratis.Screenplay` 1.8.0 to 2.0.0.
- **Arc** ([Release v21.2.0](https://github.com/Cratis/Arc/releases/tag/v21.2.0)): A generated `authorize` block states what it requires on one line, keeping the roles it accepts as alternatives to each other and a named policy as a demand on top of them.
- **Arc** ([Release v21.2.0](https://github.com/Cratis/Arc/releases/tag/v21.2.0)): The value a generated `claim` requirement is matched against is written as a quoted string rather than as a bare word.

## Fixed
- **Components** ([Release v3.4.0](https://github.com/Cratis/Components/releases/tag/v3.4.0)): The Cratis baseline theme positions the dialog backdrop and centers the dialog; both rendered in normal flow below the page content.
- **Studio** ([Release v0.69.0](https://github.com/Cratis/Studio/releases/tag/v0.69.0)): The AI provider dropdown in the Add/Edit agent dialogs could show "No available options" although providers were configured: the dialogs now observe the provider list live instead of snapshotting it when opened, and say "Loading providers…" / "No AI providers configured yet" while empty. (Cratis/StudioIssues#194)
- **Studio** ([Release v0.69.0](https://github.com/Cratis/Studio/releases/tag/v0.69.0)): "Generate with AI" no longer fails with "Timed out … waiting for the default event model" when the projection feeding the project hierarchy is slow to catch up: the generation now resolves the default domain and ev
- **Studio** ([Release v0.68.2](https://github.com/Cratis/Studio/releases/tag/v0.68.2)): Legal documents page in Admin no longer renders blank (Cratis/StudioIssues#173)
- **Studio** ([Release v0.68.2](https://github.com/Cratis/Studio/releases/tag/v0.68.2)): The Legal documents editors now open on the published documents even when they arrive after the page does
- **Components** ([Release v3.3.4](https://github.com/Cratis/Components/releases/tag/v3.3.4)): `Button` from `@cratis/components/Common` now stamps its `severity` as a `data-severity` attribute, matching `Tag`, so the Cratis theme's severity colors apply. Previously a `severity='danger'` button rendered in the primary color.
- **Components** ([Release v3.3.3](https://github.com/Cratis/Components/releases/tag/v3.3.3)): `Button` from `@cratis/components/Common` now forwards the native `title` and `autoFocus` attributes.
- **Components** ([Release v3.3.2](https://github.com/Cratis/Components/releases/tag/v3.3.2)): `DataTableForQuery` and `DataTableForObservableQuery` now accept a query proxy typed the way Arc generates them — `QueryFor<Row[], Arguments>` — while the row type is named explicitly (`<DataTableForQuery<TheProxy, Row, Arguments>>`). Previously that combination failed with TS2344, so a selectable table could only type its `selection` and `onSelectionChange` as `object`.
- **Studio** ([Release v0.68.1](https://github.com/Cratis/Studio/releases/tag/v0.68.1)): Services co-hosting an Orleans silo no longer crash on startup when reminders are enabled
- **Components** ([Release v3.3.1](https://github.com/Cratis/Components/releases/tag/v3.3.1)): `Button` from `@cratis/components/Common` now accepts `link`, mapping to PrimeReact 11's `variant: 'link'`, alongside the existing `text` and `outlined` flags. A PrimeReact 10 `<Button link />` previously rendered as a filled button.
- **Studio** ([Release v0.68.0](https://github.com/Cratis/Studio/releases/tag/v0.68.0)): The collaborator cursor's tail is shaped to the name pill it rests against — flat along its straight edges, curved around its ends — instead of the cursor's point being blunted (Cratis/StudioIssues#150)
- **Studio** ([Release v0.68.0](https://github.com/Cratis/Studio/releases/tag/v0.68.0)): The collaborator cursor keeps a constant gap from the name pill as it travels around it; it previously ranged from touching the pill to sitting several pixels clear of it (Cratis/StudioIssues#150)
- **Stage** ([Release v3.1.0](https://github.com/Cratis/Stage/releases/tag/v3.1.0)): `EventModelLoader` merging multiple `.play` files together now carries `ui profile`, `theme` and `layout` declarations through - previously only modules/concepts/policies survived a multi-file merge, so a real project split across files would lose them entirely
- **Stage** ([Release v3.1.0](https://github.com/Cratis/Stage/releases/tag/v3.1.0)): A screen's `navigate to` directive is now translated instead of failing the conversion
- **Stage** ([Release v3.1.0](https://github.com/Cratis/Stage/releases/tag/v3.1.0)): `ui profile`'s `theme` and `layout` references, a form's `on submit navigate to`, and a slot's `contributes` have no field on the corresponding Scene types yet - all called out as deliberate, documented gaps rather than silently dropped.
- **Stage** ([Release v3.1.0](https://github.com/Cratis/Stage/releases/tag/v3.1.0)): A screen with no `template` directive (a Level 1 "intent" screen, where Studio generates the component) fills the layout's `content` slot directly and names no template - which is exactly what `Screen.ScreenTemplate` documents `null` to mean. Nothing is synthesized for it.
- **Stage** ([Release v3.1.0](https://github.com/Cratis/Stage/releases/tag/v3.1.0)): A document that declares no `layout` at all gets one synthesized shell for the whole application, never one per screen.
- **Arc** ([Release v21.19.0](https://github.com/Cratis/Arc/releases/tag/v21.19.0)): Fixed normal generated `@field` and `@derivedType` proxies so they compile and run with TypeScript standard decorators through Fundamentals 7.18.0 while remaining compatible with legacy decorators. (#2440)
- **Components** ([Release v2.9.1](https://github.com/Cratis/Components/releases/tag/v2.9.1)): `TimeMachine/Properties.css` used `//` for its license header, which is not a comment in CSS. It shipped that way in both `dist/esm` and `dist/cjs`, so a consumer building with Vite's lightningcss minifier had the whole bundle rejected. It is now the `/* */` form every other stylesheet in the repo already uses.
- **Fundamentals** ([Release v7.18.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.18.0)): Fixed NuGet restore failures caused by duplicate case-insensitive Handlebars package pins.
- **Studio** ([Release v0.67.0](https://github.com/Cratis/Studio/releases/tag/v0.67.0)): Fixed an error thrown when quickly double-clicking the stop-dictation button
- **Arc** ([Release v21.17.1](https://github.com/Cratis/Arc/releases/tag/v21.17.1)): `useObservableQuery` and `useObservableQueryWithPaging` now always establish a fresh subscription when a query's arguments change, even when the argument object's key count changes between renders (e.g. going from no arguments to an object, or back) (#2551)
- **Stage** ([Release v3.0.1](https://github.com/Cratis/Stage/releases/tag/v3.0.1)): The 3.0.0 release can be published — package validation no longer fails the pack on the deliberate breaks that taking Screenplay 3 introduced
- **Stage** ([Release v3.0.1](https://github.com/Cratis/Stage/releases/tag/v3.0.1)): A binary break is caught in the pull request that causes it, rather than failing the release after merge
- **Screenplay** ([Release v3.0.1](https://github.com/Cratis/Screenplay/releases/tag/v3.0.1)): A binary break is caught in the pull request that causes it again, rather than failing the release after merge (#113)
- **cli** ([Release v2.8.1](https://github.com/Cratis/cli/releases/tag/v2.8.1)): `cratis llm-context` no longer describes large result sets as "catalogues" — the `event-types list` and `read-models list` descriptions now use American English like the rest of the CLI.
- **Screenplay** ([Release v3.0.0](https://github.com/Cratis/Screenplay/releases/tag/v3.0.0)): A malformed trigger reported both its own error and "reaction states no trigger", so one mistake produced two diagnostics and the second pointed at the header rather than at the line to fix (#102)
- **Screenplay** ([Release v3.0.0](https://github.com/Cratis/Screenplay/releases/tag/v3.0.0)): A `trigger` declaration is now carried through when a folder is compiled as one application (#102)
- **cli** ([Release v2.8.0](https://github.com/Cratis/cli/releases/tag/v2.8.0)): The table you were looking at never refreshed — rows only rebuilt while a view was *inactive*, so a live dashboard sat frozen
- **cli** ([Release v2.8.0](https://github.com/Cratis/cli/releases/tag/v2.8.0)): `F` did nothing when the sidebar had focus, which is every view you reach by navigating there
- **cli** ([Release v2.8.0](https://github.com/Cratis/cli/releases/tag/v2.8.0)): Tables collapsed to a few rows instead of filling the height, and the store and namespace pickers opened as a box that was mostly chrome
- **cli** ([Release v2.8.0](https://github.com/Cratis/cli/releases/tag/v2.8.0)): A sorted table that refreshes can't reach the comparer that throws `At least one object must implement IComparable` — every column gets a typed comparer when the table is built (#47)
- **Screenplay** ([Release v2.6.1](https://github.com/Cratis/Screenplay/releases/tag/v2.6.1)): The build no longer fails with `CS9057` when the SDK's code-style analyzers are built against a newer Roslyn than the pinned compiler
- **Arc** ([Release v21.17.0](https://github.com/Cratis/Arc/releases/tag/v21.17.0)): `StoryContainer`, `StorySection`, `StoryGrid`, `StoryDivider` and `StoryBadge` rendered as unstyled block elements in every consumer — the package emitted `story-*` class names and shipped no CSS defining them (#2544)
- **Studio** ([Release v0.66.11](https://github.com/Cratis/Studio/releases/tag/v0.66.11)): Reconfiguring an AI provider (OpenAI, Anthropic, Azure OpenAI) no longer requires re-entering its API key just to change the name or endpoint — leaving the key field blank now keeps the previously stored key.
- **Studio** ([Release v0.66.11](https://github.com/Cratis/Studio/releases/tag/v0.66.11)): The endpoint URL is now trimmed before saving an AI provider, so leading or trailing whitespace from a paste no longer causes a save to fail its validation.
- **Studio** ([Release v0.66.10](https://github.com/Cratis/Studio/releases/tag/v0.66.10)): Clicking a different topic in the top-level event model chat now correctly loads that topic's conversation, instead of always showing whichever topic was opened first.
- **Studio** ([Release v0.66.9](https://github.com/Cratis/Studio/releases/tag/v0.66.9)): Organizations, Announcements, and Invitations tables now scroll correctly with a pinned header when their row count overflows the visible area, instead of silently clipping extra rows with no scrollbar.
- **Studio** ([Release v0.66.8](https://github.com/Cratis/Studio/releases/tag/v0.66.8)): Exporting an event model now writes a reactor for an Automation or Translator slice, triggering on the events the slice reacts to, instead of writing a slice that says it reacts to nothing
- **Studio** ([Release v0.66.7](https://github.com/Cratis/Studio/releases/tag/v0.66.7)): An event a slice consumes from another slice now carries the shape the producing slice declares, so a read model built from it is projected on a real key instead of a constant that collapsed every instance of the model into one
- **Studio** ([Release v0.66.6](https://github.com/Cratis/Studio/releases/tag/v0.66.6)): The Endpoint field in the "Add AI provider" dialog now accepts input correctly after switching the provider type (e.g. to OpenAI-compatible or Azure OpenAI).
- **Arc** ([Release v21.15.0](https://github.com/Cratis/Arc/releases/tag/v21.15.0)): Screenplay options are resolved once, at whichever entry point sees them first, so emitting a model directly and reaching the same model through a generation no longer resolve the domain name against two different fallbacks (#2401)
- **Studio** ([Release v0.66.5](https://github.com/Cratis/Studio/releases/tag/v0.66.5)): Table headers on Pricing (and any other list page backed by a snapshot query) now genuinely stay pinned while scrolling, instead of scrolling away with the rows.
- **Chronicle** ([Release v16.33.1](https://github.com/Cratis/Chronicle/releases/tag/v16.33.1)): Manual PII release falls back to the read model `Id` when its `[Subject]` member is null or `NotSet`, and warns when no usable subject exists. (#3708)
- **Studio** ([Release v0.66.4](https://github.com/Cratis/Studio/releases/tag/v0.66.4)): Vault navigation now actually works - clicking into a folder refreshes the listed entries instead of leaving the previous folder's contents on screen forever.
- **Studio** ([Release v0.66.4](https://github.com/Cratis/Studio/releases/tag/v0.66.4)): Vault's folder and secret tables now scroll internally instead of overflowing the page.
- **Studio** ([Release v0.66.4](https://github.com/Cratis/Studio/releases/tag/v0.66.4)): The action toolbar and table now line up on the same edges on every list page (Organizations, Announcements, Invitations, Pricing), matching Chronicle Workbench's layout.
- **Studio** ([Release v0.66.4](https://github.com/Cratis/Studio/releases/tag/v0.66.4)): Pricing's table header now stays pinned while scrolling instead of scrolling away with the rows.
- **Studio** ([Release v0.66.2](https://github.com/Cratis/Studio/releases/tag/v0.66.2)): Trials are reported to Admin again. Onboarding produces the trial and the organization's identity by different routes, and the trial nearly always arrives first — so reporting only when the trial arrived reported nothing at all, for every organization onboarded. Whichever fact arrives last now does the reporting (Cratis/StudioIssues#152)
- **Studio** ([Release v0.66.2](https://github.com/Cratis/Studio/releases/tag/v0.66.2)): Sign-up addresses in the organization listing are readable again. They are read through the kernel, which is where an address is decrypted and where the subject that owns it is known — an address is sealed under the identity the person signed in with, not under the row it sits on (Cratis/Chronicle#3708)
- **Chronicle** ([Release v16.33.0](https://github.com/Cratis/Chronicle/releases/tag/v16.33.0)): Event Types view pagination that limited display to 20 items and broke column filtering (#3396)
- **Arc** ([Release v21.14.3](https://github.com/Cratis/Arc/releases/tag/v21.14.3)): Fixed the TypeScript proxy generator producing a different module layout for the same C# source depending on whether the project was built Debug or Release — an enum declared in its own file could end up as its own module in one configuration and folded into a neighbouring module in the other, with whichever configuration was built last deleting the other's output from disk (#2547)
- **Stage** ([Release v2.4.0](https://github.com/Cratis/Stage/releases/tag/v2.4.0)): Consuming the renderer no longer contributes 28 global usings to the consuming project, which made `User`, `AppendedEvent`, `CommandContext` and `ObserverRunningState` ambiguous — 160 compilation errors in the CLI alone. (#34)
- **Stage** ([Release v2.4.0](https://github.com/Cratis/Stage/releases/tag/v2.4.0)): Consuming the renderer no longer brings the Arc, Chronicle and MongoDB runtime it generates code *for*, nor a `NuGet.Frameworks` that stops `Microsoft.Build.Locator` from running. A host can now render and use MSBuild in the same process. (#34, #18)
- **Studio** ([Release v0.65.7](https://github.com/Cratis/Studio/releases/tag/v0.65.7)): Importing a Screenplay document no longer gives an Automation or Translator slice a command named after the slice when the document declares none, so exporting the model again writes the slice as the reactor slice it is instead of a command the document never contained.
- **cli** ([Release v2.6.2](https://github.com/Cratis/cli/releases/tag/v2.6.2)): `cratis screenplay generate` no longer captures projections declared inside specifications as though the application shipped them, which made a read model appear to be built more than once and stopped the generated document from compiling.
- **Arc** ([Release v21.14.2](https://github.com/Cratis/Arc/releases/tag/v21.14.2)): A type a specification declares is no longer captured as an artifact the application ships. A fixture declared to assert something about a contract is Debug-only and stripped from any deployed build, and where it stands in for a real artifact — a second projection over a read model that already has one — the captured document said the read model was built twice, which is not legal Screenplay, so the document did not compile and nothing downstream could read it.
- **Chronicle** ([Release v16.30.1](https://github.com/Cratis/Chronicle/releases/tag/v16.30.1)): `Tls.SkipCertificateValidation` and the connection string's `skipTlsValidation` no longer combine so that an omitted value overrides an explicit one — either setting alone is now enough to turn certificate validation on, and an omitted second setting can never silently turn it back off (#3606)
- **Chronicle** ([Release v16.30.1](https://github.com/Cratis/Chronicle/releases/tag/v16.30.1)): A client connecting to a development kernel no longer fails the TLS handshake and then crashes with `ObjectDisposedException` on `Grpc.Net.Client.GrpcChannel` at the first call after the connect timeout
- **Studio** ([Release v0.65.6](https://github.com/Cratis/Studio/releases/tag/v0.65.6)): The Kubernetes dashboard now signs you in on its own host instead of redirecting you to Admin and leaving you there.
- **Studio** ([Release v0.65.6](https://github.com/Cratis/Studio/releases/tag/v0.65.6)): A cookie set for `.admin.cratis.studio` is not sent to `console.cratis.studio`, so the dashboard is never authenticated no matter how many times you sign in.
- **Studio** ([Release v0.65.6](https://github.com/Cratis/Studio/releases/tag/v0.65.6)): oauth2-proxy refuses an `rd=` redirect to a domain outside its `--whitelist-domain`, and falls back to its own — which is Admin. That is the redirect you land on.
- **Chronicle** ([Release v16.29.1](https://github.com/Cratis/Chronicle/releases/tag/v16.29.1)): `IReadModels.GetInstances<TReadModel>()` now releases (decrypts) `[PII]`-protected values for materialized (sink-backed projection) read models, matching `GetInstanceById<TReadModel>` and the reducer/passive branch of `GetInstances`. Previously, calling `GetInstances` on a projected read model with PII properties returned ciphertext silently. (#3703)
- **Studio** ([Release v0.65.5](https://github.com/Cratis/Studio/releases/tag/v0.65.5)): An organization's trial now counts toward its seats. Every trial was read back with no organization on it, so the seat count could not match a single one and organizations on a trial showed zero allocated against one in use.
- **Studio** ([Release v0.65.5](https://github.com/Cratis/Studio/releases/tag/v0.65.5)): The trial and legal-terms panels on an organization now show their content. Both queries filtered on the property that was arriving empty, so they matched nothing.
- **Studio** ([Release v0.65.5](https://github.com/Cratis/Studio/releases/tag/v0.65.5)): An organization's subscription standing had the same defect and is corrected with them.
- **Studio** ([Release v0.65.3](https://github.com/Cratis/Studio/releases/tag/v0.65.3)): One unusable trial no longer empties the Admin organization listing. Keying the trials threw on a trial with no organization on it, from inside the enrichment that every emission of the listing passes through, so a single bad row blanked the whole page rather than costing its own organization a seat count. A duplicate trial for an organization already seen would have done the same.
- **Arc** ([Release v21.14.1](https://github.com/Cratis/Arc/releases/tag/v21.14.1)): The proxy generator releases its metadata load context when initialization fails part way through, instead of leaking it and its assembly resolving handler until the next run
- **Arc** ([Release v21.14.1](https://github.com/Cratis/Arc/releases/tag/v21.14.1)): The proxy generator no longer fails when more than one copy of `Cratis.Arc.Core` is loaded while resolving handler declarations outside the current project graph
- **Studio** ([Release v0.65.2](https://github.com/Cratis/Studio/releases/tag/v0.65.2)): A command property that is optional on the server now generates as optional in the TypeScript proxy — `DateOnly | undefined` rather than `DateOnly`. The proxies previously asserted that every such value was always present, so nothing warned about reading one that was not.
- **Studio** ([Release v0.65.0](https://github.com/Cratis/Studio/releases/tag/v0.65.0)): **An organization registered through self-service now records the address it was signed up with.** It read the address from an `email` claim that the header-only identity path never supplies, so nothing was recorded at all — which is why this column would otherwise have been blank for exactly those organizations. The address is now taken from whichever claim the provider actually carries, falling back to the forwarded user details. (Cratis/StudioIssues#145)
- **Stage** ([Release v2.3.0](https://github.com/Cratis/Stage/releases/tag/v2.3.0)): A `$context` path in a `produces` mapping is rendered against what the enclosing artifact actually receives, so a rendered application compiles. A command handler receives Arc's `CommandContext`, which carries none of `Occurred`, `Identity`, `Tenant`, `CausedBy` or `Causation` — those belong to Screenplay's own context type — and rendering them as members of it produced 15 compilation errors on the language's own `invoicing.play`. The handler now asks the runtime for what the document reads: the tenant from `ITenantIdAccessor`, the caller from `IIdentityProvider`, roles and claims from `ICurrentPrincipalAccessor`, the cause from `ICausationManager`, and `$context.occurred` from the clock. (#32)
- **Stage** ([Release v2.3.0](https://github.com/Cratis/Stage/releases/tag/v2.3.0)): A context value the document maps onto a property that cannot hold it — the runtime's string tenant onto a `Uuid` concept — is dropped and reported instead of rendered into a conversion that does not exist. (#32)
- **Stage** ([Release v2.3.0](https://github.com/Cratis/Stage/releases/tag/v2.3.0)): A command handler reading `$eventContext` or `$eventSourceId`, which it runs too early to have, is reported rather than rendered. (#32)
- **Studio** ([Release v0.64.0](https://github.com/Cratis/Studio/releases/tag/v0.64.0)): **A new organization shows the seats it actually has.** Its trial is now recorded against the tenant name, so it no longer depends on Admin having already registered the organization at the moment Core reports it. (Cratis/StudioIssues#140)
- **Studio** ([Release v0.64.0](https://github.com/Cratis/Studio/releases/tag/v0.64.0)): **An organization's acceptance of the legal terms during onboarding is recorded.** Every onboarding acceptance so far was lost to the same race. (Cratis/StudioIssues#140)
- **Studio** ([Release v0.64.0](https://github.com/Cratis/Studio/releases/tag/v0.64.0)): **Registering an organization yourself grants the trial seat**, as accepting an invitation already did. A self-registered owner previously ended up with no seat at all, and so no license. (Cratis/StudioIssues#140)
- **Studio** ([Release v0.64.0](https://github.com/Cratis/Studio/releases/tag/v0.64.0)): **A cancelled subscription reaches Admin**, where previously only purchases did. (Cratis/StudioIssues#140)
- **Arc** ([Release v21.14.0](https://github.com/Cratis/Arc/releases/tag/v21.14.0)): `formRef` documentation no longer implies an inline callback ref attaches only once; it attaches on every render, so a stable ref is required (#2497)
- **Chronicle** ([Release v16.27.0](https://github.com/Cratis/Chronicle/releases/tag/v16.27.0)): Schema validation now checks property value types, so a payload whose value does not match its declared type is rejected at append instead of being reported as valid (#3613)
- **Chronicle** ([Release v16.27.0](https://github.com/Cratis/Chronicle/releases/tag/v16.27.0)): An object schema handed a non-object value now reports a wrong-property-type error; the check was inverted and fired only when the schema did not want an object (#3613)
- **Chronicle** ([Release v16.26.3](https://github.com/Cratis/Chronicle/releases/tag/v16.26.3)): `ReadModelScenario` no longer drops a child collection when one event type both maps parent fields and feeds a child projection, in both the `Children(...).From<T>` and `AddChild(...)` forms and for model-bound `[ChildrenFrom<T>]` (#3689)
- **Arc** ([Release v21.13.0](https://github.com/Cratis/Arc/releases/tag/v21.13.0)): The unknown tenant-resolver-type error now lists `Subdomain` and `Fixed`, which it omitted (#2478)
- **Studio** ([Release v0.63.1](https://github.com/Cratis/Studio/releases/tag/v0.63.1)): **Sub-features are nested under their parent again.** A parent heads a row that spans its sub-features, and the sub-features are headed in the row beneath it, as before 0.61.1. (Cratis/StudioIssues#142)
- **Studio** ([Release v0.63.1](https://github.com/Cratis/Studio/releases/tag/v0.63.1)): **The few pixels of indent are gone.** A feature that owns sub-features and has no slices of its own takes up no width, but was still laid out as a column — and an empty column still takes the gap after it, pushing every sub-feature 8 pixels right of the header above them. Such a feature no longer takes a column, so a sub-feature's slices line up with the parent heading them. (Cratis/StudioIssues#142)
- **Chronicle** ([Release v16.26.2](https://github.com/Cratis/Chronicle/releases/tag/v16.26.2)): Kernel event types are re-registered for the `System` event store after `ResetKernelState()`, so the kernel's own events — such as `ApplicationAuthenticated` on every authentication — keep appending instead of failing with `MissingEventSchemaForEventType` for the rest of the kernel's lifetime (#3687)
- **Chronicle** ([Release v16.26.2](https://github.com/Cratis/Chronicle/releases/tag/v16.26.2)): `ReadModelScenario<T>` isolates each read model instance's state by event source, so `[ChildrenFrom]` children no longer accumulate onto a document seeded later in the same scenario (#3688)
- **Chronicle** ([Release v16.26.1](https://github.com/Cratis/Chronicle/releases/tag/v16.26.1)): `Source/Kernel/Contracts` builds in Release again — `protobuf-net.BuildTools` 3.3.8 asks for a `[ProtoModel]` partial class, but that attribute is protobuf-net 3.3+ and `protobuf-net.Grpc` 1.2.2 holds the runtime below it, so the diagnostic is now opted out of with a note to adopt compile-time serializers deliberately once the runtime moves up (#3696)
- **Arc** ([Release v21.12.1](https://github.com/Cratis/Arc/releases/tag/v21.12.1)): `waitForFirstResult=true` on a MongoDB collection-backed observable query now resolves on the initial query result instead of the empty seed emission that preceded it (#2535)
- **Arc** ([Release v21.12.1](https://github.com/Cratis/Arc/releases/tag/v21.12.1)): A subscriber that connects to a MongoDB observable query after its initial query completed now receives that result, rather than waiting for the next change
- **Arc** ([Release v21.12.0](https://github.com/Cratis/Arc/releases/tag/v21.12.0)): Generated TypeScript import statements for generic types now reference the correct proxy file name
- **Stage** ([Release v2.2.1](https://github.com/Cratis/Stage/releases/tag/v2.2.1)): A command validation rule stated against a value the application resolves while it runs — `dueDate > today`, or a threshold naming another property — is no longer carried with a substituted operand. Screenplay allows it, a Stage rule holds a fixed value, and the conversion filled the gap with `0` (or, for `matches`, an empty pattern), so `dueDate > today` became "greater than zero". The rule is dropped instead, leaving a caller free to report what was not carried rather than reading a rule the document never stated.
- **Arc** ([Release v21.10.0](https://github.com/Cratis/Arc/releases/tag/v21.10.0)): A client-composed validation failure no longer loses its reason, which had reported every such result as an authored rule (#2487)
- **Studio** ([Release v0.61.1](https://github.com/Cratis/Studio/releases/tag/v0.61.1)): **A slice added to a sub-feature appears.** The read model kept features in a tree, and a slice belonging to a sub-feature had a parent the projection could not reach — so the slice was never projected, with no error anywhere to say so. Features are now kept flat and the tree is rebuilt when the model is read. (Cratis/StudioIssues#142)
- **Studio** ([Release v0.61.1](https://github.com/Cratis/Studio/releases/tag/v0.61.1)): **Removing a sub-feature removes it properly.** Feature removal walked the tree from an un-rebuilt model, so a sub-feature was left behind on the module instead of being removed. (Cratis/StudioIssues#142)
- **Studio** ([Release v0.61.1](https://github.com/Cratis/Studio/releases/tag/v0.61.1)): **A feature with work under way in a sub-feature can no longer be removed.** The guard that refuses to remove a feature that already has slices stopped seeing slices that live in its sub-features. (Cratis/StudioIssues#142)
- **Studio** ([Release v0.61.1](https://github.com/Cratis/Studio/releases/tag/v0.61.1)): **An agent asked about a feature or a module now sees its sub-features.** Sub-feature names were missing from the conversation context entirely, and sub-features were described as though they sat at the top level. (Cratis/StudioIssues#142)
- **Studio** ([Release v0.61.0](https://github.com/Cratis/Studio/releases/tag/v0.61.0)): **The content of pill-shaped buttons is centered.** An unlayered rule gave every button in the application a gap between its icon and its label, and PrimeReact keeps a zero-width hidden label on an icon-only button — so the gap was reserved next to something invisible and the icon sat exactly half a gap left of centre. (Cratis/StudioIssues#138)
- **Studio** ([Release v0.61.0](https://github.com/Cratis/Studio/releases/tag/v0.61.0)): **Deleting an invitation does something.** The confirmation dialog it asked for was never rendered, because the dialog components it needs were not registered, so the click appeared to do nothing at all. (Cratis/StudioIssues#139)
- **Studio** ([Release v0.61.0](https://github.com/Cratis/Studio/releases/tag/v0.61.0)): **The Admin organization list shows last activity immediately.** The value came from a second query joined in the browser, so on first render every row read "No activity" — a definite answer rather than a loading state — and only looked right after navigating away and back, when a client-side cache happened to be warm. Last activity now arrives with the organization it belongs to, so a row cannot render before it. Reading it is also no longer proportional to the number of tenants. (Cratis/StudioIssues#144)
- **Studio** ([Release v0.60.0](https://github.com/Cratis/Studio/releases/tag/v0.60.0)): **Onboarding tells you a name is taken while you can still change it.** The invite and registration wizards validate against the server as you leave a field, and the rejection now lands on the organization-name field and its step rather than arriving as an unexplained failure on Create organization. The duplicate-name check itself never actually ra
- **Studio** ([Release v0.59.5](https://github.com/Cratis/Studio/releases/tag/v0.59.5)): **Legal documents were unavailable outside a container.** `LegalDocuments` resolved the `Legal` folder from the content root. In a container that happens to equal the application's base directory, so production worked, but anywhere else the content root is the project folder — where the only `Legal` folder holds frontend sources — so the startup check passed and every read of the legal version threw. It now resolves from the base directory, which is where the build actually places the folder.
- **Studio** ([Release v0.59.5](https://github.com/Cratis/Studio/releases/tag/v0.59.5)): The runner image pinned the .NET SDK to a channel rather than an exact version, so it would have drifted out of the band `global.json` accepts and broken every backend build once a new feature band shipped.
- **Studio** ([Release v0.59.5](https://github.com/Cratis/Studio/releases/tag/v0.59.5)): `pkill` was missing from the runner image, so the cleanup step that reaps leftover processes silently did nothing on every CI run.
- **Arc** ([Release v21.9.2](https://github.com/Cratis/Arc/releases/tag/v21.9.2)): Report `SP0030` for a property whose type is an interface or an abstract class. The document names such a type without ever declaring it, and until now nothing said so — only a constructed generic or a type parameter was recognised, and a contract matched neither. (#2527)
- **Arc** ([Release v21.9.1](https://github.com/Cratis/Arc/releases/tag/v21.9.1)): Start a Development application that uses a Chronicle command response value. Arc's discovered extension points were resolved from the root service provider, so a handler depending on the scoped `IEventLog` could not be created once the host turned scope validation on, and every such command threw. (#2505)
- **Arc** ([Release v21.9.1](https://github.com/Cratis/Arc/releases/tag/v21.9.1)): Resolve command filters, command execution scopes and query filters from the scope the work runs in, so an implementation of any of these that depends on a scoped service works instead of throwing in Development. (#2505)
- **Studio** ([Release v0.59.4](https://github.com/Cratis/Studio/releases/tag/v0.59.4)): Importing a Screenplay document now reports every validation rule the canvas will not carry, instead of dropping it in silence: a rule the canvas has no equivalent for (`==`, `!=`, `all >`, `all >=`, `rule`), and a rule the canvas does have but stated against another property rather than a fixed value. A property whose rules were all dropped disappeared with them, so a command could arrive validating less than the document says - or nothing at all - with nothing on screen to say so. (Cratis/StudioIssues#52)
- **Studio** ([Release v0.59.3](https://github.com/Cratis/Studio/releases/tag/v0.59.3)): The import preview now shows the validation rules a document declares for a command; they were mapped for the import itself but never for the preview of it, so a command with rules previewed as having none.
- **Studio** ([Release v0.59.3](https://github.com/Cratis/Studio/releases/tag/v0.59.3)): The import preview now shows a document's Given/When/Then specifications, including the ones whose Given names an event produced by a different module; the preview always showed a slice as having no specifications at all.
- **Studio** ([Release v0.59.3](https://github.com/Cratis/Studio/releases/tag/v0.59.3)): The import preview now orders a feature's slices the way the import adds them - every producer before the slices that read it - instead of in document order, which is an order the import never produces.
- **Studio** ([Release v0.59.2](https://github.com/Cratis/Studio/releases/tag/v0.59.2)): Importing a `.play` document keeps the uniqueness constraints it declares. A `unique event` or `unique <property> on <event>` constraint now lands on the event it names and is written back out on export, where before it survived the export direction only. (Cratis/StudioIssues#129)
- **Studio** ([Release v0.59.2](https://github.com/Cratis/Studio/releases/tag/v0.59.2)): The import preview shows the constraints an import will apply, matching what committing it actually produces.
- **Studio** ([Release v0.59.1](https://github.com/Cratis/Studio/releases/tag/v0.59.1)): Importing a `.play` document and exporting it back produces a document the Screenplay compiler accepts. A read model reading from an event no slice on the canvas owns is now written back out with that event, and a read model the canvas holds no events for is written out without a projection instead of with an empty one that fails to compile. Code generation, "play this model" and "run specifications" all read the exported document, so all three failed on any model with either shape. (Cratis/StudioIssues#129)
- **Studio** ([Release v0.59.1](https://github.com/Cratis/Studio/releases/tag/v0.59.1)): The import no longer reports a slice's specifications as left behind — it carries every one of them.
- **Arc** ([Release v21.6.3](https://github.com/Cratis/Arc/releases/tag/v21.6.3)): Generating from a single project again names the document after that project, instead of falling back to the neutral default. Handing over the projects it references made the application several projects, and several projects are named by none of them (#2521)
- **Stage** ([Release v2.1.0](https://github.com/Cratis/Stage/releases/tag/v2.1.0)): A binary break in a published contract now fails the build instead of surfacing as a missing-method fault in a consumer at run time.
- **Stage** ([Release v2.0.2](https://github.com/Cratis/Stage/releases/tag/v2.0.2)): Rendering now reports a `readmodel` and a `reducer` it does not render, instead of dropping them silently. A slice declaring either previously rendered an application that looked complete while nothing held or populated the state they declare.
- **Arc** ([Release v21.6.2](https://github.com/Cratis/Arc/releases/tag/v21.6.2)): Generating a Screenplay document no longer fails with `SyntaxTree is not part of the compilation` on an application written as several projects. A scenario naming a value another project declares - a sentinel identity, a well known identity, a member of an enumeration - is now read through the project that actually holds it, so it is recognized for what it is instead of taking generation down with it (#2521)
- **Arc** ([Release v21.6.2](https://github.com/Cratis/Arc/releases/tag/v21.6.2)): A value a scenario states that no handed-over project declares is now left unrecovered and reported, rather than throwing (#2521)
- **Stage** ([Release v2.0.1](https://github.com/Cratis/Stage/releases/tag/v2.0.1)): Restored the Release build, which stopped compiling when Roslynator 4.16.0 promoted `RCS1258` to flag a redundant `TypeAttributes.Class` flag. The flag is zero, so the emitted dynamic read-model and command types are unchanged.
- **Studio** ([Release v0.59.0](https://github.com/Cratis/Studio/releases/tag/v0.59.0)): Removing an AI provider now takes it off every agent that was configured with it, instead of leaving agents pointing at a provider that no longer exists (Cratis/StudioIssues#121)
- **Studio** ([Release v0.59.0](https://github.com/Cratis/Studio/releases/tag/v0.59.0)): Generating a project no longer fails when the name it picks is already taken — it continues under the next free numbered name (Cratis/StudioIssues#115)
- **Studio** ([Release v0.59.0](https://github.com/Cratis/Studio/releases/tag/v0.59.0)): Generating no longer covers a board in duplicate UI and system actors. A collection gets one of each, however many slices are generated into it (Cratis/StudioIssues#122)
- **Studio** ([Release v0.59.0](https://github.com/Cratis/Studio/releases/tag/v0.59.0)): A generated state view slice now names the events its read model is built from, rather than arriving as a read model nothing can populate (Cratis/StudioIssues#122)
- **Studio** ([Release v0.59.0](https://github.com/Cratis/Studio/releases/tag/v0.59.0)): Bug reports filed from Studio carry the identifiers the failure can be traced by: a generation reports its request and correlation id, a failed chat turn reports the comment it failed on (Cratis/StudioIssues#117)
- **Studio** ([Release v0.59.0](https://github.com/Cratis/Studio/releases/tag/v0.59.0)): Reports are filed under the Bug issue type instead of adding a bug label (Cratis/StudioIssues#113)
- **Studio** ([Release v0.59.0](https://github.com/Cratis/Studio/releases/tag/v0.59.0)): The translat
- **Arc** ([Release v21.6.1](https://github.com/Cratis/Arc/releases/tag/v21.6.1)): A generated command proxy declares an optional property as optional, so its accessors carry `| undefined` instead of claiming a value is always present (#2494)
- **Chronicle** ([Release v16.25.0](https://github.com/Cratis/Chronicle/releases/tag/v16.25.0)): An Aspire AppHost that configures Chronicle for production now runs the production image, instead of the development image that ships development credentials and an anonymous state-reset endpoint (#3607)
- **Chronicle** ([Release v16.25.0](https://github.com/Cratis/Chronicle/releases/tag/v16.25.0)): A TLS certificate without a password now loads, instead of failing the server's startup with a cryptographic error
- **Chronicle** ([Release v16.25.0](https://github.com/Cratis/Chronicle/releases/tag/v16.25.0)): A certificate path that does not exist now fails the AppHost immediately, instead of producing a container that reports itself running while its process has died (#3607)
- **Chronicle** ([Release v16.25.0](https://github.com/Cratis/Chronicle/releases/tag/v16.25.0)): Configuring either certificate twice now replaces the earlier call, instead of producing a container Docker refuses to start (#3607)
- **Arc** ([Release v21.6.0](https://github.com/Cratis/Arc/releases/tag/v21.6.0)): An apex domain no longer resolves to a tenant named after the site (#2471)
- **Arc** ([Release v21.6.0](https://github.com/Cratis/Arc/releases/tag/v21.6.0)): An IPv4 or IPv6 literal is no longer read as a tenant, in any spelling (#2471)
- **Arc** ([Release v21.6.0](https://github.com/Cratis/Arc/releases/tag/v21.6.0)): `IHttpRequestContext.Host` no longer truncates an IPv6 literal to its opening bracket (#2471)
- **Chronicle** ([Release v16.24.1](https://github.com/Cratis/Chronicle/releases/tag/v16.24.1)): Applying or releasing compliance no longer fails with `CompliancePropertyNotFoundInSchema` when a read model or event carries a `[PII]` value alongside a geospatial `Point`, `LineString` or `Polygon`; the geospatial value is left in the clear (#3673)
- **Studio** ([Release v0.58.13](https://github.com/Cratis/Studio/releases/tag/v0.58.13)): Accepting an invitation now records the identity provider and subject the person actually signed in with. Opening the same invitation more than once - an abandoned attempt through one provider, then a second through another - made an earlier session win, associating the new account with a login the person never used and leaving them denied access to the organization they had just created.
- **Studio** ([Release v0.58.13](https://github.com/Cratis/Studio/releases/tag/v0.58.13)): A sign-in through Google, Microsoft or Apple is attributed to the right provider. Federated logins reported nothing that named their provider, and were resolved to GitHub.
- **Studio** ([Release v0.58.13](https://github.com/Cratis/Studio/releases/tag/v0.58.13)): Linking an additional identity records the provider the credential actually belongs to.
- **Studio** ([Release v0.58.13](https://github.com/Cratis/Studio/releases/tag/v0.58.13)): The join-an-organization wizard shows the terms and conditions step. It jumped from personal information straight to an error saying the terms had not been accepted, without ever displaying them.
- **Studio** ([Release v0.58.13](https://github.com/Cratis/Studio/releases/tag/v0.58.13)): Not accepting the terms when creating an organization reports the rejection once instead of twice.
- **Studio** ([Release v0.58.13](https://github.com/Cratis/Studio/releases/tag/v0.58.13)): Finishing an invitation no longer asks for a second sign-in on arrival at Studio. The person is taken to the provider they just registered with.
- **Components** ([Release v2.8.0](https://github.com/Cratis/Components/releases/tag/v2.8.0)): `StepperCommandDialog` no longer offers to cancel a command it has already committed to running, so an operator can no longer be told a write was cancelled while it lands
- **Components** ([Release v2.8.0](https://github.com/Cratis/Components/releases/tag/v2.8.0)): The header close and `Escape` are withdrawn while a `StepperCommandDialog` command is running, matching the footer Cancel
- **AuthProxy** ([Release v2.17.5](https://github.com/Cratis/AuthProxy/releases/tag/v2.17.5)): An invitation link no longer asks for an identity provider a second time after signing in, and completes on the first attempt.
- **AuthProxy** ([Release v2.17.5](https://github.com/Cratis/AuthProxy/releases/tag/v2.17.5)): `/invite` and `/register` are answered by the invitation and registration flows in every deployment, instead of being redirected to provider selection wherever a catch-all route covers them.
- **Arc** ([Release v21.5.0](https://github.com/Cratis/Arc/releases/tag/v21.5.0)): `useQuery` settles as unsuccessful when a query fails in transport, carrying the exception message, instead of reporting that it is still performing forever (#2473)
- **Arc** ([Release v21.5.0](https://github.com/Cratis/Arc/releases/tag/v21.5.0)): An aborted, superseded query request can no longer settle over the newer request that replaced it (#2473)
- **Arc** ([Release v21.5.0](https://github.com/Cratis/Arc/releases/tag/v21.5.0)): `CommandForm` no longer lets an `initialValues` key holding `undefined` overwrite a value that `currentValues` resolved (#2493)
- **AuthProxy** ([Release v2.17.4](https://github.com/Cratis/AuthProxy/releases/tag/v2.17.4)): Accepting an invitation no longer shows a second provider-selection page: the invitation now completes on the provider sign-in callback itself, so it no longer depends on the browser presenting the fresh session cookie on the follow-up request.
- **AuthProxy** ([Release v2.17.4](https://github.com/Cratis/AuthProxy/releases/tag/v2.17.4)): After a completed invitation, the sign-in redirects straight to the lobby for a create-organization invitation and to the original return URL for a tenant-issued one; a failed exchange on the callback answers with the same page or redirect the post-login exchange produces.
- **AuthProxy** ([Release v2.17.4](https://github.com/Cratis/AuthProxy/releases/tag/v2.17.4)): A browser replaying the invitation URL or a stale pending-invitation cookie after completion is recognized as already answered instead of being offered provider selection again or re-running the exchange.
- **Chronicle** ([Release v16.24.0](https://github.com/Cratis/Chronicle/releases/tag/v16.24.0)): PII is now released on the non-generic `IReadModels.GetInstanceById(Type, ...)` for reducer-backed read models, which is how reactors resolve read model parameters — it previously returned encrypted values (#3605)
- **Chronicle** ([Release v16.24.0](https://github.com/Cratis/Chronicle/releases/tag/v16.24.0)): A read model instance request for a reducer-backed read model is made against the event sequence that reducer reduces from, rather than always the event log (#3605)
- **AuthProxy** ([Release v2.17.3](https://github.com/Cratis/AuthProxy/releases/tag/v2.17.3)): Accepting an invitation no longer loops back to provider selection after a successful sign-in: the completion gate now accepts any session that was signed in while the invitation was pending — the person's deliberate choice for it — and only a session that predates the invitation is taken through provider selection. This repairs the regression 2.17.2 introduced for deployments where the challenge's capability binding does not survive the provider round trip.
- **Chronicle** ([Release v16.23.0](https://github.com/Cratis/Chronicle/releases/tag/v16.23.0)): The duplicate context-mapping diagnostic now reports two `[SetFromContext<T>]` for one event type split across a positional record's parameter and its generated property (#3626)
- **Chronicle** ([Release v16.23.0](https://github.com/Cratis/Chronicle/releases/tag/v16.23.0)): `[EventSourceType]` and `[EventStreamType]` no longer document a placement on an event type that nothing reads (#3642)
- **Studio** ([Release v0.58.12](https://github.com/Cratis/Studio/releases/tag/v0.58.12)): Completing organization or user setup no longer lands on a second provider-selection page: entering Studio signs the user in with the provider they just used, as a silent round trip.
- **Studio** ([Release v0.58.12](https://github.com/Cratis/Studio/releases/tag/v0.58.12)): Dropdowns inside dialogs — the Add AI Provider dialog above all — no longer hide their options behind the dialog.
- **Studio** ([Release v0.58.11](https://github.com/Cratis/Studio/releases/tag/v0.58.11)): Team-driven project access now works inside an organization: adding a user to a team grants them the team's projects, and granting a team a project grants it to every member. The reactor previously read teams and issued grants through the Default namespace, so inside an organization it never found the team and no access was ever granted.
- **Studio** ([Release v0.58.11](https://github.com/Cratis/Studio/releases/tag/v0.58.11)): The renamed observer replays the event log on deploy, backfilling the project access that existing team memberships and team grants should have produced.
- **Studio** ([Release v0.58.10](https://github.com/Cratis/Studio/releases/tag/v0.58.10)): "Generate with AI" no longer fails with "Timed out while waiting for the default event model to be created" — a new application now gets its default domain and default event model inside the organization it was created in, instead of them being written into a namespace no one reads.
- **Studio** ([Release v0.58.10](https://github.com/Cratis/Studio/releases/tag/v0.58.10)): Every application created from the UI gets its default domain and event model in its own organization, so the event model opens instead of coming up empty.
- **Studio** ([Release v0.58.10](https://github.com/Cratis/Studio/releases/tag/v0.58.10)): A generation that does time out now says which project, application and namespace it was waiting on.
- **AuthProxy** ([Release v2.17.2](https://github.com/Cratis/AuthProxy/releases/tag/v2.17.2)): An invitation is now completed only with the identity that authenticated for that invitation. A session the browser was already carrying — from an earlier sign-in, possibly with a different provider — no longer completes a pending invitation, so an organization can no longer be bound permanently to an account the person did not choose for it.
- **AuthProxy** ([Release v2.17.2](https://github.com/Cratis/AuthProxy/releases/tag/v2.17.2)): A caller who is already signed in and opens an invitation link is now always shown the invitation provider-selection page, including where only a single identity provider is configured, and the invitation completes with the identity that comes back from the provider they pick.
- **AuthProxy** ([Release v2.17.2](https://github.com/Cratis/AuthProxy/releases/tag/v2.17.2)): A pending invitation is left in place when it cannot yet be completed, so it stays valid for the lifetime of the `.cratis-invite` cookie instead of being consumed by the wrong session.
- **AuthProxy** ([Release v2.17.2](https://github.com/Cratis/AuthProxy/releases/tag/v2.17.2)): Invite-token re-validation at the post-login exchange is unchanged: a forged, expired, or otherwise invalid capability is still refused with `invitation-invalid.html` / `invitation-expired.html` and cleared from the browser before anything else is decided.
- **Studio** ([Release v0.58.8](https://github.com/Cratis/Studio/releases/tag/v0.58.8)): Generating with AI no longer loses the whole result when the model's answer is cut off mid-value — the truncated response is repaired and everything the model did produce is used. This is what the built-in fallback model does on larger blueprints.
- **Studio** ([Release v0.58.7](https://github.com/Cratis/Studio/releases/tag/v0.58.7)): An agent that fails while answering a comment no longer leaves a raw provider error sitting in the thread as if it were the agent's opinion — the turn now reads as a plain line saying the agent could not answer (#106)
- **Studio** ([Release v0.58.7](https://github.com/Cratis/Studio/releases/tag/v0.58.7)): The typing indicator no longer keeps running when the agent's turn already ended in failure (#106)
- **Studio** ([Release v0.58.6](https://github.com/Cratis/Studio/releases/tag/v0.58.6)): A failed generation now keeps showing its error and red border instead of clearing them the instant the generation stopped. (#105)
- **Studio** ([Release v0.58.6](https://github.com/Cratis/Studio/releases/tag/v0.58.6)): Generations that are rejected before they start now show why, instead of silently doing nothing. (#105)
- **Studio** ([Release v0.58.5](https://github.com/Cratis/Studio/releases/tag/v0.58.5)): Generating with AI now completes instead of failing at the first step: the background generation ran without the subject the user is identified by, so it was rejected as unlicensed even for a user with a valid seat.
- **Studio** ([Release v0.58.4](https://github.com/Cratis/Studio/releases/tag/v0.58.4)): Generation requests now complete: the identity behind a background command resolves in the requesting user's organization instead of the Default namespace, so a user with a valid seat is no longer rejected with an unexplained error at the register-project step.
- **Studio** ([Release v0.58.4](https://github.com/Cratis/Studio/releases/tag/v0.58.4)): A rejected background command now names its reason instead of surfacing as "Unknown error" (Arc 21.3.1).
- **Studio** ([Release v0.58.4](https://github.com/Cratis/Studio/releases/tag/v0.58.4)): Default-agent seeding now actually runs for existing organizations: the guard read the seeding marker's existence, but a passive read model materializes a default-initialized instance for a key with no events — so seeding silently never ran. The guard reads the marker's flag, and the renamed observer replays the triggers the previous one already consumed.
- **Studio** ([Release v0.58.3](https://github.com/Cratis/Studio/releases/tag/v0.58.3)): A banner announcement no longer makes the landing page (and every other page) scrollable — the top toolbars stay pinned below the banner instead of scrolling out from under it.
- **Studio** ([Release v0.58.3](https://github.com/Cratis/Studio/releases/tag/v0.58.3)): The plus pill for adding a skill in the agent dialog has its glyph properly centered.
- **Studio** ([Release v0.58.2](https://github.com/Cratis/Studio/releases/tag/v0.58.2)): Generation no longer fails when a model answers the blueprint schema loosely — the properties a smaller model returns as example instances or name-to-type maps are accepted, and a still-unparseable answer gets one fresh attempt before failing.
- **Studio** ([Release v0.58.2](https://github.com/Cratis/Studio/releases/tag/v0.58.2)): Agent chat now finds the organization's agents: mentioned agents answer again instead of silently doing nothing (the reactor's collaborators were bound to the wrong tenant).
- **Studio** ([Release v0.58.2](https://github.com/Cratis/Studio/releases/tag/v0.58.2)): Every organization now receives the default agent roster — including organizations created before trials existed — with seeding filling only the specializations that have no agent, and never resurrecting a default agent the organization deleted.
- **Studio** ([Release v0.58.2](https://github.com/Cratis/Studio/releases/tag/v0.58.2)): The add-credential chooser is a standalone card again with its own close button, instead of a card inside a second dialog frame.
- **Studio** ([Release v0.58.2](https://github.com/Cratis/Studio/releases/tag/v0.58.2)): Microsoft sign-in and add-credential work for personal and organizational accounts (AuthProxy 2.17.1 validates multi-tenant issuers against the token's own tenant).
- **Studio** ([Release v0.58.2](https://github.com/Cratis/Studio/releases/tag/v0.58.2)): New credentials are attributed to the provider that was actually used — no more `AuthenticationTypes.Federation` rows (AuthProxy 2.17.1).
- **AuthProxy** ([Release v2.17.1](https://github.com/Cratis/AuthProxy/releases/tag/v2.17.1)): Microsoft sign-ins and credential links through a multi-tenant authority (`common`, `organizations`, `consumers`) no longer fail issuer validation (IDX10205) — the issuer is validated against the tenant the token itself names, for both organizational and personal accounts.
- **AuthProxy** ([Release v2.17.1](https://github.com/Cratis/AuthProxy/releases/tag/v2.17.1)): Sign-ins and credential links are now attributed to the identity provider that was actually challenged, instead of falling back to the meaningless `AuthenticationTypes.Federation` some providers leave as the principal's authentication type.
- **Studio** ([Release v0.58.1](https://github.com/Cratis/Studio/releases/tag/v0.58.1)): Generation, explanations, and agent chat no longer fail when the organization's configured AI provider fails (revoked key, wrong key type, outage) — they fall back to the built-in model, so generation always works.
- **Studio** ([Release v0.58.1](https://github.com/Cratis/Studio/releases/tag/v0.58.1)): An agent whose AI provider was removed or never configured now answers using the built-in model instead of failing.
- **Studio** ([Release v0.58.1](https://github.com/Cratis/Studio/releases/tag/v0.58.1)): The add and reconfigure provider dialogs now reject an API key pasted under the wrong provider type (an Anthropic `sk-ant-` key under OpenAI/Azure OpenAI and vice versa), pointing at the right provider type instead of storing a key that silently fails every call.
- **Arc** ([Release v21.3.1](https://github.com/Cratis/Arc/releases/tag/v21.3.1)): `CommandResult.MergeWith` now carries the `AuthorizationFailureReason` from merged-in results: when the result's own reason is empty, the first non-empty reason from the merged results is used, and an already-set reason is never overwritten. Previously a command filter rejecting with `CommandResult.Unauthorized(correlationId, reason)` surfaced as an unauthorized result with a blank reason, leaving callers with no explanation for the rejection.
- **Studio** ([Release v0.57.2](https://github.com/Cratis/Studio/releases/tag/v0.57.2)): Agent generation and agent chat replies work again. Background work done on a user's behalf — the generation worker and the chat-reply reactor — restored the user's identity but not their tenant, so every command they executed was evaluated against a namespace where the user does not exist and rejected as unlicensed after the LLM had already answered. The tenant now travels with the work: captured from the request at hand-off for generation, taken from the event's own namespace for chat replies — which also guarantees background work can never write into the wrong organization's namespace.
- **Studio** ([Release v0.57.0](https://github.com/Cratis/Studio/releases/tag/v0.57.0)): Adding a Microsoft or Google identity no longer loops forever: the identity handshake lost its correlation cookies on a cross-site POST callback, and the failure page's buttons restarted the same doomed flow. Callbacks now use a top-level GET and a failed link ends on a clear failure page. (Cratis/StudioIssues#104)
- **Studio** ([Release v0.57.0](https://github.com/Cratis/Studio/releases/tag/v0.57.0)): Logging out now also clears the admin session cookie that used to be issued for the whole parent domain and survive every logout; it is scoped to its own host going forward and actively swept from browsers that still carry it.
- **Studio** ([Release v0.57.0](https://github.com/Cratis/Studio/releases/tag/v0.57.0)): The Chronicle kernel no longer melts down when many services register their projections at once — identical re-registrations return immediately, duplicates coalesce, and
- **AuthProxy** ([Release v2.17.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.17.0)): OIDC sign-ins and credential links no longer fail with "Correlation failed" and loop through provider selection (Cratis/StudioIssues#104)
- **AuthProxy** ([Release v2.17.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.17.0)): A failed link challenge ends on the link-failed page instead of the sign-in selection page, which offered full sign-ins that would replace the preserved session (Cratis/StudioIssues#104)
- **Chronicle** ([Release v16.22.2](https://github.com/Cratis/Chronicle/releases/tag/v16.22.2)): Registering projection definitions that are identical to the ones already registered no longer repeats the registration fan-out - the kernel only processes definitions that are new or changed, so restarting or reconnecting clients of the same version register near-instantly and queued duplicate registrations collapse instead of piling up
- **Chronicle** ([Release v16.22.2](https://github.com/Cratis/Chronicle/releases/tag/v16.22.2)): The .NET client no longer stacks registration retries: `RegisterAll` runs as a single flight per event store - a call arriving while a registration is in flight joins that run instead of sending a duplicate - and a run that follows a failure waits an exponentially growing, jittered backoff before hitting the kernel again
- **Chronicle** ([Release v16.22.2](https://github.com/Cratis/Chronicle/releases/tag/v16.22.2)): An interrupted registration is retried in full on the next attempt instead of being skipped as already registered
- **Components** ([Release v2.7.2](https://github.com/Cratis/Components/releases/tag/v2.7.2)): Hover tooltips on the outermost buttons of a `ToolbarFanOutItem` panel are no longer clipped at the panel's edge. The clip-path that drives the reveal wipe is now released once the wipe has landed, and restored before the panel closes, so both animations keep their exact timing.
- **Components** ([Release v2.7.2](https://github.com/Cratis/Components/releases/tag/v2.7.2)): A `ToolbarGroup` that hosts a slot no longer clips the fan-out and folder panels of the buttons inside it — the slot section is only clipped while outgoing content is cross-fading out.
- **Components** ([Release v2.7.1](https://github.com/Cratis/Components/releases/tag/v2.7.1)): A stepper counts only the steps it actually renders. A conditionally rendered panel still reaches it as a child, so a hidden step was counted: Submit never appeared on the real last step, a dead Next took its place, and clicking it landed on a step with nothing in it. Each hidden step cost another click, and the per-step validation gate read past the end of its own array and stopped blocking (#120)
- **Components** ([Release v2.7.1](https://github.com/Cratis/Components/releases/tag/v2.7.1)): A step that disappears after the user has already passed it no longer strands the wizard. The index is kept within the steps that still exist, so Submit stays reachable, Previous moves rather than absorbing a click per vanished step, and hiding every step no longer leaves a dead Next behind (#120)
- **Components** ([Release v2.7.1](https://github.com/Cratis/Components/releases/tag/v2.7.1)): A data page keeps its paginator inside the height it was given. The table grew to its content instead of filling the pane, so a full page of rows pushed the paging controls past the bottom of the frame and clipped them, leaving no way to reach the next page. A short page fit and looked correct (#126)
- **Components** ([Release v2.7.1](https://github.com/Cratis/Components/releases/tag/v2.7.1)): A data page with a details component keeps its paginator in frame too. The split view sizes its panes from a stylesheet the package never imported, so the pane grew to content and clipped the paginator exactly as before, and the two panes stacked instead of siding. The stylesheet now ships with the component, so there is nothing for a consumer to import (#126)
- **Chronicle** ([Release v16.22.1](https://github.com/Cratis/Chronicle/releases/tag/v16.22.1)): The compliance key cache no longer restores a key that was deleted or evicted while a read of it was in flight. The cache releases its lock to call the backing store and takes it again to record the answer; an erasure landing in that window was overwritten by the older answer, so a shredded key came back and was served again
- **Chronicle** ([Release v16.22.1](https://github.com/Cratis/Chronicle/releases/tag/v16.22.1)): An erasure no longer leaves the key cacheable for the length of the durable delete. The cache was cleared before that call, so a read starting afterwards could still find the key in the store and cache it, and cached keys have no time-to-live. Erasing one revision no longer evicts the others
- **Chronicle** ([Release v16.22.1](https://github.com/Cratis/Chronicle/releases/tag/v16.22.1)): A partially failed erasure still clears the cache rather than keeping a key that may already be destroyed, and still evicts from every silo. A composite key store attempts every store and then reports the failure, so the key can be gone and the call still throw
- **Chronicle** ([Release v16.22.1](https://github.com/Cratis/Chronicle/releases/tag/v16.22.1)): Saving a key no longer loses to a read that began before it. After a rotation the cache could serve the superseded key, so values encrypted under the new revision failed to decrypt until something evicted the entry
- **Arc** ([Release v21.3.0](https://github.com/Cratis/Arc/releases/tag/v21.3.0)): A command that did not succeed no longer carries its response value. The value was bound before execution scopes completed, and a commit-time constraint or concurrency failure returned it alongside the failure, serialized into the error body — so a caller could act on a value produced by a command whose transaction rolled back (#2495)
- **Arc** ([Release v21.3.0](https://github.com/Cratis/Arc/releases/tag/v21.3.0)): Model-bound `IAsyncEnumerable` observable queries now work over WebSocket and Server-Sent Events. Both transports previously failed on connect: the observable was cast to an interface it does not implement and the null dereferenced before a single item was streamed
- **Studio** ([Release v0.56.0](https://github.com/Cratis/Studio/releases/tag/v0.56.0)): The organization-setup page no longer gives up while provisioning is still working: waiting escalates its messaging instead of erroring, lost connections reconnect with backoff, returning through the invite link resumes into the same state, and if the organization became ready in the meantime the page proceeds straight into it rather than asking to try again.
- **Studio** ([Release v0.55.3](https://github.com/Cratis/Studio/releases/tag/v0.55.3)): A slice with more than one projection no longer loses the events its further projections read from. It rendered with only the first projection's incoming events and now renders with all of them. (Cratis/StudioIssues#52)
- **Studio** ([Release v0.55.3](https://github.com/Cratis/Studio/releases/tag/v0.55.3)): A slice's read model keeps its name through a round trip. The name resolved on import now matches the one Cratis Stage resolves for the same document on the way back out.
- **AuthProxy** ([Release v2.14.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.14.0)): Canonical OIDC sessions are resolved against the scheme that authenticated the request instead of the identity's `AuthenticationTypes.Federation` authentication type — previously every proxied request on such a session went out without identity headers, leaving the application blank after a seemingly successful login
- **AuthProxy** ([Release v2.14.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.14.0)): Logout documentation now lists the complete set of cookies actually cleared, including `.cratis-identity-authorization`, `.cratis-invite-state`, and the transient handshake cookies
- **Studio** ([Release v0.55.1](https://github.com/Cratis/Studio/releases/tag/v0.55.1)): Members with an expired seat no longer show as holding one on the Users page — the seat-holder check now matches the same "not expired" rule already used everywhere else (seat pool availability, license validity).
- **cli** ([Release v2.5.0](https://github.com/Cratis/cli/releases/tag/v2.5.0)): A multi-targeted project was read once per target framework, and its spec projects were not recognised as such, so spec code entered the generated document
- **cli** ([Release v2.5.0](https://github.com/Cratis/cli/releases/tag/v2.5.0)): Projects that cannot declare a command or an event are no longer read when generating from a solution, so test hosts and analyzer projects stop describing the application
- **cli** ([Release v2.5.0](https://github.com/Cratis/cli/releases/tag/v2.5.0)): Generating against a solution that has not been restored reported every consequence of the missing restore instead of the missing restore itself
- **Chronicle** ([Release v16.22.0](https://github.com/Cratis/Chronicle/releases/tag/v16.22.0)): Rejected seed batches no longer disconnect clients or trigger reconnect loops; they remain unseeded for correction. (#3662)
- **Chronicle** ([Release v16.22.0](https://github.com/Cratis/Chronicle/releases/tag/v16.22.0)): `ReviseEvent` resolves `IEventSerializer` in the current event-store scope. (#3663)
- **Chronicle** ([Release v16.22.0](https://github.com/Cratis/Chronicle/releases/tag/v16.22.0)): Compliance-key erasure attempts every configured store and reports incomplete erasure. (#3664)
- **Chronicle** ([Release v16.22.0](https://github.com/Cratis/Chronicle/releases/tag/v16.22.0)): An unavailable compliance key store is reported as unavailable, not as a missing key. (#3665)
- **Chronicle** ([Release v16.22.0](https://github.com/Cratis/Chronicle/releases/tag/v16.22.0)): Refused or unconvertible join writes are logged as warnings without exposing key values. (#3656)
- **Prologue** ([Release v1.2.0](https://github.com/Cratis/Prologue/releases/tag/v1.2.0)): A slice declaring more than one projection now generates all of them. Only the first was emitted, and the rest were dropped silently.
- **Studio** ([Release v0.55.0](https://github.com/Cratis/Studio/releases/tag/v0.55.0)): Exported commands declared no produced events, so a played or exported model appended nothing and nothing downstream ever ran
- **Studio** ([Release v0.55.0](https://github.com/Cratis/Studio/releases/tag/v0.55.0)): Validation rules were read from an imported document and then discarded instead of being applied to the slice
- **Studio** ([Release v0.55.0](https://github.com/Cratis/Studio/releases/tag/v0.55.0)): Specifications were dropped entirely on import, although export already wrote them
- **Studio** ([Release v0.55.0](https://github.com/Cratis/Studio/releases/tag/v0.55.0)): An exact-length validation rule was not carried across on import
- **Chronicle** ([Release v16.21.0](https://github.com/Cratis/Chronicle/releases/tag/v16.21.0)): Prevent CHR0043 from hanging or losing AutoMap state across helper-returned and member-held projection builders. (#3614)
- **Chronicle** ([Release v16.21.0](https://github.com/Cratis/Chronicle/releases/tag/v16.21.0)): Resolve integration fixture services from scenario-owned scopes and always complete database cleanup. (#3649)
- **Chronicle** ([Release v16.21.0](https://github.com/Cratis/Chronicle/releases/tag/v16.21.0)): Prevent Orleans MongoDB services from capturing Arc scoped clients regardless of registration order. (#3650)
- **Stage** ([Release v1.4.0](https://github.com/Cratis/Stage/releases/tag/v1.4.0)): A slice referencing an event declared in another slice produced code that did not compile, because no `using` was emitted for the declaring namespace
- **Stage** ([Release v1.4.0](https://github.com/Cratis/Stage/releases/tag/v1.4.0)): State View and reactor slices never rendered the events they declare
- **Stage** ([Release v1.4.0](https://github.com/Cratis/Stage/releases/tag/v1.4.0)): Scaffolding wrote the template's placeholders verbatim, so the project's target framework, name and solution reference were literal text
- **Stage** ([Release v1.4.0](https://github.com/Cratis/Stage/releases/tag/v1.4.0)): `[FromAll]` was placed on a read model type rather than a property
- **Stage** ([Release v1.4.0](https://github.com/Cratis/Stage/releases/tag/v1.4.0)): A projection whose key names an event property crashed the slice it belonged to
- **Stage** ([Release v1.4.0](https://github.com/Cratis/Stage/releases/tag/v1.4.0)): An expression or condition that cannot be rendered produced an always-true guard or a null value, silently changing behaviour
- **Stage** ([Release v1.3.0](https://github.com/Cratis/Stage/releases/tag/v1.3.0)): Every command execution opened a brand-new event stream, so a register-then-update lifecycle was impossible
- **Stage** ([Release v1.3.0](https://github.com/Cratis/Stage/releases/tag/v1.3.0)): The specs did not run in CI: the workflow tested a Release build, which strips every spec file, so it passed having discovered none
- **Studio** ([Release v0.54.6](https://github.com/Cratis/Studio/releases/tag/v0.54.6)): Fixed the customized sign-in page dropping the caller's real destination (e.g. an invite link) once AuthProxy started serving this page directly at `/.cratis/select-provider?returnUrl=...` (Cratis/AuthProxy#90) instead of only when answering in place of the originally requested path. The page's script now reads an explicit `returnUrl` query parameter first, falling back to its own location only when one isn't present.
- **AuthProxy** ([Release v2.13.2](https://github.com/Cratis/AuthProxy/releases/tag/v2.13.2)): Fixed the sign-in page a caller sees after being redirected to accept an invite or from any other unauthenticated deep link no longer matching the branded selection page shown on a direct visit to `/`. `SelectProviderMiddleware` deferred any request under `/.cratis/select-provider` to a separate fallback endpoint instead of answering it directly, so a redirect there (the cookie authentication handler's `OnRedirectToLogin`, and the invite flow, both redirect there whenever more than one provider is configured) never reached the page a deployment customizes via `PagesPath`.
- **AuthProxy** ([Release v2.13.2](https://github.com/Cratis/AuthProxy/releases/tag/v2.13.2)): Fixed the single-provider direct-challenge redirect landing back on the selection page's own wrapper URL instead of the caller's real destination when reached this way.
- **AuthProxy** ([Release v2.13.1](https://github.com/Cratis/AuthProxy/releases/tag/v2.13.1)): Fixed the login-selection page (and any other bundled `wwwroot` asset) rendering a blank page for anyone signing in or accepting an invite. `UseIngress()` never called `app.UseRouting()` explicitly, so once the reverse proxy had a configured backend — the case in every real deployment — ASP.NET Core's implicit routing insertion matched the proxy's catch-all route against every request, including AuthProxy's own bundled assets. `UseStaticFiles()` is endpoint-aware and skips serving a file once a route is already matched, so every asset request fell through to `SelectProviderMiddleware`, which refuses unauthenticated, non-navigating callers with a `401`.
- **Components** ([Release v2.7.0](https://github.com/Cratis/Components/releases/tag/v2.7.0)): A dialog with a custom footer or `buttons={null}` left focus on `document.body`, outside the modal. `BusyIndicatorDialog` shipped in that state; focus now moves to the dialog's title.

## Removed
- **Chronicle** ([Release v16.34.1](https://github.com/Cratis/Chronicle/releases/tag/v16.34.1)): The custom per-column filter dropdowns on Event Types, Read Model Types and Observers. PrimeReact 11 has no `filterElement`, so those columns use the built-in filter menu; the columns still filter, but over raw values rather than labelled option lists.
- **Chronicle** ([Release v16.34.1](https://github.com/Cratis/Chronicle/releases/tag/v16.34.1)): The password mask toggle on the login screen and the ripple effect on sidebar items, neither of which PrimeReact 11 provides.
- **Chronicle** ([Release v16.34.1](https://github.com/Cratis/Chronicle/releases/tag/v16.34.1)): Expand/collapse of row groups on Connected Clients and Events Seeding — PrimeReact 11 groups rows but cannot collapse a group. The subheaders remain.
- **Scene** ([Release v2.0.0](https://github.com/Cratis/Scene/releases/tag/v2.0.0)): `cascadeSelect`, `inputMask`, `treeTable` and `virtualScroller` are no longer declared. PrimeReact 11 removed all four with no equivalent and no headless hook. Use `dropdown` with grouped options or `treeSelect` instead of `cascadeSelect`, `inputText` with validat
- **Arc** ([Release v21.19.0](https://github.com/Cratis/Arc/releases/tag/v21.19.0)): Removed the v21.18 opt-in explicit metadata registration option from MSBuild, CLI, and programmatic proxy generation. (#2440)
- **Chronicle** ([Release v16.32.0](https://github.com/Cratis/Chronicle/releases/tag/v16.32.0)): `[SubjectFrom]`, `[ReleaseUnder]`, CHR0038, and CHR0044 because projection provenance now provides ownership automatically. (#3644)
- **Chronicle** ([Release v16.31.0](https://github.com/Cratis/Chronicle/releases/tag/v16.31.0)): The unrouted sequences prototype built on view models over mock data, along with its bookmark tree and mock histogram
- **Stage** ([Release v2.4.0](https://github.com/Cratis/Stage/releases/tag/v2.4.0)): `Cratis.Stage.Rendering.Cratis` no longer depends on `Cratis`, `Cratis.Arc.MongoDB`, `Cratis.Templates` or the three `Microsoft.TemplateEngine.*` packages. The package is `Cratis.Stage.Contracts` and `Cratis.Screenplay` and nothing else. (#34, #18)
- **Stage** ([Release v2.4.0](https://github.com/Cratis/Stage/releases/tag/v2.4.0)): `TemplateEngineProjectScaffolder`, `SampleSlice`, `ScaffoldingFailed`, `TemplateNotFound` and `TemplatePackageNotFound` move to the new scaffolding package, keeping their namespace. (#34)
- **Arc** ([Release v21.6.0](https://github.com/Cratis/Arc/releases/tag/v21.6.0)): The `UseSubdomainTenancy(fallbackHeaderName)` overload — subdomain tenancy now requires a base domain, and the header name is the second argument (#2471)
- **Stage** ([Release v2.0.0](https://github.com/Cratis/Stage/releases/tag/v2.0.0)): `$secrets` expressions no longer render, following their removal from the Screenplay language.

## Security
- **Studio** ([Release v0.67.0](https://github.com/Cratis/Studio/releases/tag/v0.67.0)): Fixed a gap where a chat reaction's identifier and giver — visible to every viewer of a topic — could be replayed by another user to revoke or take over someone else's reaction. Giving or revoking a reaction now requires it to belong to the requesting user.
- **Studio** ([Release v0.65.1](https://github.com/Cratis/Studio/releases/tag/v0.65.1)): **SSH.NET moves off 2025.1.0**, which carries [GHSA-q939-rpr3-3284](https://github.com/advisories/GHSA-q939-rpr3-3284). It arrives transitively through Testcontainers 4.13.0 — the newest release there is — so it is pinned to 2026.0.0 instead. It is a test-only dependency and never reached a shipped artifact, but it did fail a Release build of the solution.
- **Chronicle** ([Release v16.26.1](https://github.com/Cratis/Chronicle/releases/tag/v16.26.1)): SSH.NET moved to 2026.0.0 in every project that uses Testcontainers, past GHSA-q939-rpr3-3284 (arbitrary file write via server-controlled SCP filenames). Testcontainers 4.13.0 still depends on the affected 2025.1.0, so the projects using it reference SSH.NET directly to pull the transitive dependency forward
- **Stage** ([Release v2.2.0](https://github.com/Cratis/Stage/releases/tag/v2.2.0)): A read model is now guarded by the authorization declared by the queries that read it, instead of by every query in its slice. A slice declaring several read models rendered each of them with the union of all their queries' authorization, so a single unguarded query on one read model rendered the others as `[AllowAnonymous]` — the rendered application was more permissive than the document it came from.
- **Chronicle** ([Release v16.25.0](https://github.com/Cratis/Chronicle/releases/tag/v16.25.0)): An Aspire AppHost configured for production no longer runs a development-compiled Chronicle, which seeds a documented default administrator password and a fixed OAuth client secret, and exposes an unauthenticated endpoint that erases the event store (#3607)
- **Arc** ([Release v21.6.0](https://github.com/Cratis/Arc/releases/tag/v21.6.0)): Subdomain tenancy configured without a valid base domain now fails at startup, instead of resolving no tenant from any host and falling back to a client-supplied header that selects the namespace and database (#2471)
- **AuthProxy** ([Release v2.18.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.18.0)): A configured sign-in notification that cannot be signed is no longer sent at all, rather than falling back to an unsigned call (#82)
- **AuthProxy** ([Release v2.18.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.18.0)): Signing refuses an RSA key smaller than 2048 bits (#82)
- **AuthProxy** ([Release v2.18.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.18.0)): A sign-in notification endpoint carrying a query string is rejected at startup, because the route binding deliberately excludes the query and would otherwise leave it unprotected (#82)
- **AuthProxy** ([Release v2.18.0](https://github.com/Cratis/AuthProxy/releases/tag/v2.18.0)): The attestation signing contract no longer renders its private key when written as text (#82)
- **Studio** ([Release v0.55.2](https://github.com/Cratis/Studio/releases/tag/v0.55.2)): Organization encryption keys no longer appear in the event log. `OrganizationEncryptionKeyGenerated` used to carry the organization's plaintext keypair — in the immutable log and duplicated into a read model. The event is now a bare fact, and HashiCorp Vault is the sole custodian of organization key material: keys are written to Vault at provisioning and resolved from Vault at the moment of use, failing loudly when unavailable rather than ever yielding an empty key.
- **Chronicle** ([Release v16.22.0](https://github.com/Cratis/Chronicle/releases/tag/v16.22.0)): Rejected seed diagnostics omit event-source IDs and constraint messages that may contain compliance subjects. (#3662)

## Deprecated
- **Chronicle** ([Release v16.30.0](https://github.com/Cratis/Chronicle/releases/tag/v16.30.0)): `[ReleaseUnder]` in favor of `[SubjectFrom]`; it still compiles and behaves identically, and now warns at the point it is applied (#3601)
