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

| Repository | Previous version | Current version |
| --- | --- | --- |
| [AI](https://github.com/Cratis/AI) | [v2.28.1](https://github.com/Cratis/AI/releases/tag/v2.28.1) | [v7.1.1](https://github.com/Cratis/AI/releases/tag/v7.1.1) |
| [Ante](https://github.com/Cratis/Ante) | [v0.9.0](https://github.com/Cratis/Ante/releases/tag/v0.9.0) | [v0.13.0](https://github.com/Cratis/Ante/releases/tag/v0.13.0) |
| [Arc](https://github.com/Cratis/Arc) | [v22.16.1](https://github.com/Cratis/Arc/releases/tag/v22.16.1) | [v22.31.0](https://github.com/Cratis/Arc/releases/tag/v22.31.0) |
| [Arc.Kotlin](https://github.com/Cratis/Arc.Kotlin) | [v7.5.2](https://github.com/Cratis/Arc.Kotlin/releases/tag/v7.5.2) | [v7.6.0](https://github.com/Cratis/Arc.Kotlin/releases/tag/v7.6.0) |
| [Arc.TypeScript](https://github.com/Cratis/Arc.TypeScript) | First release | [v0.43.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.43.0) |
| [AuthProxy](https://github.com/Cratis/AuthProxy) | [v2.22.2](https://github.com/Cratis/AuthProxy/releases/tag/v2.22.2) | [v2.22.4](https://github.com/Cratis/AuthProxy/releases/tag/v2.22.4) |
| [Chronicle](https://github.com/Cratis/Chronicle) | [v19.1.5](https://github.com/Cratis/Chronicle/releases/tag/v19.1.5) | [v19.15.0](https://github.com/Cratis/Chronicle/releases/tag/v19.15.0) |
| [Chronicle.Elixir](https://github.com/Cratis/Chronicle.Elixir) | [v3.4.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.4.0) | [v3.6.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.6.0) |
| [Chronicle.Kotlin](https://github.com/Cratis/Chronicle.Kotlin) | [v6.3.2](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.3.2) | [v6.6.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.6.0) |
| [Chronicle.Mcp](https://github.com/Cratis/Chronicle.Mcp) | [v1.3.2](https://github.com/Cratis/Chronicle.Mcp/releases/tag/v1.3.2) | [v1.4.0](https://github.com/Cratis/Chronicle.Mcp/releases/tag/v1.4.0) |
| [Chronicle.TypeScript](https://github.com/Cratis/Chronicle.TypeScript) | [v6.2.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.2.0) | [v6.22.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.22.1) |
| [cli](https://github.com/Cratis/cli) | [v3.8.2](https://github.com/Cratis/cli/releases/tag/v3.8.2) | [v3.21.0](https://github.com/Cratis/cli/releases/tag/v3.21.0) |
| [Components](https://github.com/Cratis/Components) | [v4.9.0](https://github.com/Cratis/Components/releases/tag/v4.9.0) | [v4.19.0](https://github.com/Cratis/Components/releases/tag/v4.19.0) |
| [Fundamentals](https://github.com/Cratis/Fundamentals) | [v7.19.3](https://github.com/Cratis/Fundamentals/releases/tag/v7.19.3) | [v7.19.6](https://github.com/Cratis/Fundamentals/releases/tag/v7.19.6) |
| [Orleans](https://github.com/Cratis/Orleans) | [v1.4.0](https://github.com/Cratis/Orleans/releases/tag/v1.4.0) | [v1.12.2](https://github.com/Cratis/Orleans/releases/tag/v1.12.2) |
| [Prompter](https://github.com/Cratis/Prompter) | [v0.2.3](https://github.com/Cratis/Prompter/releases/tag/v0.2.3) | [v0.2.4](https://github.com/Cratis/Prompter/releases/tag/v0.2.4) |
| [release-action](https://github.com/Cratis/release-action) | [v1.3.1](https://github.com/Cratis/release-action/releases/tag/v1.3.1) | [v1.4.0](https://github.com/Cratis/release-action/releases/tag/v1.4.0) |
| [Scene](https://github.com/Cratis/Scene) | [v3.5.0](https://github.com/Cratis/Scene/releases/tag/v3.5.0) | [v4.2.0](https://github.com/Cratis/Scene/releases/tag/v4.2.0) |
| [Screenplay](https://github.com/Cratis/Screenplay) | [v4.14.0](https://github.com/Cratis/Screenplay/releases/tag/v4.14.0) | [v4.44.0](https://github.com/Cratis/Screenplay/releases/tag/v4.44.0) |
| [Stage](https://github.com/Cratis/Stage) | [v3.20.0](https://github.com/Cratis/Stage/releases/tag/v3.20.0) | [v4.21.0](https://github.com/Cratis/Stage/releases/tag/v4.21.0) |
| [Templates](https://github.com/Cratis/Templates) | [v1.7.0](https://github.com/Cratis/Templates/releases/tag/v1.7.0) | [v1.7.2](https://github.com/Cratis/Templates/releases/tag/v1.7.2) |

## Added

- **Components** ([Release v4.19.0](https://github.com/Cratis/Components/releases/tag/v4.19.0)): `Toolbar` and `ActionMenubar` move focus between tools with the arrow keys and Home/End, following the toolbar's orientation and reading direction. Every tool keeps its own Tab stop, so Tab works as before. Keys inside inputs, sliders, selects and other widgets in a toolbar keep their native behavior, and a handler that calls `preventDefault` still wins. The new `focusMode` prop (`ToolbarFocusMode`) is `Arrows` by default; use `None` to keep the previous behavior. A mode with a single Tab stop for the whole toolbar is planned in #353. (#328)
- **Components** ([Release v4.19.0](https://github.com/Cratis/Components/releases/tag/v4.19.0)): The `PivotViewer` card viewport is a keyboard-focusable, named scroll region. Arrow and Page keys scroll overflowing cards, and Tab moves on to the next control. Use `labels.viewport` to localize its default name, “Card area.” Canvas cards themselves are still not keyboard-selectable. (#349)
- **Components** ([Release v4.19.0](https://github.com/Cratis/Components/releases/tag/v4.19.0)): `CratisComponentsProvider` `messages.filter` localizes the filter panel's accessible name (`label`) and its search inputs' names (`searchAriaLabel`) for the whole application. An explicit prop still wins. For search inputs, the placeholder is used when the provider message is not set, so existing names do not change. `messages.filter.label` also names the `PivotViewer` Filters button when `labels.filters` is not set. The `CratisFilterMessages` type is exported. (#347)
- **Chronicle** ([Release v19.15.0](https://github.com/Cratis/Chronicle/releases/tag/v19.15.0)): Structured named tags: an event can carry `NamedTag` values, each a `TagName` and a string value, next to its existing plain tags. Append them with `AppendWithNamedTags`, `AppendManyWithNamedTags` and `AddEventWithNamedTags` on `IEventSequence`, `ITransactionalEventSequence` and `IUnitOfWork`; they are available on `EventContext.NamedTags` (#3953)
- **Chronicle** ([Release v19.15.0](https://github.com/Cratis/Chronicle/releases/tag/v19.15.0)): Query events and sequence histograms by named tags through the kernel gRPC API (`IEventSequences.QueryEventsWithNamedTags` and `SequenceHistogramWithNamedTags`). Criteria are combined with OR across criteria and AND with the other query dimensions; each criterion matches a name and value on the same tag, compares ordinally, and treats a missing value list as "any value" (#3953)
- **Chronicle** ([Release v19.15.0](https://github.com/Cratis/Chronicle/releases/tag/v19.15.0)): Named tags are stored and indexed on MongoDB, SQL (SQLite, PostgreSQL and SQL Server) and in-memory storage. An exact duplicate name and value pair on one event is kept once. Named-tag batch appends keep per-event causation and migrated generations (#3953)
- **Chronicle** ([Release v19.15.0](https://github.com/Cratis/Chronicle/releases/tag/v19.15.0)): Upgrade servers before clients: a new client appending named tags to an older server gets `UNIMPLEMENTED` instead of silently losing the tags.
- **Chronicle** ([Release v19.15.0](https://github.com/Cratis/Chronicle/releases/tag/v19.15.0)): SQL storage reserves the per-namespace table `__cratis_named_tags`. If a table with that name already exists, event-sequence operations in that namespace fail with `NamedTagsTableCollision` until it is renamed.
- **Chronicle** ([Release v19.15.0](https://github.com/Cratis/Chronicle/releases/tag/v19.15.0)): Tag names and values are stored in plaintext and indexed. Never put personal data in tags.
- **Chronicle** ([Release v19.15.0](https://github.com/Cratis/Chronicle/releases/tag/v19.15.0)): The Workbench HTTP proxies for the named-tag queries are generated but cannot carry structured criteria yet; use the gRPC API (#4277).
- **cli** ([Release v3.21.0](https://github.com/Cratis/cli/releases/tag/v3.21.0)): **Cratis AI update hint.** In a repository with the Cratis AI corpus installed (`.cratis/ai.json` and `.cratis/ai.manifest.json`), an interactive command may end with `↑ Cratis AI update available: 12 new commits since cc9c631 - run 'cratis ai update'`. The hint appears only when the installed commit is behind the latest commit on Cratis/AI's default branch, so a corpus installed from a local checkout or another branch never triggers it. The answer is cached per installed commit next to the CLI version check and rechecked hourly. The hint is skipped when output is redirected, in AI agent environments and completions, while running `ai install`/`ai update`/`ai uninstall`, and when `CRATIS_NO_UPDATE_CHECK` is set (#197).
- **cli** ([Release v3.21.0](https://github.com/Cratis/cli/releases/tag/v3.21.0)): **`cratis render` sends Screenplay's typed-context descriptors to Stage**, so generated code can use typed contexts (#192).
- **Arc** ([Release v22.31.0](https://github.com/Cratis/Arc/releases/tag/v22.31.0)): A named Arc authorization policy can opt in to being evaluated for unauthenticated callers: `AddArcAuthorizationPolicy<TPolicy>(name, evaluatesAnonymous: true)`. The policy then receives an empty, unauthenticated principal and decides whether to allow the guest. This works the same with Arc's `[Authorize]` and ASP.NET Core's `[Authorize(Policy = ...)]`, for commands, queries and observable queries. (#2761)
- **Arc** ([Release v22.31.0](https://github.com/Cratis/Arc/releases/tag/v22.31.0)): `AddArcAnonymousAspNetAuthorizationPolicy(name)` gives the same opt-in to a policy registered through ASP.NET Core. It is checked at startup: the name must resolve to exactly one ASP.NET Core policy that doesn't require an authenticated user. Otherwise startup fails with `InvalidAuthorizationConfiguration`. (#2761)
- **Stage** ([Release v4.21.0](https://github.com/Cratis/Stage/releases/tag/v4.21.0)): Render Screenplay ESM v3 reducers with verified portable C# bodies as Chronicle reducers and typed context adapters. Supported deterministic, finite operations are admitted explicitly; unsupported or mismatched bodies fail with actionable diagnostics.
- **Stage** ([Release v4.21.0](https://github.com/Cratis/Stage/releases/tag/v4.21.0)): Generate read-model and command specifications for reducer-backed models, including collection event expectations and deletion. The Billing payment reducer is an executable example.
- **Stage** ([Release v4.21.0](https://github.com/Cratis/Stage/releases/tag/v4.21.0)): Guard every non-null reducer output so its identifier matches the event-source key; mismatches fail rather than silently routing a keyed query to unrelated state.
- **Orleans** ([Release v1.12.1](https://github.com/Cratis/Orleans/releases/tag/v1.12.1)): A packed-consumer check that restores and builds `Cratis.Orleans` for .NET 8, 9 and 10 and fails when consumers would resolve mixed Orleans versions. It runs on pull requests, in the daily package update, and before a release is cut.
- **Arc.TypeScript** ([v0.43.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.43.0)): `ChronicleCommandScenario` and `ChronicleQueryScenario` evaluate supported flat projections in-process through `ReadModelScenario` from `@cratis/chronicle` 6.19.0, so `given.forEventSource(...).events(...)` now populates projection-backed read models as well as reducer-backed ones. See [Test Chronicle commands and queries](https://github.com/Cratis/Arc.TypeScript/blob/v0.43.0/Documentation/testing/chronicle.md) for the boundary.
- **Arc.TypeScript** ([v0.43.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.43.0)): A pinned instance wins over history, and a reducer wins over a projection. Projection seeds replay in the order they were given across event sources.
- **Arc.TypeScript** ([v0.43.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.43.0)): A projection outside the supported boundary throws the SDK's `UnsupportedProjectionOperation` unchanged; test it with `ChronicleKernelScenario`.
- **Chronicle.TypeScript** ([Release v6.22.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.22.0)): `ReactorScenario` in `@cratis/chronicle/testing` delivers `given` and `when` events in order using production handler dispatch and artifact activation. An `artifactActivator` receives per-event `run` metadata and `complete()` is called after delivery, including on failure.
- **Chronicle.TypeScript** ([Release v6.22.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.22.0)): Inspect returned events through `produced`, `sideEffects`, `results`, `shouldHaveProduced`, and `shouldNotHaveProduced`. Handler failures reject the delivery and prevent further deliveries.
- **Chronicle.TypeScript** ([Release v6.22.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.22.0)): Unsupported replay, redelivery, command recording, tag-filtered reactors, self-subscribed appends, store/read-model/event-log services, and `waitForCompletion` reject with `UnsupportedReactorOperation` or `UnsupportedEventSequenceOperation`, directing tests to a kernel-backed scenario. Unsupported calls fail delivery even when caught by a handler.
- **Chronicle.TypeScript** ([Release v6.22.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.22.0)): Reactor scenario examples cover injected dependencies, services, and multiple event sources.
- **Orleans** ([Release v1.12.0](https://github.com/Cratis/Orleans/releases/tag/v1.12.0)): `Cratis.Orleans.Chronicle` package with `EventSourcedStateMachine<TModel>`: an Orleans state machine whose model is a Chronicle read model derived from events. It reads through `IEventStore.ReadModels`, never writes, and needs no `[StorageProvider]` (#34)
- **Orleans** ([Release v1.12.0](https://github.com/Cratis/Orleans/releases/tag/v1.12.0)): `DefineProjection(IProjectionBuilderFor<TModel>)` for declarative projections; model-bound projections on `TModel` also work. Projections are registered through Chronicle's explicit registration API (#34)
- **Orleans** ([Release v1.12.0](https://github.com/Cratis/Orleans/releases/tag/v1.12.0)): `DefineTransitions(IStateMachineTransitions<TModel>)` with `.On<TEvent>().TransitionTo<TState>()` and optional model guards. Definitions are inspected at startup (#34)
- **Orleans** ([Release v1.12.0](https://github.com/Cratis/Orleans/releases/tag/v1.12.0)): One fluent Chronicle reactor per state machine, subscribed to the union of the projection's and the transitions' event types. Each delivered event refreshes the grain's model, calls `OnModelChanged(previous, current, context)`, then applies matching transitions (#34)
- **Orleans** ([Release v1.12.0](https://github.com/Cratis/Orleans/releases/tag/v1.12.0)): Grain keys `{eventStore}/{namespace}/{eventSourceId}` isolate tenants. `IGrainFactory.GetEventSourcedStateMachine<T>(...)` resolves a grain; `ResolveState(model)` derives the current state from the model on activation, so no state is persisted (#34)
- **Orleans** ([Release v1.12.0](https://github.com/Cratis/Orleans/releases/tag/v1.12.0)): `AddEventSourcedStateMachines()` for `IServiceCollection` / `ISiloBuilder` (#34)
- **Chronicle** ([Release v19.14.0](https://github.com/Cratis/Chronicle/releases/tag/v19.14.0)): `IProjections.Register<TReadModel>(define, id)` registers a read model together with a declarative projection defined through the same `IProjectionBuilderFor<TReadModel>` an `IProjectionFor<T>` uses, without assembly discovery. The read model behaves like any other through `IReadModels`, including passive (on-demand) read models (#4287)
- **Chronicle** ([Release v19.14.0](https://github.com/Cratis/Chronicle/releases/tag/v19.14.0)): `IProjections.Register<TReadModel>()` registers the model-bound projection of a read model that discovery did not find (#4287)
- **Chronicle** ([Release v19.14.0](https://github.com/Cratis/Chronicle/releases/tag/v19.14.0)): `IReactors.Define(id, reactor => ...)` and `IReactors.Register(id, reactor => ...)` declare reactors fluently with typed `On<TEvent>` handlers — `(TEvent)`, `(TEvent, EventContext)` and their `Task`-returning forms — and a catch-all `Subscribe((object, EventContext) => ...)`. `IReactorDefinition` exposes the reactor id, event types and whether it subscribes to all events (#4288)
- **Chronicle** ([Release v19.14.0](https://github.com/Cratis/Chronicle/releases/tag/v19.14.0)): `ChronicleOptions.ExplicitArtifacts` registers explicit projections, read models and fluent reactors before the client connects; they are included in every registration pass, including after a reconnect (#4287, #4288)
- **Orleans** ([Release v1.11.0](https://github.com/Cratis/Orleans/releases/tag/v1.11.0)): `Cratis.Orleans.StateMachines`: the generic Orleans state machine, extracted from Chronicle with the same behavior — `StateMachine<TStoredState>`, `State<TStoredState>`, `IState<TStoredState>`, `IStateMachine<TStoredState>`, `NoOpState`, `StateMachineState`, allowed transitions, `OnEnter`/`OnLeave`, and transitions scheduled while entering (#33)
- **Orleans** ([Release v1.11.0](https://github.com/Cratis/Orleans/releases/tag/v1.11.0)): A protected `StateMachine(IStorage<TStoredState>)` constructor, so a derived state machine can supply its own storage without a `[StorageProvider]` attribute (#33)
- **Orleans** ([Release v1.11.0](https://github.com/Cratis/Orleans/releases/tag/v1.11.0)): `ResolveActivationState()` lets a derived state machine decide which state to enter on activation, and the protected `CanTransitionTo(Type)` / `TransitionTo(Type)` allow transitions by type while still honoring each state's rules (#33)
- **Arc.TypeScript** ([v0.42.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.42.0)): The proxy generator can write proxies into the backend slice folders. When the output is the artifacts folder, one of its ancestors, or a nested folder containing backend artifacts, the `.proxy` suffix is required, no barrels are written, and watch mode regenerates on backend edits. The generator only overwrites or deletes files it generated, and never analyzes generated, `.proxy`, `.tsx` or spec files as backend artifacts.
- **Arc.TypeScript** ([v0.42.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.42.0)): Runtime discovery (`builder.discover(...)`) skips co-located `*.proxy.ts`/`*.proxy.js` and `.tsx` files.
- **Arc.TypeScript** ([v0.42.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.42.0)): The Library sample keeps every slice together, uses `@cratis/components` (`DataPage` for the author listing, `CommandDialog` for registration) and runs frontend specs under jsdom beside the backend specs in `yarn test`. The Tasks sample generates its proxies in place too.
- **Arc.TypeScript** ([v0.42.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.42.0)): CI fails when committed proxies are stale, and when the Library web bundle contains decorator syntax a browser cannot parse.
- **Chronicle.TypeScript** ([Release v6.21.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.21.0)): `EventScenario` supports both `appendMany` overloads. Batches append atomically in input order and return one result per event. The mixed-source overload uses the production client's per-entry precedence for routing, subject, and occurrence, and merges per-entry and shared tags.
- **Chronicle.TypeScript** ([Release v6.21.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.21.0)): `given.forEventSource(id).events(...events)` accepts multiple setup events as sequential single appends; if any setup event is rejected, none from that call are committed. `when.forEventSource(id).events(...events)` appends one atomic batch and returns a result for each event.
- **Chronicle.TypeScript** ([Release v6.21.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.21.0)): The in-process sequence supports source, event-type, and route read filters, plus append notifications for single and batch appends. Constraints remain unsupported and are rejected rather than simulated.
- **Chronicle.TypeScript** ([Release v6.21.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.21.0)): Committed fixtures from the pinned Chronicle kernel verify batch ordering, metadata, causation, read filters, and rejection behavior.
- **Components** ([Release v4.18.0](https://github.com/Cratis/Components/releases/tag/v4.18.0)): `--cratis-canvas-minimap-grid-color` and `--cratis-canvas-minimap-item-color` theme the Canvas minimap dot grid and items that have no `color` of their own. Both fall back to the current colors, so the minimap looks the same until you set them.
- **Components** ([Release v4.17.0](https://github.com/Cratis/Components/releases/tag/v4.17.0)): `controlsIcons` on `Canvas` (`icons` on `CanvasControls`) replaces any of the minimap, zoom-out, zoom-in and help glyphs with your own icons. Unset fields keep the built-in icons, and the accessible names still come from `controlsLabels`.
- **Components** ([Release v4.17.0](https://github.com/Cratis/Components/releases/tag/v4.17.0)): `controlsFollowViewportInsets` on `Canvas` (`followViewportInsets` on `CanvasControls`) turns off the offset by `--canvas-viewport-left`/`--canvas-viewport-right`, for hosts that already move the canvas by that inset. It defaults to `true`, so existing canvases are unchanged.
- **Components** ([Release v4.17.0](https://github.com/Cratis/Components/releases/tag/v4.17.0)): The `--canvas-viewport-left` and `--canvas-viewport-right` custom properties the controls read are now documented.
- **Screenplay** ([Release v4.43.0](https://github.com/Cratis/Screenplay/releases/tag/v4.43.0)): Publish a slim `Cratis.Screenplay.Contexts` package containing the code-body context family without compiler dependencies. `Cratis.Screenplay` references it and forwards every moved public type, preserving existing binaries. Closes #283.
- **Chronicle.TypeScript** ([Release v6.20.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.20.0)): Add `EventScenario` to `@cratis/chronicle/testing` for kernel-free, scenario-local single-event appends. `given` seeds accepted events, `when` appends one event, and `results` and `appendedEvents` expose the act results and accepted history. The scenario supports global sequence allocation, `hasEventsFor`, next and tail positions, source/type reads, and inclusive reads from a sequence number within its documented input boundary.
- **Chronicle.TypeScript** ([Release v6.20.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.20.0)): Check the supported append metadata, results, and reads against committed fixtures generated by the pinned Chronicle 19.8.1 kernel oracle. Add an EventScenario guide and compiled documentation snippets.
- **Chronicle** ([Release v19.13.0](https://github.com/Cratis/Chronicle/releases/tag/v19.13.0)): `IUnitOfWork.HasEnrolledDecisionReads` reports whether a protected decision read was successfully enrolled, including after commit, rollback or disposal. Command owners can use it to refuse an unguarded returned-event fallback. Existing custom units of work default to `false`; no decision tokens or sequence numbers are exposed.
- **Chronicle** ([Release v19.13.0](https://github.com/Cratis/Chronicle/releases/tag/v19.13.0)): Release solution build (zero warnings), all non-integration specifications, client packaging, formatting and markdown validation passed.
- **Chronicle** ([Release v19.13.0](https://github.com/Cratis/Chronicle/releases/tag/v19.13.0)): Local MongoDB integration could not start: Docker Desktop LinuxKit kernel 7.0.12 is incompatible with the MongoDB image. A bounded reproduction failed before test assertions; integration CI on GitHub must pass before merge.
- **Arc.TypeScript** ([v0.41.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.41.0)): Experimental `DrizzleObservation.PostgreSQLNotify` mode: `withDrizzle({ observation: { mode: DrizzleObservation.PostgreSQLNotify, listener } })` listens for PostgreSQL `NOTIFY` on the fixed `arc_changes` channel through one dedicated connection per tenant, and re-reads observed tables after each committed change. The first read of an observation happens only after `LISTEN` is acknowledged and the table's trigger is validated.
- **Arc.TypeScript** ([v0.41.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.41.0)): `postgresqlChangeTrigger(table, { schema? })` returns the trigger SQL to add to a drizzle-kit migration. Arc never runs DDL at runtime; a missing, disabled or incompatible trigger fails the observation before any rows are read.
- **Arc.TypeScript** ([v0.41.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.41.0)): `nodePostgresListener(...)` adapts a dedicated node-postgres `Client` as the listener connection. No `pg` runtime import is added to the package root.
- **Arc.TypeScript** ([v0.41.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.41.0)): A PostgreSQL-only mode for `Source/Drizzle/run-integration.sh` and a CI job running the PostgreSQL integration specs.
- **Components** ([Release v4.16.0](https://github.com/Cratis/Components/releases/tag/v4.16.0)): `confirmBeforeExecute` on `CommandDialog`, `StepperCommandDialog`, and `CommandStepper` asks a question after validation and `onBeforeExecute`, and before the command runs. Only `true` executes. Any other answer leaves the dialog or stepper open without running the command. If the command values change while the question is open, the command is not executed and you confirm again. Stepper fields are disabled until the confirmed submission settles. Without the prop, command execution is unchanged. The `ConfirmBeforeExecute` type is exported. (#317)
- **Components** ([Release v4.16.0](https://github.com/Cratis/Components/releases/tag/v4.16.0)): `ChatSidebar` accepts `topicsStatus` and `messagesStatus` (the new `ChatStatus` enum), and `ChatSidebarForObservableQueries` sets them from its queries. The topic list and conversation show loading, failure, and unauthorized text from new `labels` keys, and never show server exception text. A failure keeps what is already shown and adds an alert above it. Unauthorized replaces the content and disables the composer and the New topic button. (#327)
- **Components** ([Release v4.16.0](https://github.com/Cratis/Components/releases/tag/v4.16.0)): `PivotViewer` `labels` makes the toolbar text, the item count, and the filter panel's name and search placeholder localizable. The defaults are unchanged. `loadingLabel` still takes precedence over `labels.loading`. (#334)
- **Components** ([Release v4.16.0](https://github.com/Cratis/Components/releases/tag/v4.16.0)): `PivotViewer` `labels.searchGroup` names the search box of each option group in the filter panel. It receives the group's label and defaults to `Search <group>`, so each group search now has its own accessible name. (#334)
- **Components** ([Release v4.16.0](https://github.com/Cratis/Components/releases/tag/v4.16.0)): FilterPanel `aria-label` and `searchAriaLabel`, `FilterDefinition` `searchAriaLabel` and `autoFocus`, and `CheckboxListFilter` `searchAriaLabel` and `autoFocusSearch`. (#328, #244)
- **Components** ([Release v4.16.0](https://github.com/Cratis/Components/releases/tag/v4.16.0)): A `DatePickerInput` reference page, and Common and Dialogs landing pages that help you choose a control. (#260)
- **Chronicle** ([Release v19.12.0](https://github.com/Cratis/Chronicle/releases/tag/v19.12.0)): The .NET client's generated JSON schemas give inline object types a `title` with the type name. A declaration generated from a fluent composite-key projection (for example in the Workbench) can then name the key type and recompile. The fluent `CompositeKeyBuilder` still emits untyped expressions, so older kernels are unaffected (#4253)
- **Chronicle** ([Release v19.12.0](https://github.com/Cratis/Chronicle/releases/tag/v19.12.0)): The ASP.NET Core causation middleware records the matched route template in a new `routeTemplate` causation property, alongside the existing request path (#4260)
- **Arc** ([Release v22.30.0](https://github.com/Cratis/Arc/releases/tag/v22.30.0)): `IFallbackAuthorizationEvaluator` supplies baseline authorization requirements for commands and queries that declare none of their own. It is consulted only when neither the method nor the type has an explicit declaration, so `[AllowAnonymous]` members are no longer ambiguous with a baseline. Commands consult only the `Type` overload. MVC controller actions, including direct HTTP and WebSocket requests to controller-based queries, stay on ASP.NET Core authorization: use `AuthorizationOptions.FallbackPolicy` there (#2751)
- **Arc** ([Release v22.30.0](https://github.com/Cratis/Arc/releases/tag/v22.30.0)): `ReceivedAt` on `CommandContext`, `QueryContext` and `AuthorizationPolicyContext`, plus an injectable `IOperationContextAccessor`, expose the time Arc received the operation. It is captured with `TimeProvider` at Arc's transport dispatch, before binding, or at pipeline entry for programmatic calls, and per subscribe operation for streams. It is Arc's receipt time, not network arrival. `ReceivedAt` takes part in record equality, so contexts from different receipts compare unequal (#2767)
- **Arc** ([Release v22.30.0](https://github.com/Cratis/Arc/releases/tag/v22.30.0)): Query filters can set `SubscriptionScope` on the query context. Arc snapshots it after filtering and before the query runs, and gives each emission guard an independent copy, so guards can base decisions on membership that the arguments don't carry. Only state that Arc's JSON options serialize is kept, and a scope that cannot be represented is rejected with `InvalidSubscriptionScope`. The scope is always `null` for controller-based observable queries (#2768)
- **Chronicle.TypeScript** ([Release v6.19.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.19.0)): `ReadModelScenario` now builds projection-backed read models in-process when no reducer applies. It compiles the same model-bound or declarative definition used at registration, validates the whole definition before replay, and then replays the given events: root `fromEvent`/`.from()` keyed by the event source ID, `setFrom` and schema-based AutoMap for scalar properties, `$eventSourceId`, supported `$eventContext(...)` paths, `$value(...)`, `$null`, `removedWith` and initial values. See [Test read models without a kernel](https://github.com/Cratis/Chronicle.TypeScript/blob/v6.19.0/Documentation/testing.md#projection-capabilities) for the full capability table.
- **Chronicle.TypeScript** ([Release v6.19.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.19.0)): `UnsupportedProjectionOperation`, exported from `@cratis/chronicle/testing`. Anything the in-process evaluator does not support (arithmetic such as `@count`/`@increment`, children, joins, nested projections, compliance metadata, and other listed cases) raises this error when the scenario is created, before any event is replayed, instead of producing a result the kernel might not.
- **Chronicle.TypeScript** ([Release v6.19.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.19.0)): Kernel projection fixtures in `Source/testing/projections/fixtures/`, produced by the projection oracle against the pinned Chronicle kernel and compared step by step with the in-process results (`yarn oracle:check`).
- **Arc.TypeScript** ([v0.40.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.40.0)): `ArcServer.runInScope(scope, callback, options?)` runs a callback inside an existing service scope, with `currentServices()` and `currentContext()` set as they are for a request. Only the correlation ID and an extra abort signal can be supplied (`RunInScopeOptions`); tenant, principal, transport and severity come from the scope. Only scopes created with `server.services.createScope(context)` can be borrowed; Arc's own request, query and observable-query scopes cannot. It rejects scopes from another server, singleton, closed or fabricated scopes, and scopes whose principal is not plain data. It is a trusted host API, not an authorization mechanism: commands still go through the normal pipeline.
- **Chronicle** ([Release v19.11.0](https://github.com/Cratis/Chronicle/releases/tag/v19.11.0)): Register a .NET reactor at runtime by stable ID, explicit event types and generations, and an awaited delegate that receives the event context, the JSON content and the generational content map. Unregister it by ID; the observer keeps its stored position. Tags and filters are not yet configurable on delegate reactors (#4196)
- **Chronicle** ([Release v19.11.0](https://github.com/Cratis/Chronicle/releases/tag/v19.11.0)): Reactor side-effect handlers can claim synchronous return types with `CanHandleReturnType(Type)`, including a declared `IEnumerable<T>`. Existing handlers stay compatible (#4121)
- **Chronicle** ([Release v19.11.0](https://github.com/Cratis/Chronicle/releases/tag/v19.11.0)): `IReactors.RetryFailedPartitionFor<TReactor>(partition)` retries a reactor's failed partition from the .NET client and returns a `ReactorPartitionRetryOutcome` (#3909)
- **Chronicle** ([Release v19.11.0](https://github.com/Cratis/Chronicle/releases/tag/v19.11.0)): Batch event payloads accept an optional per-event `causation` field. Older kernels ignore it and store only the ambient chain (#4179)
- **Chronicle** ([Release v19.11.0](https://github.com/Cratis/Chronicle/releases/tag/v19.11.0)): Append results expose the event types the operation wrote, including for batch appends (#4132)
- **Chronicle.TypeScript** ([Release v6.18.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.18.0)): `usingKeyFromContext(...)` and `usingParentKeyFromContext(...)` on declarative `.addChild(...)`, as in Chronicle for .NET, so a child can be keyed from the event context. The context path is validated when the projection is registered.
- **Arc** ([Release v22.29.0](https://github.com/Cratis/Arc/releases/tag/v22.29.0)): JavaScript `RuleBuilder.withSeverity` and `PropertyRule.withSeverity` APIs for explicit per-rule validation severity in generated command validators.
- **Arc** ([Release v22.28.0](https://github.com/Cratis/Arc/releases/tag/v22.28.0)): EF Core `Observe`, `ObserveSingle` and `ObserveById` accept `ignoreQueryContext: true` for auxiliary sources in composed observable queries. Opted-in sources read their full filtered results without client paging or sorting and do not update `TotalItems`; the primary observation keeps its paging, sorting and count. Existing composed queries must opt in on their auxiliary observations to get this fix, as with the MongoDB overloads in v22.27.0 (#2804)
- **Arc** ([Release v22.28.0](https://github.com/Cratis/Arc/releases/tag/v22.28.0)): `AuthorizationPrincipalScope` is public, so a query or command pipeline can be composed without `AddCratisArc`. The query pipeline guide shows the registrations it needs (#2753)
- **Chronicle.TypeScript** ([Release v6.17.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.17.0)): `ActivatedArtifact.run(callback, invocation)` now receives an `ArtifactInvocationContext` for every call: the handled event's `EventContext` and handler name, or the replay notification. A host can then run each reactor or reducer invocation in a context that matches that event, for example with its correlation ID.
- **Chronicle.TypeScript** ([Release v6.17.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.17.0)): `ActivatedArtifact.complete()` is an optional hook called once per activation after its batch has been processed, also when processing failed, and before the delivery is acknowledged. If it rejects, the delivery fails with `ArtifactCompletionFailed`, which keeps a processing error if there was one; `dispose()` still runs afterwards. A host can use it to fail a delivery whose resources could not be released cleanly.
- **Chronicle** ([Release v19.10.0](https://github.com/Cratis/Chronicle/releases/tag/v19.10.0)): A join in a projection declaration can set its own `automap` or `no automap`, which overrides the projection's setting. The setting is stored with the definition, and applies to live join events and to backfill. Older clients and stored definitions keep inheriting the projection's setting. The fluent .NET `JoinBuilder` and generated client code don't express it yet.
- **Chronicle** ([Release v19.10.0](https://github.com/Cratis/Chronicle/releases/tag/v19.10.0)): Joins inside a `nested` object are wired: joined values are set on the nested object, both when the join event arrives and through backfill.
- **Stage** ([Release v4.20.0](https://github.com/Cratis/Stage/releases/tag/v4.20.0)): Stage renders more of the executable model onto Cratis now that the upstream fixes are released:
- **Stage** ([Release v4.20.0](https://github.com/Cratis/Stage/releases/tag/v4.20.0)): projection literal mappings in `from` blocks, using only literals Chronicle's fluent value expression can carry exactly;
- **Stage** ([Release v4.20.0](https://github.com/Cratis/Stage/releases/tag/v4.20.0)): removing a child through a join;
- **Stage** ([Release v4.20.0](https://github.com/Cratis/Stage/releases/tag/v4.20.0)): `$context.occurred` on produced events, with one timestamp for the payload and the event's occurrence;
- **Stage** ([Release v4.20.0](https://github.com/Cratis/Stage/releases/tag/v4.20.0)): contract and production tags that aren’t duplicated. This is part of #117.
- **Stage** ([Release v4.20.0](https://github.com/Cratis/Stage/releases/tag/v4.20.0)): Validation rules and command requirements with warning or information severity reject the command, using Arc's `[BlockOnValidationSeverity]`. (#116)
- **Stage** ([Release v4.20.0](https://github.com/Cratis/Stage/releases/tag/v4.20.0)): Specifications for protected queries run through Arc's query pipeline, including denials. They are admitted only when every seeded event comes from the queried key.
- **Stage** ([Release v4.20.0](https://github.com/Cratis/Stage/releases/tag/v4.20.0)): The semantic runtime rebuilds its state from stored events on restart through Screenplay's `EstablishWorld`. It refuses to start on a history it can't reproduce.
- **Chronicle.TypeScript** ([Release v6.16.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.16.0)): Reactor handlers receive a third argument, `services`, with the `eventStore` and `readModels` of the event store and namespace the reactor observes, plus the delivery's abort `signal`. A handler can now append explicitly and check the `AppendResult`, or look up a read model before acting, as reactors in Chronicle for .NET can through injected services.
- **Chronicle.TypeScript** ([Release v6.16.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.16.0)): `ChronicleOptions.artifactActivator` lets an application or framework construct reactors and reducers, for example from a dependency injection container, like `ClientArtifactsActivator` in .NET. It returns an `ActivatedArtifact` with the instance and optional `run` and `dispose` hooks. With an activator, an artifact is activated once per delivered batch (and separately for replay notifications); `run` wraps each handler call and its returned events, and `dispose` runs when the batch is done. Activation failures fail the partition like handler failures; cleanup failures are logged.
- **Chronicle.TypeScript** ([Release v6.16.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.16.0)): `ClientArtifactsActivator`, `ActivatedArtifact`, `ArtifactActivationContext`, `ReactorServices` and `ReplayState` are exported from the package root.
- **Arc** ([Release v22.27.0](https://github.com/Cratis/Arc/releases/tag/v22.27.0)): MongoDB `Observe`, `ObserveSingle`, and `ObserveById` accept `ignoreQueryContext: true` for auxiliary sources in composed observable queries. Opted-in sources read their full filtered results without client paging or sorting and do not update `TotalItems`; the primary observation keeps its paging, sorting and filtered count. Existing composed queries must opt in on their auxiliary observations to get this fix; the existing overloads remain available (#2756)
- **Chronicle.TypeScript** ([Release v6.15.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.15.0)): `@noAutoMap` now works on model-bound child and nested types, as in Chronicle for .NET. A child or nested definition stops auto-mapping event properties when its own type, or the type that declares it, carries `@noAutoMap`. The policy applies to that type's direct child and nested definitions and doesn't cascade further.
- **Chronicle.TypeScript** ([Release v6.15.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.15.0)): `@noAutoMap` on an individual property of a child or nested type now excludes that property from auto-mapping. Previously it was ignored.
- **Arc.TypeScript** ([v0.39.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.39.0)): Paired conformance checks against Arc for .NET 22.23.0 for commands whose handlers return `OneOf`/`Result` alternatives: a DTO or primitive answers 200 with it as `response`, a validation branch answers 400, a denial 403, a tuple's validation result replaces its response, and no discriminator is added to the wire. An arbitrary `Result` error DTO in .NET is an ordinary 200 response; in TypeScript, return it with `response(...)` to get the same result, or use `rejected(...)`/`denied(...)` for failures. The suite now runs 279 checks.
- **Chronicle** ([Release v19.9.0](https://github.com/Cratis/Chronicle/releases/tag/v19.9.0)): Decision reads: `IDecisionReads.Get<T>(key)` returns a read model instance (or its absence) with an opaque guard, and the unit of work's commit is rejected if an event that could change what was read has been appended since. Developers never handle sequence numbers. Admitted read models are projections keyed on the event source without joins, children, custom keys or `all`; everything else is refused with a typed reason. Text keys and canonical (lowercase) GUID keys are admitted. `Chronicle.Testing` supports decision reads in-process. This is the client part of the design for #4138.
- **Chronicle** ([Release v19.9.0](https://github.com/Cratis/Chronicle/releases/tag/v19.9.0)): A unit of work that holds a decision read is completed only by its owner, so application code cannot commit it early and bypass the guard. The ASP.NET Core unit-of-work middleware owns its request's unit of work.
- **Chronicle** ([Release v19.9.0](https://github.com/Cratis/Chronicle/releases/tag/v19.9.0)): `GetDecisionConflicts` explains a rejected guarded append without exposing sequence numbers.
- **Arc.TypeScript** ([v0.38.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.38.0)): Opt-in, tenant-scoped observation for Drizzle read models: `withDrizzle({ observation: DrizzleObservation.InProcess })`.
- **Arc.TypeScript** ([v0.38.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.38.0)): `DrizzleReadModels.observe(filter?)` and `observeById(key)` return a live RxJS observable with `current()`, which model-bound observable queries can return and serve over SSE and WebSocket like any observable query.
- **Arc.TypeScript** ([v0.38.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.38.0)): `observePage(filter, options)` emits `QueryPage` results for low-level `defineObservableQuery` definitions; generated proxies don't support observable pages yet.
- **Arc.TypeScript** ([v0.38.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.38.0)): `DrizzleHandle.notifyChanged(tableOrReadModelType)` announces a write. Inside an Arc command, notifications from the command and its nested commands are published once, when the outermost command finishes (also when it fails). Outside a command they are published immediately.
- **Arc.TypeScript** ([v0.38.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.38.0)): The proxy generator recognizes query results whose class derives from an RxJS `Observable` or `Subject`, such as the observables returned by MongoDB and Drizzle read models, and asks for an `Observable<...>` annotation when it can't resolve the item type.
- **Arc.TypeScript** ([v0.37.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.37.0)): `ChronicleQueryScenario.for(Model, 'method', ...artifacts)` runs a model-bound query against Chronicle read models without a kernel. Seed state per event source with `given.forEventSource(id, tenant?)`: `.events(...)` builds reducer-backed read models with the Chronicle SDK's `ReadModelScenario`, and `.readModel(instance)` pins an instance, which wins over seeded events. Reads are tenant-scoped, and an unseeded key resolves as missing.
- **Arc.TypeScript** ([v0.37.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.37.0)): Listing, watching and projection-backed history need `ChronicleKernelScenario`, and the scenario says so rather than returning a partial answer.
- **Arc.TypeScript** ([v0.37.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.37.0)): `snapshotStreamSource(result)` in `@cratis/arc.core` returns the stream a snapshot query returned by mistake, so a test host can release it.
- **Arc.TypeScript** ([v0.36.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.36.0)): ARCCHR0006 in `@cratis/eslint-plugin-arc-core`'s `recommended-type-checked` preset. It reports a Chronicle `@reactor()` event handler that returns an Arc `@command()` without a replay decision: `@onceOnly()` on the reactor or handler, or a `@replay()` handler for the same event. Replaying the reactor would otherwise execute the command again.
- **Arc.TypeScript** ([v0.36.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.36.0)): It follows `async` handlers, returned arrays and tuples, and helpers in the same class whose result the handler returns, including class-expression reactors.
- **Arc.TypeScript** ([v0.36.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.36.0)): It does not follow inherited or external helpers, handlers whose event parameter isn't typed as the event class, decorated classes that only come from `.d.ts` files, or commands executed manually through an Arc server. The ARCCHR0006 page lists these limits.
- **Arc** ([Release v22.26.0](https://github.com/Cratis/Arc/releases/tag/v22.26.0)): Select a tenant with `ITenantScope.Begin` for commands, validation, queries, and tenant-scoped reads in background work. The selection takes precedence over request tenant resolution inside the current flow. Dispose to restore the previous tenant; disposal is idempotent, and disposing an outer scope early leaves an active inner tenant selected until it ends (#2747)
- **Arc** ([Release v22.26.0](https://github.com/Cratis/Arc/releases/tag/v22.26.0)): Custom `ITenantIdAccessor` registrations are preserved whether they are registered before or after Arc. Explicit tenant scopes require Arc's `TenantIdAccessor` as the effective accessor; resolving `ITenantScope` with a custom accessor throws `ExplicitTenantScopeRequiresArcAccessor` instead of silently selecting a tenant that downstream services cannot see.
- **Arc** ([Release v22.26.0](https://github.com/Cratis/Arc/releases/tag/v22.26.0)): Independent HTTP requests reset inherited tenant selection when they enter Arc's request pipeline, before authentication and tenant-bound resolution. On ASP.NET Core this covers all application middleware, but not middleware added by another `IStartupFilter` registered before Arc's. Observable emissions use the subscriber's tenant, not a producer's explicit tenant, on every streaming transport. Tasks and timers started inside a tenant scope keep its tenant after the scope is disposed: do not carry that captured context into unrelated work.
- **Arc** ([Release v22.26.0](https://github.com/Cratis/Arc/releases/tag/v22.26.0)): Configurable access to the command and query introspection catalogs (`/.cratis/commands` and `/.cratis/queries`) through `Cratis:Arc:Introspection` (`ArcOptions.Introspection`) (#2764):
- **Arc** ([Release v22.26.0](https://github.com/Cratis/Arc/releases/tag/v22.26.0)): `Enabled` (default `true`): set to `false` to leave both routes unmapped.
- **Arc** ([Release v22.26.0](https://github.com/Cratis/Arc/releases/tag/v22.26.0)): `RequireAuthentication` (default `false`): deny anonymous callers. Arc.Core returns 401; ASP.NET Core uses the configured scheme's challenge behavior.
- **Arc** ([Release v22.26.0](https://github.com/Cratis/Arc/releases/tag/v22.26.0)): `Roles` (comma-separated, any one grants access, requires `RequireAuthentication`): deny callers without a listed role. Arc.Core returns 403; ASP.NET Core uses the configured scheme's forbid behavior.
- **Arc** ([Release v22.26.0](https://github.com/Cratis/Arc/releases/tag/v22.26.0)): `TrustForwardedIdentityHeaders` (default `false`): lets the Microsoft Identity Platform header handler authenticate protected catalog requests; enable it only behind a trusted ingress that replaces those headers.
- **Arc.TypeScript** ([v0.35.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.35.0)): `/openapi.json` describes `POST <command route>/validate` for every command, with the execute operation's request body, tag, and security requirements. Its responses are the untyped command result envelope, and its operationId is `<command operationId>:validate`.
- **Arc.TypeScript** ([v0.35.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.35.0)): `GeneratedReturn` is exported as a type, so low-level `defineQuery` and `defineObservableQuery` descriptors can declare their return cardinality.
- **Arc** ([Release v22.25.0](https://github.com/Cratis/Arc/releases/tag/v22.25.0)): A model-bound command can declare `[BlockOnValidationSeverity(ValidationResultSeverity.Warning)]`, or `Information`, so that warning- or information-level validation failures reject it. The declared severity is the lowest severity that blocks. It applies to HTTP execution, validation, `Provide()` and in-process `ICommandPipeline` execution, and derived command records inherit it. (#2760)
- **Arc** ([Release v22.25.0](https://github.com/Cratis/Arc/releases/tag/v22.25.0)): Generated TypeScript proxies carry the declared severity and apply the same threshold on the client. The server stays authoritative. An out-of-range declared severity fails proxy generation.
- **Arc.TypeScript** ([v0.34.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.34.0)): `ValidationResult.information(message, options?)`, `ValidationResult.warning(message, options?)`, and `ValidationResult.error(message, options?)` construct validation results at a chosen severity.
- **Arc.TypeScript** ([v0.34.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.34.0)): The options object sets `members`, `state`, `reason`, and `reasonDetail`. `reason` defaults to `rule`, and omitted options are left out of the result.
- **Arc.TypeScript** ([v0.34.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.34.0)): `state` and `reasonDetail` reach the command and query HTTP result envelopes. `state` must be JSON-serializable.
- **Arc.TypeScript** ([v0.34.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.34.0)): `ValidationResultOptions` is exported for typing those options.
- **Stage** ([Release v4.19.0](https://github.com/Cratis/Stage/releases/tag/v4.19.0)): Stage accepts Screenplay's typed-context descriptors (Screenplay 4.41) alongside a model's implementation attachments. `LoadedSemanticModel.TypedContextDescriptors`, the matching `ArtifactRenderRequest` members and a new `CratisRendering.Plan` overload carry them from the same compilation. Stage admits descriptor contract revision 1 only, and refuses descriptors that are not ready for wrapper generation, come from another compilation, are malformed or incomplete, with `STAGE-ESM-021`.
- **Stage** ([Release v4.19.0](https://github.com/Cratis/Stage/releases/tag/v4.19.0)): Stage generates typed C# contexts from the descriptors for validation, never falling back to `dynamic`. No generated code uses them yet: they are emitted once reducer bodies render. This is part of #151.
- **Arc.TypeScript** ([v0.33.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.33.0)): `scenario.given.forEventSource(sourceId, tenant?).events(...events)` seeds ordered history for an event source.
- **Arc.TypeScript** ([v0.33.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.33.0)): When a command reads a reducer-backed read model for that source (through `commandReadModel`, `readModelForValidation` or `provide()`), the scenario builds it from the seeded events. It uses the Chronicle SDK's in-process `ReadModelScenario`, so the kernel isn't needed.
- **Arc.TypeScript** ([v0.33.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.33.0)): Seeded events never count as events the command appended.
- **Arc.TypeScript** ([v0.33.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.33.0)): Seeding history needs `@cratis/chronicle` 6.14 or later. It is loaded only when history is seeded, so the package's peer range stays `^6.7.0`.
- **Arc.TypeScript** ([v0.33.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.33.0)): `scenario.given.forEventSource(sourceId, tenant?).readModel(instance)` pins a read model for a source. A pinned instance wins over seeded history.
- **Arc** ([Release v22.24.0](https://github.com/Cratis/Arc/releases/tag/v22.24.0)): `QueryScenario<TReadModel>` runs model-bound snapshot queries in-process through the same hosted pipeline as the HTTP endpoint, including argument conversion, authorization, validation, interceptors and owned query scopes. The principal comes from an `ICurrentPrincipalAccessor` registered in `Services`, as with `CommandScenario`. (#2762)
- **Arc** ([Release v22.24.0](https://github.com/Cratis/Arc/releases/tag/v22.24.0)): `IQueryScenarioExtender` is a seam for extending query scenarios. `Cratis.Arc.Chronicle.Testing` uses it to seed read models and event history for Chronicle-backed queries, including other read model types the query reads.
- **Arc** ([Release v22.24.0](https://github.com/Cratis/Arc/releases/tag/v22.24.0)): Query scenarios materialize lazy results that depend on scoped services before releasing the query scope, so the result stays readable after `Perform` returns.
- **Arc.TypeScript** ([Arc for TypeScript 0.32.0 — Chronicle lint rules](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.32.0)): **ARCCHR0003:** a reactor appends to an event store field it got from its own client or runtime, instead of returning the event. The rule cannot prove the store is the reactor's own, and the documentation says so.
- **Arc.TypeScript** ([Arc for TypeScript 0.32.0 — Chronicle lint rules](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.32.0)): **ARCCHR0007:** a command's `handle()` or `provide()` appends to the event log directly. That includes stores reached through injected `ChronicleReadModels` or `ChronicleRuntime`, and `.transactional` appends. Such appends escape the command's batch; return the events instead.
- **Arc.TypeScript** ([Arc for TypeScript 0.32.0 — Chronicle lint rules](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.32.0)): **ARCCHR0009:** a command property with a secret-looking name that Arc does not mask at runtime, such as `passphrase`, `privateKey`, `accessKey`, `pin`, `otp`, `cvv`, `securityCode` or `authorizationHeader`. It is reported only when `@cratis/arc.chronicle` is installed, skips number, boolean, date and GUID fields, and is silenced by `@notAudited()` or `@pii()`.
- **Arc.TypeScript** ([Arc for TypeScript 0.32.0 — Chronicle lint rules](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.32.0)): **ARCCHR0010:** a keyless command returns a `Guid` beside an event instead of an event source ID response. This rule needs type information.
- **Arc.TypeScript** ([Arc for TypeScript 0.32.0 — Chronicle lint rules](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.32.0)): The Chronicle code analysis page maps every .NET `ARCCHR` diagnostic to a TypeScript rule, a runtime check, or the reason it does not apply.
- **Components** ([Release v4.15.0](https://github.com/Cratis/Components/releases/tag/v4.15.0)): `DataTableForQuery`, `DataTableForObservableQuery`, and `DataPage` show a loading row while the first result is on its way, and a failure row when the query fails or the user is not authorized. A table that is refreshing rows it already shows keeps them visible and marks itself busy (`aria-busy` on the table, `data-busy` on the root). Server exception text is never shown. (#327)
- **Components** ([Release v4.15.0](https://github.com/Cratis/Components/releases/tag/v4.15.0)): `loadingMessage`, `failureMessage`, and `unauthorizedMessage` props on `DataTableCore`, both query tables, and `DataPage`, with provider-wide defaults in `CratisComponentsProvider` `messages.dataTable.loading`, `.failed`, and `.unauthorized`. (#327)
- **Components** ([Release v4.15.0](https://github.com/Cratis/Components/releases/tag/v4.15.0)): `DataTableCore` accepts `status` (`DataTableStatus.Ready`, `Loading`, `Failed`, or `Unauthorized`) so a table over local rows can show the same states. (#327)
- **Components** ([Release v4.15.0](https://github.com/Cratis/Components/releases/tag/v4.15.0)): New stable parts `loading-row`, `loading-cell`, `failure-row`, and `failure-cell` (typed as `loadingRow`, `loadingCell`, `failureRow`, and `failureCell` in `DataTableParts`). The failure cell carries `data-reason`, and the loading and failure text are announced to screen readers through `role="status"` and `role="alert"`. (#327)
- **Components** ([Release v4.15.0](https://github.com/Cratis/Components/releases/tag/v4.15.0)): `PivotViewer` announces its loading state to screen readers, labeled by the new `loadingLabel` prop (default `Loading…`). (#328)
- **Chronicle** ([Release v19.8.0](https://github.com/Cratis/Chronicle/releases/tag/v19.8.0)): Testing scenarios accept per-run artifacts. Pass `new Defaults(clientArtifactsProvider, serviceProvider)` to `EventScenario` or `ReadModelScenario`, so each test run discovers only the artifacts you give it, not the assembly-wide set.
- **Chronicle** ([Release v19.8.0](https://github.com/Cratis/Chronicle/releases/tag/v19.8.0)): `EventScenario(Defaults, ICanProvideConstraints?)` discovers constraints from the supplied defaults when no constraint provider is passed.
- **Chronicle** ([Release v19.8.0](https://github.com/Cratis/Chronicle/releases/tag/v19.8.0)): `ReadModelScenario<TReadModel>.WithProjection(Action<IProjectionBuilderFor<TReadModel>>)` defines a projection inline for a single scenario. It takes precedence over discovered projections and reducers, and it does not leak into other runs.
- **Arc.TypeScript** ([Arc for TypeScript 0.31.0 — global command and query filters](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.31.0)): `AuthorizationCommandFilter` and `CommandPipelineFilter` apply to every command. `AuthorizationQueryFilter` and `QueryPipelineFilter` apply to every query snapshot and observable subscription. Register them through `ArcOptions`, the builder's `add…` methods, or the matching decorators.
- **Arc.TypeScript** ([Arc for TypeScript 0.31.0 — global command and query filters](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.31.0)): Authorization filters always run before pipeline filters, validators, dependency construction and the handler.
- **Arc.TypeScript** ([Arc for TypeScript 0.31.0 — global command and query filters](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.31.0)): A denial is a 403 that never discloses validation results. It wins over invalid input, and severity filtering cannot override it.
- **Arc.TypeScript** ([Arc for TypeScript 0.31.0 — global command and query filters](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.31.0)): Command `/validate` runs the same filters without calling `provide()` or `handle()`.
- **Arc.TypeScript** ([Arc for TypeScript 0.31.0 — global command and query filters](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.31.0)): Observable queries run the filters once, when the subscription is admitted, not for each emission. That includes the health observable.
- **Arc.TypeScript** ([Arc for TypeScript 0.31.0 — global command and query filters](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.31.0)): Helpers build filter results, for example `unauthorizedCommandResult` and `unauthorizedQueryResult`.
- **Arc.TypeScript** ([Arc for TypeScript 0.31.0 — global command and query filters](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.31.0)): Command and query contexts carry `operationName`, the declared name of the operation, the same as `CommandContext.Type` and `QueryContext.Name` in .NET. Framework-built contexts always set it, and it cannot be changed. Filters that rely on it must deny or handle a manually built context without it.
- **Arc.TypeScript** ([Arc for TypeScript 0.31.0 — global command and query filters](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.31.0)): Paired .NET and TypeScript HTTP checks cover denied, denied with invalid input, allowed with invalid input, and allowed commands and queries.
- **Components** ([Release v4.14.2](https://github.com/Cratis/Components/releases/tag/v4.14.2)): `ColumnsProps` is exported from `@cratis/components/DataPage` for the props of `DataPage.Columns`. `ColumnProps` from that subpath is unchanged and still describes a table column. (#333)
- **Screenplay** ([Release v4.41.0](https://github.com/Cratis/Screenplay/releases/tag/v4.41.0)): Screenplay publishes typed-context descriptors: language-neutral data describing exactly what each code body can see, so providers such as Stage can generate typed wrappers instead of `dynamic` contexts. They cover reducer transitions (a typed `Event` per `on` event using its current generation, and a nullable `State` shaped like the read model), validation and rule code, code policies at each place they are used, and the context of command handlers, which are still not bound. This is the descriptor part of decision 0012 and advances #139.
- **Screenplay** ([Release v4.41.0](https://github.com/Cratis/Screenplay/releases/tag/v4.41.0)): `CompilationResult` exposes the descriptors through `TypedContextDescriptors` and `ContextsFor(requirementId)`. `IsWrapperReady` is true only for descriptors from a successful compilation whose types all resolve; a failed compilation publishes only command-handler descriptors, marked not ready. Every descriptor carries the definitions of the concept and composite types it refers to.
- **Screenplay** ([Release v4.41.0](https://github.com/Cratis/Screenplay/releases/tag/v4.41.0)): MCP has a paged `typed-contexts` view; `implementation-requirements` items gain a small `typedContext` reference (count and operation ids).
- **Screenplay** ([Release v4.41.0](https://github.com/Cratis/Screenplay/releases/tag/v4.41.0)): The descriptor contract has its own revision (1), a published vocabulary of portable type tokens and source kinds, and two readable vectors (`typed-contexts-v1.json`, `unbound-handler-context-v1.json`) packaged with the canonical vectors. Canonical executable-model bytes and revisions are unchanged.
- **Chronicle.TypeScript** ([Release v6.14.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.14.0)): `@cratis/chronicle/testing` exports `ReadModelScenario`. Seed history with `scenario.given.forEventSource(id).events(...)`, then read `await scenario.instance` or `await scenario.instanceForEventSourceId(id)`. `wasDeletedForEventSourceId(id)` tells a deleted read model apart from one that never materialized.
- **Chronicle.TypeScript** ([Release v6.14.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.14.0)): Events go through the same reducer dispatch and the same event serialization as production. Concept values are therefore flattened exactly as they are when appended.
- **Chronicle.TypeScript** ([Release v6.14.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.14.0)): The event context carries the same defaults as the kernel, sequence numbers are global in seed order, and each event source is reduced separately.
- **Chronicle.TypeScript** ([Release v6.14.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.14.0)): A reducer that fails is reported with the read model and reducer names and the original error as its cause.
- **Chronicle.TypeScript** ([Release v6.14.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.14.0)): A read model built by a projection is rejected with a clear message; test it against a kernel instead.
- **Chronicle** ([Release v19.7.3](https://github.com/Cratis/Chronicle/releases/tag/v19.7.3)): CHR0054 reports a reactor method whose return type Chronicle cannot discover as a handler, with a message about the return type (#4206)
- **Chronicle.Elixir** ([Release v3.6.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.6.0)): `Chronicle.Observers` - lists what the event store knows about its observers and removes one by id. For the observer whose declaring code is gone: a deleted read model and its projection, or a removed reactor. Removal covers the whole event store, since an observer's definition (and its projection definition, where it has one) is a store-level record. The kernel refuses while the observer is running or still has a subscribed client in any namespace, naming the namespace that blocked it - there is no override. Read model data and sink containers are left untouched.
- **Chronicle.TypeScript** ([Release v6.13.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.13.0)): `eventStore.observers` - lists what the event store knows about its observers and removes one by id. For the observer whose declaring code is gone: a deleted read model and its projection, or a removed reactor. Removal covers the whole event store, since an observer's definition (and its projection definition, where it has one) is a store-level record. The kernel refuses while the observer is running or still has a subscribed client in any namespace, naming the namespace that blocked it - there is no override. Read model data and sink containers are left untouched.
- **Chronicle.Kotlin** ([Release v6.6.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.6.0)): `store.observers` - lists what the event store knows about its observers and removes one by id. For the observer whose declaring code is gone: a deleted read model and its projection, or a removed reactor. Removal covers the whole event store, since an observer's definition (and its projection definition, where it has one) is a store-level record. The kernel refuses while the observer is running or still has a subscribed client in any namespace, naming the namespace that blocked it - there is no override. Read model data and sink containers are left untouched.
- **Screenplay** ([Release v4.40.0](https://github.com/Cratis/Screenplay/releases/tag/v4.40.0)): `SemanticEvaluator.EstablishWorld(plan, facts)` establishes a deterministic reference world from ordered existing facts, with no read-model snapshots required. It checks every fact first: a default or null fact array, an unknown event, a payload that doesn't match the event, a missing or blank event-source identity, a source type other than the event's declared producer destination type, or a blank tag returns `SemanticRejected` with category `Contract`. A fact that affects a reducer-backed read model returns `SemanticUnsupported` with capability `Projection`, because reducer transitions are opaque. This is reference semantics and does not replace Chronicle replay. (#253)
- **Screenplay** ([Release v4.38.0](https://github.com/Cratis/Screenplay/releases/tag/v4.38.0)): A `StateView` slice's specification can use `when append … for`, as long as exactly one command produces the event and so determines the source type. (#262)
- **Chronicle.TypeScript** ([Release v6.12.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.12.0)): `@index()` marks a read-model property to be indexed, including properties in nested objects and in typed child collections. Paths are joined with dots, as in .NET, for example `address.zipCode` and `lines.productId`.
- **Chronicle.TypeScript** ([Release v6.12.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.12.0)): Indexes are registered with the kernel at application startup for declarative projections, model-bound projections, variants and reducers, and through `readModels.register()`. The MongoDB sink creates the indexes.
- **Screenplay** ([Release v4.37.0](https://github.com/Cratis/Screenplay/releases/tag/v4.37.0)): Event generations now bind to the executable model. Events with several generations share one contract identity and carry their complete prior revisions, predecessor links and revision-specific property identities. Ordinary references use the current generation. This implements decisions 0011 and 0015 and advances #71.
- **Screenplay** ([Release v4.37.0](https://github.com/Cratis/Screenplay/releases/tag/v4.37.0)): Persisted event contracts can advance through an explicit, catalog-revision-checked workspace transaction. Renaming or moving an event preserves its identities across generations; combining a rename with evolution still requires explicit advancement.
- **Screenplay** ([Release v4.37.0](https://github.com/Cratis/Screenplay/releases/tag/v4.37.0)): The RegisterProject v2 canonical corpus declares two event generations, removes the duplicated `projectId` from the current event payload and uses the event source as its identity. Single-file, folder, reordered and relocated forms produce the same model. This advances #168.
- **Chronicle.TypeScript** ([Release v6.11.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.11.0)): `waitForCompletion({ timeoutMs, signal })` accepts an `AbortSignal`. Canceling the signal rejects the wait promptly with the signal's reason and cancels the underlying call, including while the client is still waiting for an access token. Other calls that wait for the same token are not affected. The existing `waitForCompletion(timeoutMs)` form and its five-second default are unchanged.
- **Chronicle.TypeScript** ([Release v6.10.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.10.0)): `RejectedChronicleCredentials`: the client now stops retrying and rejects `getEventStore(...)` and later calls when the credentials are rejected. This applies when the token endpoint answers `invalid_client`, `unauthorized_client`, or `invalid_grant`, or the kernel refuses an API key, on three consecutive attempts. Previously a wrong password made `getEventStore(...)` wait forever.
- **Chronicle.TypeScript** ([Release v6.10.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.10.0)): `@childrenFrom(Event, ChildType, identifiedBy?, parentKey?)` accepts the child class as its second argument. Use it under runtimes that emit no type metadata, such as `tsx`, so the client knows the element type of a children collection.
- **Chronicle.TypeScript** ([Release v6.10.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.10.0)): A root `yarn test` script.
- **Screenplay** ([Release v4.36.0](https://github.com/Cratis/Screenplay/releases/tag/v4.36.0)): MCP can export the compiled executable model: `read-workspace` view `executable-model` returns its schema, language and semantic versions, model revision and size, plus bounded base64 pages of the exact canonical bytes. It is available only when compilation succeeded; otherwise it reports `available: false` and points to the `executable-diagnostics` view. Continuation pages must pass `expectedModelRevision` and `expectedAttachmentManifestRevision`, and are refused if the model or any attached code changed, including a code edit that changes neither the workspace nor the model revision. The exported model alone is not a proof of equivalence or a runnable attachment bundle (decision 0016).
- **Screenplay** ([Release v4.36.0](https://github.com/Cratis/Screenplay/releases/tag/v4.36.0)): `implementation-requirements` responses include the attachment-manifest revision. Passing it back pins a continuation and refuses it if attached code changed; continuations without it work as before.
- **Chronicle.Kotlin** ([Release v6.5.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.5.0)): `set(...).toValue(value)` on the fluent projection builder sets a constant. `toValue(null)` clears the property.
- **Chronicle.Kotlin** ([Release v6.5.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.5.0)): Passive reducers (`@Reducer(isActive = false)`, or a reducer whose read model is `@Passive`) are folded in the client from the reducer's event sequence on `getInstanceByKey` and `getInstances`, so they return current state.
- **Chronicle.Kotlin** ([Release v6.5.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.5.0)): `ChronicleConnectionFailed` is thrown by `awaitRegistration()` and by appends that wait for registration when the kernel rejects the connection: wrong credentials, missing permission, or an incompatible server. The client keeps retrying and recovers when the kernel accepts a connection.
- **Chronicle.Kotlin** ([Release v6.5.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.5.0)): `ChronicleServerIncompatible` (an `IllegalStateException`) is thrown when the compatibility check fails.
- **Chronicle.Kotlin** ([Release v6.5.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.5.0)): `ArtifactRegistrationFailed` is thrown from an explicit `registerAll()` that could not start one or more reactors or reducers, naming each one.
- **AI** ([Release v7.0.0](https://github.com/Cratis/AI/releases/tag/v7.0.0)): A decision engine choice: the built-in Decision Engine or TypeSafe's Jev, selected with `UseBuiltInDecisionEngine` or `UseJevDecisionEngine`. Exactly one engine is in force at a time; until one is chosen, decisions go to the built-in engine
- **AI** ([Release v7.0.0](https://github.com/Cratis/AI/releases/tag/v7.0.0)): Jev support: an API key (encrypted at rest and kept out of the causation chain), a model defaulting to `jev-latest` and an endpoint defaulting to `https://api.typesafe.ai`. Questions that share a context are sent as one request
- **AI** ([Release v7.0.0](https://github.com/Cratis/AI/releases/tag/v7.0.0)): The built-in engine's address and model are deployment configuration under `Cratis:AI:Decisions:BuiltIn`, bound through `IOptions<BuiltInDecisionEngineOptions>`
- **AI** ([Release v7.0.0](https://github.com/Cratis/AI/releases/tag/v7.0.0)): `DecisionEngineSettings.CurrentDecisionEngine` returns the engine in force, its model and a cached health check for a settings page. The API key is never returned
- **AI** ([Release v7.0.0](https://github.com/Cratis/AI/releases/tag/v7.0.0)): Decision usage: `RecordDecisionUsage` and the `DecisionUsageByDay` read model, with `DecisionUsageForLastThirtyDays`
- **AI** ([Release v7.0.0](https://github.com/Cratis/AI/releases/tag/v7.0.0)): A `DecisionRequest` can carry the question being asked, a description of each choice and a topic. The Decision Engine includes the question and descriptions in its prompt; without them it keeps the generic question
- **AI** ([Release v7.0.0](https://github.com/Cratis/AI/releases/tag/v7.0.0)): `CratisAIBuilder.WithDecisions()` registers decision making, and `WithDecisions<TResolver>()` replaces how the engine is resolved
- **Chronicle.TypeScript** ([Release v6.9.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.9.0)): Class-level `@onceOnly()` registers a reactor as not replayable, so the kernel never replays it. The marker is not inherited, as in .NET.
- **Chronicle.TypeScript** ([Release v6.9.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.9.0)): Method-level `@onceOnly()` skips that handler when an event is delivered during a replay.
- **Chronicle.TypeScript** ([Release v6.9.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.9.0)): `@replay()` marks a handler that runs instead of the regular handler for its event type during a replay.
- **Chronicle.TypeScript** ([Release v6.9.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.9.0)): The shared Chronicle documentation shows TypeScript examples for once-only and replay handlers.
- **AI** ([Release v6.5.0](https://github.com/Cratis/AI/releases/tag/v6.5.0)): Kubernetes workers can keep their workspace on a volume of their own. Set `Cratis:AI:ContainerRuntime:ScratchStorageClassName` and `ScratchSize`, and each worker gets a volume provisioned from that class, mounted at `/workspace` and removed with the worker. A checkout and its build output then no longer fill the node's disk or compete with other workers on it. Use a storage class that deletes volumes with their claim and binds on first consumer. Leaving either setting unset keeps today's behavior.
- **Chronicle** ([Release v19.7.0](https://github.com/Cratis/Chronicle/releases/tag/v19.7.0)): The event-store dashboard, built from projections with composite keys rather than counting rows on demand, with per-namespace figures and drill-down, and key figures under each event store on the landing page (#3731)
- **Chronicle** ([Release v19.7.0](https://github.com/Cratis/Chronicle/releases/tag/v19.7.0)): A declarative surface for kernel-owned projections - identified with a `$system.` prefix, owned by the kernel rather than a client, and refused by replay, because replaying one rebuilds state the kernel keeps for itself
- **Chronicle** ([Release v19.7.0](https://github.com/Cratis/Chronicle/releases/tag/v19.7.0)): `ProjectionScope`, so a read model can be built per namespace, once for the whole store, or both. A `Both` declaration lowers to two single-scope definitions, and a global one is keyed with the unset namespace
- **Chronicle** ([Release v19.7.0](https://github.com/Cratis/Chronicle/releases/tag/v19.7.0)): A statistics query surface over the new projections, and the Workbench screens that show it
- **Chronicle.TypeScript** ([Release v6.8.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.8.0)): `@unique()` marks an event property or an event class as unique. `@removeConstraint(name)` releases a named constraint, can be repeated, and is inherited like the .NET attribute.
- **Chronicle.TypeScript** ([Release v6.8.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.8.0)): The shared constraint pages on the Chronicle documentation site now show TypeScript examples for model-bound constraints.
- **AI** ([Release v6.4.0](https://github.com/Cratis/AI/releases/tag/v6.4.0)): `cratis-content-length`: when content stays short, when it earns more length, and where to split it. It has pilot bands for LinkedIn, documents, video, X, Bluesky, Mastodon, community answers, blog articles, tutorials, newsletters, YouTube and release notes, and says which platform limit or soft trigger applies. Each band states how strong its evidence is. It also sets batch-variety targets so a feed doesn't read as one length.
- **AI** ([Release v6.4.0](https://github.com/Cratis/AI/releases/tag/v6.4.0)): `cratis-developer-marketing`: plans how developer content earns real engagement and adoption. It covers positioning around what developers evaluate (docs, trials, peers, APIs, limits), hooks without bait, the move from pillar to canonical source to channel-native entry points, community participation, founder and company voice, a sustainable cadence, and a staged measurement framework with a small-sample experiment design.
- **AI** ([Release v6.4.0](https://github.com/Cratis/AI/releases/tag/v6.4.0)): The voice and cadence skill gains a catalog of 21 AI-sounding patterns (lexical, syntactic, structural and tonal), each with a script heuristic and the human alternative. It checks a batch for sameness, fixes problems with substance, and includes a meaning-preservation check that handles curly apostrophes. It is explicitly an editing aid, never an authorship detector.
- **AI** ([Release v6.4.0](https://github.com/Cratis/AI/releases/tag/v6.4.0)): The feed post skill leads with media that explains, and puts the Cratis mark on every image, document page, GIF frame and video; screenshots are framed, never stamped. It has guidance for adapting a post to other channels, and a dated evidence matrix with a URL for every source.
- **AI** ([Release v6.4.0](https://github.com/Cratis/AI/releases/tag/v6.4.0)): Both new skills are in the `cratis/content` profile.
- **Screenplay** ([Release v4.35.0](https://github.com/Cratis/Screenplay/releases/tag/v4.35.0)): MCP can propose a fix for a diagnostic: `read-workspace` has a `repairs` view listing the compiler-authored repairs for the workspace's diagnostics (code, subject and typed operations), and `propose-repair` turns one into a retained proposal. Review it with `read-proposal` and write it with `apply`; nothing is written before that, and a stale workspace revision is refused with a typed conflict.
- **Screenplay** ([Release v4.35.0](https://github.com/Cratis/Screenplay/releases/tag/v4.35.0)): The first repair migrates a deprecated `validate csharp` block (`PLAY0397`) to a tagged ```` ```csharp ```` fence. The code body, its requirement identity and content hash, and the executable model are unchanged. The repair reprints the whole file canonically, so it is refused if that would drop a comment. Other `PLAY0397` forms are not offered a repair.
- **Screenplay** ([Release v4.35.0](https://github.com/Cratis/Screenplay/releases/tag/v4.35.0)): Library hosts can find and propose repairs through `WorkspaceDiagnosticRepairs.Find` and `ProposeRepair`, which require canonical formatting (`RequiredFormatting`).
- **Screenplay** ([Release v4.35.0](https://github.com/Cratis/Screenplay/releases/tag/v4.35.0)): Adding a node whose references don't resolve is refused under the safe reference policy, which is how decision 0014 covers "link" in #138.
- **Screenplay** ([Release v4.34.0](https://github.com/Cratis/Screenplay/releases/tag/v4.34.0)): Events can declare their generations: `event ProjectRegistered generation 2`. An event without the marker is generation 1 and prints as before. Each earlier generation is a complete declaration in the same slice, numbered consecutively from 1; an invalid, duplicate or missing generation is a compile error (`PLAY0446`, `PLAY0447`, `PLAY0448`). Printing, workspace and MCP authoring, and editor highlighting, completion and hover support the marker. This is the grammar part of decision 0011 for #71.
- **Screenplay** ([Release v4.34.0](https://github.com/Cratis/Screenplay/releases/tag/v4.34.0)): A model that uses the marker does not compile to the executable model yet: binding fails with `PLAY0449` until generation lineage ships (decision 0015). Models without the marker are unchanged.
- **cli** ([Release v3.19.0](https://github.com/Cratis/cli/releases/tag/v3.19.0)): `chronicle observers remove` — removes an observer whose declaring code is gone (a deleted read model and projection, or a removed reactor), clearing its definition, state, handled counts and failed partitions across every namespace of the event store. Asks for confirmation first, stating what is deleted, that it reaches every namespace, that read models and their data are left alone, and that it cannot be undone. The kernel refuses while the observer is running or a client is still subscribed to it, and the command reports that refusal rather than reporting success.
- **Arc.TypeScript** ([Arc for TypeScript 0.29.0 — query paging, sorting and QUERY bodies like .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.29.0)): `QueryPagingRequired` is returned as a 400 `rule` validation result on `Size` in two cases:
- **Arc.TypeScript** ([Arc for TypeScript 0.29.0 — query paging, sorting and QUERY bodies like .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.29.0)): an unpaged MongoDB or Drizzle query reads more than the provider's maximum page size;
- **Arc.TypeScript** ([Arc for TypeScript 0.29.0 — query paging, sorting and QUERY bodies like .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.29.0)): a client asks for a page larger than that maximum.
- **cli** ([Release v3.18.0](https://github.com/Cratis/cli/releases/tag/v3.18.0)): `cratis render` reads the implementation files a model references (`file ...` on policies, validation, reducers and other code) from the model folder, or from a single `.play` file's folder, and gives their contents to the Screenplay compiler, so file-backed code is identified by content. (#184)
- **cli** ([Release v3.18.0](https://github.com/Cratis/cli/releases/tag/v3.18.0)): A file the loader refuses (outside the model folder, a link, missing, too large or not text) is reported as `PLAY0430`–`PLAY0434`, even when compilation fails. (#184)
- **Chronicle** ([Release v19.6.0](https://github.com/Cratis/Chronicle/releases/tag/v19.6.0)): `[NotProjected]` declares a read model member that the projection deliberately does not populate, because whatever reads the model assembles it. A projection may only consume events, never another read model, so a value joined in from a second read model can only be filled in by the query that serves it — and there was previously no way to say so. Declaring it also fences AutoMap off the member, so a subscribed event carrying the same name can no longer write over the assembled value
- **Arc.TypeScript** ([Arc for TypeScript 0.28.0 — Chronicle personal data in directly read models](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.28.0)): Chronicle read models that contain `@pii()` or `@encrypted()` data are decrypted before a query serves them, when the query reads them directly from their MongoDB collection through `MongoCollection`. This covers nested properties, array items, class-level markings, single results, arrays, pages and observable emissions.
- **Arc.TypeScript** ([Arc for TypeScript 0.28.0 — Chronicle personal data in directly read models](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.28.0)): If decryption fails, the query or emission fails instead of serving encrypted values.
- **Screenplay** ([Release v4.33.0](https://github.com/Cratis/Screenplay/releases/tag/v4.33.0)): Screenplay can show which read-model instances each projection event affects, derived from the executable model with no new syntax: one instance by key (`from`, removal), one per event source (`all`), or many through a root join (instances whose join property equals the event source id, never creating one) or a child join and `remove via join` (children whose identity equals the key, across every parent). `SemanticAffectedProjectionInstances.GetAffectedInstances` returns the relationships per event and block, with an overload that uses the application's types to resolve a child identity. This is the first part of decision 0007 for #132.
- **Chronicle** ([Release v19.5.0](https://github.com/Cratis/Chronicle/releases/tag/v19.5.0)): Removing an observer and everything the event store keeps for it — its definition, its state and handled counts in every namespace, its failed partitions, its in-flight events and, for a projection, its projection definition. Refuses while the observer is running or still has a subscribed client in any namespace, naming the namespace that blocked it. Read model data is left untouched (#4151)
- **Chronicle** ([Release v19.5.0](https://github.com/Cratis/Chronicle/releases/tag/v19.5.0)): `EventStore.Observers` on the .NET client, for listing the observers of an event store and removing one (#4151)
- **Chronicle** ([Release v19.5.0](https://github.com/Cratis/Chronicle/releases/tag/v19.5.0)): A **Remove** action on the Workbench observers page, with a confirmation that states what removal deletes, what it leaves alone and that it cannot be undone (#4151)
- **Stage** ([Release v4.17.0](https://github.com/Cratis/Stage/releases/tag/v4.17.0)): Render inputs can carry a Screenplay model's implementation attachments: the compiler's requirements and each resolved body, keyed by requirement id. Inline bodies come from the source; file bodies are loaded through Screenplay's `AttachmentFiles` from the model root. `LoadedSemanticModel` exposes the requirements, the bodies and the loader's attachment diagnostics, and new `CratisRendering.Plan` overloads accept them.
- **Stage** ([Release v4.17.0](https://github.com/Cratis/Stage/releases/tag/v4.17.0)): Planning verifies every supplied body against its requirement's content hash. A body the model references that is missing, refused by the loader, or changed since compilation fails with `STAGE-ESM-020`, which names the requirement and the loader's reason (`PLAY0430`–`PLAY0434`), and no artifacts are produced.
- **Orleans** ([Release v1.10.0](https://github.com/Cratis/Orleans/releases/tag/v1.10.0)): Jobs can run their steps in ordered stages. Give a step a stage with `CreateStep<TJobStep>(request, stage)` (or `JobStepDetails.Stage`): every step in a stage reaches an outcome before any step in a later stage starts, and the steps within a stage still run in parallel. A job that never assigns a stage has every step in `JobStepStage.First` and runs exactly as before. (#27)
- **Orleans** ([Release v1.10.0](https://github.com/Cratis/Orleans/releases/tag/v1.10.0)): A stage with a failed step stops the job by default. Every step behind it is recorded with the new `JobStepStatus.Unreachable` status and counted in `JobProgress.UnreachableSteps`, and the job ends `CompletedWithFailures` because it can account for every step. Override `GetFailureBehaviorFor` to return `JobStageFailureBehavior.ContinueWithNextStage` for a best-effort stage. (#27)
- **Orleans** ([Release v1.10.0](https://github.com/Cratis/Orleans/releases/tag/v1.10.0)): `JobProgress.Stages` reports the progress of each stage. It stays empty for a job with a single stage. (#27)
- **Orleans** ([Release v1.10.0](https://github.com/Cratis/Orleans/releases/tag/v1.10.0)): A resumed job continues from the stage it had reached. This includes a job that a stopped silo left between two stages, whether that was after one stage completed or at a failed barrier that nothing had acted on yet. (#27)
- **Orleans** ([Release v1.10.0](https://github.com/Cratis/Orleans/releases/tag/v1.10.0)): `Job.KeepAfterCompletedWithFailures` lets a job remove its persisted state after completing with failures. The default is `true`, which keeps today's behavior. A job that runs on a short cadence can override it so it does not keep a record of every failed run.
- **Arc.TypeScript** ([Arc for TypeScript 0.27.0 — Drizzle read models in commands](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.27.0)): A command that declares `@inject(commandReadModel(Model))` receives the Drizzle row whose primary key equals the command key. The row is read from the current tenant's database.
- **Arc.TypeScript** ([Arc for TypeScript 0.27.0 — Drizzle read models in commands](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.27.0)): `DrizzleReadModels.findById(key)` loads a row by the table's single primary key. Arc's own custom columns get a typed key, and plain columns get a primitive. Invalid number and GUID keys are rejected with a clear error.
- **Arc.TypeScript** ([Arc for TypeScript 0.27.0 — Drizzle read models in commands](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.27.0)): `DrizzleReadModelForCommandResolver` is exported.
- **Screenplay** ([Release v4.32.0](https://github.com/Cratis/Screenplay/releases/tag/v4.32.0)): `read-workspace` has a paged `source-map` view: the compiler's map from each semantic id to its role, identity origin, document and exact source span. When compilation did not succeed it reports `available: false` and points to the `executable-diagnostics` view instead of returning an empty map.
- **Screenplay** ([Release v4.32.0](https://github.com/Cratis/Screenplay/releases/tag/v4.32.0)): `find-fixtures` finds the payload values and `for` destinations of `when append` events, with the role `whenAppendedEvent`.
- **Screenplay** ([Release v4.32.0](https://github.com/Cratis/Screenplay/releases/tag/v4.32.0)): Compact specification summaries show a `then denied` assertion and the appended event of a `when append` specification.
- **Screenplay** ([Release v4.31.0](https://github.com/Cratis/Screenplay/releases/tag/v4.31.0)): Reaction triggers can declare the views they decide from: `reads <View> [as <alias>] [by <trigger value>]`, with the same alias rules as command reads. Parsing, validation, printing, the syntax walker, MCP references, and editor highlighting, completion and hover all support it.
- **Screenplay** ([Release v4.31.0](https://github.com/Cratis/Screenplay/releases/tag/v4.31.0)): Diagnostics for trigger reads: an unknown view, a repeated view without an alias, a duplicate alias, an alias that collides with a trigger value, a `by` that names no trigger value (`PLAY0442`, warning), a `by` under a clock trigger (`PLAY0443`, error), and a primitive type read as a view (`PLAY0444`, warning, pointing to `@reads`).
- **Arc.TypeScript** ([Arc for TypeScript 0.26.0 — MongoDB watcher and joined observations](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.26.0)): `mongoDBWatcher` observes changes to a tenant's collections as RxJS observables for application code, the counterpart of .NET's `IMongoDBWatcher`.
- **Arc.TypeScript** ([Arc for TypeScript 0.26.0 — MongoDB watcher and joined observations](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.26.0)): Joined observations re-emit a primary collection's results when it or one or two related collections change, like .NET's joined observe builder.
- **Arc.TypeScript** ([Arc for TypeScript 0.26.0 — MongoDB watcher and joined observations](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.26.0)): Fundamentals `Point`, `LineString` and `Polygon` values are stored as GeoJSON.
- **Arc.TypeScript** ([Arc for TypeScript 0.26.0 — MongoDB watcher and joined observations](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.26.0)): MongoDB client metrics through OpenTelemetry for clients Arc creates.
- **Arc.TypeScript** ([Arc for TypeScript 0.26.0 — MongoDB watcher and joined observations](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.26.0)): Reads retry transient MongoDB errors, at most twice.
- **Arc.TypeScript** ([Arc for TypeScript 0.25.0 — kernel-backed Chronicle tests and read consistency](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.25.0)): `ChronicleKernelScenario` in `@cratis/arc.chronicle/testing` runs commands against a real Chronicle kernel: seed events, execute commands through Arc's pipeline, wait for projections through the kernel's own completion signal, and assert on appended events, read models and constraint violations. The in-memory `ChronicleCommandScenario` stays the fast default.
- **Arc.TypeScript** ([Arc for TypeScript 0.25.0 — kernel-backed Chronicle tests and read consistency](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.25.0)): `completionTimeoutMs` makes a command wait, within a bound, until Chronicle has processed the events it appended, so a query right after the command sees the result.
- **Arc.TypeScript** ([Arc for TypeScript 0.25.0 — kernel-backed Chronicle tests and read consistency](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.25.0)): `ChronicleReadModels` reads can ask for `immediate` consistency for passive projections.
- **Arc.TypeScript** ([Arc for TypeScript 0.25.0 — kernel-backed Chronicle tests and read consistency](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.25.0)): Guides for kernel-backed testing and for choosing read consistency.
- **Arc.TypeScript** ([Arc for TypeScript 0.24.0 — Core namespaces and clean builds](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.24.0)): `server.validateCommand(...)` and `app.validate(...)` run a command's authorization and validation without executing it, like .NET's command pipeline `Validate`.
- **Arc.TypeScript** ([Arc for TypeScript 0.23.0 — Chronicle read model queries](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.23.0)): `ChronicleReadModels` reads read models for the current tenant with `getAll(Type)` and `getById(Type, id)`, and observes them as RxJS observables with `observeAll(Type)` and `observeById(Type, id)`, so observable queries over Chronicle read models need no custom plumbing.
- **Arc.TypeScript** ([Arc for TypeScript 0.23.0 — Chronicle read model queries](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.23.0)): `cratisArc(arc).close(server)` closes an Express host, draining open SSE and WebSocket connections first.
- **Arc.TypeScript** ([Arc for TypeScript 0.22.0 — grouped options](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.22.0)): `createHonoWebSockets` for sharing one Node WebSocket helper between your Hono routes and Arc.
- **Stage** ([Release v4.16.0](https://github.com/Cratis/Stage/releases/tag/v4.16.0)): The opt-in semantic Stage engine (`Stage__Runtime__Engine=semantic`) can start on a Chronicle event log that already holds events. It rebuilds its semantic world only when that can be done exactly: every projection is mirrored exactly and has caught up with its own events without failed partitions, every logged event converts back exactly, and the history satisfies the model's constraints. Otherwise it refuses with a specific `Unsupported(World)` status. (part of #23)
- **Stage** ([Release v4.15.0](https://github.com/Cratis/Stage/releases/tag/v4.15.0)): A render profile can carry the model's `.strings` catalog. Generated validators then resolve `$strings.<key>` rule and requirement messages for the request's UI culture, falling back through its parent cultures to the default locale. The key stays in the validation result's state, and generated rejection specifications compare that key, as the Screenplay reference does. A key missing from the default locale fails planning with `STAGE-ESM-018`. Without a catalog, `$strings` messages are still rejected. (part of #116)
- **Arc.TypeScript** ([Arc for TypeScript 0.21.0 — vertical slices and the Library sample](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.21.0)): The Library sample: an event-sourced Arc and Chronicle application with a React frontend using generated proxies. Commands return events, a Chronicle constraint keeps author names unique, projections build the read models, and observable queries update the frontend live. A Docker Compose file starts the Chronicle kernel.
- **Arc.TypeScript** ([Arc for TypeScript 0.21.0 — vertical slices and the Library sample](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.21.0)): A vertical slices guide: one file per slice holds the command, its validator and its events, or the read model with its queries and projection, as in Cratis C# applications. Discovery, proxy generation, generated artifact metadata and the ESLint rules all support several artifacts in one file.
- **Arc.TypeScript** ([Arc for TypeScript 0.20.0 — Fetch runtimes](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.20.0)): `@cratis/arc.core/fetch`, an entry for runtimes that speak the Fetch API: build an application from explicitly added artifacts (or generated artifact metadata) and serve commands, queries and observable queries over server-sent events with `app.fetch(request)`. Its only platform import is `node:async_hooks`, which Deno, Bun, Cloudflare Workers (with Node.js compatibility) and Next.js provide.
- **Arc.TypeScript** ([Arc for TypeScript 0.20.0 — Fetch runtimes](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.20.0)): Verified on Deno 2.9: a command, a query and an observable query over SSE. Bun, Cloudflare Workers and Next.js route handlers have examples but are not yet verified.
- **Arc.TypeScript** ([Arc for TypeScript 0.19.0 — setup, configuration and host integrations](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.19.0)): `builder.withChronicle(...)`, `builder.withMongoDB(...)` and `builder.withDrizzle(...)`, named like .NET's `WithChronicle` and `WithMongoDB`. Importing an integration package adds its method to the builder through a typed extension that also works when two copies of `@cratis/arc.core` are installed.
- **Arc.TypeScript** ([Arc for TypeScript 0.19.0 — setup, configuration and host integrations](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.19.0)): Configuration like .NET's: `ArcApplication.createBuilder()` reads the `Cratis:Arc`, `Cratis:Chronicle` and `Cratis:MongoDB` sections from `appsettings.json` and `appsettings.{Environment}.json`, and from `Cratis__...` environment variables. Values are converted per setting, .NET key names such as `CorrelationId:HttpHeader` and `GeneratedApis:EnableQueryHttpMethod` are accepted, other sections are ignored, and options set in code win. Use `configuration: false` to opt out or `configuration: { file, env }` to choose the source.
- **Arc.TypeScript** ([Arc for TypeScript 0.19.0 — setup, configuration and host integrations](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.19.0)): `@cratis/cratis`, the counterpart of the C# `Cratis` package: `CratisApplication.createBuilder()` or `builder.addCratis()` sets up Arc with Chronicle in one call. Unlike C#, it installs no authentication handler; choose one explicitly.
- **Arc.TypeScript** ([Arc for TypeScript 0.19.0 — setup, configuration and host integrations](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.19.0)): Express: `app.use(cratisArc(arc))` and `cratisArc(arc).injectWebSocket(server)` for observable queries over WebSockets.
- **Arc.TypeScript** ([Arc for TypeScript 0.19.0 — setup, configuration and host integrations](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.19.0)): Fastify: `await app.register(cratisArc, { arc })` registers HTTP routes and WebSockets in one call, in either order with `@fastify/websocket`, and respects mount prefixes.
- **Arc.TypeScript** ([Arc for TypeScript 0.19.0 — setup, configuration and host integrations](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.19.0)): Hono: `app.use(cratisArc(arc))` with `cratisArc(arc).injectWebSocket(server)`, or `serveCratisArc(app, arc, { port })`.
- **Arc.TypeScript** ([Arc for TypeScript 0.19.0 — setup, configuration and host integrations](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.19.0)): `app.fetch(request)` and `app.handle(request)` on the built application, usable as detached functions, for hosts that speak the Fetch API. Only Node.js is verified.
- **Arc.TypeScript** ([Arc for TypeScript 0.18.1 — package contents](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.18.1)): Every package has a README that describes what it contains and links to its documentation.
- **Arc.TypeScript** ([Arc for TypeScript 0.18.0 — RxJS observable queries](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.18.0)): Observable queries can return RxJS subjects and observables, just as a C# query returns `ISubject<T>`. A `BehaviorSubject` answers plain HTTP requests with its current value (200), while a `Subject`, `ReplaySubject` or `Observable` without a current value answers 202 or waits, as in .NET. Completion, errors and client disconnects end the subscription. Async iterables keep working.
- **Arc.TypeScript** ([Arc for TypeScript 0.18.0 — RxJS observable queries](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.18.0)): The proxy generator and generated artifact metadata recognize RxJS `Observable`, `Subject`, `BehaviorSubject` and `ReplaySubject` return types as observable queries.
- **Arc.TypeScript** ([Arc for TypeScript 0.18.0 — RxJS observable queries](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.18.0)): `observeIterable()`, `observeByIdIterable()` (MongoDB) and `watchIterable()` (Chronicle) for code that prefers async iterables.
- **Arc.TypeScript** ([Arc for TypeScript 0.18.0 — RxJS observable queries](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.18.0)): `arc-proxygenerator --watch` reports `Watch ready` once the first generation has finished and the watcher is armed, and notices edits to referenced files outside the artifacts folder.
- **Arc.TypeScript** ([Arc for TypeScript 0.17.0 — OpenAPI results and proxy improvements](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.17.0)): `/openapi.json` describes results: command and query result envelopes with the typed response or data (from generated artifact metadata), paging on paged queries, and the 200, 400, 403 and 500 responses, plus 202, 408 and 503 for observable queries.
- **Arc.TypeScript** ([Arc for TypeScript 0.17.0 — OpenAPI results and proxy improvements](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.17.0)): GET query parameters, including paging and sorting on queries that return collections, and operation summaries from JSDoc comments.
- **Arc.TypeScript** ([Arc for TypeScript 0.17.0 — OpenAPI results and proxy improvements](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.17.0)): Bearer security schemes for operations authenticated by `jwtBearer()`, and an `openApiVersion` option for the document's `info.version`.
- **Arc.TypeScript** ([Arc for TypeScript 0.17.0 — OpenAPI results and proxy improvements](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.17.0)): Generated proxies for two models with the same class name in different namespaces, using import aliases.
- **Arc.TypeScript** ([Arc for TypeScript 0.17.0 — OpenAPI results and proxy improvements](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.17.0)): Identity details types from `@identityDetailsProvider()` classes are generated even without an endpoint that returns them.
- **Arc.TypeScript** ([Arc for TypeScript 0.17.0 — OpenAPI results and proxy improvements](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.17.0)): Generated query proxies carry the query's HTTP method preference, and command proxies carry warning handling, as with Arc on .NET's generator.
- **Stage** ([Release v4.14.0](https://github.com/Cratis/Stage/releases/tag/v4.14.0)): A conformance suite runs every canonical-corpus specification through Screenplay's reference runner, Stage's semantic engine, and the specifications of the rendered application, and checks that all three agree wherever each can execute it. (part of #15)
- **Chronicle.TypeScript** ([Release v6.7.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.7.0)): Read models are recognized from the projections, reducers and model-bound projection decorators that build them, the way the .NET client discovers them, so a read-model class needs no extra decorator. Use `static readModelId` on the class to choose a custom identifier.
- **Chronicle.TypeScript** ([Release v6.7.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.7.0)): Event types can be constructed naturally, for example `new TaskCreated(title)`: an event class with a constructor and `@field` properties serializes, generates its schema and deserializes correctly in both standard and legacy decorator modes.
- **Arc.TypeScript** ([Arc for TypeScript 0.16.0 — Chronicle aggregates and reactor commands](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.16.0)): `AggregateRoot` and `@inject(commandAggregate(Author))`: a command receives the aggregate for its key, rehydrated from the event log on the command's route. Events passed to `apply()` join the command's batch and are appended when the command succeeds, with a concurrency scope on the event source so a concurrent change is rejected. Aggregates without handlers work too, and handlers are registered per event type with an optional event context.
- **Arc.TypeScript** ([Arc for TypeScript 0.16.0 — Chronicle aggregates and reactor commands](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.16.0)): Reactor commands: a Chronicle reactor can return Arc commands, which run through Arc's pipeline in the event's namespace with causation from the event. A failed command fails the reactor partition.
- **Arc.TypeScript** ([Arc for TypeScript 0.16.0 — Chronicle aggregates and reactor commands](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.16.0)): Transactional commands: returned events can be combined with command operations again. If Chronicle rejects the append, the operations are compensated; if the outcome is unknown, the command is reported as indeterminate.
- **Arc.TypeScript** ([Arc for TypeScript 0.16.0 — Chronicle aggregates and reactor commands](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.16.0)): `readModelForValidation()` gives validator predicates the read model for the command's key.
- **AI** ([Release v6.1.0](https://github.com/Cratis/AI/releases/tag/v6.1.0)): The GitHub Copilot provider: device-flow sign-in, API-token exchange, harness support, and model listing. It was left behind when the provider backend moved into the package, so Copilot could not be configured at all through `Cratis.AI` - every other vendor could.
- **AI** ([Release v6.1.0](https://github.com/Cratis/AI/releases/tag/v6.1.0)): `CopilotCredential.ExpiresAt`, which the device-flow refresh uses to tell when a token has run out.
- **Chronicle.TypeScript** ([Release v6.6.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.6.0)): `reactorResultHandler` in `ChronicleOptions` lets an application handle values a reactor returns that are not events, for example commands for a CQRS framework to execute. The handler receives the returned value, the triggering `EventContext`, the reactor type, the event store name and the namespace, and returns `true` when it handled the whole result or `false` to let Chronicle append the events it recognizes. A handler that throws fails the partition, so a side effect is never acknowledged without having run.
- **Arc.TypeScript** ([Arc for TypeScript 0.15.0 — generated artifact metadata](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.15.0)): `arc-proxygenerator --metadata <file>` writes a metadata module from the same analysis that generates proxies: parameter bindings for `handle()`, `provide()` and `@query` methods (services by class, query arguments by name and type, provided values and markers such as `commandContext()`, `abortSignal()` and `commandReadModel()`), result shapes, field options and validator targets. It is the counterpart of Arc on .NET's source-generated metadata.
- **Arc.TypeScript** ([Arc for TypeScript 0.15.0 — generated artifact metadata](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.15.0)): `builder.useGeneratedMetadata(metadata)` applies it. Explicit decorator arguments still win, and a stale module fails at startup with a message to regenerate. `--check-metadata` verifies in CI that the committed module matches the source, and `--watch` regenerates it while you develop.
- **Arc.TypeScript** ([Arc for TypeScript 0.15.0 — generated artifact metadata](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.15.0)): Nullable service parameters receive `null` when the service is not registered, as in .NET. Unions of several classes and other ambiguous parameters are reported with file and line.
- **Arc.TypeScript** ([Arc for TypeScript 0.15.0 — generated artifact metadata](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.15.0)): The Tasks sample uses the C#-shaped commands and queries with generated metadata, and keeps one example with explicit tokens for projects without a generation step.
- **Stage** ([Release v4.13.0](https://github.com/Cratis/Stage/releases/tag/v4.13.0)): The Stage sandbox can run a model on the Screenplay executable semantic model with the opt-in `Stage__Runtime__Engine=semantic`. The default engine is unchanged. (part of #23)
- **Stage** ([Release v4.13.0](https://github.com/Cratis/Stage/releases/tag/v4.13.0)): Commands run through Screenplay's reference evaluator. That covers authorization, validation rules and requirements, `produces when`, destinations, `$context` values and constraints, so the sandbox behaves as the model specifies.
- **Stage** ([Release v4.13.0](https://github.com/Cratis/Stage/releases/tag/v4.13.0)): Accepted events are appended to Chronicle in one atomic call.
- **Stage** ([Release v4.13.0](https://github.com/Cratis/Stage/releases/tag/v4.13.0)): Unauthorized commands return 403. Validation and constraint rejections return 400 with the modeled messages and constraint name. Anything the engine cannot realize exactly returns a typed 501.
- **Stage** ([Release v4.13.0](https://github.com/Cratis/Stage/releases/tag/v4.13.0)): `/stage/semantic/admission` reports which commands, queries, events and projections the semantic engine supports, and why the others are not supported. (part of #23)
- **AI** ([Release v6.0.0](https://github.com/Cratis/AI/releases/tag/v6.0.0)): Model catalog discovery: a provider's published models are read and recorded, so a tier can be resolved from what the vendor actually serves. Includes a background refresh, a `RefreshAvailableModels` command, and an `AvailableAIModelDiscovery` query.
- **AI** ([Release v6.0.0](https://github.com/Cratis/AI/releases/tag/v6.0.0)): ChatGPT subscription credentials - sign-in, storage, expiry-aware refresh, and the classification of whether a provider was given an API key or a subscription record.
- **AI** ([Release v6.0.0](https://github.com/Cratis/AI/releases/tag/v6.0.0)): Claude Code and OpenAI Codex as provider transports. The Anthropic client now routes to Claude Code when the credential is an OAuth token, which the Messages API will not accept.
- **AI** ([Release v6.0.0](https://github.com/Cratis/AI/releases/tag/v6.0.0)): Provider pools with failure- and capacity-aware member selection, plus `PoolMemberSelector.Candidates` for callers that fail over rather than picking once.
- **AI** ([Release v6.0.0](https://github.com/Cratis/AI/releases/tag/v6.0.0)): Rate-limit cooldowns, per-provider usage ceilings, configurable concurrency, and usage snapshots.
- **AI** ([Release v6.0.0](https://github.com/Cratis/AI/releases/tag/v6.0.0)): `IDefaultAgentInvocationModes`, which says whether a purpose runs as a job or a chat when no configured agent claims it.
- **AI** ([Release v6.0.0](https://github.com/Cratis/AI/releases/tag/v6.0.0)): Generated TypeScript proxies for all of the above, published in `@cratis/ai`.
- **Arc.TypeScript** ([Arc for TypeScript 0.14.0 — SQL read models with Drizzle](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.14.0)): `builder.addDrizzle({ database | databaseFactory, dialect })`, or the standalone `addDrizzle(builder, options)` function, with a Drizzle database per tenant. A single `database` serves only the default tenant, and a missing tenant fails instead of reading shared data.
- **Arc.TypeScript** ([Arc for TypeScript 0.14.0 — SQL read models with Drizzle](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.14.0)): `drizzleDatabase()` injects the tenant's Drizzle database into commands and queries, and `drizzleReadModel(Model)` injects a read-only handle for a read model with `find`, `findOne` and `queryPage`.
- **Arc.TypeScript** ([Arc for TypeScript 0.14.0 — SQL read models with Drizzle](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.14.0)): `queryPage` pushes Arc paging and sorting down to SQL with a count and a page-size cap. Only the read model's declared fields that are table columns can be sorted or selected; other fields answer 400.
- **Arc.TypeScript** ([Arc for TypeScript 0.14.0 — SQL read models with Drizzle](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.14.0)): Column codecs for concepts, Guids, `DateOnly`, `TimeOnly`, `TimeSpan` and JSON on PostgreSQL, MySQL and SQLite, mapped from Arc field metadata.
- **Arc.TypeScript** ([Arc for TypeScript 0.14.0 — SQL read models with Drizzle](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.14.0)): Guides for getting started, column types and conversions, tenancy, read-only access and paging, including how the Drizzle choice compares with Kysely, Prisma and TypeORM and which Entity Framework Core features are not ported.
- **Arc.TypeScript** ([Arc for TypeScript 0.13.0 — observability, interceptors and derived types](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.13.0)): OpenTelemetry tracing and metrics through `@opentelemetry/api`, using Arc on .NET's `Cratis.Arc` source, span names and tag names for commands, command filters, queries and query filters, plus spans for HTTP handling, observable subscriptions and identity resolution, and duration histograms. Spans carry the correlation id. Install and configure any OpenTelemetry SDK in your application; without one, tracing is a no-op.
- **Arc.TypeScript** ([Arc for TypeScript 0.13.0 — observability, interceptors and derived types](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.13.0)): `QueryRenderer` to turn a query result into what is sent (the first renderer that can render a result wins), and `ReadModelInterceptor` to adjust read models before they are sent, including every emission of an observable query. Both are registered on the builder or discovered, and run in the request or subscription scope.
- **Arc.TypeScript** ([Arc for TypeScript 0.13.0 — observability, interceptors and derived types](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.13.0)): Derived types on the wire: a field declared with a base type accepts and returns classes marked with Fundamentals `@derivedType('id')`, using .NET's `_derivedTypeId` discriminator, and JSON Schema in introspection and OpenAPI describes the alternatives.
- **Arc.TypeScript** ([Arc for TypeScript 0.13.0 — observability, interceptors and derived types](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.13.0)): `@field(Number, { namedFloats: true })` accepts `"NaN"`, `"Infinity"` and `"-Infinity"` for a field, matching .NET's named floating-point literals.
- **Orleans** ([Release v1.6.0](https://github.com/Cratis/Orleans/releases/tag/v1.6.0)): `Orleans.Storage.Sql.Specs`. There was no specs project for the SQL provider at all, which is why a provider that could not create its own schema looked healthy. The specs run against a real SQLite database rather than substitutes - a mocked `DbContext` never touches a schema, so it cannot see this class of defect.
- **Orleans** ([Release v1.6.0](https://github.com/Cratis/Orleans/releases/tag/v1.6.0)): An end-to-end integration spec for a job with a genuinely failing step, against a real silo and a real MongoDB, asserting the failed step stays readable.
- **AI** ([Release v5.0.0](https://github.com/Cratis/AI/releases/tag/v5.0.0)): `TierModelAssignment`, which infers the tier ladder from a provider's own catalog: the words vendors use at the small and large ends of their range, with the highest version winning inside a rung.
- **Arc.TypeScript** ([Arc for TypeScript 0.12.0 — Chronicle event sourcing](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.12.0)): `builder.addChronicle({ client | connectionString, eventStore, ... })`, or the standalone `addChronicle(builder, options)` function. Each tenant uses its own Chronicle namespace, and discovered event types, projections, reducers and reactors are registered with the event store.
- **Arc.TypeScript** ([Arc for TypeScript 0.12.0 — Chronicle event sourcing](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.12.0)): Events returned from a command's `handle()` are appended after the command succeeds: a single event, an array of events, `tuple(...)` with a client response, or `eventForEventSourceId(...)` for another event source. The event source id comes from the command key (`@key()`, `getKey()` or a key resolver), and `eventSourceIdResponse(id)` lets a command choose it explicitly.
- **Arc.TypeScript** ([Arc for TypeScript 0.12.0 — Chronicle event sourcing](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.12.0)): `@eventSourceType`, `@eventStreamType`, `@eventStreamId`, `@eventSubject` and tags route appended events, and `eventsWithConcurrencyScopes(...)` sets expected sequence numbers, including "before first". Constraint and concurrency violations come back as validation results.
- **Arc.TypeScript** ([Arc for TypeScript 0.12.0 — Chronicle event sourcing](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.12.0)): Events returned from nested commands in the same request are appended in one batch with the outer command's events, only when the outer command succeeds.
- **Arc.TypeScript** ([Arc for TypeScript 0.12.0 — Chronicle event sourcing](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.12.0)): `@inject(commandReadModel(Author))` gives `handle()` or `provide()` the read model for the command's key, from Chronicle (`ChronicleReadModelForCommandResolver`) or MongoDB, with `{ optional: true }` for a model that may not exist. Ownership conflicts between resolvers fail at startup.
- **Arc.TypeScript** ([Arc for TypeScript 0.12.0 — Chronicle event sourcing](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.12.0)): `ChronicleReadModels` for reading Chronicle read models in queries, including observable queries.
- **Arc.TypeScript** ([Arc for TypeScript 0.12.0 — Chronicle event sourcing](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.12.0)): `@notAudited()` keeps a command property out of the causation chain.
- **Arc.TypeScript** ([Arc for TypeScript 0.12.0 — Chronicle event sourcing](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.12.0)): `@cratis/arc.chronicle/testing` with `ChronicleCommandScenario`, an in-memory event log and `shouldHaveAppendedEvent(Event, eventSourceId?, predicate?)`, scoped to each execution.
- **Screenplay** ([Release v4.30.0](https://github.com/Cratis/Screenplay/releases/tag/v4.30.0)): `CodeBlockSyntax.BodyStartOffset`, `BodyEndOffset`, `BodyStart`, `BodyEnd` and `BodyLines`: the body's span in the document (UTF-16 offsets, BOM-less, as editors address text) and, for each body line, the original line and the column where its content starts after the common indentation is removed. This covers fenced bodies with a language info string and the legacy tag-line form, CRLF documents, tabs, blank and under-indented lines, and bodies at the end of a file.
- **Screenplay** ([Release v4.30.0](https://github.com/Cratis/Screenplay/releases/tag/v4.30.0)): `SemanticImplementationRequirement.BodySpan` and `BodyLines` (`SemanticImplementationBodySpan`, `CodeBlockSourceLine`): the same map for each implementation attachment. A file attachment whose contents were supplied spans the whole file; an unresolved file attachment and an inline body without parser positions have no span.
- **Screenplay** ([Release v4.30.0](https://github.com/Cratis/Screenplay/releases/tag/v4.30.0)): The MCP `implementation-requirements` views (workspace and proposal) return `bodySpan` and `bodyLines`, run-length encoded where consecutive lines share a column, so a long body stays within a page.
- **Arc.TypeScript** ([Arc for TypeScript 0.11.0 — authorization policies and identity](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.11.0)): Named authorization policies: register a policy class (resolved from the execution scope with constructor injection) or a function with `builder.addAuthorizationPolicy('Name', policy)`, and require it with `@authorize('Name')` or `@authorize({ policy, roles })` on commands, read models and query methods. A policy receives the principal, the target and the resource, can be asynchronous, and an unknown policy fails at startup.
- **Arc.TypeScript** ([Arc for TypeScript 0.11.0 — authorization policies and identity](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.11.0)): `@authorize({ schemes: [...] })` selects which Arc authentication handlers may authenticate a caller for an operation.
- **Arc.TypeScript** ([Arc for TypeScript 0.11.0 — authorization policies and identity](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.11.0)): `jwtBearer({ jwksUri, issuer, audience, ... })` validates bearer tokens with `jose`: asymmetric algorithm allowlist, issuer, audience, lifetime and clock skew, and cached JWKS with configurable timeouts. Requests without a Bearer header are left anonymous for other handlers and anonymous operations.
- **Arc.TypeScript** ([Arc for TypeScript 0.11.0 — authorization policies and identity](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.11.0)): `microsoftIdentityPlatform()` authenticates callers from Azure App Service and Container Apps authentication headers (`x-ms-client-principal`, `-id`, `-name`), stripping caller-supplied identity claims the same way Arc on .NET does. It only reads these headers when you register it.
- **Arc.TypeScript** ([Arc for TypeScript 0.11.0 — authorization policies and identity](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.11.0)): `@identityDetailsProvider()` lets discovery find the identity details provider, as Arc on .NET does, and model-bound identity details types describe `/.cratis/identity-details/schema`.
- **Arc.TypeScript** ([Arc for TypeScript 0.11.0 — authorization policies and identity](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.11.0)): The `development` tenant source, matching .NET's development tenant resolver.
- **Arc.TypeScript** ([Arc for TypeScript 0.11.0 — authorization policies and identity](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.11.0)): New documentation for authorization and identity (`Documentation/identity`) and tenant resolvers (`Documentation/tenancy`).
- **Arc.TypeScript** ([Arc for TypeScript 0.10.0 — ESLint rules for Arc artifacts](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.10.0)): `@cratis/eslint-plugin-arc-core` for ESLint 10 flat config, with a `recommended` config and a `recommended-type-checked` config for projects that lint with type information.
- **Arc.TypeScript** ([Arc for TypeScript 0.10.0 — ESLint rules for Arc artifacts](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.10.0)): Rules that carry Arc on .NET's diagnostic ids where the check applies to TypeScript: ARC0002, ARC0003, ARC0004, ARC0005, ARC0010, ARC0012, ARC0014, ARC0015 and ARC0019. Each id has a documentation page with the reason, a failing example and the fix, and every other .NET id is listed with why it does not apply.
- **Arc.TypeScript** ([Arc for TypeScript 0.10.0 — ESLint rules for Arc artifacts](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.10.0)): TypeScript-specific rules for the decorator programming model: properties without `@field`, decorated `declare` fields, `@inject` tokens and `@query` descriptors that do not match the method's parameters, decorators placed where they have no effect, artifacts that are not exported, and validators without a `@validator(Target)` target. An opt-in rule checks that query argument names match parameter names.
- **Arc.TypeScript** ([Arc for TypeScript 0.10.0 — ESLint rules for Arc artifacts](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.10.0)): Arc decorators are recognized through their imports from `@cratis/arc.core` and `@cratis/fundamentals`, including aliased and namespace imports, so decorators with the same names from other libraries are not reported.
- **Screenplay** ([Release v4.29.0](https://github.com/Cratis/Screenplay/releases/tag/v4.29.0)): A `policy` with a `csharp` body or a `file` binds as an opaque policy-predicate attachment with a stable requirement id and the capability `pure` (`SemanticOpaquePolicyCondition`). A model that has one is ESM v3, like models with reducer bodies or code validation; other models keep their bytes.
- **Screenplay** ([Release v4.29.0](https://github.com/Cratis/Screenplay/releases/tag/v4.29.0)): `SemanticExecutionCapability.Authorization`, reported when authorization cannot be decided without running policy code.
- **Screenplay** ([Release v4.29.0](https://github.com/Cratis/Screenplay/releases/tag/v4.29.0)): PLAY0440: a policy combines `require` with an inline code block or a file. A policy has one form or the other.
- **Screenplay** ([Release v4.29.0](https://github.com/Cratis/Screenplay/releases/tag/v4.29.0)): PLAY0441: a policy has more than one `require` line. Combine the conditions with `and`/`or` in one `require`.
- **Screenplay** ([Release v4.29.0](https://github.com/Cratis/Screenplay/releases/tag/v4.29.0)): Proposed decision record 0005: policy predicates as an implementation-attachment role, and authored-order composition.
- **Stage** ([Release v4.12.0](https://github.com/Cratis/Stage/releases/tag/v4.12.0)): A planned artifact now names the semantic identities it realizes: `PlannedArtifact.Sources` is a sorted, distinct list of slice, command, event, read-model, projection, query, concept, type and specification ids. Scaffold artifacts have no sources. Artifact bytes and SHA-256 hashes are unchanged, so a render plan maps every artifact to both its semantic origin and its hash. (#11)
- **Arc.TypeScript** ([Arc for TypeScript 0.9.0 — testing scenarios](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.9.0)): `CommandScenario.for(RegisterAuthor)` runs a decorated command through the real pipeline (authorization, validation, `provide()`, `handle()`) with services you override (`scenario.services.addSingleton/addScoped/addTransient`), a principal, tenant and context values, and a serialization round trip through the wire format by default. `execute(...)` and `validate(...)` return results with assertions such as `shouldBeSuccessful()`, `shouldHaveValidationErrors()`, `shouldHaveValidationErrorFor(message)`, `shouldHaveValidationErrorForMember(member)`, `shouldNotBeAuthorized()` and `shouldHaveExceptions()`.
- **Arc.TypeScript** ([Arc for TypeScript 0.9.0 — testing scenarios](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.9.0)): Command operation assertions on scenario results: executed, compensated and indeterminate outcomes.
- **Arc.TypeScript** ([Arc for TypeScript 0.9.0 — testing scenarios](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.9.0)): `QueryScenario.for(ReadModel, 'method')` performs a `@query` method with arguments, paging and sorting through the real query pipeline.
- **Arc.TypeScript** ([Arc for TypeScript 0.9.0 — testing scenarios](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.9.0)): `ObservableQueryScenario` collects emissions from an observable query within one explicit deadline and reports whether the stream completed.
- **Arc.TypeScript** ([Arc for TypeScript 0.9.0 — testing scenarios](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.9.0)): `shouldHaveValidationErrors()` refuses to pass when the only failures come from unavailable dependencies or failing validators, so a misconfigured test cannot pass for the wrong reason.
- **Arc.TypeScript** ([Arc for TypeScript 0.9.0 — testing scenarios](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.9.0)): The Tasks sample includes command and query specs written with the scenarios.
- **Arc.TypeScript** ([Arc for TypeScript 0.8.0 — MongoDB integration](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.8.0)): `builder.addMongoDB({ server | client | serverResolver, database | databaseNameResolver, ... })`, or the standalone `addMongoDB(builder, options)` function. Tenants get their own database (`tasks`, `tasks+acme`), and a server resolver can route tenants to different MongoDB servers.
- **Arc.TypeScript** ([Arc for TypeScript 0.8.0 — MongoDB integration](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.8.0)): `mongoCollection(Model)` injects a tenant-scoped collection for a read model into a `@query`, with typed `find`, `queryPage`, `observe` and `observeById`.
- **Arc.TypeScript** ([Arc for TypeScript 0.8.0 — MongoDB integration](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.8.0)): A metadata-driven BSON codec that reads and writes documents the way Arc on .NET does: `@key()` or `id` as `_id`, Guids as UUID binary (subtype 4), concepts as their primitive values, `DateOnly`, `TimeOnly`, `TimeSpan` and `Date` in .NET's formats, nested models and arrays, and `@derivedType` discriminators in `_derivedTypeId`.
- **Arc.TypeScript** ([Arc for TypeScript 0.8.0 — MongoDB integration](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.8.0)): Naming policies: `defaultMongoNamingPolicy` matches an unconfigured .NET MongoDB builder, and `camelCaseMongoNamingPolicy` matches `.WithCamelCaseNamingPolicy()`. Custom policies are supported.
- **Arc.TypeScript** ([Arc for TypeScript 0.8.0 — MongoDB integration](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.8.0)): `queryOptions()` gives a query Arc's paging and sorting options, and `queryPage` pushes them down to MongoDB with a count, a page-size cap and a field allowlist. An unknown sort field answers 400.
- **Arc.TypeScript** ([Arc for TypeScript 0.8.0 — MongoDB integration](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.8.0)): `observe(filter?)` and `observeById(id)` turn MongoDB change streams into Arc observable queries, with a current value for plain GET and updates over SSE and WebSocket. Replica sets and sharded clusters are supported; a standalone server is rejected with a clear error.
- **Stage** ([Release v4.11.0](https://github.com/Cratis/Stage/releases/tag/v4.11.0)): Render read-model and query specifications over read models built by scoped projections. Generated specifications replay every produced event in command order through the generated projection, including joins and removals. Replays that cannot be reproduced exactly fail with `STAGE-ESM-011`. (part of #14)
- **Stage** ([Release v4.11.0](https://github.com/Cratis/Stage/releases/tag/v4.11.0)): Render complete given read models in query-only lookup specifications. Given read models before a command are still rejected. (part of #14)
- **Stage** ([Release v4.11.0](https://github.com/Cratis/Stage/releases/tag/v4.11.0)): Render `then events in any order` with several events as a multiset match, checking each event's stream and payload. (part of #14)
- **Arc.TypeScript** ([Arc for TypeScript 0.7.0 — command context, response handlers and operations](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.7.0)): Command response value handlers: implement `CommandResponseValueHandler` (`canHandle` and `handle`) and register it or let discovery find it. Every handler that can handle a value returned from `handle()` processes it, in a deterministic order, and a handler failure stops the rest. At most one value left unhandled becomes the client response; more than one fails the command.
- **Arc.TypeScript** ([Arc for TypeScript 0.7.0 — command context, response handlers and operations](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.7.0)): `CommandContext` for each command execution, carrying the command, its key, context values, correlation id, principal, tenant, allowed severity and cancellation signal. Context value providers and modifiers can add to it.
- **Arc.TypeScript** ([Arc for TypeScript 0.7.0 — command context, response handlers and operations](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.7.0)): Command keys: mark one `@field` with `@key()`, implement `getKey()` on the command, or register `CommandKeyResolver` rules ahead of the default resolver.
- **Arc.TypeScript** ([Arc for TypeScript 0.7.0 — command context, response handlers and operations](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.7.0)): Parameter markers for `handle()` and `provide()`: `@inject(abortSignal(), commandContext(), provided(Type))` binds the cancellation signal, the command context and values returned from `provide()` by type.
- **Arc.TypeScript** ([Arc for TypeScript 0.7.0 — command context, response handlers and operations](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.7.0)): Command operations: `handle()` can return operations (and operation batches) that are checked before any runs, executed in order, and compensated in reverse order within a timeout when the command fails before anything commits. Execution scopes report an explicit commit disposition, an unknown commit outcome is reported as indeterminate rather than success, and recovery details stay on the server. Operations are rejected from nested commands and from commands that ran nested commands, so every effect stays inside one recovery boundary.
- **Arc.TypeScript** ([Arc for TypeScript 0.6.0 — proxies from TypeScript source](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.6.0)): `arc-proxygenerator --project <tsconfig> --artifacts <folder> --output <folder>` reads your TypeScript program with the compiler API, without running your application, and writes proxies for the published `@cratis/arc` and `@cratis/arc.react` clients: commands with `use()` hooks, snapshot and observable queries with parameters, paging, sorting, `use`, `useWithPaging`, `useSuspense` and `when`, models, enums and derived types.
- **Arc.TypeScript** ([Arc for TypeScript 0.6.0 — proxies from TypeScript source](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.6.0)): Command and query result types come from the return types of `handle()` and `@query` methods, so nothing is declared twice. Field optionality, nullability, defaults and enums come from the same `@optional()`, `@nullable()`, `@defaultValue()` and `@enumeration()` annotations the server uses.
- **Arc.TypeScript** ([Arc for TypeScript 0.6.0 — proxies from TypeScript source](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.6.0)): Client-safe validation rules from `@validator(Target)` classes are generated into the proxies. Rules the browser cannot evaluate stay on the server and are reported by the generator.
- **Arc.TypeScript** ([Arc for TypeScript 0.6.0 — proxies from TypeScript source](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.6.0)): Routes and query names come from the same discovery walk and route rules the server uses, with `--root-namespace`, `--segments-to-skip`, `--api-prefix`, `--skip-command-name-in-route` and `--skip-query-name-in-route` options named after the .NET generator's settings.
- **Arc.TypeScript** ([Arc for TypeScript 0.6.0 — proxies from TypeScript source](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.6.0)): Output management like .NET's generator: ownership headers with content hashes, unchanged files left untouched, stale generated files and barrels removed, hand-written files and barrel lines preserved, plus `--use-proxy-file-suffix`, `--emit-interfaces`, `--skip-index-generation`, `--skip-output-deletion` and `--js-import-specifiers`.
- **Arc.TypeScript** ([Arc for TypeScript 0.6.0 — proxies from TypeScript source](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.6.0)): The Tasks sample has a `generate-proxies` script.
- **Chronicle.TypeScript** ([Release v6.5.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.5.0)): `readModels.findInstanceById(type, id)` returns `null` when no instance exists, so callers can tell a missing read model from an empty one.
- **Chronicle.TypeScript** ([Release v6.5.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.5.0)): `EventSequenceNumber.beforeFirst` for expressing "no events appended yet" as an expected sequence number in a concurrency scope.
- **Chronicle.TypeScript** ([Release v6.5.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.5.0)): `isRegisteredEvent(store, value)` tells whether a value is an instance of an event type registered with an event store.
- **Chronicle.TypeScript** ([Release v6.5.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.5.0)): Scoped `run` methods on the identity, causation and correlation managers, so concurrent or nested operations on a server each keep their own ambient context and restore the previous one afterwards.
- **Stage** ([Release v4.10.0](https://github.com/Cratis/Stage/releases/tag/v4.10.0)): The semantic specification engine (`--engine semantic`) now runs specifications with a `given caller`, command authorization and `then denied`. Denied specifications check that nothing was appended. (part of #15)
- **Stage** ([Release v4.10.0](https://github.com/Cratis/Stage/releases/tag/v4.10.0)): It evaluates command validation rules and requirements at every severity, matching Screenplay's rule order, messages and default messages, and enforces unique-value and unique-event constraints, including releases, casing and re-claiming one's own value. A constraint rejection carries the constraint name as its code. (part of #15)
- **Stage** ([Release v4.10.0](https://github.com/Cratis/Stage/releases/tag/v4.10.0)): `when append` specifications that assert only events now run. (part of #15)
- **Stage** ([Release v4.9.0](https://github.com/Cratis/Stage/releases/tag/v4.9.0)): Render portable `unique <property> on <Event>` and `unique event <Event>` constraints as named Chronicle constraints, with every target, release, casing rule and message. Generated specifications prove violations, releases, casing and re-claiming one's own value. Constraints on optional, composite or non-text properties, and several events from one command that target or release a unique-value constraint, still fail with `STAGE-ESM-014`. Chronicle updates its constraint index after commit (Cratis/Chronicle#4123), so a storage failure there is not rejected at append time. (#118)
- **Stage** ([Release v4.9.0](https://github.com/Cratis/Stage/releases/tag/v4.9.0)): Commands that produce several unconditional events render, and generated specifications assert each event on its stream in order. A specification may now expect several read models and query results. (part of #14)
- **Stage** ([Release v4.9.0](https://github.com/Cratis/Stage/releases/tag/v4.9.0)): Specifications with a `given caller` fixture and `then denied` now render. The caller runs through Arc's principal override, and a denied specification checks that the command was unauthorized, that the policy is registered, and that nothing was appended. Protected-query expectations and claim conditions on the role claim type are still rejected. (part of #57)
- **Stage** ([Release v4.9.0](https://github.com/Cratis/Stage/releases/tag/v4.9.0)): Render nested `from` and `clear` blocks, supported `every` event-source mappings, and root and child `RemovedWith` / `RemovedWithJoin`. A differential specification now runs admitted projection shapes through Chronicle and compares the results with Screenplay's reference execution. (part of #117)
- **Arc.TypeScript** ([Arc for TypeScript 0.5.0 — model-bound commands, read models and validators](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.5.0)): Model-bound commands: a class decorated with `@command()` declares its input with Fundamentals `@field(Type)` and handles itself in `handle()`. An optional `provide()` loads data after validation and passes it to `handle()`, or short-circuits with `rejected(...)` / `denied(...)`.
- **Arc.TypeScript** ([Arc for TypeScript 0.5.0 — model-bound commands, read models and validators](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.5.0)): Model-bound read models and queries: a class decorated with `@readModel()` exposes static `@query(...)` methods. `argument(name, Type)` and `service(Token)` describe the parameters in order, and `@query({ observable: true })` serves live results over the same snapshot, SSE, WebSocket and hub transports as `defineObservableQuery`.
- **Arc.TypeScript** ([Arc for TypeScript 0.5.0 — model-bound commands, read models and validators](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.5.0)): Concepts from `@cratis/fundamentals` (`ConceptAs<T>` with `static readonly valueType`) on the wire: requests decode into concept, `Guid`, `Date`, `DateOnly`, `TimeOnly` and `TimeSpan` values and responses encode back to primitives. Invalid values answer 400 with `malformedRequest`.
- **Arc.TypeScript** ([Arc for TypeScript 0.5.0 — model-bound commands, read models and validators](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.5.0)): Field options `@optional()`, `@nullable()`, `@defaultValue(value)` and `@enumeration(Enum)`, which also shape the JSON Schema in introspection and OpenAPI.
- **Arc.TypeScript** ([Arc for TypeScript 0.5.0 — model-bound commands, read models and validators](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.5.0)): Validators with the same vocabulary as the `@cratis/arc` client: `CommandValidator<T>`, `QueryValidator<T>`, `ConceptValidator<T>` and `ModelValidator<T>` declare rules with `ruleFor(...)` (`notEmpty`, `maxLength`, `emailAddress`, `greaterThan`, `must`, `mustAsync`, `when`, `unless`, `withMessage`, `withSeverity`, `withState` and more) and are bound to their target with `@validator(Target)`. Concept validators apply wherever the concept appears, member paths use client casing, and validators are created per execution scope.
- **Arc.TypeScript** ([Arc for TypeScript 0.5.0 — model-bound commands, read models and validators](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.5.0)): Authorization decorators `@roles(...)`, `@authorize()` and `@allowAnonymous()` on commands, read models and query methods. A method declaration overrides its class, stacked declarations must all pass, and contradictory declarations fail at startup.
- **Arc.TypeScript** ([Arc for TypeScript 0.5.0 — model-bound commands, read models and validators](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.5.0)): `@path(...)` to override a query route, and `generatedApis` options (`routePrefix`, `segmentsToSkipForRoute`, `includeCommandNameInRoute`, `includeQueryNameInRoute`) for conventional routes derived from the folder a command or read model lives in, matching Arc on .NET.
- **Arc.TypeScript** ([Arc for TypeScript 0.5.0 — model-bound commands, read models and validators](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.5.0)): Dependency injection with classes as service tokens: `builder.services.addSingleton/addScoped/addTransient(Token, implementation?)`, `@singleton()`, `@scoped()`, `@transient()`, `@injectable(...)` and `@inject(...)`. Both TC39 standard decorators and legacy `experimentalDecorators` with `emitDecoratorMetadata` are supported; in legacy mode `@inject()` can read parameter types.
- **Arc.TypeScript** ([Arc for TypeScript 0.5.0 — model-bound commands, read models and validators](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.5.0)): `ArcApplication.createBuilder(options)` with `discover(folder)` and `add(...)`, `build()`, a blocking `run()` that shuts down on SIGINT or SIGTERM, and `start()` / `stop()` for embedding. Express, Fastify and Hono mounts accept
- **Stage** ([Release v4.8.0](https://github.com/Cratis/Stage/releases/tag/v4.8.0)): Run Screenplay specifications in memory against the executable semantic model with SpecRunner's opt-in `--engine semantic`. It addresses specifications by semantic id through `--specification` and `--scope`, and writes a `stage-spec-run/1` report. A specification the engine cannot execute exactly is reported `Unsupported` with a typed capability before it runs, so it is never reported as passing; there is no `Inconclusive` outcome. The default structural engine is unchanged. (part of #15)
- **Stage** ([Release v4.8.0](https://github.com/Cratis/Stage/releases/tag/v4.8.0)): `Cratis.Stage.Specifications` provides `ISemanticSpecificationExecutor`, and `Cratis.Stage.Contracts` provides the semantic run report and a `.play` source loader. Commands run through Arc's command scenario against a fresh in-memory Chronicle event log for each specification. Results are checked against Screenplay's reference runner on the canonical corpus. (part of #15)
- **Screenplay** ([Release v4.28.0](https://github.com/Cratis/Screenplay/releases/tag/v4.28.0)): `AttachmentFiles.Load(root, documents)` reads the files named by a model's implementation attachments (reducer rules, validation rules and code validation, command handlers, policies, reactions, query performers, file constraints) from a model root and returns their contents with warning diagnostics for anything it refuses. Pass `Contents` to `SemanticDocumentSet.Create(documents, catalog, contents)`.
- **Screenplay** ([Release v4.28.0](https://github.com/Cratis/Screenplay/releases/tag/v4.28.0)): `ScreenplayWorkspace.WithAttachmentContents(contents, diagnostics)` and a matching `ScreenplayWorkspace.Create` overload carry host-supplied contents through every workspace compilation, proposal and transaction. The workspace itself never reads files, and its revision and serialized bytes do not depend on attachment contents.
- **Screenplay** ([Release v4.28.0](https://github.com/Cratis/Screenplay/releases/tag/v4.28.0)): PLAY0430–PLAY0434 warnings for an attachment that is refused or missing: a path that is absolute or leaves the model root, a link, a missing file, a file over 2 MiB (or a set over 8 MiB), and content that is not UTF-8 text. A refused attachment stays unresolved; it never fails a model that compiled before.
- **Stage** ([Release v4.7.0](https://github.com/Cratis/Stage/releases/tag/v4.7.0)): Render portable Screenplay policies for commands and queries as registered Arc authorization policies, including module- and feature-level `authorize`. A command or query is `[AllowAnonymous]` only when no authorization applies. Expressions Arc would enforce differently fail with `STAGE-ESM-015`: role-only or claim-only policies that do not require authentication, ambiguous command subjects, and non-text claim targets. (part of #57)
- **Stage** ([Release v4.7.0](https://github.com/Cratis/Stage/releases/tag/v4.7.0)): Render all thirteen ESM validation rule kinds, concept validation rules and command requirements as generated validators, with the reference default messages. Warning and information severities, `$strings.` messages, and combinations whose failure order Arc cannot preserve are still rejected. (part of #116)
- **Stage** ([Release v4.7.0](https://github.com/Cratis/Stage/releases/tag/v4.7.0)): Render ESM projection scopes: several `from` events, root joins, children identified by a property, and property and arithmetic mappings. Several read models and keyed queries in one state-view slice are now admitted. Nested blocks, `every`/`all`, removals, composite keys, event-context mappings, whole-number arithmetic, and scopes that leave a required property unset fail with `STAGE-ESM-017`. (part of #117)
- **Stage** ([Release v4.7.0](https://github.com/Cratis/Stage/releases/tag/v4.7.0)): Render `given` events that state their event source in generated command, read-model and query specifications. Read-model and query assertions without `exactly` now check only the stated properties, as the reference does, and query specifications check projected state. (part of #14)
- **Stage** ([Release v4.7.0](https://github.com/Cratis/Stage/releases/tag/v4.7.0)): Generated rejection specifications now check the first validation message against the modeled `then error`.
- **Screenplay** ([Release v4.27.0](https://github.com/Cratis/Screenplay/releases/tag/v4.27.0)): A named rule with a `csharp` body or a `file` on a command property or a concept (`invoiceNumber rule BeUnusedInvoiceNumber file Validations/BeUnusedInvoiceNumber.cs`), and a command's `validate csharp` block, bind as opaque rule-predicate and code-validation attachments. Each carries what it guards, its message (including `$strings` keys) and severity, a stable requirement id and the capability `pure`. A bare named rule with neither body nor file is still rejected.
- **Screenplay** ([Release v4.27.0](https://github.com/Cratis/Screenplay/releases/tag/v4.27.0)): `SemanticCodeValidation`, `SemanticCommand.CodeValidations`, `SemanticValidationRule.Name` and `SemanticValidationRule.RequirementId`, and the `SemanticValidationRuleKind` members `RulePredicate` and `CodeValidation`.
- **Components** ([Release v4.14.0](https://github.com/Cratis/Components/releases/tag/v4.14.0)): `Column.filterOptions` supplies the values a column can be filtered by, rendered as a list instead of a free-form input, with the match modes narrowed to equals/not equals.
- **Components** ([Release v4.14.0](https://github.com/Cratis/Components/releases/tag/v4.14.0)): `selectionMode='multiple'` on the data tables and `DataPage`, with a checkbox per row, a select-all header checkbox, and `selectedItems`/`onSelectedItemsChange`.
- **Components** ([Release v4.14.0](https://github.com/Cratis/Components/releases/tag/v4.14.0)): `dataTable.selectAllRows` message for localizing the select-all accessible name.
- **Screenplay** ([Release v4.26.0](https://github.com/Cratis/Screenplay/releases/tag/v4.26.0)): A reducer whose every `on <Event>` rule has a body, inline or in a `file`, binds to a reducer contract in the executable semantic model: the read model it builds, the events it consumes, a key fixed to the event source id, no initial state, and a result that is the new state or a delete, as Chronicle runs reducers. Inline and file bodies bind to the same contract. The body stays opaque code, not portable meaning.
- **Screenplay** ([Release v4.26.0](https://github.com/Cratis/Screenplay/releases/tag/v4.26.0)): ESM v3. A model is serialized as v3 only when it contains a bodied reducer; every other model keeps its v1 or v2 bytes exactly. v3 includes all of v2. `LanguageVersion.V3`, `SemanticVersion.V3` and `EsmSchemaV3Support` describe it, and a full v3 golden vector pins its canonical form. Reducer transitions are canonicalized by event, so reordering `on` rules does not change a model's revision.
- **Screenplay** ([Release v4.26.0](https://github.com/Cratis/Screenplay/releases/tag/v4.26.0)): Implementation requirements carry `RequirementId` (derived from the owning construct, role and member, never from a path), `ContextVersion` and `ResultVersion`, `RequiredCapability` (`pure` for reducer transitions) and `AttachmentResolution`.
- **Screenplay** ([Release v4.26.0](https://github.com/Cratis/Screenplay/releases/tag/v4.26.0)): `SemanticDocumentSet.Create(documents, catalog, attachmentContents)` lets a host supply the contents of `file` attachments, which are then identified by a hash of their content. Without supplied contents a file attachment is reported as `UnresolvedFile` with no hash; the file compiler, MCP server and Tool supplying contents is tracked in #244.
- **Screenplay** ([Release v4.26.0](https://github.com/Cratis/Screenplay/releases/tag/v4.26.0)): PLAY0398: a reducer mixes rules with and without a body.
- **Screenplay** ([Release v4.26.0](https://github.com/Cratis/Screenplay/releases/tag/v4.26.0)): PLAY0399: a reducer has more than one rule for the same event.
- **Screenplay** ([Release v4.25.0](https://github.com/Cratis/Screenplay/releases/tag/v4.25.0)): `reads <View> as <alias> [by <property>]` names a read, so a command can read the same view twice, for example `reads Account as source by fromId` and `reads Account as destination by toId`. A `require` path can use the alias as its qualifier: `require source.balance >= amount`.
- **Screenplay** ([Release v4.25.0](https://github.com/Cratis/Screenplay/releases/tag/v4.25.0)): PLAY0410: a command reads the same view more than once and not every read has an alias.
- **Screenplay** ([Release v4.25.0](https://github.com/Cratis/Screenplay/releases/tag/v4.25.0)): PLAY0411: two reads of one command use the same alias.
- **Screenplay** ([Release v4.25.0](https://github.com/Cratis/Screenplay/releases/tag/v4.25.0)): PLAY0412: a reads alias has the same name as one of the command's properties.
- **Screenplay** ([Release v4.25.0](https://github.com/Cratis/Screenplay/releases/tag/v4.25.0)): `ReadsSyntax.Alias`, an init-only property, carries the alias in the syntax tree, syntax JSON, the printer, the TextMate grammar and the Monaco language package (completion, keyword docs, symbols).
- **Arc.TypeScript** ([Arc for TypeScript 0.4.0 — observable queries and the Arc package layout](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.4.0)): Observable queries with `defineObservableQuery`: sources can be async iterables, RxJS-style observables or `CurrentValueSubject.of(value)` / `.pending()`. Every subscription runs the query's authorization and validation and owns a service scope.
- **Arc.TypeScript** ([Arc for TypeScript 0.4.0 — observable queries and the Arc package layout](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.4.0)): HTTP snapshots of observable queries: 200 with the current value, 202 while no value exists yet, and 408 when `waitForFirstResult` times out.
- **Arc.TypeScript** ([Arc for TypeScript 0.4.0 — observable queries and the Arc package layout](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.4.0)): Direct server-sent events and WebSocket streams on a query's own route, and the multiplexed `/.cratis/queries/ws` and `/.cratis/queries/sse` hubs used by the `@cratis/arc` client, with subscription revisions, full and delta transfer modes, and keep-alive.
- **Arc.TypeScript** ([Arc for TypeScript 0.4.0 — observable queries and the Arc package layout](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.4.0)): Emission guards (`observableEmissionGuards`) that can allow, suppress or terminate each emission, and an opt-in `/.cratis/queries/health` endpoint that shows callers their own connections.
- **Arc.TypeScript** ([Arc for TypeScript 0.4.0 — observable queries and the Arc package layout](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.4.0)): Configurable limits for observable subscriptions, hub connections, queues and frame sizes, per caller and globally, plus `allowedOrigins` for WebSocket upgrades and SSE hub control requests.
- **Arc.TypeScript** ([Arc for TypeScript 0.4.0 — observable queries and the Arc package layout](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.4.0)): WebSocket support for Express (upgrade listener), Fastify (through `@fastify/websocket`, reusing an existing registration) and Hono (through `@hono/node-ws`, reusing an existing helper).
- **Arc.TypeScript** ([Arc for TypeScript 0.4.0 — observable queries and the Arc package layout](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.4.0)): A standalone Node.js host in `@cratis/arc.core` (`runArc`, `createArcNodeHandler`): HTTP or HTTPS, WebSocket upgrades, static files, SPA fallback, a path base, cache validators and a bounded shutdown.
- **Arc.TypeScript** ([Arc for TypeScript 0.4.0 — observable queries and the Arc package layout](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.4.0)): Generated `ObservableQueryFor` proxies for observable queries.
- **Chronicle.TypeScript** ([Release v6.4.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.4.0)): Declare event types, read models, projections, reducers, reactors and the other SDK artifacts with TC39 standard decorators, without enabling `experimentalDecorators`. Legacy decorators keep working.
- **Chronicle.TypeScript** ([Release v6.4.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.4.0)): Schema support for explicitly typed arrays and for Guid-, Date-, and primitive-backed concepts, with a `static readonly valueType` hint for concepts when no decorator type metadata is emitted.
- **Stage** ([Release v4.5.0](https://github.com/Cratis/Stage/releases/tag/v4.5.0)): Admit ESM v2 models from Screenplay 4.20. A command with a typed `produces … for` destination appends to that event source without copying the identity into the event. When a specification states `for <value>` on its `when` or `then` event, the generated specification checks the appended event on that stream. It also seeds the projected read model there. (#128)
- **Screenplay** ([Release v4.24.0](https://github.com/Cratis/Screenplay/releases/tag/v4.24.0)): A workspace transaction that finds two files declaring the same thing returns a typed `ConflictingOwner` conflict naming both paths, instead of a generic compilation failure. Ownership belongs to the file that declares a member, never to a module or feature header restated to place a child (#137)
- **Screenplay** ([Release v4.24.0](https://github.com/Cratis/Screenplay/releases/tag/v4.24.0)): Specs pin the round trip of a commented model between a single document and a folder: same semantic revision, same identities, same canonical print, and every comment kept. A folder write is rejected before touching disk when the source changed since the proposal (#137)
- **Screenplay** ([Release v4.23.0](https://github.com/Cratis/Screenplay/releases/tag/v4.23.0)): `when append <Event>` specifications: the event goes through append-time constraints and projections, then the stated read models and query results are compared. If the specification asserts events, they must equal the complete set of new facts. Reactions do not run.
- **Screenplay** ([Release v4.23.0](https://github.com/Cratis/Screenplay/releases/tag/v4.23.0)): Explicit comparison qualifiers on specification outcomes. Event order defaults to authored order and can be relaxed; read-model and query properties default to subset matching and can be made exact. Conflicting actions and malformed qualifiers are reported (`PLAY0358`, `PLAY0359`).
- **Screenplay** ([Release v4.23.0](https://github.com/Cratis/Screenplay/releases/tag/v4.23.0)): An inventory of the code attachments the executable model cannot run yet: command handlers and validation, concept validation, rule and policy predicates, reducer transitions, query performers and reactions. Each is listed with its role, owning declaration, language or file, content hash and source location. It sits on the compilation result, and MCP pages it by workspace revision. Binding still fails closed with `PLAY0268`.
- **Screenplay** ([Release v4.23.0](https://github.com/Cratis/Screenplay/releases/tag/v4.23.0)): A `policy` may name its implementation with `file <Path>`, as an alternative to inline code. The executable model treats it like a code policy.
- **Screenplay** ([Release v4.22.0](https://github.com/Cratis/Screenplay/releases/tag/v4.22.0)): Declarative policies bind into the executable semantic model and are evaluated for commands and queries. A command's or query's effective authorization is its own policies, every enclosing feature's and its module's, combined by AND (#142)
- **Screenplay** ([Release v4.22.0](https://github.com/Cratis/Screenplay/releases/tag/v4.22.0)): Specifications accept a `given caller` block (`authenticated`, `role "<role>"`, `claim "<type>" = "<value>"`; a claim may repeat) and a `then denied` outcome, distinct from `then error`. A denied command or query is rejected as `Unauthorized` before validation runs (#142)
- **Screenplay** ([Release v4.21.0](https://github.com/Cratis/Screenplay/releases/tag/v4.21.0)): Modules and features accept `authorize`. It combines by AND with the policies of every command and query beneath them, and folder files merge it like behaviors; a repeated identical clause warns with `PLAY0394` (#75)
- **Screenplay** ([Release v4.21.0](https://github.com/Cratis/Screenplay/releases/tag/v4.21.0)): Inline code blocks carry their language as a fence info string (` ```csharp `). The previous forms — a language line above a bare fence, and `validate csharp` — still parse with a `PLAY0397` warning, and printing writes the new form (#184)
- **Screenplay** ([Release v4.21.0](https://github.com/Cratis/Screenplay/releases/tag/v4.21.0)): Typed accessors beside every `dynamic` context member (`CommandAs<T>()`, `ArgumentsAs<T>()`, `ArtifactAs<T>()`, …), so LINQ in inline code binds at compile time. A payload of another type throws `ContextPayloadTypeMismatch` (#84)
- **Screenplay** ([Release v4.21.0](https://github.com/Cratis/Screenplay/releases/tag/v4.21.0)): Canonical corpus vectors: RegisterProject with reordered and relocated documents (same revision and bytes), a pinned ESM v2 vector, and an unsupported vector that fails closed with no artifacts. The corpus package now runs package validation (#168)
- **Screenplay** ([Release v4.21.0](https://github.com/Cratis/Screenplay/releases/tag/v4.21.0)): Documentation gates: every construct the parsers accept must have a grammar production and a reference page; every relative link and anchor must resolve and every page must be reachable from navigation. Documentation-only pull requests now run these checks (#146)
- **Arc.TypeScript** ([Arc for TypeScript 0.3.0 — generated clients](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.3.0)): `exportClientManifest` writes a versioned JSON client manifest from registered commands and queries that declare an explicit `clientOutput` shape.
- **Arc.TypeScript** ([Arc for TypeScript 0.3.0 — generated clients](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.3.0)): `@cratis/arc.server.codegen` renders `@cratis/arc` command and query proxies from that manifest, with `renderClientManifest`, `generateClient`, and a JSON-only CLI that refuses unsafe paths, symlinks, and overwrites of files it does not own.
- **Arc.TypeScript** ([Arc for TypeScript 0.3.0 — generated clients](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.3.0)): Generated proxies for flat DTOs, basic and optional inputs, command responses, and DTO or array queries, verified against live Express, Fastify, and Hono hosts with the published `@cratis/arc` client.
- **Screenplay** ([Release v4.20.0](https://github.com/Cratis/Screenplay/releases/tag/v4.20.0)): Executable semantic model version 2. It is selected automatically when a model uses a v2 construct and is otherwise unchanged at version 1 (#226, #167):
- **Screenplay** ([Release v4.20.0](https://github.com/Cratis/Screenplay/releases/tag/v4.20.0)): Typed state-change destinations: `produces … for <expr>` targets an event source without duplicating the identity into the event.
- **Screenplay** ([Release v4.20.0](https://github.com/Cratis/Screenplay/releases/tag/v4.20.0)): Event-source context on facts, which projections read the event-source identity from.
- **Screenplay** ([Release v4.20.0](https://github.com/Cratis/Screenplay/releases/tag/v4.20.0)): `for <value>` event-source assertions on `given` and `then` events, so a specification can name exact streams. For example, a unique constraint can be shown colliding between two event sources.
- **Screenplay** ([Release v4.20.0](https://github.com/Cratis/Screenplay/releases/tag/v4.20.0)): `$context.occurred` and the caller's identity (`$context.identity.*`) in `produces`, matching Chronicle's event context.
- **Screenplay** ([Release v4.20.0](https://github.com/Cratis/Screenplay/releases/tag/v4.20.0)): Projection variants execute. Each variant is its own read model; entering one removes the entity from its siblings, and projection-level handlers apply to every variant that has the property. This follows how Chronicle's variant support reclassifies them. New errors (`PLAY0382`–`PLAY0385`) cover a variant without `enters on`, an entering event claimed twice, and a shared mapping a variant's read model lacks (#185)
- **Screenplay** ([Release v4.20.0](https://github.com/Cratis/Screenplay/releases/tag/v4.20.0)): Validation rules and `require` conditions accept a severity: `information`, `warning` or `error` (the default). Every failing rule still rejects the command, and the rejection reports each failure's severity (#227)
- **Screenplay** ([Release v4.20.0](https://github.com/Cratis/Screenplay/releases/tag/v4.20.0)): `require` bodies accept a localized `message $strings.<key>` (#231)
- **Arc** ([Release v22.23.0](https://github.com/Cratis/Arc/releases/tag/v22.23.0)): Register scoped, asynchronous authorization policies with `IAuthorizationPolicy` and `AddArcAuthorizationPolicy<TPolicy>()` on either Arc host (#2736).
- **Arc** ([Release v22.23.0](https://github.com/Cratis/Arc/releases/tag/v22.23.0)): Use ASP.NET Core policies and authentication schemes on model-bound commands, queries, and observable subscriptions, following the [authorization contract](https://github.com/Cratis/Arc/blob/main/decisions/0004-evaluate-authorization-policies-asynchronously.md) (#2736).
- **Arc.TypeScript** ([Arc for TypeScript 0.2.0 — services and identity](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.2.0)): Explicit service tokens and singleton, scoped, and transient lifetimes, with owned resource cleanup and real-pipeline testing helpers.
- **Arc.TypeScript** ([Arc for TypeScript 0.2.0 — services and identity](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.2.0)): Registry-owned singleton initialization and graceful draining of admitted work without converting committed successes into shutdown failures.
- **Arc.TypeScript** ([Arc for TypeScript 0.2.0 — services and identity](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.2.0)): Identity-details endpoints and a size-bounded, Unicode-compatible display cookie that is never used as a credential.
- **Arc.TypeScript** ([Arc for TypeScript 0.2.0 — services and identity](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.2.0)): Explicit trusted native-principal integration for Express, Fastify, and Hono, with native TLS handling and preserved routing defenses.
- **Arc.TypeScript** ([Arc for TypeScript 0.2.0 — services and identity](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.2.0)): Ordered tenant selection with optional required-tenant and membership enforcement, plus opt-in development user and tenant discovery.
- **Arc.Kotlin** ([Release v7.6.0](https://github.com/Cratis/Arc.Kotlin/releases/tag/v7.6.0)): Opt into `Name.proxy.ts` filenames with `cratisArc.proxies.useProxyFileSuffix` or `--use-proxy-file-suffix true`. Generated imports and barrel exports follow the setting, while external mappings and routes stay unchanged. Switching either direction cleans up owned generated files when cleanup is enabled (#229).
- **Arc.TypeScript** ([Arc for TypeScript 0.1.0 — source preview](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.1.0)): Schema-backed command and query APIs with validation-only execution, authorization, tenant and correlation context, execution scopes, and paging.
- **Arc.TypeScript** ([Arc for TypeScript 0.1.0 — source preview](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.1.0)): Express, Fastify, and Hono adapters for hosting Arc APIs on Node.js.
- **Arc.TypeScript** ([Arc for TypeScript 0.1.0 — source preview](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.1.0)): Tenant-aware MongoDB read helpers with trusted filtering and database-owned paging.
- **Arc.TypeScript** ([Arc for TypeScript 0.1.0 — source preview](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.1.0)): Introspection, basic OpenAPI descriptions, a runnable Tasks sample, and documentation of supported capabilities and limitations.
- **Screenplay** ([Release v4.19.0](https://github.com/Cratis/Screenplay/releases/tag/v4.19.0)): Specification values accept typed single-line objects and lists, such as `lines = [{"sku":"A-1","quantity":2}]` and `tags = []`. Keys are checked against the declared composite type (`PLAY0291`–`PLAY0294`). The values bind to executable composite and array values and run end to end (#215, #207)
- **Screenplay** ([Release v4.19.0](https://github.com/Cratis/Screenplay/releases/tag/v4.19.0)): Specifications may state a subset of read-model or query-result properties. A query result may omit the identifier its arguments supply. Specifications with only `given` and `then query`/`then readmodel` steps and no `when` run (#207)
- **Screenplay** ([Release v4.19.0](https://github.com/Cratis/Screenplay/releases/tag/v4.19.0)): Commands can produce events conditionally (`produces when …`) with conditions over command properties, and can state `require` conditions over command properties. Each condition is evaluated independently (#210, #209)
- **Screenplay** ([Release v4.19.0](https://github.com/Cratis/Screenplay/releases/tag/v4.19.0)): Literal tags on events and `produces` travel as append metadata (#210)
- **Screenplay** ([Release v4.19.0](https://github.com/Cratis/Screenplay/releases/tag/v4.19.0)): Constraints accept `released by <Event>`, composite properties (`unique a, b on E`), several targets under one name, `message` and `ignore casing` (#212)
- **Screenplay** ([Release v4.19.0](https://github.com/Cratis/Screenplay/releases/tag/v4.19.0)): `matches "<regex>"` takes an ECMAScript regular expression, and `matches email` is a named pattern with a documented definition (#209)
- **Screenplay** ([Release v4.19.0](https://github.com/Cratis/Screenplay/releases/tag/v4.19.0)): Renaming a composite type's property through MCP rewrites the object keys that name it (#215)
- **Stage** ([Release v4.2.0](https://github.com/Cratis/Stage/releases/tag/v4.2.0)): Customize generated hosts through optional `ConfigureServices` and `ConfigureApplication` hooks and a `Customizations/Dependencies.props` import, without editing managed files. Includes a catalog adapter example and a customization guide. Modeled capture, reaction, and `file` bindings remain unsupported. (#121)
- **Stage** ([Release v4.2.0](https://github.com/Cratis/Stage/releases/tag/v4.2.0)): Load an optional product-owned `Customizations/styles.css` after component tokens and styles, before rendering the frontend. The renderer never emits files into this directory. (#122)
- **AI** ([Release v3.4.0](https://github.com/Cratis/AI/releases/tag/v3.4.0)): The social feed post skill now teaches drafting in a human voice: open with something that happened or the reader's concrete problem, talk the way the people who built it would, show the default shape next to the better one, sell with specifics instead of adjectives, put each limit inside the sentence it limits, keep review and evidence language out of the copy, and stop when you are done.
- **AI** ([Release v3.4.0](https://github.com/Cratis/AI/releases/tag/v3.4.0)): The voice and cadence skill recognizes five more tells of generated prose: punchline fragments ("They run."), signpost pairs ("That's the X. Here's the Y."), labeled caveats ("One honest limit:"), aphoristic closes and reflexive triplets.
- **AI** ([Release v3.4.0](https://github.com/Cratis/AI/releases/tag/v3.4.0)): The voice and cadence skill explains hedged, noncommittal copy as review language leaking into the material, and how to fix it without dropping a true limitation.
- **Stage** ([Release v4.1.0](https://github.com/Cratis/Stage/releases/tag/v4.1.0)): Support scalar nested objects, all-event subscriptions, and recursive projection definitions when loading Screenplay models. (#125)
- **Screenplay** ([Release v4.18.0](https://github.com/Cratis/Screenplay/releases/tag/v4.18.0)): The executable semantic model admits validation rules beyond `not empty`: `max`/`min` (length on text, value on numbers), `==`/`!=`, `>`/`>=`/`<`/`<=` on numbers, `length ==`, and `all >`/`all >=` over collections of numbers. The reference executor evaluates them all (#209)
- **Screenplay** ([Release v4.18.0](https://github.com/Cratis/Screenplay/releases/tag/v4.18.0)): The executable semantic model admits every projection block the way Chronicle lowers it: several events in one `from`, `children`, `nested`, update-only `join`, `every`/`all`, `remove with`, `remove via join`, composite and literal keys, and the `add`/`subtract`/`increment`/`decrement`/`count`/`clear` mappings. The reference executor runs them all (#211)
- **Screenplay** ([Release v4.18.0](https://github.com/Cratis/Screenplay/releases/tag/v4.18.0)): The executable semantic model admits `unique <property> on <Event>` and `unique event <Event>` constraints, and the reference executor enforces them with Chronicle's semantics (#212)
- **Screenplay** ([Release v4.18.0](https://github.com/Cratis/Screenplay/releases/tag/v4.18.0)): One event-context catalog, matching Chronicle's `EventContext`, is shared by the compiler, the editor and the documentation. The compiler checks `$eventContext` paths against it (`PLAY0295`–`PLAY0299`) and the editor underlines invalid paths (#217)
- **Screenplay** ([Release v4.18.0](https://github.com/Cratis/Screenplay/releases/tag/v4.18.0)): MCP `read-proposal` has a `dropped-comments` view, and every proposal reports how many comments it drops (#216)
- **Screenplay** ([Release v4.18.0](https://github.com/Cratis/Screenplay/releases/tag/v4.18.0)): A workspace operation replaces one produced-event mapping source in place (#193)
- **Screenplay** ([Release v4.18.0](https://github.com/Cratis/Screenplay/releases/tag/v4.18.0)): New warnings:
- **Screenplay** ([Release v4.18.0](https://github.com/Cratis/Screenplay/releases/tag/v4.18.0)): `PLAY0290`: an `import` names something the application declares itself (#208)
- **Screenplay** ([Release v4.18.0](https://github.com/Cratis/Screenplay/releases/tag/v4.18.0)): `PLAY0340`: the same behavior is attached twice across folder files
- **Screenplay** ([Release v4.18.0](https://github.com/Cratis/Screenplay/releases/tag/v4.18.0)): `PLAY0380`: Chronicle's projection lowering drops part of a construct
- **Screenplay** ([Release v4.18.0](https://github.com/Cratis/Screenplay/releases/tag/v4.18.0)): `PLAY0381`: a projection-level key does not route events
- **AI** ([Release v3.3.0](https://github.com/Cratis/AI/releases/tag/v3.3.0)): A hook guards agent-run `cratis chronicle` commands in Claude and Pi: read-only inspection and help run as before; replay, retry, quarantine clearing, job control, recommendations, and adding or removing users, applications and subscriptions are refused, as is any chronicle command the guard does not recognize.
- **AI** ([Release v3.3.0](https://github.com/Cratis/AI/releases/tag/v3.3.0)): A human who has authorized a store mutation can allow it by starting the agent with `CRATIS_HOOKS_ALLOW_STORE_MUTATIONS=1`; the command lists live in `cratis-store-mutations.json` and can be extended per repository.
- **Arc** ([Release v22.22.0](https://github.com/Cratis/Arc/releases/tag/v22.22.0)): `CratisProxiesUseProxyFileSuffix` names generated TypeScript files `Name.proxy.ts` instead of `Name.ts`, so generated proxies can be told apart from hand-written TypeScript in the same folders. Imports between generated files and `index.ts` barrels follow the suffix; imports of modules you mapped yourself are left as mapped. Switching the option on or off replaces the previously generated files. Off by default.
- **Chronicle** ([Release v19.4.5](https://github.com/Cratis/Chronicle/releases/tag/v19.4.5)): `CHRONICLE_MONGODB_IMAGE` selects the MongoDB image the integration fixtures start. Current MongoDB refuses to start on some host kernels, and the refusal surfaces as a container start timeout that explains nothing, leaving integration scenarios unrunnable on that machine.
- **cli** ([Release v3.16.0](https://github.com/Cratis/cli/releases/tag/v3.16.0)): Shell completions offer the AI and LLM command values offline, without calling out to a provider.
- **cli** ([Release v3.15.0](https://github.com/Cratis/cli/releases/tag/v3.15.0)): `cratis llm-context` now gives every command an `effect` — `read-only`, `local`, `mutating` or `destructive` — and a `requiresConfirmation` flag, so agents and guards can tell observing commands from state-changing ones without keeping their own lists.
- **cli** ([Release v3.15.0](https://github.com/Cratis/cli/releases/tag/v3.15.0)): The `cratis llm-context --schema` JSON Schema, the catalog's tips, the generated `CHRONICLE.md` safety notes and a new LLM Context reference page explain both fields and what each value means.
- **cli** ([Release v3.14.0](https://github.com/Cratis/cli/releases/tag/v3.14.0)): `cratis run` accepts a single Screenplay (`.play`) file as well as a folder. Only that file is mounted, read-only, and handed to the Stage; the folder it sits in is not mounted (#128)
- **Chronicle.Mcp** ([Release v1.4.0](https://github.com/Cratis/Chronicle.Mcp/releases/tag/v1.4.0)): Every tool declares MCP tool annotations (`readOnlyHint`, `destructiveHint`, `idempotentHint`, `openWorldHint`), so MCP clients can run read-only tools freely and ask before a tool changes state. `stop_job` and `resume_job` are state-changing, non-destructive and idempotent; `delete_job` is state-changing, destructive and idempotent; all other tools are read-only, and every tool is closed-world — it talks only to the configured Chronicle server. (#34)
- **Arc** ([Release v22.21.0](https://github.com/Cratis/Arc/releases/tag/v22.21.0)): Analyzer `ARC0021` reports a `Policy` or `AuthenticationSchemes` on an authorization attribute of a model-bound command or read model. Arc enforces authentication and roles but evaluates neither of these, so the artifact is less protected than its attribute reads (#2736)
- **Arc** ([Release v22.21.0](https://github.com/Cratis/Arc/releases/tag/v22.21.0)): `IAuthorizationAttributeEvaluator.GetAuthorizationRequirements`, so an evaluator can report every attribute it finds. It defaults to the existing single answer, so existing implementations keep working
- **AI** ([Release v3.2.1](https://github.com/Cratis/AI/releases/tag/v3.2.1)): The Decision Engine image is built and pushed to Docker Hub with every release, as `cratis/decision-engine`
- **AI** ([Release v3.2.0](https://github.com/Cratis/AI/releases/tag/v3.2.0)): `IDecisions` — submit context plus a finite set of choices, get back every choice with its probability, the highest-probability choice, and the margin to the runner-up. Thresholds are deliberately left to consumers so the raw distribution survives intact (#392)
- **AI** ([Release v3.2.0](https://github.com/Cratis/AI/releases/tag/v3.2.0)): A batch overload on `IDecisions` for callers scoring many candidates against one task, with results guaranteed in request order (#392)
- **AI** ([Release v3.2.0](https://github.com/Cratis/AI/releases/tag/v3.2.0)): `Decision` as an `AIProviderCapability` and an `AIModelCapability`, advertised independently of the conversational and agentic capabilities (#392)
- **AI** ([Release v3.2.0](https://github.com/Cratis/AI/releases/tag/v3.2.0)): `AIProviderType.DecisionEngine` and `AddDecisionEngineProvider` / `ReconfigureDecisionEngineProvider` for configuring decision providers the same way as any other AI provider (#392)
- **AI** ([Release v3.2.0](https://github.com/Cratis/AI/releases/tag/v3.2.0)): `AIModelCapabilities.For(AIProviderType, ModelName)` — capability for a decision model is declared by provider type rather than inferred from the model identifier, which carries no marker that would distinguish it from a chat model (#392)
- **AI** ([Release v3.2.0](https://github.com/Cratis/AI/releases/tag/v3.2.0)): `AIProviderCapabilities` — what each provider type can be used for. A decision engine advertises `Decision` and neither `Conversational` nor `Agentic`, so existing compatibility checks refuse to schedule an agent onto it (#392)
- **AI** ([Release v3.2.0](https://github.com/Cratis/AI/releases/tag/v3.2.0)): `AddCratisAI(ai => ai.WithDecisions<TResolver>())` registers the decision surface. Nothing decision-related is registered when it is not called (#392)
- **AI** ([Release v3.2.0](https://github.com/Cratis/AI/releases/tag/v3.2.0)): Telemetry on `Cratis.AI.Decisions`: decision duration, count, and top-probability distribution. Context text is not recorded unless explicitly enabled (#392)
- **AI** ([Release v3.2.0](https://github.com/Cratis/AI/releases/tag/v3.2.0)): The Cratis Decision Engine service under `Source/DecisionEngine/` — Decision API v1, CPU-first, model and calibration temperature configurable, with an artifact cache so restarts do not re-download weights (#392)
- **release-action** ([Release v1.4.0](https://github.com/Cratis/release-action/releases/tag/v1.4.0)): The issues a release's notes say it resolves are closed when the release is created, each with a comment naming the release tag. Only a note bullet ending in `(#123)` counts; prose mentions and cross-repository references are left alone. Needs `issues: write`, and is turned off with `close-resolved-issues: false`
- **Arc** ([Release v22.20.0](https://github.com/Cratis/Arc/releases/tag/v22.20.0)): Analyzer `ARC0019` reports `[AllowAnonymous]` declared on the same class or method as `[Authorize]` or `[Roles]`. Arc resolves that contradiction differently depending on evaluator order — rejecting the call in one order and admitting anonymous callers in the other — so the declaration now fails loudly at build time instead. Overriding a class on one query method is supported and not reported (#2714)
- **Arc** ([Release v22.20.0](https://github.com/Cratis/Arc/releases/tag/v22.20.0)): Analyzer `ARC0020` reports `[Authorize]` or `[AllowAnonymous]` from `Microsoft.AspNetCore.Authorization` on a model-bound `[Command]` or `[ReadModel]`. Arc enforces only its own `Cratis.Arc.Authorization` attributes on model-bound artifacts, so the ASP.NET Core attribute protects nothing: a command marked with it is open to every caller. Use the Arc attribute of the same name. Controller-based commands and queries are unaffected (#2719)
- **Chronicle.Elixir** ([Release v3.5.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.5.0)): `encrypted/1,2,3` macro (`Chronicle.Confidentiality`) for values that need encryption at rest without being personal data subject to GDPR right-to-erasure — an API key, a webhook signing secret, a partner credential (Cratis/Chronicle#4095)
- **Chronicle.Elixir** ([Release v3.5.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.5.0)): `Chronicle.Concept` gets its own concept-level `encrypted/0,1` macro, mirroring how `pii/0,1` is the concept-level counterpart to `Chronicle.Compliance.pii/1,2`
- **Chronicle.Elixir** ([Release v3.5.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.5.0)): `EncryptionScope` (`:subject` default, `:namespace`, `:global`) — the identity an `encrypted` value's key is provisioned under. A subject-scoped key is always disjoint from any `pii` key for the same subject; a namespace-scoped key is shared by every value marked that way in one event store namespace; a global-scoped key is shared across the whole installation
- **Chronicle.Elixir** ([Release v3.5.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.5.0)): `pii` and `encrypted` cannot both apply to the same value — rejected at schema-generation time with `Chronicle.Confidentiality.PiiAndEncryptedCombinedNotSupported`, because the two would otherwise encrypt the value twice under two different keys and be unable to release it correctly
- **Chronicle.Elixir** ([Release v3.5.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.5.0)): `encrypted/0,1` cannot be declared on a `Chronicle.Concept` created with `event_source_id: true`, rejected at compile time, mirroring the existing restriction on `pii/0,1`
- **Chronicle.Kotlin** ([Release v6.4.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.4.0)): `@Encrypted` annotation (`io.cratis.chronicle.confidentiality`) for values that need encryption at rest without being personal data subject to GDPR right-to-erasure — an API key, a webhook signing secret, a partner credential (Cratis/Chronicle#4095)
- **Chronicle.Kotlin** ([Release v6.4.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.4.0)): `EncryptionScope.Subject` (default), `.Namespace`, and `.Global` — the identity an `@Encrypted` value's key is provisioned under. A subject-scoped key is always disjoint from any `@Pii` key for the same subject; a namespace-scoped key is shared by every value marked that way in one event store namespace; a global-scoped key is shared across the whole installation
- **Chronicle.Kotlin** ([Release v6.4.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.4.0)): `@Pii` and `@Encrypted` cannot both apply to the same value — rejected at schema-generation time with `PiiAndEncryptedCombinedNotSupported`, because the two would otherwise encrypt the value twice under two different keys and be unable to release it correctly
- **Chronicle.Kotlin** ([Release v6.4.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.4.0)): `@Encrypted` cannot be applied to an `EventSourceId`-typed concept, flagged with `EncryptedNotSupportedOnEventSourceId`, mirroring the existing restriction on `@Pii`
- **Chronicle.TypeScript** ([Release v6.3.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.3.0)): `@encrypted()` decorator (`@cratis/chronicle/confidentiality`) for values that need encryption at rest without being personal data subject to GDPR right-to-erasure — an API key, a webhook signing secret, a partner credential (Cratis/Chronicle#4095)
- **Chronicle.TypeScript** ([Release v6.3.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.3.0)): `EncryptionScope.Subject` (default), `.Namespace`, and `.Global` — the identity an `@encrypted()` value's key is provisioned under. A subject-scoped key is always disjoint from any `@pii()` key for the same subject; a namespace-scoped key is shared by every value marked that way in one event store namespace; a global-scoped key is shared across the whole installation
- **Chronicle.TypeScript** ([Release v6.3.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.3.0)): `@pii()` and `@encrypted()` cannot both apply to the same value — rejected at schema-generation time with `PIIAndEncryptedCombinedNotSupported`, because the two would otherwise encrypt the value twice under two different keys and be unable to release it correctly
- **Chronicle.TypeScript** ([Release v6.3.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.3.0)): `@encrypted()` cannot be applied to the `eventSourceId` property, flagged at decoration time with `EncryptedNotSupportedOnEventSourceId`, mirroring the existing restriction on `@pii()`
- **Chronicle** ([Release v19.4.0](https://github.com/Cratis/Chronicle/releases/tag/v19.4.0)): `[Encrypted]` attribute (`Cratis.Chronicle.ProtectedValues`) for values that need encryption at rest without being personal data subject to GDPR right-to-erasure — an API key, a webhook signing secret, a partner credential (#4095)
- **Chronicle** ([Release v19.4.0](https://github.com/Cratis/Chronicle/releases/tag/v19.4.0)): `EncryptionScope.Subject` (default), `.Namespace`, and `.Global` — the identity an `[Encrypted]` value's key is provisioned under. A subject-scoped key is always disjoint from any `[PII]` key for the same subject; a namespace-scoped key is shared by every value marked that way in one event store namespace; a global-scoped key is shared across the whole installation
- **Chronicle** ([Release v19.4.0](https://github.com/Cratis/Chronicle/releases/tag/v19.4.0)): `[PII]` and `[Encrypted]` cannot both apply to the same value — rejected at schema-generation time, and flagged at compile time by a new analyzer (CHR0053), because the two would otherwise encrypt the value twice under two different keys and be unable to release it correctly
- **Chronicle** ([Release v19.4.0](https://github.com/Cratis/Chronicle/releases/tag/v19.4.0)): `[Encrypted]` cannot be applied to an `EventSourceId<T>`, flagged at compile time by a new analyzer (CHR0052), mirroring the existing restriction on `[PII]`
- **Chronicle** ([Release v19.4.0](https://github.com/Cratis/Chronicle/releases/tag/v19.4.0)): No API anywhere can delete an `[Encrypted]` value's key — `PIIManager`'s erasure operations explicitly refuse an identifier belonging to an `[Encrypted]` value
- **Chronicle** ([Release v19.4.0](https://github.com/Cratis/Chronicle/releases/tag/v19.4.0)): `Cratis.Chronicle.Testing`'s `EventScenario` and related scenario helpers now protect `[Encrypted]` values the same way they already protect `[PII]` values
- **Chronicle** ([Release v19.4.0](https://github.com/Cratis/Chronicle/releases/tag/v19.4.0)): `Cratis.Chronicle.Confidentiality` — a security metadata provider system (`ICanProvideSecurityMetadataForType`/`ICanProvideSecurityMetadataForProperty`, `ISecurityMetadataResolver`) parallel to the existing GDPR compliance one, for classifying a value as needing protection for security reasons rather than compliance reasons. `[Encrypted]` is its first consumer; `[PII]` continues to resolve only through the compliance provider system and never gains `[Encrypted]`'s wider scopes
- **AI** ([Release v3.1.2](https://github.com/Cratis/AI/releases/tag/v3.1.2)): A Cratis site reference for the documentation writing skill: which teaching components to use (`YouWillLearn`, `Recap`, client-language tabs), how to state an experimental product's maturity, how to state cross-product compatibility, what Prompter records as a documentation-gap signal, and who decides page structure.
- **cli** ([Release v3.12.0](https://github.com/Cratis/cli/releases/tag/v3.12.0)): Render generated applications with explicit command inputs and editable keyed lookups using Stage 3.22.0.
- **Stage** ([Release v3.22.0](https://github.com/Cratis/Stage/releases/tag/v3.22.0)): Compose exact required String/Guid command inputs and an explicit submit action; show unsupported required fields instead of silently omitting them. (#100)
- **Stage** ([Release v3.22.0](https://github.com/Cratis/Stage/releases/tag/v3.22.0)): Generate editable lookup forms for supported optional-single queries alongside command forms, preserving exact entered identifiers and showing returned values or not-found states. (#100)
- **Stage** ([Release v3.22.0](https://github.com/Cratis/Stage/releases/tag/v3.22.0)): Bind generated queries by stable source identity so ambiguous names are not silently resolved to another query. (#100)
- **Scene** ([Release v3.7.0](https://github.com/Cratis/Scene/releases/tag/v3.7.0)): Let Scene command forms bind exact String and Guid inputs and submit through the native Arc form, showing unsupported required properties instead of silently omitting them. (#7)
- **Scene** ([Release v3.7.0](https://github.com/Cratis/Scene/releases/tag/v3.7.0)): Rebind mounted forms when their registered command changes, so submissions use the current proxy and authorization. (#7)
- **AI** ([Release v3.1.0](https://github.com/Cratis/AI/releases/tag/v3.1.0)): Selecting the `cratis/screenplay` profile makes the Screenplay MCP server available through the Cratis CLI and each supported client’s native project integration. No separate Screenplay .NET tool installation or manual MCP JSON is needed.
- **AI** ([Release v3.1.0](https://github.com/Cratis/AI/releases/tag/v3.1.0)): Pi receives a native Screenplay tool bridge that discovers live tool schemas, honors profile selection and opt-out, and reports errors without retrying an uncertain source mutation.
- **AI** ([Release v3.1.0](https://github.com/Cratis/AI/releases/tag/v3.1.0)): Screenplay AI guidance now teaches scoped model navigation, reviewed typed-AST proposals, safe refactoring, durable identities and explicit recovery.
- **cli** ([Release v3.11.0](https://github.com/Cratis/cli/releases/tag/v3.11.0)): Run the Screenplay MCP server with `cratis screenplay mcp`, bundled into the Cratis CLI with no separate Screenplay tool installation or startup download.
- **cli** ([Release v3.11.0](https://github.com/Cratis/cli/releases/tag/v3.11.0)): Configure Screenplay MCP automatically when `cratis ai install` or `cratis ai update` selects the Screenplay profile, including profiles that compose it. Supported native configurations cover Claude Code, VS Code/Copilot, Cursor, OpenCode, Codex and Pi.
- **cli** ([Release v3.11.0](https://github.com/Cratis/cli/releases/tag/v3.11.0)): Choose a project-local model directory or disable registration in `.cratis/ai.json`; dry-run and status report the planned and installed registrations.
- **Components** ([Release v4.13.0](https://github.com/Cratis/Components/releases/tag/v4.13.0)): Let AutoCommandForm callers place optional footer content, including a native submit action, inside the form while retaining its fields-only default. (#314)
- **Screenplay** ([Release v4.16.0](https://github.com/Cratis/Screenplay/releases/tag/v4.16.0)): Embed the Screenplay MCP server in .NET 10 hosts through the `Cratis.Screenplay.Mcp` package and `ScreenplayMcpServer.Run`, without installing or launching a separate tool. The existing `screenplay mcp` command remains supported with the same protocol and authoring behavior. (#203)
- **AI** ([Release v3.0.0](https://github.com/Cratis/AI/releases/tag/v3.0.0)): `DayKey`, the daily counterpart to `WeekKey` and `MonthKey`.
- **AI** ([Release v3.0.0](https://github.com/Cratis/AI/releases/tag/v3.0.0)): `AgentUsageBucketKey`, the day/provider/agent/purpose/model bucket a daily usage row accumulates under.
- **AI** ([Release v3.0.0](https://github.com/Cratis/AI/releases/tag/v3.0.0)): `AgentSessionUsageRecorded` now carries a precomputed `DayKey` and `DailyBucketKey`, for the reason its own remarks already give for `WeekKey`/`MonthKey`: Chronicle's model-bound key resolution keys a projection on a single event property, so a composite bucket has nowhere else to come from.
- **AI** ([Release v3.0.0](https://github.com/Cratis/AI/releases/tag/v3.0.0)): `UsagePeriod` now carries the resolved `Day` and `DailyBucket` alongside `Week` and `Month`.
- **AI** ([Release v3.0.0](https://github.com/Cratis/AI/releases/tag/v3.0.0)): `AgentSessionUsageRecorded` and `UsagePeriod` gained required positional parameters. Code constructing either directly must supply them; `RecordAgentSessionUsage.Provide` resolves them for the normal path.
- **AI** ([Release v3.0.0](https://github.com/Cratis/AI/releases/tag/v3.0.0)): `AgentUsageByDay`'s shape and the signature of `AgentUsageByDay.LastYear` changed as described above.
- **Screenplay** ([Release v4.15.0](https://github.com/Cratis/Screenplay/releases/tag/v4.15.0)): Author Screenplay models through `screenplay mcp <model-folder>` with typed AST creation and editing, guarded cross-file renames, and reviewable multi-file proposals. Install the server with the existing `Cratis.Screenplay.Tool` .NET tool package. (#203)
- **Screenplay** ([Release v4.15.0](https://github.com/Cratis/Screenplay/releases/tag/v4.15.0)): Navigate large, hierarchical models with scoped declaration searches, dependency views, fixture queries, and revision-safe pagination. (#203)
- **Screenplay** ([Release v4.15.0](https://github.com/Cratis/Screenplay/releases/tag/v4.15.0)): Preserve model identities across server restarts and explicitly recover interrupted source writes using root-local identity state and recovery journals. (#203)
- **Screenplay** ([Release v4.15.0](https://github.com/Cratis/Screenplay/releases/tag/v4.15.0)): Choose single-file, module, feature, or slice layouts, with whole-model validation before changes are applied. (#203)
- **Screenplay** ([Release v4.15.0](https://github.com/Cratis/Screenplay/releases/tag/v4.15.0)): Use typed syntax schemas and source-authoring APIs independently of executable backend readiness, with safe reference validation and verified trivia-preserving renames. (#203)
- **AI** ([Release v2.31.0](https://github.com/Cratis/AI/releases/tag/v2.31.0)): Add dedicated skills for release notes and migration guidance, verified technical examples, and LLM-friendly documentation delivery.
- **AI** ([Release v2.31.0](https://github.com/Cratis/AI/releases/tag/v2.31.0)): Make the writing skills available through documentation, content, and engineering profiles appropriate to their tasks.
- **Arc** ([Release v22.19.0](https://github.com/Cratis/Arc/releases/tag/v22.19.0)): `SortDirectionIsNotRecognized`, the validation failure raised for an unrecognized sort direction (#2715)
- **AI** ([Release v2.30.0](https://github.com/Cratis/AI/releases/tag/v2.30.0)): `cratis-social-feed-post` skill covering the feed truncation model, what the opening has to do to survive it, and the formatting and reach constraints that apply to a plain-text feed.
- **AI** ([Release v2.30.0](https://github.com/Cratis/AI/releases/tag/v2.30.0)): `cratis-writing-voice-and-cadence` skill covering the sentence constructions and the structural sameness that make written material read as machine-generated, and the claim-preservation checks a voice pass must pass before it is accepted.
- **AI** ([Release v2.30.0](https://github.com/Cratis/AI/releases/tag/v2.30.0)): `cratis/content` profile composing both skills.
- **AI** ([Release v2.30.0](https://github.com/Cratis/AI/releases/tag/v2.30.0)): Executable verification scenarios for both skills.
- **Chronicle** ([Release v19.3.0](https://github.com/Cratis/Chronicle/releases/tag/v19.3.0)): `Cratis:Chronicle:Clustering:ResponseTimeout` sets how long a grain call waits for its response. Some startup work grows with the deployment — the projections for an event store are registered across every namespace it has — while Orleans' 30 second default does not, and a server that grows past that point cannot finish starting. Because it cannot finish starting it cannot start on the next attempt either, so it stays down with no way to give it more room. Defaults to the same 30 seconds Orleans uses. (#4088)
- **AI** ([Release v2.29.0](https://github.com/Cratis/AI/releases/tag/v2.29.0)): `Providers.UsageReporting` - `ICanReportAIUsage`, `AnthropicUsageReporting`/`OpenAIUsageReporting` (Anthropic/OpenAI organization usage and cost report readers), the `IAIUsageReporting`/`AIUsageReporting` orchestrator, and a live `AIProviderUsageReport` query for a configured provider's trailing-30-day vendor-reported token usage and cost.
- **AI** ([Release v2.29.0](https://github.com/Cratis/AI/releases/tag/v2.29.0)): `Providers.UsageReporting.SettingCredential` - `SetAIProviderUsageCredential`/`ClearAIProviderUsageCredential` for the separate Admin API key a vendor's usage report is read through.
- **AI** ([Release v2.29.0](https://github.com/Cratis/AI/releases/tag/v2.29.0)): `ConfiguredAIProvider.UsageApiKey`.
- **Arc** ([Release v22.18.0](https://github.com/Cratis/Arc/releases/tag/v22.18.0)): `HttpRequestContextEndpointExtensions` on `Cratis.Arc.Http`: `SetEndpointMetadata`, `GetEndpointMetadata`, and `AllowsAnonymous()` on `IHttpRequestContext`, so an `IAuthenticationHandler` can tell whether the endpoint it is about to authenticate allows anonymous access (#2706)
- **Arc** ([Release v22.17.0](https://github.com/Cratis/Arc/releases/tag/v22.17.0)): `IHaveKnownChanges` lets an observable collection query state which of its items changed, so the delta for an emission is the one the provider already knows rather than one rediscovered by comparison. An emitted collection is still an `IEnumerable<T>` of the read model, so existing subscribers are unaffected, and a provider that cannot know what changed continues to be served by the comparison fallback.
- **Scene** ([Release v3.6.0](https://github.com/Cratis/Scene/releases/tag/v3.6.0)): Add query input forms that submit exact string or Guid arguments to an optional-single query, with visible validation, loading, result, and not-found states. (#39)
- **Scene** ([Release v3.6.0](https://github.com/Cratis/Scene/releases/tag/v3.6.0)): Add identity-aware query registration that detects ambiguous bindings while remaining compatible with existing query views. (#39)
- **cli** ([Release v3.10.0](https://github.com/Cratis/cli/releases/tag/v3.10.0)): Add `--warnings-as-errors` so Screenplay validation can reject compiler warnings in CI. (#168)
- **Components** ([Release v4.12.0](https://github.com/Cratis/Components/releases/tag/v4.12.0)): `icons` on `CratisComponentsProvider`, replacing Components-owned glyphs product-wide and resolved per site as per-component prop → provider icon → built-in glyph (#299)
- **Components** ([Release v4.12.0](https://github.com/Cratis/Components/releases/tag/v4.12.0)): First cut of the icon vocabulary: `close`, `remove`, `expand`, `sortAscending`, `sortDescending`, `previous`, `next` and `clear` (#299)
- **Components** ([Release v4.12.0](https://github.com/Cratis/Components/releases/tag/v4.12.0)): `useCratisIcon()` and `CratisIconResolver`, the resolver Components uses at every icon site, exported from the setup-only root barrel for product components that want to follow the same vocabulary (#299)
- **Components** ([Release v4.12.0](https://github.com/Cratis/Components/releases/tag/v4.12.0)): `Chip`, `DataTableCore`'s sort indicators, `ComboBox`, `Dropdown`, `TablePaginator`, `DatePickerInput`, `ProgressSpinner`, a toast's dismiss and loading marks, `CommandForm`'s chips field, `ChatSidebar`, the `Chat` panel and PivotViewer's filter/detail panels now resolve their glyphs through that vocabulary instead of hard-coding them (#299)
- **Components** ([Release v4.12.0](https://github.com/Cratis/Components/releases/tag/v4.12.0)): `Documentation/Common/cratis-components-provider.md` documents `icons` the way `messages` is documented: the whole vocabulary with what each name draws, its default, and every component that uses it (#299)
- **Components** ([Release v4.11.0](https://github.com/Cratis/Components/releases/tag/v4.11.0)): Per-area CSS entry points for every JavaScript subpath — `@cratis/components/Dialogs/styles`, `@cratis/components/PivotViewer/styles`, `@cratis/components/DataTables/styles` and the rest — so an application downloads only the CSS for the surfaces it mounts (#301)
- **Components** ([Release v4.11.0](https://github.com/Cratis/Components/releases/tag/v4.11.0)): `@cratis/components/styles/base`, the shared internal utilities and cascade-layer order that every per-area entry point needs, imported once and never duplicated per surface (#301)
- **Components** ([Release v4.11.0](https://github.com/Cratis/Components/releases/tag/v4.11.0)): `Documentation/Styling/per-area-stylesheets.md` documentation covering when to prefer them over the aggregate, the full list of entry points and what each one covers (#301)
- **Components** ([Release v4.11.0](https://github.com/Cratis/Components/releases/tag/v4.11.0)): Per-area CSS budgets in the published-archive gate: each entry point has its own reviewed gzip ceiling, and a new area cannot ship without a measured number (#301)
- **Components** ([Release v4.10.0](https://github.com/Cratis/Components/releases/tag/v4.10.0)): `removeIcon` on `TagGroup` replaces the glyph inside each tag's remove button, defaulting to the multiplication sign it renders today. The button, its accessible name from `removeLabel`, and its keyboard behaviour are unchanged. (#293)

## Changed

- **cli** ([Release v3.21.0](https://github.com/Cratis/cli/releases/tag/v3.21.0)): The CLI now bundles Screenplay 4.43.0 and Stage 4.20.0, and `cratis run` defaults to the matching Stage image. Model authors get Screenplay's fixes up to 4.43, including `given … for` and `when append … for` in view slices, which previously failed with PLAY0273 (#193).
- **cli** ([Release v3.21.0](https://github.com/Cratis/cli/releases/tag/v3.21.0)): **Chronicle login tokens only go to the server that issued them.** `cratis chronicle login` saves the token, its expiry and the issuing server in the active context. Later commands send the token only when they connect to that exact server. If you log in with `--server`, the token is used when you pass the same `--server` again, and nowhere else. Login refuses multi-host and `chronicle+srv://` connection strings, because the server that receives the token can't be determined in advance. It also no longer follows redirects, and it honours the connection string's TLS options instead of accepting any certificate.
- **cli** ([Release v3.21.0](https://github.com/Cratis/cli/releases/tag/v3.21.0)): **All startup hints share one wait.** The CLI, Stage image and Cratis AI hints get at most about 300 ms together after the command finishes, instead of up to 300 ms each. `CRATIS_NO_UPDATE_CHECK` now also skips the Stage image check's local Docker lookup.
- **Arc** ([Release v22.31.0](https://github.com/Cratis/Arc/releases/tag/v22.31.0)): Policies without the opt-in behave as before and still require an authenticated caller. Role requirements and authentication-scheme requirements always require an authenticated caller, even when combined with an opted-in policy. If several policies apply, a guest is only evaluated when every one of them opted in. (#2761)
- **Arc** ([Release v22.31.0](https://github.com/Cratis/Arc/releases/tag/v22.31.0)): Arc's method-level authorization replaces the type-level declaration. A method with an opted-in policy is therefore reachable by guests even when its type requires a role. The authorization docs now call this out. (#2761)
- **Stage** ([Release v4.21.0](https://github.com/Cratis/Stage/releases/tag/v4.21.0)): Bundle the pinned .NET reference assemblies used for audited body binding, expose the Roslyn runtime dependency, and verify a standalone packed consumer in CI. Existing projection and body-less reducer refusal remains unchanged.
- **Stage** ([Release v4.21.0](https://github.com/Cratis/Stage/releases/tag/v4.21.0)): Whole-solution Debug specs pass in serial execution (`dotnet test --configuration Debug -m:1`); one optional Mongo-backed test is skipped without a configured connection. Parallel local runs suffered external SIGTERM of testhost from another worktree command; isolated Rendering.Cratis 1,751 pass + 1 skip.
- **Stage** ([Release v4.21.0](https://github.com/Cratis/Stage/releases/tag/v4.21.0)): Release build zero warnings, NuGet pack and standalone consumer, frontend test/build and Python compatibility/entrypoint checks pass. Full cross-provider review on the exact committed diff passed with no findings.
- **Chronicle** ([Release v19.14.1](https://github.com/Cratis/Chronicle/releases/tag/v19.14.1)): The kernel's observers now use the generic state machine from `Cratis.Orleans.StateMachines` (Cratis.Orleans 1.11.0), and Chronicle's own copy is removed. Runtime behavior and persisted observer state are unchanged. The transition trace log category is now `StateMachine<ObserverState>` (#4289)
- **Chronicle** ([Release v19.14.1](https://github.com/Cratis/Chronicle/releases/tag/v19.14.1)): Chronicle now builds against Cratis.Orleans 1.11.0, Arc 22.30.0 and Fundamentals 7.19.6 — the minimum versions Cratis.Orleans 1.11.0 requires. The Arc proxy-generator build package stays at 22.23.0 because 22.30.0 crashes on Core
- **Arc.TypeScript** ([v0.43.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.43.0)): The development dependency on `@cratis/chronicle` is 6.19.0, and the samples use the same version. The peer range stays `^6.7.0`.
- **Arc.TypeScript** ([v0.43.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.43.0)): With an older SDK, a projection-backed lookup fails with an error naming `@cratis/chronicle >= 6.19.0`. When a declarative projection without an explicit read-model type is registered, seeded lookups of read models that have no reducer or explicit projection now fail the same way instead of returning `null`, because Arc cannot tell which read model that projection targets. Give the projection an explicit read-model type (`@projection('', ReadModel)`) or upgrade the SDK.
- **Arc.TypeScript** ([v0.42.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.42.0)): The documentation recommends the co-located layout; a separate output folder remains supported, including a dedicated folder nested inside the artifacts folder, which keeps its barrels.
- **Arc.TypeScript** ([v0.42.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.42.0)): A bundler that reads slice files outside the web project must lower the proxies' decorators itself, because the web project's `tsconfig.json` does not apply to them. For Vite 8, set `oxc: { decorator: { legacy: true } }`; declare the client packages where the slice folder can resolve them. See [Set up proxy generation](https://github.com/Cratis/Arc.TypeScript/blob/v0.42.0/Documentation/proxy-generation/getting-started.md).
- **Chronicle** ([Release v19.13.2](https://github.com/Cratis/Chronicle/releases/tag/v19.13.2)): Document that a webhook's non-2xx response fails delivery: transient failures are first retried by the HTTP client, then the partition follows the observer retry settings and is quarantined when attempts are exhausted.
- **Chronicle** ([Release v19.13.2](https://github.com/Cratis/Chronicle/releases/tag/v19.13.2)): Document that an event source can re-claim its own unique value, and that changing the value frees the old one.
- **Arc** ([Release v22.30.1](https://github.com/Cratis/Arc/releases/tag/v22.30.1)): Update the Chronicle integration to Cratis.Chronicle 19.13.0, with the Cratis.Fundamentals, Cratis.Metrics and MongoDB driver versions it requires.
- **Screenplay** ([Release v4.43.0](https://github.com/Cratis/Screenplay/releases/tag/v4.43.0)): Document that C# code bodies use provider-generated PascalCase member names, while authored Screenplay identifiers remain unchanged. The portable default tenant remains the zero GUID; provider-side tenant translation is still pending. Refs #282.
- **Screenplay** ([Release v4.43.0](https://github.com/Cratis/Screenplay/releases/tag/v4.43.0)): Decision records 0012 and 0018 now use the supported `implemented` stage and retain their outstanding provider-verification notes.
- **Screenplay** ([Release v4.42.0](https://github.com/Cratis/Screenplay/releases/tag/v4.42.0)): A projection block that repeats `automap` or `no automap` reports `PLAY0452` (warning). The last setting still wins, and canonical printing keeps each line's comments.
- **Chronicle.TypeScript** ([Release v6.20.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.20.0)): Reject constraints, batch appends (`appendMany` and plural `when.events`), and other unproven operations or inputs with `UnsupportedEventSequenceOperation`, which points to a kernel-backed test. Constraints can be disabled explicitly only for tests that do not depend on them.
- **Arc.TypeScript** ([v0.41.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.41.0)): In PostgreSQL mode, `notifyChanged()` validates its target but publishes nothing locally; the database trigger is the only change source. In-process mode is unchanged.
- **Components** ([Release v4.16.0](https://github.com/Cratis/Components/releases/tag/v4.16.0)): `Tooltip` `content` accepts any React node, and `0` now shows. `undefined`, `null`, booleans, and an empty string still disable the tooltip. Keep tooltip content non-interactive. Renderer adapters that implement `common.tooltip` receive nodes and must render them as they are; the Conformance profile now checks this. (#230)
- **Components** ([Release v4.16.0](https://github.com/Cratis/Components/releases/tag/v4.16.0)): FilterPanel is now a named, non-modal dialog. Opening it moves focus into the panel, and Escape closes it and returns focus to the element that opened it. It now renders as a `div` with `role="dialog"` instead of an `<aside>`, so it is no longer a complementary landmark: `getByRole('complementary')` no longer finds it, and CSS or tests that target the `aside` element must use `.pv-filter-dropdown` or `getByRole('dialog', { name })` instead. This also applies to the filter panel inside `PivotViewer`. (#328)
- **Components** ([Release v4.16.0](https://github.com/Cratis/Components/releases/tag/v4.16.0)): Loading and failure rows in query tables now remount on each state change, so screen readers announce the change. (#327)
- **Components** ([Release v4.16.0](https://github.com/Cratis/Components/releases/tag/v4.16.0)): Conformance merges a part variant's own `pt` attributes with the profile's pass-throu
- **Chronicle** ([Release v19.12.0](https://github.com/Cratis/Chronicle/releases/tag/v19.12.0)): Pattern mining derives request features from route templates only, never from raw request paths, so identifiers embedded in a URL (such as `/customers/jane@example.com`) are no longer stored in mined patterns. Patterns stored before this release are not rewritten (#4260)
- **Chronicle** ([Release v19.12.0](https://github.com/Cratis/Chronicle/releases/tag/v19.12.0)): Registering an event type whose stored schema differs only in titles no longer rewrites the stored schema, and no longer invalidates caches on every reconnect. This matters when old and new clients run side by side (#4253)
- **Chronicle.TypeScript** ([Release v6.19.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.19.0)): Reducer replay in `ReadModelScenario` moved behind an internal read-model processor. Reducer behavior is unchanged.
- **Arc.TypeScript** ([v0.40.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.40.0)): A service scope captures an immutable snapshot of its execution context when it is created. `ServiceScope.identity` returns that snapshot, and the Chronicle, MongoDB and Drizzle integrations use it, so changing the original context object after a scope was created no longer changes the tenant those services use. Principals whose claims can't be cloned keep working for ordinary requests.
- **Chronicle** ([Release v19.11.0](https://github.com/Cratis/Chronicle/releases/tag/v19.11.0)): A reactor whose return value no side-effect handler claims now fails its partition, naming the return type, instead of logging a warning and acknowledging the event. Fix the handler, then retry the partition (#4156)
- **Chronicle** ([Release v19.11.0](https://github.com/Cratis/Chronicle/releases/tag/v19.11.0)): Duplicate reactor IDs, across discovered classes and runtime delegates, are rejected before existing subscriptions disconnect, and the error names both types. A duplicate `Register<T>()` now throws `ReactorAlreadyRegistered` instead of `ArgumentException` (#4196)
- **Chronicle** ([Release v19.11.0](https://github.com/Cratis/Chronicle/releases/tag/v19.11.0)): A `WaitForCompletion()` timeout returns a result with `TimedOut` set instead of throwing a gRPC cancellation. Supported servers also report which observers are still behind (#4132)
- **Chronicle** ([Release v19.11.0](https://github.com/Cratis/Chronicle/releases/tag/v19.11.0)): Read-model instance pages from MongoDB, SQL and in-memory sinks are ordered by key, so reading a page again returns the same instances while membership is unchanged (#3741)
- **Chronicle** ([Release v19.11.0](https://github.com/Cratis/Chronicle/releases/tag/v19.11.0)): A dynamic dictionary key that uses an unknown `$` expression fails with `UnsupportedDynamicPropertyPathExpression` instead of being written as a literal key (#4119)
- **Chronicle** ([Release v19.11.0](https://github.com/Cratis/Chronicle/releases/tag/v19.11.0)): SQL redaction content describes the original event (type, occurrence time, correlation id, caused-by identities and causation types) instead of the redaction itself, matching the other providers (#4145)
- **Chronicle** ([Release v19.11.0](https://github.com/Cratis/Chronicle/releases/tag/v19.11.0)): `Cratis.Chronicle.Testing` depends on `Cratis.Arc` and `Cratis.Arc.Core` 22.19.1 or later, which brings in the ASP.NET Core shared framework. Projects pinned to an older Arc must upgrade (#4158)
- **Chronicle** ([Release v19.11.0](https://github.com/Cratis/Chronicle/releases/tag/v19.11.0)): Aspire uses the development Chronicle image in run mode and the production image in publish mode. A configuration callback no longer implies the production image; `WithImageTag` still overrides (#3686)
- **Chronicle.TypeScript** ([Release v6.18.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.18.0)): Model-bound children now fill their identifier the way Chronicle for .NET does. When the child's identifier is a discoverable `id`/`Id` or given with `identifiedBy`, and the child key defaults to the event source ID, the identifier comes from the event source ID. When no `id` exists and a child property matches an explicit event key, that property becomes the child's identifier. Explicit identifier mappings and class-level `@noAutoMap` still take precedence.
- **Arc** ([Release v22.28.1](https://github.com/Cratis/Arc/releases/tag/v22.28.1)): Query argument parsing is stricter: values that previously fell back silently now return HTTP 400, including `?flag=1` or `?flag=yes` for a boolean, overflowing integers, whitespace-only values, invalid nullable value types that used to become null, and invalid concept values (including nullable or defaulted concepts). Clients must send valid values or omit optional arguments.
- **Arc** ([Release v22.28.1](https://github.com/Cratis/Arc/releases/tag/v22.28.1)): The new public `InvalidQueryArgument` exception represents an invalid supplied query argument; `QueryHttpExtensions.GetQueryArguments` can now throw it. Invalid collection elements use the same named malformed-request validation shape.
- **Arc** ([Release v22.27.1](https://github.com/Cratis/Arc/releases/tag/v22.27.1)): Creating several Arc Core containers over the same types is faster: model-bound command, query and read-model discovery runs once per type set and is reused. A local .NET 10 Release measurement of 50 containers over 581 types dropped from 58.8 ms to 23.7 ms median, about 60% faster (#2673)
- **Arc** ([Release v22.27.1](https://github.com/Cratis/Arc/releases/tag/v22.27.1)): Read models no longer expose private static methods or compiler-generated methods as queries through runtime discovery; public and internal static query methods remain supported (#2651)
- **Chronicle** ([Release v19.10.0](https://github.com/Cratis/Chronicle/releases/tag/v19.10.0)): `all` inside `children` or `nested`. Use `all` at the root with a dotted path instead.
- **Chronicle** ([Release v19.10.0](https://github.com/Cratis/Chronicle/releases/tag/v19.10.0)): `remove via join` at the root or inside `nested`.
- **Chronicle** ([Release v19.10.0](https://github.com/Cratis/Chronicle/releases/tag/v19.10.0)): `children` inside `nested`.
- **Chronicle** ([Release v19.10.0](https://github.com/Cratis/Chronicle/releases/tag/v19.10.0)): `join` inside a `nested` object beneath `children`.
- **Chronicle** ([Release v19.10.0](https://github.com/Cratis/Chronicle/releases/tag/v19.10.0)): More than one `every`/`all` block at the same level. Two `every` blocks inside `children` used to be merged; they are now an error.
- **Chronicle** ([Release v19.10.0](https://github.com/Cratis/Chronicle/releases/tag/v19.10.0)): The same event more than once at one level, including across join blocks, repeated `clear with`, and `remove with` plus `clear with` for the same event. These checks now also run when no schema is supplied.
- **Stage** ([Release v4.20.0](https://github.com/Cratis/Stage/releases/tag/v4.20.0)): Stage targets Chronicle 19.8.1, Arc 22.25.0 and Screenplay 4.41.1. Generated applications and the Host image use the same versions, and CI checks the Chronicle projection oracle against v19.8.1.
- **Stage** ([Release v4.20.0](https://github.com/Cratis/Stage/releases/tag/v4.20.0)): The semantic engine no longer registers Chronicle projection mirrors, so its read models no longer appear as projection views in the Workbench. The admission endpoint no longer reports `projectionMirror`. The default engine is unchanged.
- **Stage** ([Release v4.20.0](https://github.com/Cratis/Stage/releases/tag/v4.20.0)): Specifications that assert a value derived from `$context.occurred` are rejected, because the generated handler uses the actual time.
- **Stage** ([Release v4.20.0](https://github.com/Cratis/Stage/releases/tag/v4.20.0)): composite-key read models, which need https://github.com/Cratis/Chronicle/issues/4265;
- **Stage** ([Release v4.20.0](https://github.com/Cratis/Stage/releases/tag/v4.20.0)): `FromAll`, which needs https://github.com/Cratis/Chronicle/issues/4266;
- **Stage** ([Release v4.20.0](https://github.com/Cratis/Stage/releases/tag/v4.20.0)): literals in `every`/`all` blocks;
- **Stage** ([Release v4.20.0](https://github.com/Cratis/Stage/releases/tag/v4.20.0)): the projection shapes tracked in Chronicle #4125 and #4166;
- **Stage** ([Release v4.20.0](https://github.com/Cratis/Stage/releases/tag/v4.20.0)): role-only policies (Arc #2761);
- **Stage** ([Release v4.20.0](https://github.com/Cratis/Stage/releases/tag/v4.20.0)): per-run projection specifications (#15);
- **Stage** ([Release v4.20.0](https://github.com/Cratis/Stage/releases/tag/v4.20.0)): given read models (#14).
- **Chronicle.TypeScript** ([Release v6.16.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.16.0)): Reactor handlers are always called with the third `services` argument. One- and two-argument handlers are unaffected; a handler that collects arguments with a rest parameter now receives one more.
- **Chronicle.TypeScript** ([Release v6.16.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.16.0)): Without an activator, reactors and reducers are still constructed once per observation with no arguments, exactly as before.
- **Chronicle.TypeScript** ([Release v6.16.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.16.0)): The reactor documentation covers explicit appends, read-model lookups, activation lifetimes, and replay: `@onceOnly()` keeps a handler out of replay but does not protect against retries or duplicate delivery, so explicit writes should be idempotent. The four TypeScript snippets for explicit appends and reading state inside a reactor now show working code.
- **Arc.TypeScript** ([v0.39.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.39.0)): The proxy generator analyzes every execution path of a command's return type, including `Outcome` helpers, promises, aliases and nested tuples, and accepts alternatives that resolve to the same client type. Literal unions such as `boolean`, enums and `'a' | 'b'`, with or without `null`/`undefined`, keep their full type, distinct concepts fall back to their shared primitive, and arrays that mix Chronicle event types are omitted from the client response as before.
- **Arc.TypeScript** ([v0.39.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.39.0)): Alternatives that need different client types, including two structurally identical but distinct DTO classes, now fail generation with guidance to return one response DTO with a status field. Arc for .NET's generator picks one of them instead, which the client can't decode reliably.
- **Arc.TypeScript** ([v0.39.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.39.0)): Generated metadata for queries returning `boolean`, enums or literal unions now names the element type, so OpenAPI describes their data.
- **Arc.TypeScript** ([v0.39.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.39.0)): The command outcomes guide describes how to model several business outcomes.
- **AI** ([Release v7.1.0](https://github.com/Cratis/AI/releases/tag/v7.1.0)): Package unmodified Laya at commit 4066d5d5 with a CPU-only Decision API v1 adapter and pinned multilingual checkpoint.
- **AI** ([Release v7.1.0](https://github.com/Cratis/AI/releases/tag/v7.1.0)): Preserve built-in v1 single/batch contract, add independent multi-label `/v1/labels` and typed `ClassifyLabels()` for callers.
- **AI** ([Release v7.1.0](https://github.com/Cratis/AI/releases/tag/v7.1.0)): Test the packaged image in release CI and publish the Laya candidate image tag.
- **AI** ([Release v7.1.0](https://github.com/Cratis/AI/releases/tag/v7.1.0)): Image build and five adapter tests passed; five C# classification specs passed; AI and Infrastructure builds passed.
- **AI** ([Release v7.1.0](https://github.com/Cratis/AI/releases/tag/v7.1.0)): 10-issue workload against the packaged image: 30 sequential in 4.12s, batch in 3.97s, label requests in 6.96s.
- **Chronicle** ([Release v19.9.0](https://github.com/Cratis/Chronicle/releases/tag/v19.9.0)): An append with no events but at least one concurrency scope that will actually be checked is now accepted and only validates those scopes, so a command that decides to write nothing can still confirm its decision was current. Empty appends without such a scope are still rejected, and empty appends no longer notify append subscribers.
- **Chronicle** ([Release v19.9.0](https://github.com/Cratis/Chronicle/releases/tag/v19.9.0)): Requires Chronicle kernel 19.0.0 or later for decision reads. With plain ASP.NET Core the middleware commits after the response is written, so a caller that needs a conflict-aware response must commit before writing it.
- **Arc.TypeScript** ([v0.38.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.38.0)): `rxjs` is now a required peer dependency of `@cratis/arc.drizzle`.
- **Arc.TypeScript** ([v0.37.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.37.0)): A query declared as a snapshot that returns an observable, subscribable or async iterable is rejected without touching the returned source, so a shared RxJS `Subject` stays usable.
- **Arc.TypeScript** ([v0.37.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.37.0)): `QueryScenario` releases such a stream before rejecting, with a one-second limit and cancellation support. Sources returned inside a scenario are treated as owned by the scenario and may be closed.
- **Arc.TypeScript** ([v0.37.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.37.0)): `QueryScenario.perform()` now rejects queries declared `observable: true`, as `QueryScenario` does in Arc for .NET; use `ObservableQueryScenario` for them.
- **Arc.TypeScript** ([v0.37.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.37.0)): `yarn ci` now type-checks the built declarations of every published package with `skipLibCheck: false`, so a declaration a consumer can't compile fails the build.
- **Arc.TypeScript** ([v0.36.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.36.0)): Projects that use `recommended-type-checked` can see new ARCCHR0006 diagnostics on reactors that return commands without `@onceOnly()` or `@replay()`.
- **Arc.TypeScript** ([v0.36.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.36.0)): The code-analysis navigation lists the ARCCHR0003, ARCCHR0006, ARCCHR0007, ARCCHR0009, and ARCCHR0010 pages.
- **Chronicle.TypeScript** ([Release v6.14.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.14.1)): When a property-only model can't be found at store creation (for example, an import-only model in compiled JavaScript without discovery patterns), the client logs one diagnostic warning per process, naming the mapped properties and their event types. It suggests adding a class-level `@fromEvent(...)`, enabling artifact discovery, or registering the class explicitly. Mappings inherited from base classes or reachable through child types don't trigger the warning.
- **Chronicle.TypeScript** ([Release v6.14.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.14.1)): The getting-started, read-model and troubleshooting guides describe these registration options.
- **Arc** ([Release v22.26.0](https://github.com/Cratis/Arc/releases/tag/v22.26.0)): Plain minimal API responses that return concepts change from objects such as `{"value":"..."}` to primitive values such as `"..."`, matching Arc-generated endpoints and the TypeScript proxies. To keep the object shape for a concept, register your own `JsonConverter<YourConcept>` with `ConfigureHttpJsonOptions`; it takes precedence for individual concepts, concept collections, and, when it implements property-name conversion, dictionary keys, whether registered before or after `AddCratisArc` (#2755)
- **Arc** ([Release v22.26.0](https://github.com/Cratis/Arc/releases/tag/v22.26.0)): Only concept-related converters are added to ASP.NET Core's HTTP JSON options. Your converters keep precedence and the naming policy is unchanged; enums (including `long`-backed va
- **Arc.TypeScript** ([v0.35.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.35.0)): Paging and sorting parameters are listed only for queries whose return is declared as an array or a `queryPage` result. A metadata-free array query no longer lists them; to list them again, set `generatedReturn: { cardinality: 'many', nullable: false }` on its descriptor. Queries that rely on a `QueryRenderer` to page are not advertised as pageable.
- **Arc.TypeScript** ([v0.35.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.35.0)): 401 responses are listed on command execute, command validation, and query operations exactly when authentication can produce them.
- **Arc.TypeScript** ([v0.35.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.35.0)): `page` and `pageSize` are described as `int32`, and the paging parameter descriptions match Arc for .NET.
- **Arc** ([Release v22.25.0](https://github.com/Cratis/Arc/releases/tag/v22.25.0)): For a command that declares a blocking severity, the caller's `X-Allowed-Severity` (or `allowedSeverity`) can make validation stricter, never looser. A failure with `Unknown` severity also rejects such a command. Commands without the attribute behave as before. This deliberately differs from the caller opt-out for controller actions in #21; decision 0005 records why.
- **Arc.TypeScript** ([v0.34.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.34.0)): `ValidationResult` is now both the existing interface and a value holding the helpers. Existing `import type { ValidationResult }` imports and the `validation(message, members?, reason?, severity?)` helper are unchanged.
- **Chronicle** ([Release v19.8.1](https://github.com/Cratis/Chronicle/releases/tag/v19.8.1)): Generating a declaration from a stored, untyped composite-key expression takes the key type from the read model's `Id` schema (including nullable types), or from the child item's `Id` inside a children block. When the schema has no composite type it falls back to `CompositeKey`, and in that case the generated declaration only recompiles if the schema defines that type.
- **Components** ([Release v4.15.1](https://github.com/Cratis/Components/releases/tag/v4.15.1)): `yarn ci` in `Source` now also runs the public API TSDoc check and the packed-archive CSS budget check, which previously ran only in GitHub CI.
- **Stage** ([Release v4.19.0](https://github.com/Cratis/Stage/releases/tag/v4.19.0)): Stage now uses Screenplay 4.41.0. Models with evolved events (ESM v4) are still refused with `STAGE-ESM-016`, which is now reported before any descriptor check.
- **Stage** ([Release v4.19.0](https://github.com/Cratis/Stage/releases/tag/v4.19.0)): The reducer-body rejection (`STAGE-ESM-019`) names only what is still missing.
- **Stage** ([Release v4.19.0](https://github.com/Cratis/Stage/releases/tag/v4.19.0)): Specifications attach typed event-source context for every executable-model version after v1, as Screenplay's reference evaluator does.
- **Arc.TypeScript** ([v0.33.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.33.0)): `givenReadModel(Type, sourceId, instance)` without a tenant now pins the model for the scenario's current `context.tenantId`, not always `Default`. It still falls back to `Default` when the context sets no tenant.
- **Arc.TypeScript** ([v0.33.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.33.0)): A read model with no seeded history and no pin resolves as missing. A required model reports the usual not-found validation result, and an optional one receives `null`.
- **Arc.TypeScript** ([v0.33.0](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.33.0)): A projection-backed read model with seeded history, and aggregates, point to `ChronicleKernelScenario`. Projections need the kernel.
- **Components** ([Release v4.15.0](https://github.com/Cratis/Components/releases/tag/v4.15.0)): While a query table's first result loads, or when its query fails or is unauthorized, the table now renders the new loading or failure row instead of an empty `empty-row`/`emptyMessage`. `empty-row` still renders for a query that returns no rows. If your CSS or tests target `empty-row` to detect loading or errors, update them to the new parts. (#327)
- **Components** ([Release v4.15.0](https://github.com/Cratis/Components/releases/tag/v4.15.0)): An observable query that is missing a required argument never subscribes, so its table now shows the loading row until every required argument has a value; before, it showed a blank row. A snapshot query missing a required argument still shows `emptyMessage`. (#327)
- **Components** ([Release v4.15.0](https://github.com/Cratis/Components/releases/tag/v4.15.0)): `ToolbarButton` exposes `aria-pressed` when you pass `active`, so assistive technology announces the toggle state. Buttons without `active` are unchanged. (#328)
- **Components** ([Release v4.14.3](https://github.com/Cratis/Components/releases/tag/v4.14.3)): `release.md` documents the release order and every place the Components major-version window is set.
- **Arc.TypeScript** ([Arc for TypeScript 0.31.0 — global command and query filters](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.31.0)): Cancellation stops every stage that has not started: authorization policies, filters, validators, dependency resolution, `provide()`, `handle()`, query performers, renderers, read-model interceptors, observable producers, and command response handlers. Once a command handler has run, the command reports what actually happened. A completed outcome is not turned into a cancellation failure. A response handler that cancellation stops before it starts is reported as canceled. An effect that was already acknowledged is never reported as undone.
- **Arc.TypeScript** ([Arc for TypeScript 0.31.0 — global command and query filters](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.31.0)): A defined Chronicle command whose append was acknowledged keeps its success when cancellation stops the wait for projections. A real observer failure is still reported.
- **Arc.TypeScript** ([Arc for TypeScript 0.31.0 — global command and query filters](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.31.0)): Filter results are validated before use. Malformed authorization, readiness or severity values fail closed.
- **Arc.TypeScript** ([Arc for TypeScript 0.31.0 — global command and query filters](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.31.0)): Each filter result's validation entries are filtered by the allowed severity before the chain decides whether to stop. A filtered-out warning therefore cannot switch off later authorization filters. This deliberately differs from Arc on .NET, which stops before severity filtering.
- **Chronicle.TypeScript** ([Release v6.14.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.14.0)): Reducer handler selection and invocation are shared by the production observer and the scenario. Production behavior is unchanged.
- **Chronicle.Elixir** ([Release v3.6.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.6.0)): `cratis_chronicle_contracts` bumped from 19.4.7 to 19.6.1, the first release carrying the `RemoveObserver` rpc
- **Chronicle.TypeScript** ([Release v6.13.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.13.0)): `@cratis/chronicle.contracts` bumped from 19.4.0 to 19.6.1, the first release carrying the `RemoveObserver` rpc
- **Chronicle.Kotlin** ([Release v6.6.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.6.0)): `chronicle-contracts` bumped from 19.5.0 to 19.6.1, the first release carrying the `RemoveObserver` rpc
- **Chronicle** ([Release v19.7.2](https://github.com/Cratis/Chronicle/releases/tag/v19.7.2)): Fluent `.FromAll()` and model-bound `[FromAll]` projections now subscribe to every event type in the event sequence, as a declaration `all` block already does. **Existing projections that use `FromAll` will be redefined, and will start creating or updating read-model instances for events from any event source**, keyed by event source id unless another key is given. Use `FromEvery` for mappings that should only apply to the projection's own event types. Combining `FromAll` with `FromEvery` applies both sets of mappings to all event types. Event types already mapped through `From`, a join or a derivative are not processed a second time by the all-events subscription (#4164)
- **Screenplay** ([Release v4.40.0](https://github.com/Cratis/Screenplay/releases/tag/v4.40.0)): Specification `given` events now go through the same establishment path. Existing specification outcomes are unchanged.
- **Screenplay** ([Release v4.39.0](https://github.com/Cratis/Screenplay/releases/tag/v4.39.0)): A valid `persona` no longer stops a model from binding to the executable model. It is reported as information only, and models that already bound produce the same bytes. Personas and providers are still not part of the executable model; the authentication documentation describes where a renderer reads provider identities from the compilation result. This is part of #254.
- **Screenplay** ([Release v4.39.0](https://github.com/Cratis/Screenplay/releases/tag/v4.39.0)): A persona whose policy cannot be resolved is now an error in compilation, Safe authoring and executable binding, so it never falls back to anonymous access. Draft authoring still accepts it and reports the unresolved reference.
- **Screenplay** ([Release v4.38.0](https://github.com/Cratis/Screenplay/releases/tag/v4.38.0)): PLAY0284 follows what Chronicle fills in a join. It counts a join's mapped fields and compatible AutoMap fields instead of the join's label, which Chronicle discards. It no longer counts a field that AutoMap cannot fill because an explicit mapping already uses the same event field. It also no longer counts fields that only a join inside a `nested` block would fill, because Chronicle does not currently apply joins there. Models that relied on those cases now get PLAY0284 for fields that stay empty at runtime. (#262)
- **cli** ([Release v3.20.0](https://github.com/Cratis/cli/releases/tag/v3.20.0)): The CLI now bundles Screenplay 4.37.0 and Stage 4.18.1, and `cratis run` defaults to the matching Stage image.
- **Chronicle.TypeScript** ([Release v6.12.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.12.0)): Projections, reducers and `readModels.register()` build read-model definitions through one shared builder. Definitions for read models without `@index()` are unchanged.
- **Screenplay** ([Release v4.37.0](https://github.com/Cratis/Screenplay/releases/tag/v4.37.0)): Models with multiple event generations select ESM v4. A lone `generation 1` keeps its previous ESM version, and v1–v3 canonical bytes are unchanged. Consumers must explicitly admit v4 before accepting these models; generation transformations, historical replay and Chronicle deployment support remain separate work under #71.
- **Screenplay** ([Release v4.37.0](https://github.com/Cratis/Screenplay/releases/tag/v4.37.0)): ESM v4 no longer serializes projection-transition cardinality and rejects the legacy `ZeroOrOne` and `Many` values. Query cardinality is unchanged (decision 0007; part of #132).
- **Screenplay** ([Release v4.37.0](https://github.com/Cratis/Screenplay/releases/tag/v4.37.0)): References to removed current-generation properties fail binding instead of falling back to historical shapes. MCP understands generation-qualified addresses and exports canonical v4 models.
- **Arc.TypeScript** ([Arc for TypeScript 0.30.4 — tested with Chronicle SDK 6.10](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.4)): Test the Chronicle integration, Cratis package, and Library sample against `@cratis/chronicle` 6.10.0. The supported peer range remains `^6.7.0`.
- **Arc.TypeScript** ([Arc for TypeScript 0.30.4 — tested with Chronicle SDK 6.10](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.4)): Mark the live command-returning reactor `@onceOnly()` and document the replayable-by-default behavior introduced in SDK 6.9.0. Failed-partition recovery still requires repeat-safe effects.
- **Arc.TypeScript** ([Arc for TypeScript 0.30.4 — tested with Chronicle SDK 6.10](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.4)): Document subscription-marker filtering, compiled-JavaScript artifact discovery, and credential-rejection behavior. Correct the package README to describe its bounded live-kernel coverage.
- **Chronicle.TypeScript** ([Release v6.11.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.11.0)): `getInstanceById` is no longer deprecated. It is the canonical read-by-key API, as `GetInstanceById` is in .NET, and its behavior for a missing instance is documented. `findInstanceById` remains for code that wants `null` when no instance exists.
- **Chronicle.TypeScript** ([Release v6.10.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.10.0)): Artifact discovery no longer scans `.ts` sources when your program runs as compiled JavaScript. Artifacts register when their modules are imported. When the program runs from TypeScript (a `.ts`, `.tsx`, `.mts`, or `.cts` entry file, Vitest, or a `tsx`, `ts-node`, or type-stripping loader), the default still scans `**/*.ts`, and now also `**/*.tsx`. An explicit `discoveryPatterns` is always used as given.
- **Chronicle.TypeScript** ([Release v6.10.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.10.0)): `glob` is now a dependency of `@cratis/chronicle`, and `!` patterns in `discoveryPatterns` exclude files as documented. When a discovered file fails to import, the error names the file.
- **Chronicle.TypeScript** ([Release v6.10.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.10.0)): A failed token request no longer stops the call. The client logs the token endpoint and cause, then sends the call without a token, the same way the .NET client does. A kernel with authentication turned off is therefore reachable, and an unauthenticated rejection reports the token failure. When the kernel rejects a cached token, the client refreshes it and retries the call once.
- **Chronicle.TypeScript** ([Release v6.10.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.10.0)): With client credentials, tokens are requested from the server the client selected for the connection, not always from the first host in the connection string.
- **Chronicle.TypeScript** ([Release v6.10.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.10.0)): A declarative join without `.on(...)` now fails when the projection is built, with a clear message. A join inside `.children(...)` uses the children's `identifiedBy` as its default, whatever the call order.
- **Chronicle.TypeScript** ([Release v6.10.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.10.0)): The keep-alive reports the installed client version instead of `1.0.0`.
- **Chronicle.Kotlin** ([Release v6.5.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.5.0)): A read model marked `@Passive` is registered without a sink and computed from its events on read, so a read right after an append includes that event. Data a previous version stored for such a model is no longer read.
- **Chronicle.Kotlin** ([Release v6.5.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.5.0)): `registerAll()` throws `ArtifactRegistrationFailed` when a reactor or reducer cannot be started. It still starts the others, captures and seeders first. The automatic pass on connect logs each failure and retries the failed observers on the next reconnect.
- **Chronicle.Kotlin** ([Release v6.5.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.5.0)): In Spring Boot, a kernel that rejects the connection at startup now stops the application with `ChronicleConnectionFailed`. It no longer starts and leaves every appending request waiting.
- **Chronicle.Kotlin** ([Release v6.5.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.5.0)): A connection string with `apiKey` is rejected at client creation with `IllegalArgumentException`. The kernel has no API key authentication, and such a client used to connect with no credentials at all.
- **Chronicle.Kotlin** ([Release v6.5.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.5.0)): Seed entries without `forNamespace()` are sent as global seed
- **AI** ([Release v7.0.0](https://github.com/Cratis/AI/releases/tag/v7.0.0)): `DecisionResult.Provider` is replaced by `DecisionResult.Engine`, a `DecisionEngineType`, and the `decision.engine` telemetry tag replaces the provider tag
- **Stage** ([Release v4.18.0](https://github.com/Cratis/Stage/releases/tag/v4.18.0)): Stage now uses Screenplay 4.35.0 and its canonical corpus.
- **Stage** ([Release v4.18.0](https://github.com/Cratis/Stage/releases/tag/v4.18.0)): Reaction trigger `reads` (Screenplay 4.31) is accepted and adds no runtime behaviour, since Screenplay binds no runtime meaning to it yet. Stage's documentation says so, and that matching children in a child join is left to Chronicle.
- **Chronicle.TypeScript** ([Release v6.9.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.9.0)): **Reactors are now replayable by default, as in .NET.** Existing reactors accept explicit replays. They also accept kernel-initiated replays, such as rewinds after an event revision or redaction, and replays after a definition change when that option is enabled. Before upgrading, mark reactors that cause side effects with class-level `@onceOnly()`, or mark individual handlers when only those handlers must be skipped.
- **Chronicle.TypeScript** ([Release v6.9.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.9.0)): Reactor registration fails for a `@replay()` handler that matches no registered event type, and for two replay handlers for the same event type.
- **Chronicle.TypeScript** ([Release v6.9.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.9.0)): Inherited replay handlers are found, and the most derived method wins.
- **Arc** ([Release v22.23.2](https://github.com/Cratis/Arc/releases/tag/v22.23.2)): During a scenario, code that reads Arc's process-wide provider directly, such as the MongoDB and EF Core `Observe()` extensions, now sees the host's provider, or throws `ServiceProviderNotConfigured` when no host has set one, instead of using the scenario's provider. Command validation in a scenario is unaffected (#2763)
- **Chronicle** ([Release v19.7.0](https://github.com/Cratis/Chronicle/releases/tag/v19.7.0)): The job system is now `Cratis.Orleans` rather than Chronicle's own. The local engine, its storage for MongoDB and SQL, and its specs are gone; what remains here are the job scenarios that are about Chronicle
- **Chronicle** ([Release v19.7.0](https://github.com/Cratis/Chronicle/releases/tag/v19.7.0)): Job storage is resolved through `IJobsStorage`. The kernel asked for the concrete MongoDB type, which the container satisfied by building a second, unconfigured instance - grains wrote to one database and the kernel read from another, and reading an always-empty database does not throw. Six integration specs asserted job steps were empty and passed for the wrong reason
- **Chronicle** ([Release v19.7.0](https://github.com/Cratis/Chronicle/releases/tag/v19.7.0)): The kernel names its own assemblies for BSON serializer registration. Adopting the package's registration silently dropped every serializer the kernel ships, including the one that upgrades constraint definitions written before 16.12
- **Chronicle** ([Release v19.7.0](https://github.com/Cratis/Chronicle/releases/tag/v19.7.0)): A development wipe tells the job system its database was emptied, so the tables it creates on resolution are made again
- **Chronicle** ([Release v19.7.0](https://github.com/Cratis/Chronicle/releases/tag/v19.7.0)): A replay specification no longer depends on catching a transient job. A replay job is removed the moment it completes, and two events against a fast database finish before the first poll looks; the replay is verified from the rebuilt read model and the absence of a recommendation instead
- **Templates** ([Release v1.7.1](https://github.com/Cratis/Templates/releases/tag/v1.7.1)): The `README.md` generated into every project lists the prerequisites the templates really need: the .NET 10 SDK (every .NET template targets `net10.0`), JDK 17 for the Kotlin and Java templates, Docker with the Compose plugin, and Node.js `^20.19.0` or `>=22.12.0`
- **Templates** ([Release v1.7.1](https://github.com/Cratis/Templates/releases/tag/v1.7.1)): The post-creation instructions and generated READMEs use `docker compose` instead of the standalone `docker-compose` command
- **Templates** ([Release v1.7.1](https://github.com/Cratis/Templates/releases/tag/v1.7.1)): The generated READMEs now show expected output, the Chronicle health check, how to stop without losing data, and a warning that the development containers publish their ports on every network interface with well-known credentials
- **Templates** ([Release v1.7.1](https://github.com/Cratis/Templates/releases/tag/v1.7.1)): The Kotlin and Java READMEs explain that the Cratis Gradle plugin and dependency float on `latest.release`, how Gradle caches that, and how to pin versions for reproducible builds
- **Templates** ([Release v1.7.1](https://github.com/Cratis/Templates/releases/tag/v1.7.1)): The template documentation's getting-started page is now a step-by-step tutorial that ends with a registered item. Each template page lists its options, how to run it, and troubleshooting
- **Arc.TypeScript** ([Arc for TypeScript 0.30.1 — identity, tenancy and authorization paired with .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.1)): The paired conformance suite now covers:
- **Arc.TypeScript** ([Arc for TypeScript 0.30.1 — identity, tenancy and authorization paired with .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.1)): the identity endpoint and its display cookie;
- **Arc.TypeScript** ([Arc for TypeScript 0.30.1 — identity, tenancy and authorization paired with .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.1)): tenant resolution from headers, claims, fixed tenants and subdomains;
- **Arc.TypeScript** ([Arc for TypeScript 0.30.1 — identity, tenancy and authorization paired with .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.1)): class- and method-level authorization, including role replacement and anonymous overrides;
- **Arc.TypeScript** ([Arc for TypeScript 0.30.1 — identity, tenancy and authorization paired with .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.1)): malformed command inputs and query failures;
- **Arc.TypeScript** ([Arc for TypeScript 0.30.1 — identity, tenancy and authorization paired with .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.1)): correlation IDs on success, error and pending responses;
- **Arc.TypeScript** ([Arc for TypeScript 0.30.1 — identity, tenancy and authorization paired with .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.1)): observable-query waits and completion.
- **Arc.TypeScript** ([Arc for TypeScript 0.30.1 — identity, tenancy and authorization paired with .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.1)): The authorization docs now state the rules the suite checks:
- **Arc.TypeScript** ([Arc for TypeScript 0.30.1 — identity, tenancy and authorization paired with .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.1)): a query method's authorization declaration replaces the class declaration, as in Arc on .NET;
- **Arc.TypeScript** ([Arc for TypeScript 0.30.1 — identity, tenancy and authorization paired with .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.1)): authorization decorators on command methods fail the build, because command authorization is declared on the class.
- **Arc.TypeScript** ([Arc for TypeScript 0.30.1 — identity, tenancy and authorization paired with .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.1)): The capability reference records the remaining deliberate differences: identity denial bodies, display-cookie trust, 401 versus 403 for anonymous callers, and redacted message text.
- **Chronicle.TypeScript** ([Release v6.8.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.8.0)): Same-named fluent `uniqueFor` declarations across classes, together with decorated event types of the same name, are merged into one definition. Before, each registered its own definition with the same name.
- **Chronicle.TypeScript** ([Release v6.8.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.8.0)): `hasFor` looks constraints up by their registered name, as `HasFor` does in .NET.
- **Chronicle.TypeScript** ([Release v6.8.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.8.0)): A message configured with `withMessage` now replaces the kernel's message in append results.
- **AI** ([Release v6.4.0](https://github.com/Cratis/AI/releases/tag/v6.4.0)): Keeping an external link out of a LinkedIn post's body is an editorial default with a reader-need exception, not a claimed ranking penalty. The feed skill no longer says that expanding a post is a ranking signal, or that pseudo-formatting defeats search.
- **AI** ([Release v6.4.0](https://github.com/Cratis/AI/releases/tag/v6.4.0)): Hacker News: AI doesn't write or edit anything Cratis posts there.
- **Arc.TypeScript** ([Arc for TypeScript 0.30.0 — enums instead of string-literal unions](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.0)): `@cratis/arc.core`:
- **Arc.TypeScript** ([Arc for TypeScript 0.30.0 — enums instead of string-literal unions](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.0)): `ServiceLifetime` for `ServiceRegistration.lifetime` (`ArcOptions.services`, `new ServiceRegistry([...])`). `addScoped`/`@scoped()` and friends are unaffected.
- **Arc.TypeScript** ([Arc for TypeScript 0.30.0 — enums instead of string-literal unions](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.0)): `TenantResolverType` for `TenancyOptions.resolverType` and `sources` in code. `appsettings.json` and environment variables are unaffected.
- **Arc.TypeScript** ([Arc for TypeScript 0.30.0 — enums instead of string-literal unions](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.0)): `SortDirection` for `SortRequest.direction` (`QueryOptions.sorting`, `queryPage(...)`). The HTTP `sortDirection` parameter is unaffected.
- **Arc.TypeScript** ([Arc for TypeScript 0.30.0 — enums instead of string-literal unions](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.0)): `CommandCommitDisposition`, `CommandRecoveryStatus`, `CommandOperationCompensation` and `CommandOperationFailureSource` for command operation outcomes and custom execution scopes.
- **Arc.TypeScript** ([Arc for TypeScript 0.30.0 — enums instead of string-literal unions](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.0)): `ClientAuthentication` and `ClientOperationKind` for typed client-manifest entries.
- **Arc.TypeScript** ([Arc for TypeScript 0.30.0 — enums instead of string-literal unions](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.0)): `@cratis/arc.testing`: `SortDirection` for the `sorting.direction` option of `QueryScenario` and `ObservableQueryScenario`.
- **Arc.TypeScript** ([Arc for TypeScript 0.30.0 — enums instead of string-literal unions](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.0)): `@cratis/arc.mongodb`: `SortDirection` in `queryPage` sorting.
- **Arc.TypeScript** ([Arc for TypeScript 0.30.0 — enums instead of string-literal unions](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.0)): `@cratis/arc.drizzle`: `DrizzleDialect` for `DrizzleOptions.dialect` and the codec helpers, `ConceptCodecKind` for `conceptCodec`, and `SortDirection` in sorting.
- **Arc.TypeScript** ([Arc for TypeScript 0.30.0 — enums instead of string-literal unions](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.0)): `@cratis/arc.chronicle`: `ChronicleReadConsistency` for the `consistency` argument of `ChronicleReadModels` reads.
- **Arc.TypeScript** ([Arc for TypeScript 0.30.0 — enums instead of string-literal unions](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.0)): `@cratis/arc.proxygenerator`: `SourceOperation.kind` uses `ClientOperationKind`.
- **Screenplay** ([Release v4.34.0](https://github.com/Cratis/Screenplay/releases/tag/v4.34.0)): Two unmarked declarations of the same event in one slice are now a syntax error (`PLAY0447`, a duplicate generation 1); before, only binding rejected them.
- **Screenplay** ([Release v4.34.0](https://github.com/Cratis/Screenplay/releases/tag/v4.34.0)): References to an event and the checks on its shape (produced mappings, specifications, projections, reaction trigger values) use the current, highest generation.
- **Screenplay** ([Release v4.34.0](https://github.com/Cratis/Screenplay/releases/tag/v4.34.0)): Tools that read `EventSyntax` directly will now see one declaration per generation. Until the executable model carries lineage, they should reject or skip events that carry a generation marker (`HasGenerationMarker`).
- **cli** ([Release v3.19.0](https://github.com/Cratis/cli/releases/tag/v3.19.0)): Chronicle bumped from 18.1.0 to 19.6.1 to pick up `RemoveObserver` and the `RetryPartitionResponse` outcome
- **Arc.TypeScript** ([Arc for TypeScript 0.29.0 — query paging, sorting and QUERY bodies like .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.29.0)): **GET paging**
- **Arc.TypeScript** ([Arc for TypeScript 0.29.0 — query paging, sorting and QUERY bodies like .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.29.0)): `pageSize` is parsed like .NET's `int.TryParse`: leading zeros, `+` and ASCII whitespace are accepted.
- **Arc.TypeScript** ([Arc for TypeScript 0.29.0 — query paging, sorting and QUERY bodies like .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.29.0)): A nonnumeric, empty or out-of-range `pageSize` means unpaged (200) rather than 400.
- **Arc.TypeScript** ([Arc for TypeScript 0.29.0 — query paging, sorting and QUERY bodies like .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.29.0)): A nonnumeric `page` falls back to page 0.
- **Arc.TypeScript** ([Arc for TypeScript 0.29.0 — query paging, sorting and QUERY bodies like .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.29.0)): A negative `page` or a nonpositive `pageSize` gives 400 `rule` results on `Page` and `Size`, in that order.
- **Arc.TypeScript** ([Arc for TypeScript 0.29.0 — query paging, sorting and QUERY bodies like .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.29.0)): **Invalid sort direction:** a GET or QUERY request with one gives `malformedRequest` naming `sortDirection` or `sorting.direction`, with .NET's message.
- **Arc.TypeScript** ([Arc for TypeScript 0.29.0 — query paging, sorting and QUERY bodies like .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.29.0)): **QUERY bodies**
- **Arc.TypeScript** ([Arc for TypeScript 0.29.0 — query paging, sorting and QUERY bodies like .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.29.0)): A negative `pageSize` means unpaged.
- **Arc.TypeScript** ([Arc for TypeScript 0.29.0 — query paging, sorting and QUERY bodies like .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.29.0)): A negative `page` gives a `rule` result on `Page`.
- **Arc.TypeScript** ([Arc for TypeScript 0.29.0 — query paging, sorting and QUERY bodies like .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.29.0)): `null`, and `null` `arguments`, `paging` or `sorting`, are treated as absent.
- **Arc.TypeScript** ([Arc for TypeScript 0.29.0 — query paging, sorting and QUERY bodies like .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.29.0)): Unknown members, and a sort direction without a field, are ignored.
- **Arc.TypeScript** ([Arc for TypeScript 0.29.0 — query paging, sorting and QUERY bodies like .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.29.0)): Malformed JSON, a non-object member, a noninteger or out-of-range paging value, or a non-string sort value gives .NET's exception envelope. Details appear only when `exposeExceptionDetails` is on.
- **Arc.TypeScript** ([Arc for TypeScript 0.29.0 — query paging, sorting and QUERY bodies like .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.29.0)): Oversized bodies and undeclared argument names still get `malformedRequest`.
- **Arc.TypeScript** ([Arc for TypeScript 0.29.0 — query paging, sorting and QUERY bodies like .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.29.0)): **In-memory paging:** offsets are capped at the int32 maximum.
- **cli** ([Release v3.18.0](https://github.com/Cratis/cli/releases/tag/v3.18.0)): `cratis render` passes the model's implementation requirements and resolved code to Stage, so a missing or changed body stops rendering with `STAGE-ESM-020` and the loader's reason. (#184)
- **cli** ([Release v3.18.0](https://github.com/Cratis/cli/releases/tag/v3.18.0)): The CLI now bundles Screenplay 4.32.0 and Stage 4.17.0, and `cratis run` defaults to the matching `cratis/stage:4.17.0` image.
- **cli** ([Release v3.18.0](https://github.com/Cratis/cli/releases/tag/v3.18.0)): The render and run reference recommends a dedicated folder for models with file attachments: a single-file `cratis run` mounts only the `.play` file.
- **Arc.TypeScript** ([Arc for TypeScript 0.28.0 — Chronicle personal data in directly read models](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.28.0)): Read models returned through `ChronicleReadModels` (find, getAll, observe, watch) and read models injected into commands are already decrypted by Chronicle. Arc does not decrypt them a second time.
- **Arc.TypeScript** ([Arc for TypeScript 0.28.0 — Chronicle personal data in directly read models](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.28.0)): A protected read model read directly from storage needs a `@subject()` property or an `id` that matches the subject used when its events were appended. Otherwise the query fails.
- **Arc.TypeScript** ([Arc for TypeScript 0.28.0 — Chronicle personal data in directly read models](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.28.0)): Reads through `MongoReadModels`, raw driver documents, derived types and mapped objects are served as stored. Release them yourself with the tenant store's `readModels.release`.
- **Arc.TypeScript** ([Arc for TypeScript 0.28.0 — Chronicle personal data in directly read models](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.28.0)): The Chronicle live-kernel suite needs `ARC_CHRONICLE_TEST_MONGO_URL` when `ARC_CHRONICLE_TEST_URL` points at an existing kernel.
- **Screenplay** ([Release v4.33.0](https://github.com/Cratis/Screenplay/releases/tag/v4.33.0)): A join inside `children` now matches children by their identity, as Chronicle does, instead of by the join's `on` property. Specifications where they differ may produce different results.
- **Stage** ([Release v4.17.0](https://github.com/Cratis/Stage/releases/tag/v4.17.0)): Code validation, reducers with bodies and code policies are still rejected, and their diagnostics now name only what is still missing: Arc does not supply the received-at time for `RuleContext.Occurred` or `PolicyContext.Occurred`, Stage does not yet enforce the `pure` capability, and reducers wait for Screenplay's typed context descriptor.
- **Stage** ([Release v4.17.0](https://github.com/Cratis/Stage/releases/tag/v4.17.0)): The renderer guide describes the attachment envelope, what planning verifies, and that a single-file model's root is its folder.
- **Orleans** ([Release v1.10.0](https://github.com/Cratis/Orleans/releases/tag/v1.10.0)): A job completes `CompletedWithFailures` when any step is unreachable, not only when a step failed. `JobProgress.IsCompleted` and `IsStopped` count unreachable steps. (#27)
- **Orleans** ([Release v1.10.0](https://github.com/Cratis/Orleans/releases/tag/v1.10.0)): `Start` returns once the first stage is running for a job with stages. Its start errors describe that stage, and later stages report their start failures through the job. (#27)
- **Chronicle.TypeScript** ([Release v6.7.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.7.1)): The README, documentation, JSDoc and console samples now use inferred read models instead of the deprecated `@readModel` decorator. Existing applications need no changes, and `@readModel` is still supported.
- **Arc.TypeScript** ([Arc for TypeScript 0.27.0 — Drizzle read models in commands](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.27.0)): Only read models whose table declares exactly one column with `.primaryKey()` and a model `@field` on it can be injected into commands. Other read models still serve queries. A command that injects one of them fails when the application is built.
- **Arc.TypeScript** ([Arc for TypeScript 0.27.0 — Drizzle read models in commands](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.27.0)): A read model registered with both Chronicle and Drizzle, and injected into a command, fails when the application is built.
- **AI** ([Release v6.3.0](https://github.com/Cratis/AI/releases/tag/v6.3.0)): The Screenplay skills now describe Screenplay 4.31.0. Every example in them compiles with that version with zero diagnostics, and both complete examples pass the reference runner.
- **AI** ([Release v6.3.0](https://github.com/Cratis/AI/releases/tag/v6.3.0)): Reaction triggers can declare the views an automation decides from: `reads <View> [as <alias>] [by <trigger value>]`. The skills cover:
- **AI** ([Release v6.3.0](https://github.com/Cratis/AI/releases/tag/v6.3.0)): the alias rules, which are the same as for commands (`PLAY0410`–`PLAY0412`);
- **AI** ([Release v6.3.0](https://github.com/Cratis/AI/releases/tag/v6.3.0)): `by` naming a trigger value (`PLAY0442`);
- **AI** ([Release v6.3.0](https://github.com/Cratis/AI/releases/tag/v6.3.0)): clock triggers reading whole views only (`PLAY0443`);
- **AI** ([Release v6.3.0](https://github.com/Cratis/AI/releases/tag/v6.3.0)): the `@reads` escape (`PLAY0175`, `PLAY0444`);
- **AI** ([Release v6.3.0](https://github.com/Cratis/AI/releases/tag/v6.3.0)): `for each <View>` being reserved;
- **AI** ([Release v6.3.0](https://github.com/Cratis/AI/releases/tag/v6.3.0)): trigger reads, like command reads, giving no runtime protection yet.
- **AI** ([Release v6.3.0](https://github.com/Cratis/AI/releases/tag/v6.3.0)): Model authoring explains how the ESM version (v1, v2 or v3) follows from what a model uses. It separates four states: parsed, bound, reference-executed and target-executed. A table checked against the binder lists what binds, what binds only as opaque code, what binds but the reference execution plan refuses, and what blocks binding.
- **AI** ([Release v6.3.0](https://github.com/Cratis/AI/releases/tag/v6.3.0)): Model authoring covers code attachments (loading, content hashes, source maps) and describes how comments are kept and reviewed.
- **AI** ([Release v6.3.0](https://github.com/Cratis/AI/releases/tag/v6.3.0)): Command guidance covers read aliases, validation severity, the `matches email` pattern, authorization order, one `require` per policy, what `produces` can bind, and `unique` constraints with their lifecycle forms.
- **AI** ([Release v6.3.0](https://github.com/Cratis/AI/releases/tag/v6.3.0)): Projection guidance follows how Chronicle interprets projections: an unkeyed `from` routes by event source, `every` runs for a level's `from` and `join` events, and `join`, `all` and auto-map behave as Chronicle lowers them. It also covers bodied reducers as opaque code and projection variants.
- **AI** ([Release v6.3.0](https://github.com/Cratis/AI/releases/tag/v6.3.0)): Specification guidance is rewritten for `given caller`, `then denied`, `when append`, scenarios without a `when`, subset versus `exactly` comparisons, events in any order, and typed values. It includes one complete example whose six specifications pass the reference runner.
- **AI** ([Release v6.3.0](https://github.com/Cratis/AI/releases/tag/v6.3.0)): Query and screen guidance states what `from` parameters and `observable` guarantee, which query shapes bind, how to specify query authorization, and how UI interactions (`behavior`, `on`, `uses`) differ from application triggers.
- **AI** ([Release v6.3.0](https://github.com/Cratis/AI/releases/tag/v6.3.0)): Captures and reactions guidance scopes the unknown-trigger warning and describes reaction code as an attachment.
- **AI** ([Release v6.3.0](https://github.com/Cratis/AI/releases/tag/v6.3.0)): Decision 0006 is shown as shipped in 4.31.0. Decisions 0007–0014 are marked as not yet available.
- **Screenplay** ([Release v4.31.0](https://github.com/Cratis/Screenplay/releases/tag/v4.31.0)): A trigger value named `reads` must now be written `@reads`. A bare `reads` line or `reads <PrimitiveType>` under a trigger reports a diagnostic that names the escape instead of being misread.
- **Screenplay** ([Release v4.31.0](https://github.com/Cratis/Screenplay/releases/tag/v4.31.0)): Clock triggers (`every`, `at`) can read whole views but cannot use `by`, since they take no values.
- **Screenplay** ([Release v4.31.0](https://github.com/Cratis/Screenplay/releases/tag/v4.31.0)): Neither command nor reaction reads bind at runtime yet; editor guidance says so. `for each <View>` stays reserved.
- **Stage** ([Release v4.16.2](https://github.com/Cratis/Stage/releases/tag/v4.16.2)): A model whose authorization references an opaque (code) policy still fails with `STAGE-ESM-015`, and the diagnostic now names what is missing: the policy's implementation attachment is not part of the render request, and Arc has no exact received-at time for `PolicyContext.Occurred`. Stage never emits a policy with a substituted time or a predicate that silently denies.
- **Stage** ([Release v4.16.2](https://github.com/Cratis/Stage/releases/tag/v4.16.2)): The renderer guide documents that a keyed query's policy subject is the query key, matching Screenplay's reference evaluator.
- **Arc.TypeScript** ([Arc for TypeScript 0.24.0 — Core namespaces and clean builds](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.24.0)): Builder methods added by integration packages (`withChronicle`, `withMongoDB`, `withDrizzle`, `addCratis`) are typed through a builder extension interface, so they type-check wherever the builder is used, including in `@cratis/arc.testing` and in installed packages.
- **Arc.TypeScript** ([Arc for TypeScript 0.24.0 — Core namespaces and clean builds](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.24.0)): Core modules live in the namespaces that own them, as in Arc.Core.
- **Arc.TypeScript** ([Arc for TypeScript 0.23.0 — Chronicle read model queries](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.23.0)): The Library sample reads and observes its read models through `ChronicleReadModels`.
- **Stage** ([Release v4.16.1](https://github.com/Cratis/Stage/releases/tag/v4.16.1)): A model with reducer implementation bodies still fails with `STAGE-ESM-019`. The diagnostic now names what is missing: Screenplay's per-transition typed context descriptor for `State` and `Event` (ContextVersion 1, ResultVersion 1), tracked in Cratis/Screenplay#139. (part of #119)
- **Arc.TypeScript** ([Arc for TypeScript 0.22.0 — grouped options](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.22.0)): `ArcServerOptions` is now `ArcOptions`, grouped like .NET: `correlationId.httpHeader`, `tenancy.httpHeader` and `tenancy.resolve`, `generatedApis` (including `enableQueryMethod` and `openApiVersion`), `hosting` (`maxBodyBytes`, `applicationUrl`) and `query` (observable limits, allowed origins, emission guards, health and keep-alive). Configuration files and `Cratis__Arc__...` environment variables use the same .NET paths, and `Query:KeepAliveInterval` accepts `hh:mm:ss`.
- **Arc.TypeScript** ([Arc for TypeScript 0.22.0 — grouped options](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.22.0)): `exposeExceptionDetails` controls whether HTTP results include exception details and defaults to on only in the Development environment; `development` now only enables development discovery of users and tenants.
- **Arc.TypeScript** ([Arc for TypeScript 0.22.0 — grouped options](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.22.0)): `builder.withChronicle()`, `withMongoDB()`, `withDrizzle()` and `addCratis()` are declared by their own packages, so `@cratis/arc.core` no longer depends on knowing them.
- **Arc.TypeScript** ([Arc for TypeScript 0.22.0 — grouped options](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.22.0)): Tenant resolution is shared by HTTP requests and observable query connections.
- **Stage** ([Release v4.16.0](https://github.com/Cratis/Stage/releases/tag/v4.16.0)): The semantic engine reports `loading` while it rebuilds, and refuses requests until it is ready. After any append by another client it stops serving requests rather than drift from the log. (part of #23)
- **Stage** ([Release v4.16.0](https://github.com/Cratis/Stage/releases/tag/v4.16.0)): A rebuild is refused for event contracts with date-time or decimal properties, because Chronicle's storage changes those values (offsets, precision). It is also refused for null optional values, non-text destinations, a `causedBy` name that changed over time, and duplicate tags. The bundled sandbox container resets its kernel on restart, so rebuilding applies when the host runs against an external or persistent Chronicle. (part of #23)
- **Stage** ([Release v4.15.0](https://github.com/Cratis/Stage/releases/tag/v4.15.0)): Update to Screenplay 4.30.0 and Chronicle 19.4.8, including the Host's bundled kernel image and the Chronicle client and image pinned for generated applications.
- **Stage** ([Release v4.15.0](https://github.com/Cratis/Stage/releases/tag/v4.15.0)): Screenplay ESM v3 models are admitted. Their new constructs fail closed:
- **Stage** ([Release v4.15.0](https://github.com/Cratis/Stage/releases/tag/v4.15.0)): reducers with implementation bodies are rejected with `STAGE-ESM-019`;
- **Stage** ([Release v4.15.0](https://github.com/Cratis/Stage/releases/tag/v4.15.0)): code validations and rule predicates are rejected with `STAGE-ESM-005`;
- **Stage** ([Release v4.15.0](https://github.com/Cratis/Stage/releases/tag/v4.15.0)): opaque policies are rejected with `STAGE-ESM-015`.
- **Arc.TypeScript** ([Arc for TypeScript 0.21.0 — vertical slices and the Library sample](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.21.0)): `@cratis/arc.chronicle` requires `@cratis/chronicle` 6.7.0. Read models are recognized from the projections, reducers and projection decorators that build them, so an Arc `@readModel()` class with Chronicle projection decorators needs no second read-model decorator.
- **Arc.TypeScript** ([Arc for TypeScript 0.21.0 — vertical slices and the Library sample](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.21.0)): Documentation, shared examples and the Tasks sample use vertical slice files and create events with their constructors, for example `return new AuthorRegistered(this.name)`.
- **Arc.TypeScript** ([Arc for TypeScript 0.20.0 — Fetch runtimes](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.20.0)): `@cratis/arc.core` remains the Node.js entry with discovery, configuration files, the standalone host, static files and WebSockets.
- **Arc.TypeScript** ([Arc for TypeScript 0.19.0 — setup, configuration and host integrations](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.19.0)): Shutting down Express, Fastify and Hono hosts no longer waits forever for connected SSE and WebSocket clients.
- **Arc.TypeScript** ([Arc for TypeScript 0.18.0 — RxJS observable queries](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.18.0)): MongoDB `observe()` and `observeById()` and Chronicle read model `watch()` return RxJS observables. Code that iterated their previous async iterables should switch to the `*Iterable()` methods.
- **Arc.TypeScript** ([Arc for TypeScript 0.18.0 — RxJS observable queries](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.18.0)): RxJS 7 is an optional peer dependency of `@cratis/arc.core`.
- **Arc.TypeScript** ([Arc for TypeScript 0.17.0 — OpenAPI results and proxy improvements](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.17.0)): With `--root-namespace`, generated model files are written under the root namespace folder, like other generated files. Update imports that referenced the previous model paths.
- **Arc.TypeScript** ([Arc for TypeScript 0.17.0 — OpenAPI results and proxy improvements](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.17.0)): Decorator options the generator cannot read statically fail generation with a diagnostic instead of being ignored.
- **Stage** ([Release v4.14.0](https://github.com/Cratis/Stage/releases/tag/v4.14.0)): The structural specification engine is deprecated. `ISpecificationRunner`, `SpecificationRunner` and the structural run strategies are marked `[Obsolete]`, and SpecRunner prints a one-line notice on stderr when it runs the structural engine. The default engine and exit codes are unchanged; use `--engine semantic` or `ISemanticSpecificationExecutor`. The structural engine is removed in the next major version. (part of #15)
- **Stage** ([Release v4.14.0](https://github.com/Cratis/Stage/releases/tag/v4.14.0)): The scoped projection shapes that still fail with `STAGE-ESM-017` now state the verified cause. Clearing and then re-creating a nested object fails the projection on MongoDB (Cratis/Chronicle#4166). Removing a joined child across several parents diverges only in Chronicle's testing engine (Cratis/Chronicle#4167). (part of #117)
- **Chronicle.TypeScript** ([Release v6.7.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.7.0)): `@readModel()` is deprecated. Existing identifiers set through it keep working; new code can drop the decorator.
- **Chronicle.TypeScript** ([Release v6.7.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.7.0)): Registering two read models with the same identifier fails with an error instead of letting one silently replace the other.
- **Arc.TypeScript** ([Arc for TypeScript 0.16.0 — Chronicle aggregates and reactor commands](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.16.0)): `@cratis/arc.chronicle` requires `@cratis/chronicle` 6.6.0 or later.
- **AI** ([Release v6.2.0](https://github.com/Cratis/AI/releases/tag/v6.2.0)): `Providers/Configuring` is documented as deliberately excluded from the flat barrel: it declares commands with the same names as those in `Adding`, `Reconfiguring`, `Removing` and `Renaming`, so exporting both is ambiguous. Import it by path.
- **Stage** ([Release v4.13.0](https://github.com/Cratis/Stage/releases/tag/v4.13.0)): In the semantic engine, keyed queries are served with their modeled authorization. The compatibility `Get…ById`/`All…` queries are served only for read models whose keyed queries are unprotected. (part of #23)
- **Stage** ([Release v4.13.0](https://github.com/Cratis/Stage/releases/tag/v4.13.0)): The semantic engine refuses a model it cannot compile, or a Chronicle log that is not empty, with a typed status instead of starting partially. If an append's outcome is unknown, it stops serving requests rather than drift from the event log. (part of #23)
- **AI** ([Release v6.0.0](https://github.com/Cratis/AI/releases/tag/v6.0.0)): `ConfiguredAIProvider` carries the provider's endpoint, tier mapping, usage credential, usage ceiling, rate-limit cooldown and discovered catalog. Its properties are non-nullable with sentinel defaults: a nullable property on a `[Passive]` read model reads back null from a running kernel however the events were recorded, while in-process scenarios populate it happily - so a value could be configured, recorded, and invisible to the code that resolves a provider, with nothing failing.
- **AI** ([Release v6.0.0](https://github.com/Cratis/AI/releases/tag/v6.0.0)): `AnthropicProviderClient` takes the Claude Code transport alongside its quota tracker.
- **AI** ([Release v6.0.0](https://github.com/Cratis/AI/releases/tag/v6.0.0)): `ReconfigureOpenAIProvider` and `AddOpenAIProvider` record which kind of credential arrived, and refuse a subscription record that is too incomplete to be spent.
- **AI** ([Release v6.0.0](https://github.com/Cratis/AI/releases/tag/v6.0.0)): `ProviderConcurrencyGate` is a singleton. It holds per-provider semaphores in instance state and was registered nowhere, so every resolution got a fresh set and the gate limited nothing.
- **AI** ([Release v6.0.0](https://github.com/Cratis/AI/releases/tag/v6.0.0)): Claude Code usage reports cached tokens separately instead of folding them into the input count - a cache read is billed differently from a fresh input token.
- **AI** ([Release v6.0.0](https://github.com/Cratis/AI/releases/tag/v6.0.0)): The three event types that carried an explicit GUID identifier now key on their type name like every other event type. No stored event anywhere used those GUIDs.
- **Arc.TypeScript** ([Arc for TypeScript 0.13.0 — observability, interceptors and derived types](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.13.0)): Properties of `@field`-declared models are written in camelCase on the wire, including PascalCase and acronym-leading names, the same way Arc on .NET names them. Plain objects, dictionaries and low-level Zod results are sent as they are, and generated proxies use the same names.
- **Arc.TypeScript** ([Arc for TypeScript 0.13.0 — observability, interceptors and derived types](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.13.0)): In-memory query results are paged before read-model interceptors run, as in .NET.
- **Arc.TypeScript** ([Arc for TypeScript 0.13.0 — observability, interceptors and derived types](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.13.0)): `@opentelemetry/api` is a peer dependency of `@cratis/arc.core`.
- **Arc.TypeScript** ([Arc for TypeScript 0.13.0 — observability, interceptors and derived types](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.13.0)): The `correlationHeader` option rejects invalid header names.
- **AI** ([Release v5.0.0](https://github.com/Cratis/AI/releases/tag/v5.0.0)): A model tier that no operator mapped is now resolved from the models the provider actually published, rather than from a built-in per-vendor table of model names. A tier can no longer resolve to a model a provider does not serve.
- **AI** ([Release v5.0.0](https://github.com/Cratis/AI/releases/tag/v5.0.0)): `TierModelResolution.Resolve` takes the provider's available models in place of its `AIProviderType`. An explicit mapping still wins, tier by tier.
- **Arc.TypeScript** ([Arc for TypeScript 0.12.0 — Chronicle event sourcing](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.12.0)): Command execution runners in `@cratis/arc.core` are composable, so several integrations can wrap command execution.
- **Arc.TypeScript** ([Arc for TypeScript 0.12.0 — Chronicle event sourcing](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.12.0)): Commands that return both Chronicle events and command operations are rejected before either runs, because the event batch does not yet take part in operation compensation.
- **Arc.TypeScript** ([Arc for TypeScript 0.12.0 — Chronicle event sourcing](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.12.0)): `@cratis/arc.chronicle` requires `@cratis/chronicle` 6.5.1 or later.
- **Screenplay** ([Release v4.30.0](https://github.com/Cratis/Screenplay/releases/tag/v4.30.0)): `CodeBlockSyntax` and `SemanticImplementationRequirement` compare body line maps by value, so two parses of the same text are equal. Positions do not take part in syntax structural equality, so moving a body inside a document never produces a workspace change on its own.
- **Screenplay** ([Release v4.29.0](https://github.com/Cratis/Screenplay/releases/tag/v4.29.0)): The reference evaluator does not run policy code. Authorization is evaluated left to right in authored order, as Stage renders it (`&&`/`||`) and Arc evaluates it (in declaration order, stopping at the first false): a portable operand that decides first still decides (`Portable and Custom` denies when `Portable` denies), but once policy code would run, the outcome is unsupported, never allowed or denied. The same order applies across module, feature and construct gates. A specification whose outcome depends on policy code never passes.
- **Screenplay** ([Release v4.29.0](https://github.com/Cratis/Screenplay/releases/tag/v4.29.0)): The documented `IsAdultCustomer` example no longer reads the clock or throws on a malformed claim: it uses `context.Occurred` and `DateTime.TryParse`.
- **Arc.TypeScript** ([Arc for TypeScript 0.8.0 — MongoDB integration](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.8.0)): `@key()` also marks a read model's identity for storage integrations.
- **Stage** ([Release v4.11.0](https://github.com/Cratis/Stage/releases/tag/v4.11.0)): Scoped projection constructs that remain rejected now name their exact blocker in the diagnostic. They are composite keys, `all` subscriptions, root join removals, nested clear followed by re-creation, child removal across several parents, literal mappings (Cratis/Chronicle#4124), and joins or children inside nested blocks (Cratis/Chronicle#4125). (part of #117)
- **Arc.TypeScript** ([Arc for TypeScript 0.7.0 — command context, response handlers and operations](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.7.0)): `tuple(...)` groups values for response value handlers with at most one client response; two unhandled values fail the command.
- **Arc.TypeScript** ([Arc for TypeScript 0.6.0 — proxies from TypeScript source](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.6.0)): `@cratis/arc.core` exports `routeFor`, `includeRouteName` and the artifact discovery walk so tools can compute the same routes as the server.
- **Chronicle.TypeScript** ([Release v6.5.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.5.0)): `readModels.getInstanceById` is deprecated in favor of `findInstanceById`; its behavior is unchanged.
- **Stage** ([Release v4.10.0](https://github.com/Cratis/Stage/releases/tag/v4.10.0)): An accepted command with no destination and no stated event source is reported `Unsupported(IdentityAllocation)` after validation, as in the reference, instead of failing. Projections, queries, given read models and implicit identity allocation remain `Unsupported`. (part of #15)
- **Stage** ([Release v4.9.0](https://github.com/Cratis/Stage/releases/tag/v4.9.0)): Command properties that feed a constrained event property get a not-null validation rule, so a null value never reaches the unique index (Cratis/Chronicle#4122).
- **Stage** ([Release v4.9.0](https://github.com/Cratis/Stage/releases/tag/v4.9.0)): Projection shapes where Chronicle keys, clears or removes differently from the reference now fail with `STAGE-ESM-017`. This covers one event contract in several roles at the root, and nested `from`/`clear` blocks without a matching root `from`. It also covers clearing a nested block and then re-creating it, and removing a child joined to several parents.
- **Stage** ([Release v4.8.0](https://github.com/Cratis/Stage/releases/tag/v4.8.0)): The first increment executes commands with explicit-message `not empty`, `minimum` and `maximum` validation, unconditional event mappings, given events with a stated event source, event and rejection assertions, and cancellation. Projections, queries, given read models, authorization, requirements, constraints and identity allocation are reported `Unsupported`, because Chronicle 19.4.7 cannot run a projection per specification through public APIs. The executor replaces Arc's process-wide service provider, so run it in its own process, as SpecRunner does. (part of #15)
- **Screenplay** ([Release v4.28.0](https://github.com/Cratis/Screenplay/releases/tag/v4.28.0)): The MCP server loads attachment contents from its trusted root, so `implementation-requirements` shows a content hash for each file attachment, and a changed attachment changes its hash. Unchanged attachments reuse the analyzed workspace, and proposals survive an attachment edit.
- **Screenplay** ([Release v4.28.0](https://github.com/Cratis/Screenplay/releases/tag/v4.28.0)): `SemanticDocumentSet.Create` normalizes attachment keys, so `./X.cs`, `.\X.cs` and `X.cs` name the same attachment and hash. Two supplied keys that normalize to the same path with different contents are treated as a conflict, not resolved by picking one.
- **Screenplay** ([Release v4.28.0](https://github.com/Cratis/Screenplay/releases/tag/v4.28.0)): `PlayFileCompiler` and the standalone Tool compile syntax only and do not read attachments; the documentation now says so (#244).
- **Stage** ([Release v4.7.0](https://github.com/Cratis/Stage/releases/tag/v4.7.0)): Query arguments typed as a validated concept are rejected with `STAGE-ESM-010`, because Arc validates them and the reference does not.
- **Screenplay** ([Release v4.27.0](https://github.com/Cratis/Screenplay/releases/tag/v4.27.0)): ESM v3 now means "ESM with implementation attachments": a model is v3 when it has a reducer with a body or code validation. Models with neither keep their v1 or v2 bytes exactly.
- **Screenplay** ([Release v4.27.0](https://github.com/Cratis/Screenplay/releases/tag/v4.27.0)): The reference evaluator cannot run code validation. Executing a command guarded by it, directly or through a concept on one of its properties (including inside composite types and collections), reports an unsupported outcome naming the command or concept and the rule, and a specification that runs it never passes. Authorization is still evaluated first, so a `then denied` specification on such a command keeps working. Specifications that do not run the command are unaffected.
- **Screenplay** ([Release v4.27.0](https://github.com/Cratis/Screenplay/releases/tag/v4.27.0)): A model with two validation attachments sharing a requirement id is rejected, as duplicate reducer transitions already were.
- **Arc.TypeScript** ([Arc for TypeScript 0.4.1 — observable hosting fixes](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.4.1)): `runArc` owns WebSocket upgrades for Arc paths on `host.server`; attach your own upgrade handlers only for other paths.
- **Arc.TypeScript** ([Arc for TypeScript 0.4.1 — observable hosting fixes](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.4.1)): Internal `ArcServer` hosting members are no longer part of the published type declarations; host integrations use `@cratis/arc.core/hosting`.
- **Screenplay** ([Release v4.26.0](https://github.com/Cratis/Screenplay/releases/tag/v4.26.0)): The reference runner does not compute reducer state. A specification that reads a reducer-built read model, through `given readmodel`, `then readmodel` or `then query`, reports an unsupported outcome naming the reducer and never passes; other specifications in the model run as before. Calling the evaluator directly reports the same for a query over, or returned state of, a reducer-built read model.
- **Screenplay** ([Release v4.26.0](https://github.com/Cratis/Screenplay/releases/tag/v4.26.0)): A file-backed implementation attachment is no longer hashed from its path, so moving a file no longer changes its hash and editing it is no longer invisible.
- **Screenplay** ([Release v4.26.0](https://github.com/Cratis/Screenplay/releases/tag/v4.26.0)): A consumer that accepts only ESM v1 or v2 now receives a v3 model for documents with bodied reducers, where binding used to fail with "requires a portable reducer contract". Reducers without bodies are still rejected with the same message.
- **Orleans** ([Release v1.5.0](https://github.com/Cratis/Orleans/releases/tag/v1.5.0)): `Task Resume(JobId)` becomes `Task<bool> Resume(JobId)`. A call that ignores the result is unaffected at source level; an implementer of the interface is not. A job that fails to *start* is a different situation and keeps its existing handling.
- **Screenplay** ([Release v4.25.0](https://github.com/Cratis/Screenplay/releases/tag/v4.25.0)): A `require` path qualified with a view the command reads more than once now says to use one of that view's aliases and lists them, instead of claiming the command does not read the view.
- **Screenplay** ([Release v4.25.0](https://github.com/Cratis/Screenplay/releases/tag/v4.25.0)): PLAY0175 also reports `as`, `by` or `reads` used as an alias. Aliases, like `by` properties, are lower-case identifiers.
- **Screenplay** ([Release v4.25.0](https://github.com/Cratis/Screenplay/releases/tag/v4.25.0)): Decision 0003 notes that its runtime precondition is only partly met (tracked in Cratis/Chronicle#4138).
- **Arc.TypeScript** ([Arc for TypeScript 0.4.0 — observable queries and the Arc package layout](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.4.0)): Packages are renamed and laid out like Arc on .NET: `@cratis/arc.core` (was `@cratis/arc.server`), `@cratis/arc.express`, `@cratis/arc.fastify`, `@cratis/arc.hono`, `@cratis/arc.mongodb`, `@cratis/arc.chronicle` (still private and experimental), `@cratis/arc.testing` (was the `@cratis/arc.server/testing` export) and `@cratis/arc.proxygenerator` with the `arc-proxygenerator` CLI (was `@cratis/arc.server.codegen`). All source lives under `Source/<Package>`.
- **Arc.TypeScript** ([Arc for TypeScript 0.4.0 — observable queries and the Arc package layout](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.4.0)): The standalone host that was prototyped as `@cratis/arc.server.node` ships inside `@cratis/arc.core`, the way Arc on .NET hosts itself from `Arc.Core`.
- **Arc.TypeScript** ([Arc for TypeScript 0.4.0 — observable queries and the Arc package layout](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.4.0)): The build uses TypeScript 7.
- **Screenplay** ([Release v4.24.2](https://github.com/Cratis/Screenplay/releases/tag/v4.24.2)): The invoicing sample, the language's largest example, now declares every read model, type and event it uses and gives its authorized specifications an explicit caller. It binds to the executable semantic model with only the unsupported constructs it shows on purpose left, and a specification pins that list so the sample cannot drift from the language again (#240)
- **Stage** ([Release v4.6.1](https://github.com/Cratis/Stage/releases/tag/v4.6.1)): Update dependency versions and required runtime compatibility settings.
- **AI** ([Release v4.0.0](https://github.com/Cratis/AI/releases/tag/v4.0.0)): `AIProviderApiKey` is `[Encrypted(EncryptionScope.Namespace)]`. Chronicle encrypts it on append and decrypts it on read, keyed per event store namespace — the same boundary the per-tenant protectors it replaces already used.
- **AI** ([Release v4.0.0](https://github.com/Cratis/AI/releases/tag/v4.0.0)): Command handlers that only awaited the protector are now synchronous.
- **AI** ([Release v4.0.0](https://github.com/Cratis/AI/releases/tag/v4.0.0)): `Cratis.Arc.Chronicle` is a direct dependency, which also enables the `ARCCHR` analyzers. `ARCCHR0009` fails the build when a command carries a credential-shaped property that is not excluded from the causation chain.
- **AI** ([Release v4.0.0](https://github.com/Cratis/AI/releases/tag/v4.0.0)): Chronicle 18.1.6 → 19.4.7, Arc 22.14.0 → 22.23.0.
- **AI** ([Release v4.0.0](https://github.com/Cratis/AI/releases/tag/v4.0.0)): Twenty event types no longer pass their own name as an explicit `[EventType]` id. The identifier each one resolves to is unchanged — the type name is the default.
- **Stage** ([Release v4.6.0](https://github.com/Cratis/Stage/releases/tag/v4.6.0)): Update Stage to Cratis/Arc 22.23.0, Chronicle 19.4.7 and Scene 4.2.0. The Host image now bundles the `cratis/chronicle:19.4.7-development` kernel.
- **Stage** ([Release v4.6.0](https://github.com/Cratis/Stage/releases/tag/v4.6.0)): Generated applications now pin Arc 22.23.0, an explicit Cratis.Chronicle 19.4.7 client with the matching `cratis/chronicle:19.4.7-development` image, and the Scene 4.2.0 frontend packages.
- **Stage** ([Release v4.6.0](https://github.com/Cratis/Stage/releases/tag/v4.6.0)): Update `Cratis.Screenplay` and `Cratis.Screenplay.CanonicalCorpus` to 4.24.0. Specifications may now use `then events in any order` and `exactly`, and they render as before. (#128)
- **Stage** ([Release v4.6.0](https://github.com/Cratis/Stage/releases/tag/v4.6.0)): Reject commands and queries that are authorized by a Screenplay policy (`STAGE-ESM-015`), and specifications that use `given caller` or `then denied` (`STAGE-ESM-011`). The Cratis planner does not render authorization yet, so a rendered application would let any caller through. (#57, #13)
- **Stage** ([Release v4.6.0](https://github.com/Cratis/Stage/releases/tag/v4.6.0)): Update the Billing sample to the fenced inline-code form, because Screenplay 4.24 deprecates the old form (`PLAY0397`).
- **Chronicle.TypeScript** ([Release v6.4.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.4.0)): Standard-mode schema errors are collected and reported together before the client registers any artifact with the Kernel.
- **Chronicle.TypeScript** ([Release v6.4.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.4.0)): Documentation shows standard-mode `@field` declarations and labels constructor-property examples as legacy-mode.
- **Stage** ([Release v4.5.0](https://github.com/Cratis/Stage/releases/tag/v4.5.0)): Update `Cratis.Screenplay` and `Cratis.Screenplay.CanonicalCorpus` to 4.20.0. (#128)
- **Stage** ([Release v4.5.0](https://github.com/Cratis/Stage/releases/tag/v4.5.0)): Reject ESM v2 constructs the Cratis planner cannot yet render exactly, instead of treating them as v1. Rendering fails with a typed diagnostic in these cases (#128, #13):
- **Stage** ([Release v4.5.0](https://github.com/Cratis/Stage/releases/tag/v4.5.0)): `$context` occurrence mappings: `STAGE-ESM-013`.
- **Stage** ([Release v4.5.0](https://github.com/Cratis/Stage/releases/tag/v4.5.0)): Stated specification sources that disagree, have the wrong type, or are not text or UUID: `STAGE-ESM-011`.
- **Stage** ([Release v4.5.0](https://github.com/Cratis/Stage/releases/tag/v4.5.0)): Whenless specifications: `STAGE-ESM-011`.
- **Stage** ([Release v4.5.0](https://github.com/Cratis/Stage/releases/tag/v4.5.0)): Projections keyed on the event source: `STAGE-ESM-008`.
- **Stage** ([Release v4.5.0](https://github.com/Cratis/Stage/releases/tag/v4.5.0)): Reject command requirements (`STAGE-ESM-005`), guarded productions and event tags (`STAGE-ESM-006`), and append-time constraints (`STAGE-ESM-014`). The planner does not render these yet, so the generated application would append events the reference evaluator rejects, or tag them differently. (#118, #116)
- **Stage** ([Release v4.5.0](https://github.com/Cratis/Stage/releases/tag/v4.5.0)): Reject validation rules at warning or information severity (`STAGE-ESM-005`) until the generated validator can report that severity. (#116)
- **Screenplay** ([Release v4.24.0](https://github.com/Cratis/Screenplay/releases/tag/v4.24.0)): `PlayFileWriter.Expand` uses the same folder-layout projection as workspace layout changes. `folders.md` explains which parts of `PlayFileCompiler.CompileFolder` and `WriteTo` stay independent of the workspace and why (#137)
- **Screenplay** ([Release v4.22.0](https://github.com/Cratis/Screenplay/releases/tag/v4.22.0)): Claim types compare case-insensitively; role names and claim values compare exactly; a claim carried more than once matches when any of its values matches. A missing claim, a null target or an unresolvable subject denies. This matches how Arc evaluates authorization through .NET's `ClaimsPrincipal`, and `Identity.ClaimValue`/`ClaimValues` now look claim types up case-insensitively too (#142)
- **Screenplay** ([Release v4.22.0](https://github.com/Cratis/Screenplay/releases/tag/v4.22.0)): A specification that exercises an authorized command without a `given caller` is reported when binding. Caller identity is never inferred (#142)
- **Screenplay** ([Release v4.21.0](https://github.com/Cratis/Screenplay/releases/tag/v4.21.0)): A `file` constraint warns (`PLAY0396`): Chronicle only supports unique constraints, so declare them with `unique …`, and put other rules in validation or `require`. The constraints page now states Chronicle's actual guarantee (#223)
- **Arc.Kotlin** ([Release v7.6.0](https://github.com/Cratis/Arc.Kotlin/releases/tag/v7.6.0)): The JVM parity reference links to the shared C#/Kotlin/Java capability matrix while retaining its implementation evidence (#217).
- **Screenplay** ([Release v4.19.0](https://github.com/Cratis/Screenplay/releases/tag/v4.19.0)): Canonical printing, folder expansion, MCP `expand-layout` and `propose-ast` edits keep comments with the declarations they annotate (#220)
- **Screenplay** ([Release v4.19.0](https://github.com/Cratis/Screenplay/releases/tag/v4.19.0)): `$strings.` messages are symbolic string keys in the executable model. A malformed key is reported (`PLAY0357`), and a reference rejection marks its message as a key (#224)
- **Screenplay** ([Release v4.19.0](https://github.com/Cratis/Screenplay/releases/tag/v4.19.0)): `null` in a command or event value is rejected with the reason (`PLAY0350`): an optional fact is a separate event (#207)
- **Stage** ([Release v4.2.0](https://github.com/Cratis/Stage/releases/tag/v4.2.0)): Reserve the top-level `Customizations/` directory for product-owned files. Models that would generate files there, including case variants, now fail with `STAGE-CRATIS-005` and no candidate artifacts. (#121)
- **Stage** ([Release v4.2.0](https://github.com/Cratis/Stage/releases/tag/v4.2.0)): Reject malformed or version-mismatched authored Scene payloads with `STAGE-CRATIS-001` before producing artifacts. This validates the JSON wire shape, not component bindings or semantic revision provenance. (#100, #13)
- **Stage** ([Release v4.2.0](https://github.com/Cratis/Stage/releases/tag/v4.2.0)): Fail runtime queries when Chronicle returns an unreadable document, rather than silently omitting it and returning partial data. (#10)
- **AI** ([Release v3.4.0](https://github.com/Cratis/AI/releases/tag/v3.4.0)): A feed post announcing what shipped may carry one plain list of real capabilities inside its argument, with no bolded labels and no slogan per item.
- **AI** ([Release v3.4.0](https://github.com/Cratis/AI/releases/tag/v3.4.0)): A company account's copy says "we", the way the team would say it, instead of the company name in the third person.
- **Stage** ([Release v4.1.0](https://github.com/Cratis/Stage/releases/tag/v4.1.0)): Update Stage and generated applications to Cratis Arc 22.22.0, Chronicle 19.4.4, and Scene 4.1.0. Generated applications explicitly pin their Chronicle client, ASP.NET Core integration, and testing packages to the kernel version.
- **Stage** ([Release v4.1.0](https://github.com/Cratis/Stage/releases/tag/v4.1.0)): Update generated frontends to Components 4.13.1 and Fundamentals 7.19.4.
- **Screenplay** ([Release v4.18.0](https://github.com/Cratis/Screenplay/releases/tag/v4.18.0)): Canonical printing keeps the authored order of declarations, also through MCP `propose-ast` edits and folder expansion (#221)
- **Screenplay** ([Release v4.18.0](https://github.com/Cratis/Screenplay/releases/tag/v4.18.0)): MCP `PreserveTrivia` edits replace literal values and whole mappings in place at every mapping site, keeping comments and blank lines (#216, #222)
- **Screenplay** ([Release v4.18.0](https://github.com/Cratis/Screenplay/releases/tag/v4.18.0)): `propose-rename` is refused only when opaque text actually names the declaration being renamed, and the conflict states the file, line and column (#215)
- **Screenplay** ([Release v4.18.0](https://github.com/Cratis/Screenplay/releases/tag/v4.18.0)): A projection-level `key` no longer decides which instance an event updates; key it on `from`, as Chronicle does (#219)
- **Screenplay** ([Release v4.18.0](https://github.com/Cratis/Screenplay/releases/tag/v4.18.0)): A reducer without a transition body is reported with guidance to declare a projection instead (#213)
- **cli** ([Release v3.14.0](https://github.com/Cratis/cli/releases/tag/v3.14.0)): `cratis run` mounts a Screenplay folder read-only (#128)
- **cli** ([Release v3.14.0](https://github.com/Cratis/cli/releases/tag/v3.14.0)): `cratis run` finds `.play` files in a folder in any casing on every platform (#128)
- **cli** ([Release v3.14.0](https://github.com/Cratis/cli/releases/tag/v3.14.0)): `cratis run` rejects a missing path, a file without the `.play` extension, or a path containing a colon before Docker is started (#128)
- **Arc** ([Release v22.21.0](https://github.com/Cratis/Arc/releases/tag/v22.21.0)): Analyzer `ARC0020` now reports an ASP.NET Core authorization attribute only in a project without Arc's ASP.NET Core integration (`Cratis.Arc`), since that integration now enforces it (#2719)
- **AI** ([Release v3.2.0](https://github.com/Cratis/AI/releases/tag/v3.2.0)): `ConfiguredAIProvider` now projects the Decision Engine provider events (#392)
- **Arc** ([Release v22.19.2](https://github.com/Cratis/Arc/releases/tag/v22.19.2)): `Cratis.Chronicle`/`Cratis.Chronicle.AspNetCore`/`Cratis.Chronicle.Testing` bumped from `18.2.0` to `19.4.2` to pick up `[Encrypted]` and the read-model release fix it depends on; `Cratis.Fundamentals`/`Cratis.Metrics.Roslyn` bumped from `7.19.2` to `7.19.3` alongside it
- **Chronicle** ([Release v19.4.2](https://github.com/Cratis/Chronicle/releases/tag/v19.4.2)): `SecurityJsonSchemaExtensions` gains `HasSubjectIndependentSecurityMetadata`, built on a new predicate-based recursive schema walk in `SchemaMetadataExtensions`, so `Release` can tell a namespace-/global-scoped value apart from a subject-scoped (`[PII]`, or `[Encrypted]` with the default `EncryptionScope.Subject`) one before deciding whether a missing subject means "nothing to release"
- **Chronicle.Elixir** ([Release v3.5.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.5.0)): `cratis_chronicle_contracts` bumped from `19.3.2` to `19.4.0`
- **Chronicle.Kotlin** ([Release v6.4.0](https://github.com/Cratis/Chronicle.Kotlin/releases/tag/v6.4.0)): `chronicleContractsVersion` bumped from `19.3.2` to `19.4.0`
- **Chronicle.TypeScript** ([Release v6.3.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.3.0)): `@cratis/chronicle.contracts` bumped from `19.0.1` to `19.4.0`
- **AI** ([Release v3.1.2](https://github.com/Cratis/AI/releases/tag/v3.1.2)): Tutorials start from the smallest *safe* setup and a convention-first snippet, and link the paradigm explanation (event sourcing, event modeling) without delaying the first success.
- **AI** ([Release v3.1.2](https://github.com/Cratis/AI/releases/tag/v3.1.2)): Explanations of what happened after a code block must match the backend the reader actually built.
- **AI** ([Release v3.1.2](https://github.com/Cratis/AI/releases/tag/v3.1.2)): AI-drafted narrative gets a revision pass against source evidence and voice before it ships.
- **AI** ([Release v3.1.2](https://github.com/Cratis/AI/releases/tag/v3.1.2)): Coming-from-X pages follow a consistent shape: the reader's current code, the Cratis equivalent, and what changed. The other technology's code is accurate at a named version or labeled illustrative.
- **AI** ([Release v3.1.2](https://github.com/Cratis/AI/releases/tag/v3.1.2)): Diagrams, use-case indexes and diagnostic documentation are asked for where they help, not on every page.
- **AI** ([Release v3.1.2](https://github.com/Cratis/AI/releases/tag/v3.1.2)): Release notes state verified cross-product pairings, include a fix's root cause and regression guard as observable behavior, credit external contributors, and state a migration table's scope without claiming compatibility that was not assessed.
- **AI** ([Release v3.1.2](https://github.com/Cratis/AI/releases/tag/v3.1.2)): Guidance on how a merged documentation change reaches cratis.io, and that restructuring navigation is not a side effect of writing one page.
- **AI** ([Release v3.1.1](https://github.com/Cratis/AI/releases/tag/v3.1.1)): The `write-documentation` prompt and the orchestrator's documentation step now load `cratis-documentation-writing` (with `cratis-engineering-docs-authoring` and `cratis-technical-examples`) instead of a skill that no longer exists.
- **AI** ([Release v3.1.1](https://github.com/Cratis/AI/releases/tag/v3.1.1)): `cratis-documentation-writing` is now also available from the engineering core profile.
- **AI** ([Release v3.1.1](https://github.com/Cratis/AI/releases/tag/v3.1.1)): Documentation guidance treats Diátaxis as a guide to each page's primary reader purpose rather than a purity rule. It allows brief supporting context, separate language or host start routes, and page sets scaled to the product.
- **AI** ([Release v3.1.1](https://github.com/Cratis/AI/releases/tag/v3.1.1)): Example guidance distinguishes partial excerpts from runnable samples and states which snippets the Arc and Chronicle validators actually compile.
- **Stage** ([Release v3.22.0](https://github.com/Cratis/Stage/releases/tag/v3.22.0)): Use Scene 3.7.0 and Components 4.13.0 in generated frontends for editable command and keyed-query forms. (#100)
- **Stage** ([Release v3.22.0](https://github.com/Cratis/Stage/releases/tag/v3.22.0)): Align generated backend and frontend packages on Arc 22.19.1 while retaining the Chronicle 18.2.0 kernel. (#100)
- **Scene** ([Release v3.7.0](https://github.com/Cratis/Scene/releases/tag/v3.7.0)): Require Components 4.13.0 and Arc/Arc React 22.19.1 for the new form contract while retaining Arc-free unbound previews. (#7)
- **AI** ([Release v3.1.0](https://github.com/Cratis/AI/releases/tag/v3.1.0)): AI setup preserves unrelated MCP servers, settings and comments; conflicting or modified entries are reported instead of overwritten.
- **cli** ([Release v3.11.0](https://github.com/Cratis/cli/releases/tag/v3.11.0)): Preserve existing MCP servers, comments and unrelated settings during install, update and uninstall. User-owned or modified Screenplay entries are reported as conflicts rather than overwritten.
- **cli** ([Release v3.11.0](https://github.com/Cratis/cli/releases/tag/v3.11.0)): Keep MCP standard output exclusively JSON-RPC and suppress CLI update checks during a protocol session.
- **AI** ([Release v3.0.0](https://github.com/Cratis/AI/releases/tag/v3.0.0)): `AgentUsageByDay` is now a real accumulating projection instead of a `[Passive]` read model. It previously recomputed a year of buckets with an in-memory `GroupBy` over every session recorded in the trailing 371-day window on every read, a cost that grows without bound with the number of sessions to answer a question whose answer only changes by one session at a time. `AgentUsageByWeek` and `AgentUsageByMonth` were already real projections; the daily model is now keyed and accumulated the same way.
- **AI** ([Release v3.0.0](https://github.com/Cratis/AI/releases/tag/v3.0.0)): `AgentUsageByDay.LastYear` now reads the accumulated buckets from its own collection and takes an `IMongoCollection<AgentUsageByDay>` and a `TimeProvider`, replacing the previous `IRecordedAgentSessions` parameter.
- **AI** ([Release v3.0.0](https://github.com/Cratis/AI/releases/tag/v3.0.0)): `AgentUsageByDay` now exposes the day as a `DayKey` and carries `BucketKey`, `CachedTokens` and `DurationMs`; total session time remains available as the `Duration` property.
- **AI** ([Release v2.31.0](https://github.com/Cratis/AI/releases/tag/v2.31.0)): Center documentation on reader journeys, intended idioms, minimal first-run setup, and visible results, with source-checked examples and explicit drift checks.
- **Arc** ([Release v22.19.0](https://github.com/Cratis/Arc/releases/tag/v22.19.0)): A query request reader that rejects input as invalid now surfaces as the documented `malformedRequest` validation failure rather than an exception envelope. Reader failures that are not validation failures are unchanged (#2715)
- **Arc** ([Release v22.19.0](https://github.com/Cratis/Arc/releases/tag/v22.19.0)): The shared HTTP contract documents SSE connection ownership and the sort direction vocabulary as single behaviours, with the remaining narrower difference in what each implementation compares for ownership stated explicitly (#2713)
- **AI** ([Release v2.30.0](https://github.com/Cratis/AI/releases/tag/v2.30.0)): `cratis/documentation` gains the writing cadence skill, which applies to documentation equally.
- **AI** ([Release v2.30.0](https://github.com/Cratis/AI/releases/tag/v2.30.0)): Harness skill-count assertions move from 63 to 65.
- **Chronicle** ([Release v19.1.8](https://github.com/Cratis/Chronicle/releases/tag/v19.1.8)): `IReadModels.Release` for a sequence now resolves the schema once for the whole sequence instead of once per instance, and hands the sequence back untouched when the read model carries no compliance metadata at all.
- **Components** ([Release v4.11.0](https://github.com/Cratis/Components/releases/tag/v4.11.0)): Each `<subpath>/styles` is self-contained for that subpath — `@cratis/components/PivotViewer/styles` includes `Filter`'s rules because `PivotViewer` renders a `FilterPanel`, and `@cratis/components/DataPage/styles` includes the vendored Allotment split-view rules — so there is never a second stylesheet to remember (#301)
- **Components** ([Release v4.11.0](https://github.com/Cratis/Components/releases/tag/v4.11.0)): Import order between per-area stylesheets does not matter: only `styles/base` establishes cascade-layer precedence, every area sheet just reopens `cratis-components`, and the cascade contract is identical whichever entry points are used (#301)
- **Components** ([Release v4.11.0](https://github.com/Cratis/Components/releases/tag/v4.11.0)): Getting-started and styling documentation now present the per-area path alongside the aggregate, and `Documentation/ui-foundation.md` records the split instead of the criteria for a future one (#301)
- **cli** ([Release v3.9.0](https://github.com/Cratis/cli/releases/tag/v3.9.0)): Rendering a Screenplay now produces a full application rather than a backend alone: the generated project gains a frontend that builds, a composed screen, and a module registering its generated proxies against that screen. (Cratis/Stage#100)

## Fixed

- **Components** ([Release v4.19.0](https://github.com/Cratis/Components/releases/tag/v4.19.0)): `FilterPanel` uses the overlay container configured by `CratisComponentsProvider` instead of always portaling to `document.body`. An unavailable container defers the panel. Inside a modal `Dialog`, the panel stays within the modal's focus scope and stays visible to assistive technology, even when the shared overlay container sits outside the modal. (#346)
- **Components** ([Release v4.19.0](https://github.com/Cratis/Components/releases/tag/v4.19.0)): A filter panel stays aligned with its trigger and within reach while a Dialog animates in, inside a transformed overlay container, and after scroll and resize. Inside a dialog that clips its content, the panel keeps every option reachable. (#346)
- **Orleans** ([Release v1.12.2](https://github.com/Cratis/Orleans/releases/tag/v1.12.2)): An `ExpandoObject` that crosses a silo boundary keeps its shape. Before, every `ExpandoObject` nested inside it came back on the receiving silo as a `Dictionary<string, object>`, including a child in a collection or a nested object. Code that looks such a value up by its properties could no longer find them. In Chronicle, this made on-demand read models throw and then return nothing whenever the projection and its cached result ran on different silos (Cratis/Chronicle#4337). What is sent between silos is unchanged, so silos on either side of the upgrade keep working together during a rolling update.
- **Chronicle** ([Release v19.14.2](https://github.com/Cratis/Chronicle/releases/tag/v19.14.2)): A reactor, reducer, read-model reactor or event type that carries `[EventLog]`/`[EventSequence]` is no longer also registered as an empty model-bound projection. Before this, a reactor pinned to an event sequence stopped receiving events. Model-bound read models that use those attributes, including record structs, are still discovered. (#4310)
- **Chronicle** ([Release v19.14.2](https://github.com/Cratis/Chronicle/releases/tag/v19.14.2)): Synchronous reactor handlers can return arrays and lists of events (`SomeEvent[]`, `List<SomeEvent>`, `IReadOnlyList<SomeEvent>`, any single-dimensional array or `IEnumerable<T>` of known events, `EventForEventSourceId` or `object`). Discovery and invocation agree on these return types, and the CHR0054 analyzer no longer reports them as unsupported. Multidimensional arrays are rejected. (#4121)
- **Chronicle** ([Release v19.14.2](https://github.com/Cratis/Chronicle/releases/tag/v19.14.2)): Release builds of the client and analyzer projects and their specs with 0 warnings.
- **Chronicle** ([Release v19.14.2](https://github.com/Cratis/Chronicle/releases/tag/v19.14.2)): `DotNET.Specs` 3,350/3,350 and `DotNET.CodeAnalysis.Specs` 415/415.
- **Chronicle** ([Release v19.14.2](https://github.com/Cratis/Chronicle/releases/tag/v19.14.2)): `Documentation/verify-markdown.sh`.
- **Chronicle** ([Release v19.14.2](https://github.com/Cratis/Chronicle/releases/tag/v19.14.2)): The local CI-equivalent gate is green.
- **Chronicle** ([Release v19.14.2](https://github.com/Cratis/Chronicle/releases/tag/v19.14.2)): A cross-provider review passed with no remaining findings after two rounds.
- **cli** ([Release v3.21.0](https://github.com/Cratis/cli/releases/tag/v3.21.0)): **`cratis chronicle login` now saves the token** (#118). Before, it reported "Logged in as …" but threw the token away, so every later command fell back to the development client and got 401 from any secured server. Login now fails with a clear error when the server returns no usable token. When a saved token expires, commands report an expired login instead of silently switching to the development client, unless the context has its own client credentials. Tokens and certificate passwords are hidden in `--debug`, diagnose and workbench output.
- **cli** ([Release v3.21.0](https://github.com/Cratis/cli/releases/tag/v3.21.0)): **The CLI update h
- **Orleans** ([Release v1.12.1](https://github.com/Cratis/Orleans/releases/tag/v1.12.1)): `Cratis.Orleans` now depends directly on Orleans 10 Reminders, so the MongoDB provider's Orleans 9 dependency no longer pulls `Microsoft.Orleans.Reminders` 9.0.1 into consumers and trips the package's own alignment guard.
- **Chronicle** ([Release v19.4.9-hotfix.1](https://github.com/Cratis/Chronicle/releases/tag/v19.4.9-hotfix.1)): Hotfix on the 19.4 line for kernels that cannot yet move to 19.13: a replay of a projection no longer leaves its MongoDB read model frozen when the replay ends on more than one kernel silo at once, or overlaps another replay of the same projection. Also carries the replay-context fixes from 19.13.3. 19.13.3 has the same fix for everyone already on 19.13. (#4296)
- **Chronicle.TypeScript** ([Release v6.22.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.22.1)): Append results now carry the constraint name Chronicle returns, so constraint violations, including schema-validation failures, have their `constraintId`, and configured constraint messages resolve.
- **Chronicle.TypeScript** ([Release v6.22.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.22.1)): The TypeScript appending example shows schema constraint violations and their property paths.
- **Screenplay** ([Release v4.44.0](https://github.com/Cratis/Screenplay/releases/tag/v4.44.0)): Comments on persona descriptions, query descriptions, constraint headers, unique rules, `released by`, `ignore casing`, `message`, and query `by` / `scoped to` lines now stay attached to their line when a document is reformatted or edited.
- **Chronicle** ([Release v19.13.3](https://github.com/Cratis/Chronicle/releases/tag/v19.13.3)): A replay of a projection no longer leaves its MongoDB read model frozen when the replay ends on more than one kernel silo at once, or overlaps another replay of the same projection. The replay is promoted exactly once, and every silo goes back to writing the read model itself. Before, a silo that lost the race kept sending every live change to `replay-<container>`, with the observer still reporting `Active` and no error recorded (#4296)
- **Chronicle** ([Release v19.13.3](https://github.com/Cratis/Chronicle/releases/tag/v19.13.3)): A replay no longer fails to end because the revert container name from a previous replay of the same read model is reused (#4296)
- **Chronicle** ([Release v19.13.3](https://github.com/Cratis/Chronicle/releases/tag/v19.13.3)): Starting a replay on several silos at once no longer fails with a duplicate key on `replay-contexts` (#4296)
- **cli** ([Release v3.20.1](https://github.com/Cratis/cli/releases/tag/v3.20.1)): `cratis new --language` help, validation errors and documentation now list C#, Kotlin and Java, including the `c#` alias. They also state that Kotlin and Java currently require naming the template, for example `cratis new cratis --language kotlin`.
- **Chronicle** ([Release v19.13.2](https://github.com/Cratis/Chronicle/releases/tag/v19.13.2)): The `MissingImmediateProjectionForModel` exception no longer tells you to implement an interface that does not exist.
- **Arc.TypeScript** ([v0.41.2](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.41.2)): When the PostgreSQL observation manager was disposed without awaiting it and a listener close then failed, the disposal failure surfaced as an unhandled rejection, which can terminate a Node.js process. The failure is now handled internally and still returned to callers that await disposal.
- **Arc.TypeScript** ([v0.41.2](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.41.2)): The listener manager specs no longer depend on wall-clock timing, which made one of them fail intermittently under load.
- **Chronicle** ([Release v19.13.1](https://github.com/Cratis/Chronicle/releases/tag/v19.13.1)): `WaitForCompletion()` no longer fails with an `InvalidOperationException` when the append result carries event-type tails. The request's repeated `EventTypeTails` field defaulted to an array, which protobuf-net cannot add to while decoding, so every non-empty request failed on the server (#4280)
- **Chronicle** ([Release v19.13.1](https://github.com/Cratis/Chronicle/releases/tag/v19.13.1)): A `WaitForCompletion()` timeout response that lists outstanding observers now decodes on the client, for the same reason (#4280)
- **Chronicle** ([Release v19.13.1](https://github.com/Cratis/Chronicle/releases/tag/v19.13.1)): Round-trip specifications under `Server.Specs/Contracts/` for non-empty tails, omitted tails and non-empty outstanding observers. The two non-empty cases reproduce the exception without the fix.
- **Chronicle** ([Release v19.13.1](https://github.com/Cratis/Chronicle/releases/tag/v19.13.1)): All Server specs pass; Release solution build with warnings as errors and formatting pass.
- **Chronicle** ([Release v19.13.1](https://github.com/Cratis/Chronicle/releases/tag/v19.13.1)): A search of every protobuf-net contract found no other `IEnumerable<T>` member with an array default.
- **Arc.TypeScript** ([v0.41.1](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.41.1)): A snapshot query that returns a stream is still rejected with `SnapshotStreamError`, and Arc now releases the returned value exactly once through the first hook it owns: `Symbol.asyncDispose`, `Symbol.dispose`, `dispose()`, `close()`, or `return()` when the value is itself an iterator. Arc never subscribes to it or creates an iterator from it, never calls `unsubscribe()` (which would close a shared RxJS `Subject` for every consumer), and never releases values its service container owns. A release failure is reported alongside the rejection, including when the request is cancelled, and a release still running after one second is reported to the server logger. The same rule applies over HTTP and in `QueryScenario`.
- **Screenplay** ([Release v4.42.0](https://github.com/Cratis/Screenplay/releases/tag/v4.42.0)): Comments stay attached to their line during canonical printing and `expand-layout` for the remaining directive lines. These include:
- **Screenplay** ([Release v4.42.0](https://github.com/Cratis/Screenplay/releases/tag/v4.42.0)): enum values and concept reasons;
- **Screenplay** ([Release v4.42.0](https://github.com/Cratis/Screenplay/releases/tag/v4.42.0)): policy requirements and persona policies;
- **Screenplay** ([Release v4.42.0](https://github.com/Cratis/Screenplay/releases/tag/v4.42.0)): UI profile, theme and theme-compatibility lines;
- **Screenplay** ([Release v4.42.0](https://github.com/Cratis/Screenplay/releases/tag/v4.42.0)): contribution and screen-action labels and order;
- **Screenplay** ([Release v4.42.0](https://github.com/Cratis/Screenplay/releases/tag/v4.42.0)): implementation file references;
- **Screenplay** ([Release v4.42.0](https://github.com/Cratis/Screenplay/releases/tag/v4.42.0)): the scalar subdirectives in specifications, captures, projections and commands.
- **Screenplay** ([Release v4.42.0](https://github.com/Cratis/Screenplay/releases/tag/v4.42.0)): Comments on enum and other collection values follow their value when a syntax tree or workspace edit reorders, inserts or removes values.
- **Chronicle** ([Release v19.12.0](https://github.com/Cratis/Chronicle/releases/tag/v19.12.0)): A MongoDB bulk write that fails part way now applies the remaining operations instead of silently dropping them. Later changes for the partition that failed are held back, so they can't overtake its replay. Each failed partition is reported once, at its earliest sequence number (#4244)
- **Chronicle** ([Release v19.12.0](https://github.com/Cratis/Chronicle/releases/tag/v19.12.0)): Forwarding events to another event store's inbox no longer acknowledges events whose append failed. It stops at the first failure and reports the last event it actually forwarded, so the retry resumes from the failed event (#4259)
- **Chronicle** ([Release v19.12.0](https://github.com/Cratis/Chronicle/releases/tag/v19.12.0)): Projection keys for immediate (passive) projections round-trip read-model keys that contain `#` (#4241)
- **Chronicle** ([Release v19.12.0](https://github.com/Cratis/Chronicle/releases/tag/v19.12.0)): `add` and `subtract` projection mappings accept negative, decimal and exponent operands (for example `-1`, `-2.5`, `1e-3`), and reject malformed operands. Exponent literals and integer literals beyond 2^53 in declarations still depend on the declaration parser (Cratis/Screenplay#285) (#4239)
- **Chronicle** ([Release v19.12.0](https://github.com/Cratis/Chronicle/releases/tag/v19.12.0)): Composite-key validation for generated declarations resolves the key type from the read model's `Id` schema first, so a same-named type elsewhere in the read model can't be picked by mistake (#4253)
- **Chronicle** ([Release v19.11.1](https://github.com/Cratis/Chronicle/releases/tag/v19.11.1)): The local Chronicle image starts its embedded MongoDB only when configured to use it; connections to a separate MongoDB or another storage provider no longer start an unused replica set (#4111).
- **Chronicle** ([Release v19.11.1](https://github.com/Cratis/Chronicle/releases/tag/v19.11.1)): Generating a declarative projection preserves nested mappings, including inner nested blocks and `clear with` rules. Nested composite keys use the nested read model's schema while generating their declarations (#4116).
- **Arc** ([Release v22.30.0](https://github.com/Cratis/Arc/releases/tag/v22.30.0)): An authentication scheme or policy supplied by a fallback evaluator is applied before command context values and execution scopes are built, instead of failing every such command (#2751)
- **Arc** ([Release v22.30.0](https://github.com/Cratis/Arc/releases/tag/v22.30.0)): The ambiguity error for conflicting authorization declarations names the conflicting evaluators (#2751)
- **Arc** ([Release v22.30.0](https://github.com/Cratis/Arc/releases/tag/v22.30.0)): Observable queries over collections whose items have no `Id` send complete snapshots instead of unreliable change sets, and log one warning per subscription explaining that deltas need a stable identity. Collections with an `Id` are unchanged (#2428)
- **Arc** ([Release v22.30.0](https://github.com/Cratis/Arc/releases/tag/v22.30.0)): The manual query pipeline composition recipe registers `AuthorizationDeclarations`, which the pipeline needs to authorize queries (#2753)
- **Chronicle** ([Release v19.11.0](https://github.com/Cratis/Chronicle/releases/tag/v19.11.0)): Observer tail lookups and in-process reactor scenarios recognize cla
- **Chronicle** ([Release v19.10.1](https://github.com/Cratis/Chronicle/releases/tag/v19.10.1)): A projection can clear a nested object and later set it again, including an object nested inside another nested object. The MongoDB sink no longer fails the projection, and the testing engine no longer throws. (#4166)
- **Chronicle** ([Release v19.10.1](https://github.com/Cratis/Chronicle/releases/tag/v19.10.1)): Clearing a nested object in MongoDB removes the field with `$unset` instead of storing `null`. A document already stored with a `null` parent from an earlier version is repaired before the nested value is written again. The same applies to a nested object inside an array element. The repair only touches that document's parent, or that one element, and only when it really holds `null`.
- **Chronicle** ([Release v19.10.1](https://github.com/Cratis/Chronicle/releases/tag/v19.10.1)): The in-memory sink and the testing engine clear the right property for deeper paths such as `outer.info`. Clearing an object whose parent is missing no longer creates that parent, which matches MongoDB.
- **Arc** ([Release v22.29.0](https://github.com/Cratis/Arc/releases/tag/v22.29.0)): Command filters continue past non-blocking validation results, so a later Error rejects execution and preflight validation even when an earlier Warning is allowed (#2817).
- **Arc** ([Release v22.29.0](https://github.com/Cratis/Arc/releases/tag/v22.29.0)): Client-side command validation blocks only at the effective severity threshold; non-blocking results remain advisory, server preflight still runs, and CommandForm validity follows the validation verdict.
- **Arc** ([Release v22.29.0](https://github.com/Cratis/Arc/releases/tag/v22.29.0)): Generated validators emit severity calls only for non-Error rules, retaining compatibility with existing client libraries for default rules. Rules with runtime-dependent severity are left to the server. Documentation describes the default-severity assumption at build time.
- **Arc** ([Release v22.28.1](https://github.com/Cratis/Arc/releases/tag/v22.28.1)): Invalid scalar, concept, and collection arguments on GET and QUERY endpoints now return HTTP 400 with a named malformed-request validation error instead of invoking model-bound or controller queries with default values or reporting invalid values as missing. (#2794)
- **Arc** ([Release v22.27.2](https://github.com/Cratis/Arc/releases/tag/v22.27.2)): API path joins collapse repeated separators at segment boundaries without damaging `http://`, `https://`, or leading and trailing slashes (#2593)
- **Arc** ([Release v22.27.2](https://github.com/Cratis/Arc/releases/tag/v22.27.2)): Path-prefix hosting guidance now covers `apiBasePath`, router basename, ASP.NET Core `UsePathBase` ordering, and Arc.Core static files and fallback (#2593)
- **Arc** ([Release v22.27.1](https://github.com/Cratis/Arc/releases/tag/v22.27.1)): Local functions and other compiler-generated methods inside read models no longer create query endpoints, generated proxies or route conflicts. The runtime, the metadata generator, the proxy generator and the `QueryScenario` testing helpers apply the same rule (#2651)
- **Arc** ([Release v22.27.1](https://github.com/Cratis/Arc/releases/tag/v22.27.1)): Proxies are no longer generated for query methods returning a collection that is not of the read model, such as `string` or `IEnumerable<Other>`, which the runtime never served; covariant collections of a derived read model still get proxies (#2651)
- **Arc** ([Release v22.27.1](https://github.com/Cratis/Arc/releases/tag/v22.27.1)): Multiplexed SSE and WebSocket observable queries keep paging totals on an empty first result and pick up updated totals on later results, without mixing metadata between subscriptions (#2707)
- **Chronicle.TypeScript** ([Release v6.16.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.16.1)): Event-context projection mappings and context-derived keys now reach the kernel in the form it resolves, `$eventContext(<Property>)`, as Chronicle for .NET sends them. Previously declarative `toEventContextProperty(...)`, `usingKeyFromContext(...)` and `usingParentKeyFromContext(...)` sent `$context.<name>`, which the kernel doesn't recognize, and model-bound `@setFromContext(...)` sent a bare name that the kernel read as an event content property.
- **Chronicle.TypeScript** ([Release v6.16.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.16.1)): Invalid event-context paths now fail when the projection is registered, naming the projection, read model and path, instead of failing for every event in the kernel. Registration accepts any `EventContext` property, `causedBy.subject`, `causedBy.name`, `causedBy.userName` and `causedBy.onBehalfOf` as a whole, and `occurred.week()`, the kernel's only derived function. Paths into the `causation` and `tags` collections are rejected. The error's cause, `InvalidEventContextPropertyError`, is exported.
- **Chronicle** ([Release v19.10.0](https://github.com/Cratis/Chronicle/releases/tag/v19.10.0)): `every` mappings, such as `count`, `increment` and `add`, ran twice for join events. They now run once. **Existing read models keep their doubled values until you replay the affected projections.** Their definitions don't change, so no replay is triggered automatically.
- **Arc** ([Release v22.27.0](https://github.com/Cratis/Arc/releases/tag/v22.27.0)): ARCCHR0006 recognizes inherited `[Replay]` handlers when checking whether reactor command execution has a replay decision, including handlers on generic base classes (#2790)
- **AI** ([Release v7.1.1](https://github.com/Cratis/AI/releases/tag/v7.1.1)): A valid 8,000-character context with 32 labels OOM-killed the published image on the production x86 compute pool (exit 137). Groups of four and even a single 8K label also OOM-killed the 2 GiB Apple Silicon container.
- **AI** ([Release v7.1.1](https://github.com/Cratis/AI/releases/tag/v7.1.1)): Score labels one at a time; keep the first and last 750 characters of longer inference text. The wire contract still accepts 8K and returns all supplied scores, with documented information-loss/latency trade-offs.
- **AI** ([Release v7.1.1](https://github.com/Cratis/AI/releases/tag/v7.1.1)): Add tests for long-context truncation and 32-label requests.
- **AI** ([Release v7.1.1](https://github.com/Cratis/AI/releases/tag/v7.1.1)): Local 2 CPU / 2 GiB Docker test: 8K input with 32 labels returned HTTP 200, all 32 scores, in ~16s without OOM.
- **AI** ([Release v7.1.1](https://github.com/Cratis/AI/releases/tag/v7.1.1)): Packaged image builds and seven adapter tests pass. Follow-up x86 staging validation is required before merging Infrastructure#82.
- **Chronicle.TypeScript** ([Release v6.14.3](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.14.3)): A projection definition's `LastUpdated` value now changes when a nested mapping changes, such as a property expression inside a `from`, `join`, `removedWith`, child or nested definition. The hash used to drop nested keys, so those changes left `LastUpdated` unchanged. The kernel compares definitions by structure, so replays were already triggered correctly; only the `LastUpdated` metadata was wrong.
- **Chronicle.TypeScript** ([Release v6.14.2](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.14.2)): A property-level `@clearWith(Event)` on a member of a model-bound child or nested type now clears that member, as in Chronicle for .NET. Previously the TypeScript client registered it as a removal of the whole child or nested object, so the event could remove the object, or match nothing, instead of setting the member to null.
- **Arc** ([Release v22.26.1](https://github.com/Cratis/Arc/releases/tag/v22.26.1)): The NuGet and npm packages for the changes listed in [v22.26.0](https://github.com/Cratis/Arc/releases/tag/v22.26.0) are published with this release. Publishing v22.26.0 stopped before any package was pushed, because two independently merged changes together broke the TypeScript build; this release contains everything in v22.26.0 and restores the build.
- **Chronicle.TypeScript** ([Release v6.14.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.14.1)): With standard (TC39) decorators, a read model whose mappings are all on properties, such as `@setFrom(Event, 'name')` without a class-level `@fromEvent(...)`, is now registered when the event store is created, if artifact discovery finds its class or it is registered explicitly. Previously it was registered only after an instance had been created, so queries could fail with "Unknown read model".
- **Chronicle.TypeScript** ([Release v6.14.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.14.1)): Registering such a model after an instance has been created no longer risks registering it twice.
- **Chronicle** ([Release v19.8.1](https://github.com/Cratis/Chronicle/releases/tag/v19.8.1)): Composite-key expressions in projection declarations resolve on the kernel. The kernel, the declaration-language generator and the declarative code generator now share one `$composite(...)` parser. It accepts an optional leading key type name, and spacing between components doesn't matter. This is part of #4163.
- **Chronicle** ([Release v19.8.1](https://github.com/Cratis/Chronicle/releases/tag/v19.8.1)): Malformed composite-key expressions fail with a clear error instead of resolving to a wrong key. That covers an invalid type name, duplicate or empty components, and whitespace-only content.
- **Chronicle** ([Release v19.8.1](https://github.com/Cratis/Chronicle/releases/tag/v19.8.1)): Composite keys that contain characters such as `-`, `@` or `:` in their mappings are now resolved as composite keys. Previously they fell through to value resolution, which could put every event into one read model instance. **If a projection used such a key, replay it after upgrading.** New events go to the correct instances, but the old instance stays until you replay.
- **Components** ([Release v4.15.1](https://github.com/Cratis/Components/releases/tag/v4.15.1)): `CommandStepper` and `StepperCommandDialog` now call `onChangeStep({ index })` once for every accepted move to a different step: header clicks, Previous, and Next. Previous and Next never reported a change before, and a header click reported one even when the move was then rejected. (#249)
- **Components** ([Release v4.15.1](https://github.com/Cratis/Components/releases/tag/v4.15.1)): Each stepper panel is now labelled by its step header through `aria-labelledby`. If you pass `pt.header.id`, your id is kept and the panel keeps its text label. The wizard stays an ordered list of steps rather than ARIA tabs. (#249)
- **Components** ([Release v4.15.1](https://github.com/Cratis/Components/releases/tag/v4.15.1)): PivotViewer boolean dimensions now group into true and false columns, and their categorical filters narrow the cards, including the None and Unknown options for missing values. (#334)
- **Components** ([Release v4.15.1](https://github.com/Cratis/Components/releases/tag/v4.15.1)): PivotViewer keeps missing values missing instead of turning them into the text `undefined`, and infers each column's type from its first non-missing value. Missing numbers sort last. Because of this, a numeric column whose first value is missing is now treated as numeric, so a categorical selection on it no longer narrows the cards, as for every other numeric column. (#334)
- **Components** ([Release v4.15.1](https://github.com/Cratis/Components/releases/tag/v4.15.1)): PivotViewer now applies a dimension's declared `formatValue` to column labels and `sort` to column order. Changing either no longer re-runs the grouping. (#334)
- **Components** ([Release v4.15.1](https://github.com/Cratis/Components/releases/tag/v4.15.1)): PivotViewer no longer renders an empty viewport after regrouping or filtering when the new layout's first entries are off-screen. Cards that intersect the viewport are drawn during the transition, and cards that move off-screen are released when it ends. Refs #236: the intermittent crash reported there is not reproduced, so that issue stays open.
- **Components** ([Release v4.15.1](https://github.com/Cratis/Components/releases/tag/v4.15.1)): A non-modal `ChatSidebar` can now be rendered open on the server. It portals after mount into the `CratisComponentsProvider` overlay container, and falls back to `document.body` when there is none. (#339)
- **Components** ([Release v4.15.1](https://github.com/Cratis/Components/releases/tag/v4.15.1)): The non-modal `ChatSidebar` now plays the same open and close animation as the modal one, and skips it when the user prefers reduced motion. (#339)
- **Chronicle** ([Release v19.8.0](https://github.com/Cratis/Chronicle/releases/tag/v19.8.0)): `ReadModelScenario` seeds and reads read models through the artifacts provider of its own `Defaults`, instead of always using the process-wide provider.
- **Arc** ([Release v22.23.8](https://github.com/Cratis/Arc/releases/tag/v22.23.8)): Committing to an aggregate that already had events no longer fails with a concurrency violation when no one else wrote to it. Loading the aggregate left its expected position at zero, so any aggregate whose event source had a later event was rejected on every commit.
- **Arc** ([Release v22.23.8](https://github.com/Cratis/Arc/releases/tag/v22.23.8)): The expected position is now captured before the aggregate's events are read, so an event appended by someone else while the aggregate is loading is still detected as a conflict at commit instead of being silently overwritten.
- **Arc** ([Release v22.23.8](https://github.com/Cratis/Arc/releases/tag/v22.23.8)): For aggregates without event handlers, `IsNew` now reflects only the aggregate's own stream: events for the same event source in other streams no longer make it look existing.
- **Screenplay** ([Release v4.41.1](https://github.com/Cratis/Screenplay/releases/tag/v4.41.1)): Comments before or on a template's `fits slot` line stay with that directive when printed canonically or moved with `expand-layout`. The typed JSON syntax is unchanged. (#276)
- **Screenplay** ([Release v4.41.1](https://github.com/Cratis/Screenplay/releases/tag/v4.41.1)): Comments on contribution navigation lines and on declaration and screen file references also stay with their lines.
- **Components** ([Release v4.14.3](https://github.com/Cratis/Components/releases/tag/v4.14.3)): Published Migrator packages refused to run with a stale-metadata error because their bundled compatibility manifest was still pinned to 4.0.0. Releases now bump every public package to the release version first, regenerate and verify all three compatibility manifests from those versions, and only then publish. A failure in any of those steps stops the release before the first package is published. (#232)
- **Components** ([Release v4.14.3](https://github.com/Cratis/Components/releases/tag/v4.14.3)): The Migrator's version mismatch error now names both the package version and the manifest version, and says that the mismatch is a packaging defect. (#232)
- **Components** ([Release v4.14.3](https://github.com/Cratis/Components/releases/tag/v4.14.3)): The post-publish registry check now also waits for `@cratis/components.conformance`.
- **Arc.TypeScript** ([Arc for TypeScript 0.31.0 — global command and query filters](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.31.0)): Malformed command input no longer runs context-value providers or key resolvers before it is rejected.
- **Arc.TypeScript** ([Arc for TypeScript 0.31.0 — global command and query filters](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.31.0)): The existing per-definition `CommandFilter<T>` and `QueryFilter<T>` callbacks are unchanged.
- **Components** ([Release v4.14.2](https://github.com/Cratis/Components/releases/tag/v4.14.2)): The baseline theme's forced-colors (high-contrast) tokens now win over the dark-scheme tokens in every scheme state: explicit `cratis-dark`/`cratis-light` classes, the OS dark preference, and scoped `.cratis-theme` sections. Before, high-contrast mode kept the dark palette. (#329)
- **Components** ([Release v4.14.2](https://github.com/Cratis/Components/releases/tag/v4.14.2)): `Page` keeps its full-height flex layout when you pass a `className`; the class is added instead of replacing the layout classes. The `panel` prop is documented as what it is: a `panel` class hook on the content region for your own CSS. (#330)
- **Components** ([Release v4.14.2](https://github.com/Cratis/Components/releases/tag/v4.14.2)): `CommandStepper` now calls `onException` and `onUnauthorized` when a command fails, and turns Submit busy before an async `onBeforeExecute` runs, so the command can no longer be submitted twice. `onFailed` now also fires for validation failures, as it already does in `CommandDialog` and `StepperCommandDialog`; if you show a generic error from `onFailed`, it will now also appear for validation failures. (#331)
- **Components** ([Release v4.14.2](https://github.com/Cratis/Components/releases/tag/v4.14.2)): The Components 3 to 4 change-handler codemod no longer produces an `onChange` prop on CommandForm fields that fails type-checking. It leaves those call sites unchanged and tells you to move the handler to the enclosing `CommandForm`'s `onFieldChange`. `onValueChange` handlers are still migrated automatically. (#332)
- **Components** ([Release v4.14.2](https://github.com/Cratis/Components/releases/tag/v4.14.2)): The `onbeforeexecute-must-return` ESLint rule now checks only the components that transform command values (`CommandDialog`, `StepperCommandDialog`, `CommandStepper`, and Arc's `CommandForm`, including aliased and namespace imports), so it no longer reports Arc `CommandScope` callbacks. (#332)
- **Components** ([Release v4.14.2](https://github.com/Cratis/Components/releases/tag/v4.14.2)): Corrected public examples and descriptions that did not match the shipped code: the `FilterPanel` examples now compile, `SchemaEditor`'s `canEdit` and `DataPage`'s `onRefresh` describe their actual behavior, and the confirmation and busy-indicator dialogs point to Arc's `useConfirmationDialog` and `useBusyIndicator`. (#333)
- **Chronicle** ([Release v19.7.11](https://github.com/Cratis/Chronicle/releases/tag/v19.7.11)): The kernel no longer registers its MongoDB camel-case convention pack twice (#3589)
- **Chronicle** ([Release v19.7.10](https://github.com/Cratis/Chronicle/releases/tag/v19.7.10)): A projection declaration containing a block the engine cannot build, such as `variant`, now fails compilation with a compiler error that points at the block. Before this fix, compilation threw an exception. This also applies when compiling without read model or event schemas and to blocks inside `children` and `nested` (#4109)
- **Chronicle** ([Release v19.7.9](https://github.com/Cratis/Chronicle/releases/tag/v19.7.9)): Watching a read model before the kernel has finished registering it now waits for registration instead of throwing `NullReferenceException`. If it is never registered, the watch fails with `ReadModelNotFound` (#3925)
- **Chronicle** ([Release v19.7.8](https://github.com/Cratis/Chronicle/releases/tag/v19.7.8)): The .NET client now loads a passwordless PKCS#12 client certificate, including its private key, for mutual TLS on .NET 9 and later. Before, it read the file as a plain certificate and lost the key (#3680)
- **Chronicle** ([Release v19.7.7](https://github.com/Cratis/Chronicle/releases/tag/v19.7.7)): Webhook deliveries that get a non-success HTTP response (4xx or 5xx) now fail the partition and go through the normal failed-partition retry, instead of counting as delivered (#4200)
- **Chronicle** ([Release v19.7.5](https://github.com/Cratis/Chronicle/releases/tag/v19.7.5)): Append notifications raised by the .NET client now carry each event's subject: an explicit subject or one resolved from a `[Subject]` property. Before, they always reported the event source id. This covers single appends, `AppendMany` and batch appends across event sources (#4133)
- **Chronicle** ([Release v19.7.4](https://github.com/Cratis/Chronicle/releases/tag/v19.7.4)): The Chronicle health check now reports the failure status it was registered with (for example `Degraded`) when the kernel is disconnected or unreachable, instead of always reporting `Unhealthy` (#4201)
- **Chronicle** ([Release v19.7.3](https://github.com/Cratis/Chronicle/releases/tag/v19.7.3)): The reactor analyzer no longer reports a synchronous `EventsWithConcurrencyScopes` return, which the runtime supports. It also no longer reports unsupported return types as CHR0004, a parameter error (#4206)
- **Arc** ([Release v22.23.7](https://github.com/Cratis/Arc/releases/tag/v22.23.7)): Generated TypeScript query, observable query and command proxies no longer contain whitespace-only lines, so they pass whitespace lint rules without editing generated files (#2705)
- **Arc** ([Release v22.23.6](https://github.com/Cratis/Arc/releases/tag/v22.23.6)): GET queries honor paging and sorting parameters regardless of casing, so `sortBy`, `sortDirection`, `page` and `pageSize` sent by the generated TypeScript proxies are applied on both the ASP.NET Core and Arc.Core hosts; ordinary query argument matching is unchanged (#2758)
- **Chronicle** ([Release v19.7.2](https://github.com/Cratis/Chronicle/releases/tag/v19.7.2)): Literal set-mappings in projection declarations (`status = "draft"`, `isActive = true`, `version = 1`, and non-negative numeric `add`/`subtract` operands) now project their values. Before this fix they resolved to null. Stored definitions pick up the literal values without migration, but read models built before the fix keep their null values until they are replayed. An empty or otherwise unsupported value expression now fails when the projection is created instead of silently resolving to null (#4124)
- **Chronicle** ([Release v19.7.2](https://github.com/Cratis/Chronicle/releases/tag/v19.7.2)): Removing a joined child with `RemovedWithJoin` now removes it from every parent in the in-memory sink and in `ReadModelScenario`, matching MongoDB. Before this fix the parent that received the event kept the child (#4167)
- **Arc** ([Release v22.23.5](https://github.com/Cratis/Arc/releases/tag/v22.23.5)): ARC0013 no longer reports static members reached through a concept type, such as a `NotSet` sentinel or a static factory, in validator rules; nullable instance dereferences like `RuleFor(c => c.Name.Value)` are still reported (#2658)
- **Arc** ([Release v22.23.4](https://github.com/Cratis/Arc/releases/tag/v22.23.4)): Model-bound queries no longer risk binding a dependency to the wrong parameter under concurrent first use. Parameters are classified once when the query is discovered and bound by position, instead of by comparing reflection metadata instances across calls (#2765)
- **Screenplay** ([Release v4.39.0](https://github.com/Cratis/Screenplay/releases/tag/v4.39.0)): A value indented under a clock trigger (`every …`, `at …`) reports `PLAY0450`, because clock triggers take no values. (#258)
- **Screenplay** ([Release v4.39.0](https://github.com/Cratis/Screenplay/releases/tag/v4.39.0)): A line indented under a `reads` line reports `PLAY0451`. It no longer becomes a property of the command or a value of the reaction trigger. (#259)
- **Screenplay** ([Release v4.38.0](https://github.com/Cratis/Screenplay/releases/tag/v4.38.0)): The documentation now describes what the executable model binds: one `then error` per specification, `produces … for` only on the command's identifier, and `all` projections keyed per event source instead of global counters. The shapes it rejects now get clearer diagnostics. (#261)
- **Components** ([Release v4.14.1](https://github.com/Cratis/Components/releases/tag/v4.14.1)): `CommandDialog` now applies `subtitle`, `placement`, `closeIcon`, and every other `Dialog` prop it accepts. Before, these type-checked but were passed to the command form instead of the dialog, so they had no effect. A type-level check now fails the build if a `Dialog` prop is added without being forwarded.
- **AuthProxy** ([Release v2.22.4](https://github.com/Cratis/AuthProxy/releases/tag/v2.22.4)): An expired session no longer strands a single-page app mid-use. Every unauthenticated request used to get redirected to the sign-in page, even a frontend's own `fetch()`/XHR call - the browser followed that redirect silently and handed the caller a plain `200` login page instead of a clear refusal, so a command kept failing without explanation and an identity check could crash trying to parse the page as JSON. A caller that is not navigating a browser now gets a `401` it can act on; an actual page load still redirects to sign-in as before.
- **Arc** ([Release v22.23.3](https://github.com/Cratis/Arc/releases/tag/v22.23.3)): A frontend using `useIdentity`/`IdentityProvider` no longer gets stuck showing "not signed in" while the tab stays open. When a session that was active ends server-side (expiry, revoked access) an identity refresh now reloads the page instead of quietly settling into an unset identity nothing on the page could act on - the reload sends the browser through the ordinary sign-in redirect (see Cratis/AuthProxy#136) instead of leaving every command failing silently against a session that is already gone.
- **Screenplay** ([Release v4.37.1](https://github.com/Cratis/Screenplay/releases/tag/v4.37.1)): Canonical printing and `expand-layout` keep comments inside `form` blocks, including `@input` notes and comments on `populate`, fields, `on submit` and inline `on` behaviors, in order and without duplicates. (#267)
- **Screenplay** ([Release v4.37.1](https://github.com/Cratis/Screenplay/releases/tag/v4.37.1)): Comments on navigation lines inside screen actions and tables stay with their lines when printed canonically.
- **cli** ([Release v3.20.0](https://github.com/Cratis/cli/releases/tag/v3.20.0)): `cratis render` explains why a model whose events declare several generations cannot be rendered yet: alongside Stage's `STAGE-ESM-016`, it reports `CLI-RENDER-003` naming the evolved event. The command fails with a validation error and writes nothing. Screenplay itself validates such models; Stage does not yet accept their executable model (ESM v4).
- **Chronicle** ([Release v19.7.1](https://github.com/Cratis/Chronicle/releases/tag/v19.7.1)): CHR0037 no longer reports valid migration chains where two or more generations written with `EventTypeGenerationFor` belong to the same event type. It still reports generations that resolve to different event types (#4207)
- **Chronicle.TypeScript** ([Release v6.11.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.11.0)): A completion wait no longer leaves its timeout timer queued after it finishes or is canceled.
- **Chronicle.TypeScript** ([Release v6.11.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.11.0)): A stale comment was removed and a sample comment uses American spelling.
- **Stage** ([Release v4.18.1](https://github.com/Cratis/Stage/releases/tag/v4.18.1)): Stage's semantic runtime now has Chronicle reject its append atomically when another writer appended to the event log after Stage captured the tail, including the first append to an empty log. Before, the append succeeded and the divergence was only detected on the next command. The runtime faults with "the event-log tail changed outside this session", and nothing is appended.
- **Stage** ([Release v4.18.1](https://github.com/Cratis/Stage/releases/tag/v4.18.1)): An accepted command that appends no facts no longer reports a world that changed during its checks as current.
- **Stage** ([Release v4.18.1](https://github.com/Cratis/Stage/releases/tag/v4.18.1)): Custom `IAppendSemanticFacts` implementations keep working unchanged; the built-in appender also implements the new `IAppendSemanticFactsAtTail`, which the runtime uses for the atomic check. Appenders without it keep the previous, non-atomic check.
- **Arc.TypeScript** ([Arc for TypeScript 0.30.3 — proxies for commands that can reject](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.3)): Generating proxies no longer fails with "Multiple unhandled command response types" for commands that return events or a visible value alongside `rejected(...)` or `denied(...)`. This covers async, union and tuple returns. The rejection branches are not client response values; the client sees them as validation or authorization results, as at runtime.
- **Arc.TypeScript** ([Arc for TypeScript 0.30.3 — proxies for commands that can reject](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.3)): Generated metadata for a command that returns either a rejection or an array of events now accepts the successful array.
- **Arc.TypeScript** ([Arc for TypeScript 0.30.3 — proxies for commands that can reject](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.3)): Proxy generation rejects arrays of `Outcome` values with a clear error, because the runtime does not unwrap them.
- **Arc.TypeScript** ([Arc for TypeScript 0.30.3 — proxies for commands that can reject](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.3)): The aggregate and Chronicle testing docs use the normal generate-and-discover path.
- **Templates** ([Release v1.7.2](https://github.com/Cratis/Templates/releases/tag/v1.7.2)): `cratis --Database PostgreSQL`, `MsSql`, or `SQLite`: the sample listing now shows registered items. Previously the query failed because the client still sent read models to a MongoDB sink the kernel did not have, and the app connected to a database and user that did not exist. The generated `appsettings.json` now sets `Cratis:Chronicle:DefaultSinkTypeId` to `SQL` and points `ConnectionStrings:Cratis` at `chronicle+<event store>`, the database Chronicle projects into
- **Templates** ([Release v1.7.2](https://github.com/Cratis/Templates/releases/tag/v1.7.2)): `cratis --Database SQLite` now keeps Chronicle's data in a `chronicle-data` folder in the project, so the backend can read the read models; it is listed in `.gitignore`
- **Templates** ([Release v1.7.2](https://github.com/Cratis/Templates/releases/tag/v1.7.2)): `cratis-aspire` with the default MongoDB database no longer stops at startup, and the backend now connects to the Chronicle container Aspire starts instead of `localhost:35000`
- **Templates** ([Release v1.7.2](https://github.com/Cratis/Templates/releases/tag/v1.7.2)): `cratis-aspire` with PostgreSQL, MsSql, or SQLite now starts Chronicle with the development client credentials the backend uses, waits for the database before starting Chronicle, and gives the backend its read-model database
- **Templates** ([Release v1.7.2](https://github.com/Cratis/Templates/releases/tag/v1.7.2)): `cratis-aspire` SQL variants no longer add `Cratis.Arc.MongoDB`, and pin `Cratis.Arc.EntityFrameworkCore` to the current release like the other Cratis packages
- **Templates** ([Release v1.7.2](https://github.com/Cratis/Templates/releases/tag/v1.7.2)): The sample `Listing` read model now records the event source id it is keyed by, which the listing page uses as its row key
- **Templates** ([Release v1.7.2](https://github.com/Cratis/Templates/releases/tag/v1.7.2)): Every template now produces a `.gitignore`; NuGet had been dropping it from the packages
- **Templates** ([Release v1.7.2](https://github.com/Cratis/Templates/releases/tag/v1.7.2)): `yarn build` no longer fails with Yarn 2 and later: the frontend templates include a `.yarnrc.yml` that sets `nodeLinker: node-modules`
- **Chronicle.TypeScript** ([Release v6.10.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.10.0)): `@setValue(Event, value)`, `.set(...).toValue(value)`, and constant keys now write their value to the read model. They previously sent a form the kernel did not apply, so the property kept its old value.
- **Chronicle.TypeScript** ([Release v6.10.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.10.0)): Read models with a `@nested` property, or a declarative `.nested(...)`, now register. The kernel previously failed registration with a `NullReferenceException`.
- **Chronicle.TypeScript** ([Release v6.10.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.10.0)): Read-model queries (`findInstanceById`, `getInstances`, snapshots, watches, and materialized reads) now return every property the model declares. Before, they only returned properties declared with `@field`. Nested plain classes, `ConceptAs` values, dates, and booleans are restored as their declared types.
- **Chronicle.TypeScript** ([Release v6.10.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.10.0)): With legacy decorators, an event whose properties are constructor parameters without default values, such as `constructor(readonly name: string)`, now registers with its property types. Before, it regist
- **Arc.TypeScript** ([Arc for TypeScript 0.30.2 — Chronicle live lists and late registration](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.2)): Live Chronicle read-model lists no longer contain an empty entry when observation starts. Arc ignores the kernel's subscription acknowledgment, which arrives as a change with no key. `@cratis/chronicle` 6.9.1 also filters it.
- **Arc.TypeScript** ([Arc for TypeScript 0.30.2 — Chronicle live lists and late registration](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.2)): Calling `withChronicle(...)` after `discover(...)` or `add(...)` now works. Before, command and query routes answered 500. An artifact observer added to the application builder now also receives the artifacts registered before it, in registration order.
- **AI** ([Release v7.0.1](https://github.com/Cratis/AI/releases/tag/v7.0.1)): The Decision Engine no longer restart-loops when many decisions arrive at once. Its liveness and readiness probes queued behind waiting decisions, missed their deadline, and got a busy engine killed as if it had died - so every caller fell back to its default for as long as the backlog lasted. The probes and `/metrics` now answer immediately however many decisions are waiting.
- **Chronicle.Elixir** ([Release v3.5.1](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.5.1)): **Projections map multi-word event fields.** Events are stored as camelCase JSON, but projection expressions sent atoms such as `:owner_name` as-is, so those fields were never set, with no error. Atom field references and key expressions are now sent as camelCase; a join's `on:` still names the read model property. Multi-word fields that the event and read model share are mapped automatically, following the kernel's own AutoMap rules: not for a `from` that only aggregates, never over an explicit mapping or a `no_auto_map` field, and never from an event field a join's explicit mapping already reads.
- **Chronicle.Elixir** ([Release v3.5.1](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.5.1)): **Boolean and float constants in projections work.** `set: [on_loan: true]` was sent as a field name and never applied. It is now sent as a constant, like integers already were.
- **Chronicle.Elixir** ([Release v3.5.1](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.5.1)): **Reducers register.** Every registration attempt failed with an `UndefinedFunctionError` for `Cratis.Chronicle.Contracts.Observation.Reducers.SinkDefinition`, so no reducer ever ran and its read model read as `{:ok, nil}`.
- **Chronicle.Elixir** ([Release v3.5.1](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.5.1)): **Constraints with `remove_constraint` register.** The releasing event type was sent in a form the contract can't encode. Because constraints register before read models and projections, one such constraint stopped the whole client fro
- **Stage** ([Release v4.18.0](https://github.com/Cratis/Stage/releases/tag/v4.18.0)): A model that declares event generations (Screenplay 4.34) now fails with `STAGE-EVENT-001`, naming the event, on every path that reads events from syntax, instead of rendering one generation's shape as if it were the current event. (#160)
- **Chronicle.TypeScript** ([Release v6.9.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.9.1)): `watch()` skips the kernel's subscription acknowledgment, as the .NET client does. Before, every new watch began with an empty changeset that had no key and no read model. Consumers that built lists from the changesets got an empty entry. Normal changes and removals are unaffected.
- **Arc** ([Release v22.23.2](https://github.com/Cratis/Arc/releases/tag/v22.23.2)): `CommandScenario<TCommand>` no longer replaces Arc's process-wide service provider. A host that runs in-process specs keeps resolving services from its own provider after a scenario is disposed, and overlapping scenarios no longer interfere with each other (#2763)
- **Chronicle** ([Release v19.7.0](https://github.com/Cratis/Chronicle/releases/tag/v19.7.0)): Jobs could not be written on PostgreSQL at all: the state column is `jsonb`, which refuses an implicit cast from `text`. Starting a job still reported success because the failure was inside the grain's write, so the kernel believed it had started work that never existed - a failed partition was never retried, and a redaction's replay never ran (fixed in `Cratis.Orleans` 1.10.1)
- **Chronicle** ([Release v19.7.0](https://github.com/Cratis/Chronicle/releases/tag/v19.7.0)): The SQL job storage shipped a context it could not create tables for, and the MongoDB one never registered the conventions its own queries assumed, so writes and reads disagreed on casing (fixed in `Cratis.Orleans` 1.6.1)
- **Templates** ([Release v1.7.1](https://github.com/Cratis/Templates/releases/tag/v1.7.1)): The generated READMEs gave the wrong frontend port: the Vite dev server runs on `http://localhost:9000`, not 5173, and `run.sh` in the Kotlin and Java templates now prints the right port
- **Templates** ([Release v1.7.1](https://github.com/Cratis/Templates/releases/tag/v1.7.1)): The documentation pointed to `dotnet new cratis-kotlin` and `dotnet new cratis-java`, which do not exist. The command is `dotnet new cratis --language Kotlin` or `--language Java`, and `Cratis.Templates` already includes both
- **Templates** ([Release v1.7.1](https://github.com/Cratis/Templates/releases/tag/v1.7.1)): The documentation stated fixed versions for the Kotlin and Java templates (Arc 7.2.0 with Chronicle 4.0.0), but those templates resolve the latest Cratis release when they build
- **Templates** ([Release v1.7.1](https://github.com/Cratis/Templates/releases/tag/v1.7.1)): `cratis new` examples now include the required `--language` option
- **Templates** ([Release v1.7.1](https://github.com/Cratis/Templates/releases/tag/v1.7.1)): The TypeScript command example in the web template documentation now compiles against the generated proxy
- **Templates** ([Release v1.7.1](https://github.com/Cratis/Templates/releases/tag/v1.7.1)): The Aspire template README gave a fixed dashboard address; Aspire prints a dashboard link with a login token and a different port each run
- **Templates** ([Release v1.7.1](https://github.com/Cratis/Templates/releases/tag/v1.7.1)): Links in the generated READMEs that pointed to retired `cratis.io/docs/...` pages now point to the current Arc, Chronicle, and template documentation
- **Templates** ([Release v1.7.1](https://github.com/Cratis/Templates/releases/tag/v1.7.1)): The AI setup table listed the wrong profile for the Java template; it uses `cratis/application/java`
- **Templates** ([Release v1.7.1](https://github.com/Cratis/Templates/releases/tag/v1.7.1)): The generated READMEs and documentation now describe known problems in the templates:
- **Templates** ([Release v1.7.1](https://github.com/Cratis/Templates/releases/tag/v1.7.1)): With the Yarn 2+ default Plug'n'Play mode, `yarn build` fails. Add `nodeLinker: node-modules` to fix it
- **Templates** ([Release v1.7.1](https://github.com/Cratis/Templates/releases/tag/v1.7.1)): The default MongoDB variant of `cratis-aspire` stops at startup
- **Templates** ([Release v1.7.1](https://github.com/Cratis/Templates/releases/tag/v1.7.1)): Read-model queries fail in the PostgreSQL variant of `cratis`
- **Templates** ([Release v1.7.1](https://github.com/Cratis/Templates/releases/tag/v1.7.1)): The `cratis-aspire` SQL variants keep `Cratis.Arc.EntityFrameworkCore` unpinned
- **Arc.TypeScript** ([Arc for TypeScript 0.30.1 — identity, tenancy and authorization paired with .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.30.1)): The client manifest now lists roles from nested authorization requirements, such as stacked role declarations. Enforcement was already correct.
- **Chronicle.TypeScript** ([Release v6.8.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.8.0)): Two `@constraint` classes with the same id now fail at registration. Before, the last one silently replaced the first.
- **Chronicle.TypeScript** ([Release v6.8.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.8.0)): Merging same-named constraints with conflicting scopes or ignore-casing settings now fails with a clear error.
- **Chronicle.TypeScript** ([Release v6.8.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.8.0)): The first message supplied among same-named unique event type declarations is kept.
- **Chronicle.TypeScript** ([Release v6.8.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.8.0)): A `$` in a violation value is inserted literally into the message.
- **Arc** ([Release v22.23.1](https://github.com/Cratis/Arc/releases/tag/v22.23.1)): An `EventForEventSourceId` returned from a command now keeps its `Occurred` and `Tags` when appended, for a single wrapper, a collection or mixed collection of wrappers, and `EventsWithConcurrencyScopes`, on both the transactional and the immediate append path. Previously both values were silently dropped, so imported or backfilled events were recorded with the append time and without their per-event tags (#2570)
- **cli** ([Release v3.19.0](https://github.com/Cratis/cli/releases/tag/v3.19.0)): `clear-quarantine` failed against every kernel it was ever pointed at: it resolved its contract method by reflection, which cannot see explicitly implemented interface members, and the generated client implements the contract explicitly. It now calls the contract method directly (#185)
- **cli** ([Release v3.19.0](https://github.com/Cratis/cli/releases/tag/v3.19.0)): `retry-partition` reported that a retry had started regardless of what the kernel actually did. It now reads the outcome the kernel reports and exits non-zero when the observer or the partition is quarantined, or the partition was not among the observer's failures, instead of leaving the impression that recovery was under way (#186)
- **Arc.TypeScript** ([Arc for TypeScript 0.29.0 — query paging, sorting and QUERY bodies like .NET](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.29.0)): An unpaged request to a MongoDB or Drizzle query that needs paging no longer fails with a 500. It returns the complete result, up to the provider's maximum page size. Arc on .NET returns every row; this bound is a documented deliberate difference.
- **Chronicle** ([Release v19.6.1](https://github.com/Cratis/Chronicle/releases/tag/v19.6.1)): Restored the Chronicle release pipeline: adding `IObservers Observers` to `IEventStore` as a required member broke the actual publish, because an existing external implementation of `IEventStore` (Arc's `CommandScenario` test harness) was compiled against the interface before this member existed, and does not have it. A type that implements an interface has to implement all of it, or the runtime refuses to load it before any of its own code runs — which is exactly what happened when the release pipeline tried to start Chronicle 19.5.0 beside the currently published Arc packages.
- **Chronicle** ([Release v19.6.1](https://github.com/Cratis/Chronicle/releases/tag/v19.6.1)): `Observers` is now an optional interface member with a default implementation that throws `ObserversNotSupported`, the same shape `IPatterns Patterns`/`PatternsNotSupported` already use on this interface for the identical reason. Every real implementation continues to provide it explicitly and is unaffected.
- **AI** ([Release v6.3.2](https://github.com/Cratis/AI/releases/tag/v6.3.2)): The Decision Engine no longer answers the first decision after an idle spell in seconds instead of milliseconds. Model weights are now held in process memory instead of memory-mapped page cache the node could reclaim, and a warm-up decision is scored before `/readyz` reports ready, so a ready pod stays at full speed for as long as it runs.
- **Chronicle** ([Release v19.6.0](https://github.com/Cratis/Chronicle/releases/tag/v19.6.0)): CHR0024 no longer reports a `[Nested]` projection object as having no mapping source. The attribute was missing from the analyzer's set of recognized mapping attributes, so every nested object was reported as one that would never be populated (#4175)
- **Chronicle** ([Release v19.6.0](https://github.com/Cratis/Chronicle/releases/tag/v19.6.0)): CHR0024 no longer reports the properties of a `[ChildrenFrom<TEvent>]` child record as unmapped. The events that populate a child are named by its parent, but the child was judged against only its own attributes and so against an empty set of subscribed events (#4176)
- **AI** ([Release v6.3.1](https://github.com/Cratis/AI/releases/tag/v6.3.1)): The provider `Configuring` namespace is now reachable from the package root as `import { Configuring } from '@cratis/ai'`. It was left out of the barrel because its command names collide with those in `Adding`, `Reconfiguring`, `Removing` and `Renaming`, with a comment directing consumers to import it by path — but the package's `exports` map exposes only the root entry, so no deep path resolves and the namespace could not be reached at all. It goes out under its own namespace, which carries it without reintroducing the ambiguity
- **Chronicle.TypeScript** ([Release v6.7.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.7.1)): An inferred variant read model now uses the model's own members when its shared-handler mappings are validated.
- **AI** ([Release v6.3.0](https://github.com/Cratis/AI/releases/tag/v6.3.0)): Removed the advice that `reads` plus `concurrency` protects a decision. The executable model rejects both (`PLAY0271`).
- **AI** ([Release v6.3.0](https://github.com/Cratis/AI/releases/tag/v6.3.0)): Removed the projection-level `key` from the examples. It routes nothing (`PLAY0381`).
- **AI** ([Release v6.3.0](https://github.com/Cratis/AI/releases/tag/v6.3.0)): Binding no longer implies the reference runner will run a model. The skills list the projection constructs the reference execution plan refuses: a projection-level `remove via join`, `all` beside removals, `children` or `nested`, `join`/`children`/`remove via join` inside `nested`, and event-context values other than the event source identity. One of these stops every specification in the
- **Arc.TypeScript** ([Arc for TypeScript 0.26.1 — standalone host peer addresses](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.26.1)): The standalone host (`app.run()`, `runArc` and `createArcNodeHandler`) now passes each request's socket peer address to Arc. Before, two things went wrong for anonymous callers:
- **Arc.TypeScript** ([Arc for TypeScript 0.26.1 — standalone host peer addresses](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.26.1)): All of them in a tenant shared one per-caller connection budget.
- **Arc.TypeScript** ([Arc for TypeScript 0.26.1 — standalone host peer addresses](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.26.1)): SSE hub control requests were not tied to the address that opened the stream.
- **Screenplay** ([Release v4.32.0](https://github.com/Cratis/Screenplay/releases/tag/v4.32.0)): `find-assertion-gaps` no longer reports a slice whose only assertion is `then denied` as unasserted.
- **Screenplay** ([Release v4.32.0](https://github.com/Cratis/Screenplay/releases/tag/v4.32.0)): References and dependencies to an appended event are labelled `whenAppendedEvent` instead of `thenEvent`.
- **Screenplay** ([Release v4.32.0](https://github.com/Cratis/Screenplay/releases/tag/v4.32.0)): The server's initialize instructions say identities persist when a proposal is applied; `export-workspace` is optional, for transfer or backup.
- **Stage** ([Release v4.16.2](https://github.com/Cratis/Stage/releases/tag/v4.16.2)): Stage's in-memory runtime and specification executor report an opaque policy they reach as unsupported instead of allowing or denying it, following authored order: a portable operand that decides first still decides (Screenplay decision 0005).
- **Stage** ([Release v4.16.2](https://github.com/Cratis/Stage/releases/tag/v4.16.2)): An unsupported authorization result is no longer replaced by a contract rejection when the command payload fails to bind.
- **Arc.TypeScript** ([Arc for TypeScript 0.25.0 — kernel-backed Chronicle tests and read consistency](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.25.0)): A `@subject()` field or a `getEventSourceId()` result holding a `Guid` or a concept is converted to its string form instead of being ignored or failing the command.
- **Arc.TypeScript** ([Arc for TypeScript 0.25.0 — kernel-backed Chronicle tests and read consistency](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.25.0)): The causation chain records concept, `Guid`, `Date`, `DateOnly`, `TimeOnly` and `TimeSpan` command fields, not only strings, numbers and booleans.
- **Arc.TypeScript** ([Arc for TypeScript 0.24.1 — anonymous live queries over SSE](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.24.1)): Live queries work for anonymous callers over the SSE hub, the transport the `@cratis/arc.react` `<Arc>` provider uses by default, as they do with Arc on .NET. Previously the SSE hub accepted only authenticated callers, so observable queries in anonymous applications stayed empty unless the client switched to WebSockets.
- **Arc.TypeScript** ([Arc for TypeScript 0.24.0 — Core namespaces and clean builds](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.24.0)): A clean build of the repository no longer fails on the Chronicle testing scenario's builder typing.
- **Arc.TypeScript** ([Arc for TypeScript 0.24.0 — Core namespaces and clean builds](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.24.0)): The repository builds and passes its full gate from a fresh checkout on Linux and Node.js 22, and pull requests run it in hosted CI.
- **Arc.TypeScript** ([Arc for TypeScript 0.21.1 — proxy response types](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.21.1)): Generated command proxies no longer declare Chronicle events, event wrappers, aggregate commit results or command operations returned from `handle()` as the command response. The response is the one value the server sends back, or `void` when every returned value is handled on the server, as with Arc on .NET.
- **Arc.TypeScript** ([Arc for TypeScript 0.18.1 — package contents](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.18.1)): `@cratis/arc.core`'s type declarations no longer require RxJS, which is an optional peer dependency.
- **Arc.TypeScript** ([Arc for TypeScript 0.18.1 — package contents](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.18.1)): Published packages no longer include test helpers, specifications or build metadata.
- **Arc.TypeScript** ([Arc for TypeScript 0.18.1 — package contents](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.18.1)): `@cratis/arc.chronicle/testing` declares the Chronicle SDK version range it actually requires.
- **AI** ([Release v6.2.0](https://github.com/Cratis/AI/releases/tag/v6.2.0)): Twenty-eight generated proxy folders were unreachable from `@cratis/ai`. Agents, skills, provider pools, model discovery, tier mapping, Codex, Copilot, rate limiting and usage snapshots all generate proxies, but the package root's hand-maintained barrel had no export line for them, so importing any of them failed as a missing export rather than as a build error.
- **Orleans** ([Release v1.6.1](https://github.com/Cratis/Orleans/releases/tag/v1.6.1)): The new `Orleans.Storage.Sql.Specs` project was multi-targeted along with everything else, but the provider it specifies is `net10.0` only because EF Core 10 is. Restore failed with `NU1201` on a project reference that cannot resolve for `net8.0`/`net9.0`. It now carries the same `IsPackaging` condition the provider itself uses.
- **Orleans** ([Release v1.6.1](https://github.com/Cratis/Orleans/releases/tag/v1.6.1)): `ConventionPacks` used `System.Threading.Lock`, which does not exist on `net8.0`. Now a plain `object`, with the reason recorded next to it.
- **Orleans** ([Release v1.6.0](https://github.com/Cratis/Orleans/releases/tag/v1.6.0)): SQL jobs storage now creates its own schema. The provider shipped a `JobsDbContext` with no migrations, and nothing else in the package created the tables, so provisioning silently fell to whoever consumed it - and a consumer that did not know to do it got a database where every job read and write failed with `relation "Jobs" does not exist`. A `v1_0_0` migration creates `Jobs` and `JobSteps`, and `SqlJobsStorage.GetFor` applies it before handing back storage. The column helpers come from `Cratis.Arc.EntityFrameworkCore`, so one migration is valid across SQL Server, PostgreSQL and SQLite.
- **Orleans** ([Release v1.6.0](https://github.com/Cratis/Orleans/releases/tag/v1.6.0)): MongoDB jobs storage now registers its own convention pack. It declared one by implementing `ICanProvideMongoDBConventionPacks`, but nothing ever called `Provide()`, so state serialized with Pascal-case element names while every filter was written against camel case - including the composite `_id`. No filter matched: reads returned empty and upserts were rejected for altering an immutable `_id`. A failed job step was written and then could not be found, which is indistinguishable from a job that never had steps.
- **Orleans** ([Release v1.6.0](https://github.com/Cratis/Orleans/releases/tag/v1.6.0)): Job and job step state are read back as their base types, but what is written is the consumer's own subclass. The first extra property made the read throw, so a job authored the way the documentation shows could never have its steps read. `IgnoreExtraElementsConvention` added to the same pack.
- **Chronicle.TypeScript** ([Release v6.5.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.5.1)): `readModels.findInstanceById` returns `null` when the Kernel answers a missing read model with a JSON `null` document, instead of throwing.
- **Screenplay** ([Release v4.29.0](https://github.com/Cratis/Screenplay/releases/tag/v4.29.0)): A command or query with two or more `authorize` lines kept only the last one, so every earlier gate was silently dropped. The lines now combine with AND in authored order, as module and feature gates already did and as the documentation states. Printing writes them as one `authorize A and B` line. This makes such commands and queries stricter.
- **Screenplay** ([Release v4.29.0](https://github.com/Cratis/Screenplay/releases/tag/v4.29.0)): A policy with two `require` lines silently kept only the last condition. This is now PLAY0441.
- **Screenplay** ([Release v4.29.0](https://github.com/Cratis/Screenplay/releases/tag/v4.29.0)): A policy combining `require` with code bound only the code and dropped the condition once policies with code were admitted; this is now PLAY0440 at parse time.
- **Arc.TypeScript** ([Arc for TypeScript 0.8.0 — MongoDB integration](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.8.0)): `MongoReadModels.queryPage` applies Arc's requested sort before the application's own sort, so the order it reports is the order it returns.
- **Arc.TypeScript** ([Arc for TypeScript 0.6.0 — proxies from TypeScript source](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.6.0)): Documentation no longer states that model-bound commands and queries cannot be turned into client proxies.
- **Chronicle.TypeScript** ([Release v6.5.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.5.0)): `appendMany` sends every supplied concurrency scope label, not only the scopes derived from the events' event source ids.
- **Chronicle.TypeScript** ([Release v6.5.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.5.0)): An event store now uses the `clientArtifactsProvider` configured in `ChronicleOptions` instead of always using the default artifact discovery.
- **Chronicle.TypeScript** ([Release v6.5.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.5.0)): Causation links added while appending no longer leak into sibling operations.
- **Fundamentals** ([Release v7.19.6](https://github.com/Cratis/Fundamentals/releases/tag/v7.19.6)): TypeScript projects that use `"moduleResolution": "NodeNext"` (Node.js ESM servers and libraries) can now import `@cratis/fundamentals` and its `geospatial`, `json` and `reflection` subpaths with full type checking. The published declarations use resolvable `.js` import paths, and each entry point resolves the ESM or CommonJS declarations that match the module format being loaded.
- **Stage** ([Release v4.7.1](https://github.com/Cratis/Stage/releases/tag/v4.7.1)): A generated application's event store data now survives `docker compose down` and `up`, container recreation and regenerating the application into the same folder. The generated `docker-compose.yml` keeps the development Chronicle image's MongoDB data in the named volumes `chronicle-data` and `chronicle-config`; before, it used anonymous volumes and a recreated container started from an empty store. Only `docker compose down --volumes` deletes the data. (part of #100)
- **Stage** ([Release v4.7.0](https://github.com/Cratis/Stage/releases/tag/v4.7.0)): The legacy syntax renderer no longer renders `[AllowAnonymous]` for a command or query that inherits `authorize` from its module or feature. It now fails with `AuthorizationCannotBeRendered`.
- **Screenplay** ([Release v4.27.0](https://github.com/Cratis/Screenplay/releases/tag/v4.27.0)): An ESM v3 model (released in v4.26.0 for reducers with a body) lost v2 execution semantics: produced facts carried no event-source context, so `then <Event> for …` assertions failed, and a mismatched typed `when … for` was not rejected. v3 models now execute with all v2 semantics, as documented.
- **Components** ([Release v4.14.0](https://github.com/Cratis/Components/releases/tag/v4.14.0)): The column filter trigger rendered `U+2315 TELEPHONE RECORDER` in a `span` at the ambient font size, so it showed as a tiny mark that does not read as a filter. It is now a funnel SVG sized against the header row.
- **Arc.TypeScript** ([Arc for TypeScript 0.4.1 — observable hosting fixes](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.4.1)): Closing an SSE hub connection while a subscription is still opening no longer crashes the process with an unhandled rejection after the shutdown timeout.
- **Arc.TypeScript** ([Arc for TypeScript 0.4.1 — observable hosting fixes](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.4.1)): `mountFastifyWebSockets` no longer hides boot errors from plugins registered before it, so a Fastify app whose authentication plugin fails to load no longer starts serving. The mount now also works whether `@fastify/websocket` is registered before or after it.
- **Arc.TypeScript** ([Arc for TypeScript 0.4.1 — observable hosting fixes](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.4.1)): The standalone host (`runArc`) now applies its `native` callback to WebSocket upgrades too, so host-authenticated principals, the request authority and the remote address are the same over WebSocket as over HTTP.
- **Arc.TypeScript** ([Arc for TypeScript 0.4.1 — observable hosting fixes](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.4.1)): `runArc`'s `close()` stops accepting connections first and finishes within its timeout, even when a direct WebSocket query never finishes opening.
- **Arc.TypeScript** ([Arc for TypeScript 0.4.1 — observable hosting fixes](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.4.1)): Oversized inbound WebSocket frames are rejected with close code 1009 even when the app shares its own `@fastify/websocket` or `@hono/node-ws` server with Arc.
- **Arc.TypeScript** ([Arc for TypeScript 0.4.1 — observable hosting fixes](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.4.1)): Upgrade sockets for paths that belong to another handler are left to that handler.
- **Chronicle** ([Release v19.4.8](https://github.com/Cratis/Chronicle/releases/tag/v19.4.8)): `Cratis.Chronicle` now carries `Cratis.Chronicle.CodeAnalysis` as a package dependency, so a consumer actually receives the CHR analyzers. The analyzer project packed itself while setting `DevelopmentDependency`, which NuGet reads as "never emit me as a dependency" — so the client's nuspec never mentioned it and a consumer had to know the package existed and reference it by hand. The package identity moves into a package-only project the client can depend on, the same shape `Cratis.Arc.Chronicle` already uses for its ARCCHR analyzers.
- **Orleans** ([Release v1.5.0](https://github.com/Cratis/Orleans/releases/tag/v1.5.0)): `IJobsManager.Resume` reports whether the job was actually taken forward. Resuming is allowed to refuse - the job was never prepared, or its owner is no longer interested - and `Resume` computed that refusal, logged it, and returned `void`, so a caller could not tell a refusal from a resume. Nothing takes a refused job: it stays `Stopped`, so it will not run, will not finalize, and will never report back, and a caller that treats that as success waits forever for something that is not coming.
- **Stage** ([Release v4.6.2](https://github.com/Cratis/Stage/releases/tag/v4.6.2)): A command in the sandbox runtime no longer reports success when Chronicle rejects its events. A constraint violation now fails the command with the constraint's name and message as a validation failure. A schema rejection or any other append error fails it with an error. Before, the rejection was only logged, so nothing was appended and read models stayed empty while the command said it had succeeded. (#10)
- **Stage** ([Release v4.6.2](https://github.com/Cratis/Stage/releases/tag/v4.6.2)): `$context.tenant` and `$context.causedBy.subject`, `.name` and `.userName` in produced event mappings now resolve to the current tenant and caller. A produced mapping the runtime cannot resolve now fails the command instead of being dropped from the event. (#10)
- **Fundamentals** ([Release v7.19.5](https://github.com/Cratis/Fundamentals/releases/tag/v7.19.5)): `JsonSerializer.deserialize` now fills arrays declared as `@field(Array, { genericArguments: [ItemType] })`, the form standard-decorator code uses. Items are deserialized as `ItemType`, including concepts and nested models; before, such an array came back empty.
- **Fundamentals** ([Release v7.19.5](https://github.com/Cratis/Fundamentals/releases/tag/v7.19.5)): A concept that declares `static readonly valueType` (for example `Guid`) now receives its value converted to that type, so a `ConceptAs<Guid>` holds a `Guid` instead of a string.
- **Fundamentals** ([Release v7.19.5](https://github.com/Cratis/Fundamentals/releases/tag/v7.19.5)): Falsy payload values (`""`, `0`, `false`) are deserialized through their field type, so a concept field holding an empty string or zero is wrapped in its concept like any other value.
- **Screenplay** ([Release v4.24.2](https://github.com/Cratis/Screenplay/releases/tag/v4.24.2)): A specification that uses a read model with no keyed query in `given readmodel` or `then readmodel` no longer reports a second error, "must state its identifier property ''", at every block. The one error where the read model is declared, which says why it cannot be identified, remains.
- **Screenplay** ([Release v4.24.1](https://github.com/Cratis/Screenplay/releases/tag/v4.24.1)): An MCP apply that renames a document only by case now succeeds and leaves the file with the new casing on disk. A destination is allowed only when it is the same on-disk entry as the document being moved away. A different file whose name differs only by case is still refused, and a failed case-only rename rolls back to the original name.
- **Chronicle.TypeScript** ([Release v6.4.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.4.0)): Member-less events and read models work in standard mode.
- **Chronicle.TypeScript** ([Release v6.4.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.4.0)): An explicit `@field(Object)` keeps its object schema, and concepts and Guids are recognized across duplicate `@cratis/fundamentals` copies.
- **Stage** ([Release v4.5.0](https://github.com/Cratis/Stage/releases/tag/v4.5.0)): State the payment summary identifier in the Billing sample's payment-list specification. Screenplay now requires it (`PLAY0351`). (#124)
- **Orleans** ([Release v1.4.2](https://github.com/Cratis/Orleans/releases/tag/v1.4.2)): `NullJob` collided with Chronicle's `NullJob` the same way `JobsManager` did, so a silo referencing both libraries still could not start
- **Chronicle.TypeScript** ([Release v6.3.2](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.3.2)): Load `@cratis/chronicle` and every exported subpath directly in Node.js ESM without a bundler. Published JavaScript and declaration files now use explicit `.js` file specifiers, and each build verifies the packed package imports natively.
- **Chronicle.TypeScript** ([Release v6.3.2](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.3.2)): Preserve constraint violations and errors when a batch append is rejected before sequence numbers are assigned, so a rejected batch no longer reports an empty result set.
- **Orleans** ([Release v1.4.1](https://github.com/Cratis/Orleans/releases/tag/v1.4.1)): A silo referencing both `Cratis.Orleans` and `Cratis.Chronicle` could not start, because both ship a `JobsManager` grain and Orleans gave them the same derived grain type name (#16)
- **Screenplay** ([Release v4.20.0](https://github.com/Cratis/Screenplay/releases/tag/v4.20.0)): A preserved comment stays with its own declaration, even when two declarations in the same scope print identical lines (#229)
- **Chronicle** ([Release v19.4.7](https://github.com/Cratis/Chronicle/releases/tag/v19.4.7)): An observer whose stopped catch-up job refused to resume was left believing catch-up was under way — dropping every live event, never advancing, and eventually quarantined for a strand it could not escape
- **Arc** ([Release v22.23.0](https://github.com/Cratis/Arc/releases/tag/v22.23.0)): Observable streams retain their identity and service lifetime through in-flight emissions, including disconnects and failing cancellation or disposal callbacks.
- **Arc** ([Release v22.23.0](https://github.com/Cratis/Arc/releases/tag/v22.23.0)): Authorization diagnostics now describe contradictory attributes accurately; ARC0021 is limited to authentication schemes without Arc’s ASP.NET Core integration.
- **Arc.Kotlin** ([Release v7.6.0](https://github.com/Cratis/Arc.Kotlin/releases/tag/v7.6.0)): Corrected the parity reference: Arc .NET rejects contradictory authorization attributes in either evaluator order, and its generated proxies support XML documentation comments.
- **Stage** ([Release v4.2.0](https://github.com/Cratis/Stage/releases/tag/v4.2.0)): Bind Chronicle’s lowercase read-model identity for live by-id queries while preserving modeled `Id` and `ID` fields. Normalize numeric, boolean, and composite identities for consistent readback. (#10)
- **Stage** ([Release v4.1.0](https://github.com/Cratis/Stage/releases/tag/v4.1.0)): Reject unsupported ESM kinds and value combinations with a typed diagnostic and no candidate artifacts, instead of emitting placeholder types, default values, or silently omitting slices. (#123)
- **Stage** ([Release v4.1.0](https://github.com/Cratis/Stage/releases/tag/v4.1.0)): Preserve Chronicle projection mapping replacement, recursive child mappings, and auto-map inheritance. Legacy rendering now fails when it cannot preserve the modeled projection rather than producing incomplete code. This does not add support for new ESM constructs. (#125)
- **Stage** ([Release v4.1.0](https://github.com/Cratis/Stage/releases/tag/v4.1.0)): Reject ambiguous runtime projection keys before startup or remote registration, preventing keys from silently resolving to an unrelated value.
- **Stage** ([Release v4.1.0](https://github.com/Cratis/Stage/releases/tag/v4.1.0)): Correct the Billing sample’s customer-name and cancellation fields, validate issuance against the invoice’s read state, and replace its empty state reducer with a projection. (#124)
- **Screenplay** ([Release v4.18.0](https://github.com/Cratis/Screenplay/releases/tag/v4.18.0)): An `import` of a declaration from the same application no longer hides consistency diagnostics (#208)
- **Screenplay** ([Release v4.18.0](https://github.com/Cratis/Screenplay/releases/tag/v4.18.0)): A dotted path that continues past a scalar, concept or enum field is reported (`PLAY0282`/`PLAY0287`) instead of compiling silently (#201)
- **Chronicle.TypeScript** ([Release v6.3.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.3.1)): Repeated `removedWith()` calls on a unique property constraint now retain every distinct release event, so any declared event can free the value instead of only the last one (#77).
- **Chronicle.TypeScript** ([Release v6.3.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.3.1)): Unique event-type release examples now explicitly state that the TypeScript client does not support that workflow, rather than demonstrating a constraint that enforced nothing.
- **AI** ([Release v3.3.1](https://github.com/Cratis/AI/releases/tag/v3.3.1)): Cratis corpus agents inherit the model selected for the session instead of overriding it with outdated Claude model IDs, in every harness. (#396)
- **AI** ([Release v3.3.1](https://github.com/Cratis/AI/releases/tag/v3.3.1)): Pi no longer offers two delegation tools when another extension already provides `Agent` (such as pi-subagents, which reads the same `.pi/agents`): the Cratis `subagent` tool stands down for that session and says so once. Without such a tool it works as before.
- **Chronicle** ([Release v19.4.6](https://github.com/Cratis/Chronicle/releases/tag/v19.4.6)): A failed partition is now retried within the retry interval even if the first retry reminder tick is lost. Previously the next attempt could be deferred by the 48-hour reminder period. (#4113)
- **Chronicle** ([Release v19.4.6](https://github.com/Cratis/Chronicle/releases/tag/v19.4.6)): SQL storage (PostgreSQL, SQL Server, SQLite) now loads and refreshes reminders from storage correctly. Range reads follow the Orleans reminder table contract, and reminders stored by earlier versions are rehashed on startup. (#4113)
- **Chronicle** ([Release v19.4.6](https://github.com/Cratis/Chronicle/releases/tag/v19.4.6)): The SQL reminder table now returns the stored ETag when a reminder is registered, and returns nothing instead of failing when a reminder does not exist. (#4113)
- **Chronicle** ([Release v19.4.5](https://github.com/Cratis/Chronicle/releases/tag/v19.4.5)): A projection whose children use a constant parent key now applies every event to them, not just the ones that create them. Previously, when the root carried event types of its own, later events for an existing child were dropped: a fixed-key document counting things kept an accurate root total while updates and removals to its children went nowhere, so a count of what was still open kept counting things that had closed. Creations still landed, so the document looked healthy. (#4105)
- **Chronicle** ([Release v19.4.5](https://github.com/Cratis/Chronicle/releases/tag/v19.4.5)): A projection can now combine a root-level constant key with constant-parent-key children in one read model. It previously failed to resolve the child's parent, forcing the total and the membership set into separate read models. (#4099)
- **Chronicle** ([Release v19.4.4](https://github.com/Cratis/Chronicle/releases/tag/v19.4.4)): Seeding a projection-backed `ReadModelScenario` with an initial state containing a nonempty `JsonObject` no longer crashes the test host with a stack overflow (#3993)
- **Chronicle.Mcp** ([Release v1.4.0](https://github.com/Cratis/Chronicle.Mcp/releases/tag/v1.4.0)): Merges to `main` publish again. The publish trigger's path filter matched only a file named `main`, so no labeled merge since the switch to releasing on push (#20) produced a release.
- **AuthProxy** ([Release v2.22.3](https://github.com/Cratis/AuthProxy/releases/tag/v2.22.3)): The 43 `<c>` elements in XML documentation that had no language attribute now declare `language="text"`, matching the rest of the codebase and keeping MA0219 clean.
- **Fundamentals** ([Release v7.19.4](https://github.com/Cratis/Fundamentals/releases/tag/v7.19.4)): API documentation uses the standard `@public` tag instead of `@export`, and the decorator context types are marked `@inline`.
- **Fundamentals** ([Release v7.19.4](https://github.com/Cratis/Fundamentals/releases/tag/v7.19.4)): References to `Date` link to its MDN page, so they resolve in the generated API documentation.
- **Fundamentals** ([Release v7.19.4](https://github.com/Cratis/Fundamentals/releases/tag/v7.19.4)): Remove a stale lint suppression and add the blank lines the markdown lint expects.
- **Arc** ([Release v22.21.0](https://github.com/Cratis/Arc/releases/tag/v22.21.0)): The authorization attribute evaluator specs could not fail: a null-conditional assertion skipped the assertion whenever the evaluator found nothing
- **AI** ([Release v3.2.1](https://github.com/Cratis/AI/releases/tag/v3.2.1)): The Decision Engine image did not build at all
- **Chronicle** ([Release v19.4.3](https://github.com/Cratis/Chronicle/releases/tag/v19.4.3)): An observer could be left permanently believing it was preparing catch-up — dropping every live event, never advancing, and eventually quarantined — when its catch-up job concluded without having prepared steps of its own
- **Chronicle** ([Release v19.4.3](https://github.com/Cratis/Chronicle/releases/tag/v19.4.3)): a job that was already running,
- **Chronicle** ([Release v19.4.3](https://github.com/Cratis/Chronicle/releases/tag/v19.4.3)): a stopped job that was merely resumed,
- **Chronicle** ([Release v19.4.3](https://github.com/Cratis/Chronicle/releases/tag/v19.4.3)): a job found with every step already completed, which is finalized rather than resumed.
- **cli** ([Release v3.13.2](https://github.com/Cratis/cli/releases/tag/v3.13.2)): The `<READ_MODEL>` argument is described as the read model identifier and names the column to read it from, matching what the commands actually send.
- **cli** ([Release v3.13.2](https://github.com/Cratis/cli/releases/tag/v3.13.2)): No behaviour change: the wire value was always `ReadModelIdentifier`. This aligns the `[Description]`, the `[LlmOption]` metadata and the settings doc comment with it.
- **cli** ([Release v3.13.2](https://github.com/Cratis/cli/releases/tag/v3.13.2)): The server side of the same mistake is fixed separately in Cratis/Chronicle `fix/read-model-lookup-miss-guard`, which turns the resulting `NullReferenceException` into a meaningful error. The two are independent; either can merge first.
- **cli** ([Release v3.13.2](https://github.com/Cratis/cli/releases/tag/v3.13.2)): `GetReadModelInstancesCommand` catches an RPC error whose detail contains `"NullReferenceException"` and reports it as "read model is client-owned". That was papering over the server defect above and is the wrong explanation for an unknown identifier — worth re-scoping once the Chronicle fix ships. Left untouched here.
- **cli** ([Release v3.13.2](https://github.com/Cratis/cli/releases/tag/v3.13.2)): `read-models occurrences` uses a different argument name (`<READ_MODEL_TYPE>`) and may be worth a consistency pass.
- **cli** ([Release v3.13.2](https://github.com/Cratis/cli/releases/tag/v3.13.2)): New spec asserts the description says identifier, does not say container name, and names the `Identifier` column that `ListReadModelsCommand` prints — so help text and wire payload cannot drift apart again.
- **cli** ([Release v3.13.2](https://github.com/Cratis/cli/releases/tag/v3.13.2)): `Cli.Specs`: 1,111 tests passing.
- **Arc** ([Release v22.19.2](https://github.com/Cratis/Arc/releases/tag/v22.19.2)): A read model injected into a command's `Handle()`, `Provide()`, or a `CommandValidator<T>` is now released (its `[PII]`/`[Encrypted]` properties decrypted) regardless of whether the *command* declares a `Subject`/`[Subject]`/`ICanProvideSubject` — most commands rely on Chronicle's implicit event-source-id subject fallback instead, which was never checked, so release was silently skipped for the common case independent of what the injected read model actually carried
- **Arc** ([Release v22.19.2](https://github.com/Cratis/Arc/releases/tag/v22.19.2)): A namespace- or global-scoped `[Encrypted]` value (Cratis/Chronicle#4095) now reaches release correctly even on a read model that has no `Id`/`[Subject]` at all — the ordinary shape for that kind of value, since its key does not depend on a subject
- **Chronicle** ([Release v19.4.2](https://github.com/Cratis/Chronicle/releases/tag/v19.4.2)): `IReadModels.Release` no longer skips a namespace- or global-scoped `[Encrypted]` value on a read model that has no resolvable subject (no `[Subject]` property and no `Id` property) — that scope's key does not depend on a subject at all, and a read model carrying only that kind of value ordinarily has no subject-identifying property in the first place (Cratis/Chronicle#4095)
- **Chronicle.Elixir** ([Release v3.5.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v3.5.0)): `Chronicle.Connections.AppendCompatibility`'s announced protocol version was still pinned to `19.0.1` while `mix.lock` had already moved to `19.3.2`
- **Chronicle** ([Release v19.4.1](https://github.com/Cratis/Chronicle/releases/tag/v19.4.1)): A kernel with a large artifact set could no longer start. Registering projections awaited a reconciliation pass whose cost scales with projections × namespaces, inside the caller's response timeout, so every registration timed out and the silo never became ready. Registration now schedules that pass instead of awaiting it. (#4088)
- **AI** ([Release v3.1.1](https://github.com/Cratis/AI/releases/tag/v3.1.1)): New documentation pages are again added to the product's `toc.yml`, so they no longer silently drop out of the sidebar.
- **AI** ([Release v3.1.1](https://github.com/Cratis/AI/releases/tag/v3.1.1)): Writing guidance no longer asks authors to hand-maintain page edit links that the documentation site now generates.
- **Stage** ([Release v3.22.0](https://github.com/Cratis/Stage/releases/tag/v3.22.0)): Include the component stylesheet and its font assets in generated frontend bundles. (#100)
- **Screenplay** ([Release v4.15.0](https://github.com/Cratis/Screenplay/releases/tag/v4.15.0)): Diagnose invalid validation targets, incompatible read keys, unpopulated child fields, inconsistent specification outcomes, undeclared enum values, and unknown event fields. (#201)
- **Screenplay** ([Release v4.15.0](https://github.com/Cratis/Screenplay/releases/tag/v4.15.0)): Preserve module forms and module/feature contributions exactly once when expanding and merging model folders. (#202)
- **Screenplay** ([Release v4.15.0](https://github.com/Cratis/Screenplay/releases/tag/v4.15.0)): Report unsupported query-key combinations as diagnostics instead of throwing, and reject executable-only no-op transactions on non-executable workspaces.
- **Chronicle** ([Release v19.3.2](https://github.com/Cratis/Chronicle/releases/tag/v19.3.2)): `Cratis:Chronicle:Clustering:ResponseTimeout` now governs the call it was added for. A grain service is a system target, and Orleans times system target calls out against `SystemResponseTimeout` rather than `ResponseTimeout`, so registering projections from the startup task stayed on the 30 second default while the setting appeared to have been applied. (#4088)
- **Arc** ([Release v22.19.1](https://github.com/Cratis/Arc/releases/tag/v22.19.1)): Prevent CommandForm from executing while custom field validation errors are present, including immediate and imperative submissions. (#2723)
- **Arc** ([Release v22.19.1](https://github.com/Cratis/Arc/releases/tag/v22.19.1)): Keep validation messages and displayed submission results consistent when custom errors change or clear. (#2723)
- **AI** ([Release v2.31.0](https://github.com/Cratis/AI/releases/tag/v2.31.0)): Resolve conflicting tutorial and snippet guidance and remove handoffs to nonexistent documentation skills.
- **AI** ([Release v2.31.0](https://github.com/Cratis/AI/releases/tag/v2.31.0)): Clarify release-intent authority and the limits of static skill verification.
- **Arc** ([Release v22.19.0](https://github.com/Cratis/Arc/releases/tag/v22.19.0)): `sortDirection=descending` sorted ascending. `asc`, `ascending`, `desc` and `descending` are all accepted case-insensitively now, and any other value is rejected as `malformedRequest` with 400 instead of being answered in the opposite order to the one asked for (#2715)
- **Chronicle** ([Release v19.3.1](https://github.com/Cratis/Chronicle/releases/tag/v19.3.1)): `Cratis:Chronicle:Clustering:ResponseTimeout` now also applies to the calls it was added for. A silo hosts a client of its own, and the startup task reaches its grain services through that hosted client, so those calls take the client's timeout rather than the silo's — which left the startup path that needs the larger budget still running on Orleans' 30 second default and made the setting look like it did nothing. (#4088)
- **Chronicle** ([Release v19.2.2](https://github.com/Cratis/Chronicle/releases/tag/v19.2.2)): A Chronicle kernel could reach a state where it was unable to start at all. Registering the persisted projection definitions was the one startup step that did not retry, and it is the step likeliest to exceed the response timeout, because registering fans a subscribe out across every observer in the store rather than doing a single grain's work — so the time it needs grows with the store. Once a store grew past that point the timeout terminated the host, the next attempt hit the same wall, and the kernel stayed down until someone intervened. (#4088)
- **Chronicle** ([Release v19.2.2](https://github.com/Cratis/Chronicle/releases/tag/v19.2.2)): The `Week` calendar accessor is now an extension method. It shipped as an extension property, which cannot be used for the one thing it exists for — the language does not permit an extension property inside an expression tree, and these accessors are only ever written inside one. A path built with it is now also rendered as the bare name rather than with a trailing `()`, matching the name the registry is keyed by; the parenthesized form is still accepted when parsing.
- **Arc** ([Release v22.18.0](https://github.com/Cratis/Arc/releases/tag/v22.18.0)): `AuthenticationMiddleware` now sets the matched endpoint's metadata on the request context before any `IAuthenticationHandler` runs, so a handler can check `context.AllowsAnonymous()` and return `AuthenticationResult.Anonymous` instead of rejecting - and logging a rejection for - a request the endpoint never required a credential for, such as a Kubernetes health probe (#2706)
- **Chronicle** ([Release v19.1.8](https://github.com/Cratis/Chronicle/releases/tag/v19.1.8)): Reading a collection of read models no longer regenerates the same JSON schema once per row. Generating a schema is a function of the CLR type alone, so it is now generated once per type and shared. The compliance release pass asked for it per instance, which made serving a collection of read models — every emission of an observable query, for every subscriber — spend time proportional to the number of rows on work that produces an identical answer each time. Measured at 328 ms for 916 rows of a moderately sized read model, now effectively zero.
- **Arc** ([Release v22.17.0](https://github.com/Cratis/Arc/releases/tag/v22.17.0)): An observable collection query backed by MongoDB no longer costs time proportional to the size of the collection every time a single document changes. The change stream already names the changed document, and the observable already decides what that meant for the observed set; that verdict is now carried on the emission instead of being discarded and then rediscovered by serializing every item of the new snapshot and the previous one.
- **Arc** ([Release v22.17.0](https://github.com/Cratis/Arc/releases/tag/v22.17.0)): The comparison fallback no longer serializes every item twice on every emission. Unchanged items are the very same instances the previous snapshot held, so reference equality settles most comparisons and record value equality settles the rest; serializing is now the last resort for an item type that overrides neither.
- **Arc** ([Release v22.17.0](https://github.com/Cratis/Arc/releases/tag/v22.17.0)): Removing an item from a **paged** observable query now reports the document pulled onto the page to replace it, so a client applying the delta no longer ends up one row short.
- **Stage** ([Release v3.21.2](https://github.com/Cratis/Stage/releases/tag/v3.21.2)): Synchronize the Stage Host kernel with updated Chronicle clients, verify the exact image exists, and propose the validated package and runtime changes together for review instead of pushing directly to main. (#107)
- **Scene** ([Release v3.6.0](https://github.com/Cratis/Scene/releases/tag/v3.6.0)): Cancel pending lookups and hide obsolete results when query inputs change. (#39)
- **cli** ([Release v3.10.0](https://github.com/Cratis/cli/releases/tag/v3.10.0)): Compile a folder of `.play` files as one application so declarations resolve across files and diagnostics retain their source paths. (#168)
- **Components** ([Release v4.11.2](https://github.com/Cratis/Components/releases/tag/v4.11.2)): `ColumnFilterMenu` now returns focus to its own trigger button when the filter popover closes having dropped focus, for both Escape and outside-click dismissal, instead of depending on React Aria's timing-sensitive automatic restore (#241)
- **Components** ([Release v4.11.2](https://github.com/Cratis/Components/releases/tag/v4.11.2)): Dismissing a filter menu by moving focus elsewhere — for example pressing another column's filter trigger — leaves focus where the user put it, rather than pulling it back to the trigger whose menu closed (#241)
- **Components** ([Release v4.11.1](https://github.com/Cratis/Components/releases/tag/v4.11.1)): A filtered `Dropdown` now commits the option ArrowDown or ArrowUp made active: Enter reports it once, closes the list, and shows its label. Escape still dismisses without changing the selection (#239)
- **Components** ([Release v4.11.1](https://github.com/Cratis/Components/releases/tag/v4.11.1)): A `Dropdown` selection now closes its own overlay and settles its own filter text, instead of waiting for a `value` that may never come back or may resolve to none of the options (#239)
- **Components** ([Release v4.11.1](https://github.com/Cratis/Components/releases/tag/v4.11.1)): An unfiltered single-select `Dropdown` now shows the label of the option that was chosen, rather than keeping its placeholder, when the application does not bind the value back (#239)
- **Components** ([Release v4.10.4](https://github.com/Cratis/Components/releases/tag/v4.10.4)): `ComboBox` now offers every option when the list is opened by the trigger, by ArrowDown or on focus, instead of only the already-selected one; typing still narrows the list, and reopening after a selection shows everything again (#297)
- **Chronicle** ([Release v19.1.7](https://github.com/Cratis/Chronicle/releases/tag/v19.1.7)): Subscribing an observer no longer waits for every failed partition to be handed to the jobs manager for recovery. An observer with hundreds of failed partitions previously exceeded the 30 second grain-call budget inside `Subscribe`, so the client timed out and the observer stayed unsubscribed - after a kernel restart this left reactors quarantined and projections disconnected until the next restart. Recovery now runs in a turn of the observer's own once the subscription is established.
- **Components** ([Release v4.10.3](https://github.com/Cratis/Components/releases/tag/v4.10.3)): A disabled tag group now refuses to remove a tag with Delete or Backspace, matching the mouse behavior (#305)
- **Components** ([Release v4.10.2](https://github.com/Cratis/Components/releases/tag/v4.10.2)): The gap between tags in a `TagGroup` applies. (#293)
- **Components** ([Release v4.10.1](https://github.com/Cratis/Components/releases/tag/v4.10.1)): A single-selection `ToggleGroup` is one tab stop. The selected option carries it — or the first enabled option when the value matches none — and it follows the selection as it changes. Arrow-key movement and `Space`/`Enter` committing are unchanged. (#292)
- **Chronicle** ([Release v19.1.6](https://github.com/Cratis/Chronicle/releases/tag/v19.1.6)): Projection subscribers now discard their silo-local cached pipeline when a projection definition changes, so events of a newly consumed event type are handled with the updated key resolvers instead of failing with `Missing key resolver` until the kernel restarts.
- **Stage** ([Release v3.21.1](https://github.com/Cratis/Stage/releases/tag/v3.21.1)): The binding module imports each generated proxy from the slice folder that declares it, instead of from the project root where no proxy is written. Every import previously pointed at a file that does not exist. (#100)
- **Stage** ([Release v3.21.1](https://github.com/Cratis/Stage/releases/tag/v3.21.1)): The generated frontend declares the types its own bundler configuration needs, so it type-checks and its build script runs. (#100)
- **Stage** ([Release v3.21.0](https://github.com/Cratis/Stage/releases/tag/v3.21.0)): A generated application renders the screen it composed, instead of mounting an empty shell around a placeholder. (#100)
- **Stage** ([Release v3.21.0](https://github.com/Cratis/Stage/releases/tag/v3.21.0)): The composed scene is written with the member names the Scene model declares, so it can be read at all. Serialized with .NET member names it parsed successfully and matched nothing, which would have rendered every screen empty without reporting an error.

## Removed

- **AI** ([Release v7.0.0](https://github.com/Cratis/AI/releases/tag/v7.0.0)): `AddDecisionEngineProvider` and `ReconfigureDecisionEngineProvider`, and decision engines as a kind of configured AI provider. Choose the engine with the new commands instead
- **AI** ([Release v7.0.0](https://github.com/Cratis/AI/releases/tag/v7.0.0)): `IDecisionProviderResolver` and `IDecisionProviderClient`, replaced by `IDecisionEngineResolver` and `IDecisionEngineClient`
- **Arc.TypeScript** ([Arc for TypeScript 0.24.0 — Core namespaces and clean builds](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.24.0)): The `validateOnly` flag on `executeCommand` and `execute`; use `validateCommand` and `validate`.
- **Arc.TypeScript** ([Arc for TypeScript 0.24.0 — Core namespaces and clean builds](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.24.0)): Internal result helpers (`malformed`, `status`, `emptyPaging`, `commandResult`) from the root export; `recordFailure` moved to `@cratis/arc.core/hosting`.
- **Arc.TypeScript** ([Arc for TypeScript 0.22.0 — grouped options](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.22.0)): `mountExpress`, `mountFastify`, `mountHono` and the `mount*WebSockets` functions; use `cratisArc`.
- **Arc.TypeScript** ([Arc for TypeScript 0.22.0 — grouped options](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.22.0)): `addChronicle`, `addMongoDB`, `addDrizzle` and the free `addCratis` function; use `withChronicle`, `withMongoDB`, `withDrizzle` and `builder.addCratis()`.
- **Arc.TypeScript** ([Arc for TypeScript 0.22.0 — grouped options](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.22.0)): The flat `prefix`, `segmentsToSkip`, `include*NameInRoute`, `correlationHeader`, `tenantHeader`, `resolveTenant`, `enableQueryMethod` and `maxBodyBytes` options and `identityDetailsSchema`; use the grouped options above.
- **AI** ([Release v6.0.0](https://github.com/Cratis/AI/releases/tag/v6.0.0)): `Cratis.AI.Providers.Resolving`, whose `ConfiguredAIProvider` collided by name with the one in `Cratis.AI.Providers`.
- **AI** ([Release v6.0.0](https://github.com/Cratis/AI/releases/tag/v6.0.0)): The duplicate `AIProviderPoolMember` in `Cratis.AI.Providers.Pools`; the one in `Pools.Listing` is the single definition.
- **AI** ([Release v6.0.0](https://github.com/Cratis/AI/releases/tag/v6.0.0)): `Cratis.AI.Agents.Identity` is now `Cratis.AI.Agents.Naming` - a namespace called `Identity` shadowed Chronicle's own `Identity` type for every consumer.
- **AI** ([Release v5.0.0](https://github.com/Cratis/AI/releases/tag/v5.0.0)): `TierModelDefaults`, the built-in table of per-vendor model names. It had already drifted from what the vendors serve - it named models that had been renamed, and one that never existed - and a tier pointing at a name the vendor does not serve fails silently, landing on whatever the harness falls back to.
- **AI** ([Release v4.0.0](https://github.com/Cratis/AI/releases/tag/v4.0.0)): `ISecretProtector`, `ISecretRevealer` and `CratisAIBuilder.WithSecretProtection<T>()`.

## Security

- **Arc** ([Release v22.31.0](https://github.com/Cratis/Arc/releases/tag/v22.31.0)): For commands and queries protected by a policy or authentication scheme, Arc checks the caller and the authorization requirements again immediately before the handler, query method or controller action runs, and denies the request if either changed after the policy verdict. (#2761)
- **Arc** ([Release v22.31.0](https://github.com/Cratis/Arc/releases/tag/v22.31.0)): Missing or conflicting authorization configuration now denies the request with Unauthorized (403 at the HTTP endpoints) instead of running it or returning a server error, including when a custom command or query pipeline is registered. (#2761)
- **Chronicle** ([Release v19.7.6](https://github.com/Cratis/Chronicle/releases/tag/v19.7.6)): The kernel development Compose file (`Source/Kernel/Server/docker-compose.yml`) now publishes MongoDB, PostgreSQL, SQL Server and the Aspire dashboard on `127.0.0.1` only, instead of on all network interfaces. These services use well-known development credentials (#4208)
- **Arc.TypeScript** ([Arc for TypeScript 0.24.1 — anonymous live queries over SSE](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.24.1)): SSE hub control requests are accepted only from the caller that opened the connection: the same identity for authenticated callers, and additionally the same peer address for anonymous callers when the host provides one. Control requests must be JSON and pass the allowed-origins check, and each subscription still runs the query's own authorization.
- **Arc.TypeScript** ([Arc for TypeScript 0.11.0 — authorization policies and identity](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.11.0)): A principal's authentication scheme is always set by Arc from the handler that authenticated it, never taken from the handler's own result.
- **Arc.TypeScript** ([Arc for TypeScript 0.11.0 — authorization policies and identity](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.11.0)): Observable queries restricted to specific authentication schemes are rejected at startup, because the shared WebSocket and SSE connections cannot honor per-query schemes.
- **Arc.TypeScript** ([Arc for TypeScript 0.11.0 — authorization policies and identity](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.11.0)): Empty `x-ms-client-principal-id` headers and oversized principal headers are rejected.
- **Chronicle.TypeScript** ([Release v6.5.0](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v6.5.0)): Reading a read model that holds personal data now fails when the data cannot be released, instead of returning the unreleased values.
- **Screenplay** ([Release v4.28.0](https://github.com/Cratis/Screenplay/releases/tag/v4.28.0)): Attachment reads are confined to the model root. Paths are normalized and rejected if absolute, drive- or UNC-qualified, escaping the root with `..`, containing control characters, or naming a Windows device (`CON`, `NUL`, `COM1`, ...). Links and reparse points on the file or any directory of its path are refused, and the resolved path is checked against the root again before reading.
- **Screenplay** ([Release v4.28.0](https://github.com/Cratis/Screenplay/releases/tag/v4.28.0)): Only regular files are read. On Linux and macOS the file type is checked with `lstat` before opening, so a FIFO or device cannot block the MCP server or CLI; where the type cannot be verified, the attachment is refused with a warning. Sizes are checked before reading.
- **Screenplay** ([Release v4.28.0](https://github.com/Cratis/Screenplay/releases/tag/v4.28.0)): Only a SHA-256 of an attachment's content leaves the loader; contents are never shown, logged or persisted, and diagnostics name only the authored path. Link checks run before opening and after reading, but not as one atomic no-follow open, so a concurrent local writer could swa
- **Arc.TypeScript** ([Arc for TypeScript 0.4.0 — observable queries and the Arc package layout](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.4.0)): Anonymous observable callers are limited per connection or address instead of sharing one server-wide allowance.
- **Arc.TypeScript** ([Arc for TypeScript 0.4.0 — observable queries and the Arc package layout](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.4.0)): WebSocket upgrades and SSE hub control requests are checked against the request's Origin, with trusted proxy metadata for TLS-terminating proxies.
- **Arc.TypeScript** ([Arc for TypeScript 0.4.0 — observable queries and the Arc package layout](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.4.0)): Upgrade requests for paths that are not Arc's get a 404 instead of hanging, handshakes time out, and a client that resets its connection during an upgrade no longer crashes the process.
- **Arc.TypeScript** ([Arc for TypeScript 0.4.0 — observable queries and the Arc package layout](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.4.0)): Observable errors are redacted outside development, and each subscription gets its own frozen copy of the principal.
- **AI** ([Release v4.0.0](https://github.com/Cratis/AI/releases/tag/v4.0.0)): An AI provider's API key is no longer written to the causation chain in plain text. A command's property values are recorded there before `Handle` runs, so protecting the value inside the handler never covered them — the key was stored in the clear, permanently, beside the event that protected it. `AIProviderApiKey` is now `[NotAudited]`. Anyone upgrading should treat keys configured through earlier versions as exposed in their own event log.
- **cli** ([Release v3.17.1](https://github.com/Cratis/cli/releases/tag/v3.17.1)): The `screenplay` MCP descriptor must be stdio, command `cratis`, with exactly `screenplay mcp` as arguments. Anything else is refused before any file is written, matching the rule the Pi bridge in Cratis/AI enforces.
- **cli** ([Release v3.17.1](https://github.com/Cratis/cli/releases/tag/v3.17.1)): `cratis ai status` flags a managed MCP entry whose launch command is not the allowed one.
- **Arc** ([Release v22.23.0](https://github.com/Cratis/Arc/releases/tag/v22.23.0)): `Policy` and `AuthenticationSchemes` no longer silently fall back to authentication-only checks. Unknown, ambiguous, malformed, or unsupported requirements fail closed; applications using previously ignored settings must register valid policies and schemes before startup (#2736).
- **Arc** ([Release v22.23.0](https://github.com/Cratis/Arc/releases/tag/v22.23.0)): Scheme-selected execution isolates the effective principal, tenant, and scoped services. Unsafe caller-supplied providers and identity-changing nested scheme calls are rejected rather than reusing services bound to another identity. Standalone Core does not support named authentication schemes (#2736).
- **AI** ([Release v3.3.0](https://github.com/Cratis/AI/releases/tag/v3.3.0)): A refused command tells the agent not to retry or work around it, and to report the exact command, its target server or context, and what it would change, so the user decides.
- **Components** ([Release v4.13.1](https://github.com/Cratis/Components/releases/tag/v4.13.1)): Every checkout in `javascript-build.yml` now sets `persist-credentials: false`. None of the build jobs push, so the token no longer stays in the local git config where later steps (dependency scripts, tests) could read it.
- **Arc** ([Release v22.21.0](https://github.com/Cratis/Arc/releases/tag/v22.21.0)): `[Authorize]` and `[AllowAnonymous]` from `Microsoft.AspNetCore.Authorization` are enforced again on model-bound commands and read models when Arc is hosted on ASP.NET Core. Since v18.2.0 a model-bound artifact protected only with Microsoft's `[Authorize]` was open to every caller — over HTTP, over hub subscriptions and through direct pipeline execution — because the evaluators meant to honour it read Arc's same-named attributes instead (#2719)
- **Arc** ([Release v22.21.0](https://github.com/Cratis/Arc/releases/tag/v22.21.0)): Every authorization attribute on a declaration now applies. Previously only the first one found was evaluated, so a second, stacked requirement — `[Roles("Admin")]` together with `[Authorize(Roles = "Auditor")]` — was silently dropped
- **Arc** ([Release v22.21.0](https://github.com/Cratis/Arc/releases/tag/v22.21.0)): A declaration marked both `[AllowAnonymous]` and `[Authorize]`/`[Roles]` is always rejected as ambiguous. Previously it either threw or admitted anonymous callers depending on which evaluator was discovered first (#2714)
- **Screenplay** ([Release v4.15.0](https://github.com/Cratis/Screenplay/releases/tag/v4.15.0)): Preserve restricted file access during model replacement, moves, and rollback; refuse recovery that would overwrite unexpected external edits.
- **Arc** ([Release v22.19.0](https://github.com/Cratis/Arc/releases/tag/v22.19.0)): SSE subscribe and unsubscribe now verify that the caller owns the connection they name. The identity that opened the stream is captured once and compared on each control request; a mismatch returns 404, exactly as an unknown connection id does, so the endpoints never confirm another caller's connection exists. Previously a caller holding another connection's id could attach a subscription whose results were written into that caller's stream, or cancel their subscriptions (#2713)

## Deprecated

- **Arc** ([Release v22.27.2](https://github.com/Cratis/Arc/releases/tag/v22.27.2)): `<Arc basePath>` is deprecated because it does not configure routing or API requests; its context value remains available for compatibility (#2593)
- **Screenplay** ([Release v4.33.0](https://github.com/Cratis/Screenplay/releases/tag/v4.33.0)): `ZeroOrOne` and `Many` on a projection transition have no Chronicle meaning. An executable model that carries them, built in code or read from canonical bytes, reports warning `PLAY0445`; they will be removed in the next model version. Models compiled from `.play` sources never carry them.
- **Arc.TypeScript** ([Arc for TypeScript 0.19.0 — setup, configuration and host integrations](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.19.0)): `addChronicle`, `addMongoDB` and `addDrizzle`; use `withChronicle`, `withMongoDB` and `withDrizzle`.
- **Arc.TypeScript** ([Arc for TypeScript 0.19.0 — setup, configuration and host integrations](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.19.0)): `mountExpress`, `mountFastify`, `mountHono` and the `mount*WebSockets` functions; use `cratisArc`.
- **Arc.TypeScript** ([Arc for TypeScript 0.18.0 — RxJS observable queries](https://github.com/Cratis/Arc.TypeScript/releases/tag/v0.18.0)): `CurrentValueSubject` is deprecated; use RxJS `BehaviorSubject` instead.
- **Screenplay** ([Release v4.25.0](https://github.com/Cratis/Screenplay/releases/tag/v4.25.0)): PLAY0176 is retired and no longer reported. Two identical `reads` lines used to give one PLAY0176 with the second line dropped; now both lines are kept and reported as PLAY0410. The `DiagnosticCodes.DuplicateReads` constant remains for compatibility.
