---
title: Release digest for week of 2026-06-01 to 2026-06-08
---

## Added
- **Chronicle** ([Release v15.33.5](https://github.com/Cratis/Chronicle/releases/tag/v15.33.5)): `WithHashiCorpVault` and `WithAzureKeyVault` extension methods on `IChronicleAspireBuilder` to configure compliance encryption key storage from Aspire host code without manually setting environment variables (#3205, #685)
- **Chronicle** ([Release v15.33.5](https://github.com/Cratis/Chronicle/releases/tag/v15.33.5)): Compliance encryption storage environment variable constants in `ChronicleContainerImageTags`
- **Chronicle.Elixir** ([Release v0.3.2](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v0.3.2)): `subject/1` macro in `Chronicle.Compliance` to explicitly mark the GDPR data-subject field on a read model. Falls back to `:id` when not declared.
- **Chronicle.TypeScript** ([Release v0.2.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v0.2.1)): `IMaterializedReadModels` and `MaterializedReadModels` for retrieving individual or multiple read model instances directly from the Chronicle sink.
- **Chronicle.TypeScript** ([Release v0.2.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v0.2.1)): `IReadModels.materialized` exposes the new service to consumers.
- **Chronicle.TypeScript** ([Release v0.2.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v0.2.1)): Compliance-aware release for reducer-based read models: instances are automatically passed through the release pipeline when the schema declares compliance metadata on any property.
- **Chronicle.Elixir** ([Release v0.3.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v0.3.0)): New `Chronicle.Projections.Projection` macro for defining standalone declarative projections — keeps read model structs as pure data shapes while projection logic lives in a separate module.
- **Chronicle.Elixir** ([Release v0.3.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v0.3.0)): `:projections` option on `Chronicle.Client` to register declarative projection modules alongside `:read_models`; auto-discovered via `otp_app:` convention.
- **Chronicle.Elixir** ([Release v0.3.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v0.3.0)): Read model queries now wait for the Chronicle connection to be established before attempting requests, with configurable timeouts and clean error propagation when the connection is unavailable.
- **Chronicle.Elixir** ([Release v0.2.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v0.2.0)): Automatic, ordered re-registration of reactors, reducers, projections, seeders, webhooks and subscriptions on every reconnect, bringing reconnection behavior on par with the C# client.
- **Chronicle.Elixir** ([Release v0.2.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v0.2.0)): Guides for connections (connection strings and resilience), event types, reactors, reducers, and getting started.
- **Arc** ([Release v20.39.0](https://github.com/Cratis/Arc/releases/tag/v20.39.0)): `@cratis/eslint-plugin-arc`: ESLint rules for projects that consume Cratis Arc, designed to compose on top of `@cratis/eslint-config`.
- **Arc** ([Release v20.39.0](https://github.com/Cratis/Arc/releases/tag/v20.39.0)): **`skip-generated-proxies`** (processor) — skips Arc-generated proxy files wholesale. They carry a `// @generated by Cratis` header (and a `**DO NOT EDIT**` banner), cannot be edited, and are regenerated by the build, so any lint finding on them is un-actionable. Keyed on the header because generated proxies sit intermixed with hand-written `.ts` under the same folders, with no path distinction. The pass-through preserves filenames (import resolution is unaffected) and keeps `--fix` working on hand-written files.
- **Arc** ([Release v20.39.0](https://github.com/Cratis/Arc/releases/tag/v20.39.0)): **`no-hooks-in-view-model`** (rule) — forbids React hook calls inside MVVM view models (classes named `*ViewModel`). A view model must be a plain, React-free class; inject Cratis abstractions instead of calling hooks. Only bare-identifier hook calls are flagged, so view-model methods that merely start with `use` are not false positives. The class suffix and hook pattern are configurable.
- **Arc** ([Release v20.39.0](https://github.com/Cratis/Arc/releases/tag/v20.39.0)): Named per the ESLint scoped-plugin convention (`@scope/eslint-plugin-*`). The plugin namespace is `@cratis/arc`, so rule IDs read `@cratis/arc/no-hooks-in-view-model`.
- **Arc** ([Release v20.39.0](https://github.com/Cratis/Arc/releases/tag/v20.39.0)): Ships as raw ESM (no build step), declares only `eslint` as a peer dependency, and exposes `meta.version` plus per-rule docs URLs. It owns these rules because Arc owns the proxy generator and `@cratis/arc.react.mvvm`.
- **Arc** ([Release v20.38.0](https://github.com/Cratis/Arc/releases/tag/v20.38.0)): `@cratis/eslint-plugin-arc`: ESLint rules for projects that consume Cratis Arc, designed to compose on top of `@cratis/eslint-config`.
- **Arc** ([Release v20.38.0](https://github.com/Cratis/Arc/releases/tag/v20.38.0)): **`skip-generated-proxies`** (processor) — skips Arc-generated proxy files wholesale. They carry a `// @generated by Cratis` header (and a `**DO NOT EDIT**` banner), cannot be edited, and are regenerated by the build, so any lint finding on them is un-actionable. Keyed on the header because generated proxies sit intermixed with hand-written `.ts` under the same folders, with no path distinction. The pass-through preserves filenames (import resolution is unaffected) and keeps `--fix` working on hand-written files.
- **Arc** ([Release v20.38.0](https://github.com/Cratis/Arc/releases/tag/v20.38.0)): **`no-hooks-in-view-model`** (rule) — forbids React hook calls inside MVVM view models (classes named `*ViewModel`). A view model must be a plain, React-free class; inject Cratis abstractions instead of calling hooks. Only bare-identifier hook calls are flagged, so view-model methods that merely start with `use` are not false positives. The class suffix and hook pattern are configurable.
- **Arc** ([Release v20.38.0](https://github.com/Cratis/Arc/releases/tag/v20.38.0)): Named per the ESLint scoped-plugin convention (`@scope/eslint-plugin-*`). The plugin namespace is `@cratis/arc`, so rule IDs read `@cratis/arc/no-hooks-in-view-model`.
- **Arc** ([Release v20.38.0](https://github.com/Cratis/Arc/releases/tag/v20.38.0)): Ships as raw ESM (no build step), declares only `eslint` as a peer dependency, and exposes `meta.version` plus per-rule docs URLs. It owns these rules because Arc owns the proxy generator and `@cratis/arc.react.mvvm`.
- **Arc** ([Release v20.37.0](https://github.com/Cratis/Arc/releases/tag/v20.37.0)): `@cratis/eslint-plugin-arc`: ESLint rules for projects that consume Cratis Arc, designed to compose on top of `@cratis/eslint-config`.
- **Arc** ([Release v20.37.0](https://github.com/Cratis/Arc/releases/tag/v20.37.0)): **`skip-generated-proxies`** (processor) — skips Arc-generated proxy files wholesale. They carry a `// @generated by Cratis` header (and a `**DO NOT EDIT**` banner), cannot be edited, and are regenerated by the build, so any lint finding on them is un-actionable. Keyed on the header because generated proxies sit intermixed with hand-written `.ts` under the same folders, with no path distinction. The pass-through preserves filenames (import resolution is unaffected) and keeps `--fix` working on hand-written files.
- **Arc** ([Release v20.37.0](https://github.com/Cratis/Arc/releases/tag/v20.37.0)): **`no-hooks-in-view-model`** (rule) — forbids React hook calls inside MVVM view models (classes named `*ViewModel`). A view model must be a plain, React-free class; inject Cratis abstractions instead of calling hooks. Only bare-identifier hook calls are flagged, so view-model methods that merely start with `use` are not false positives. The class suffix and hook pattern are configurable.
- **Arc** ([Release v20.37.0](https://github.com/Cratis/Arc/releases/tag/v20.37.0)): Named per the ESLint scoped-plugin convention (`@scope/eslint-plugin-*`). The plugin namespace is `@cratis/arc`, so rule IDs read `@cratis/arc/no-hooks-in-view-model`.
- **Arc** ([Release v20.37.0](https://github.com/Cratis/Arc/releases/tag/v20.37.0)): Ships as raw ESM (no build step), declares only `eslint` as a peer dependency, and exposes `meta.version` plus per-rule docs URLs. It owns these rules because Arc owns the proxy generator and `@cratis/arc.react.mvvm`.
- **Arc** ([Release v20.36.0](https://github.com/Cratis/Arc/releases/tag/v20.36.0)): `@cratis/eslint-plugin-arc`: ESLint rules for projects that consume Cratis Arc, designed to compose on top of `@cratis/eslint-config`.
- **Arc** ([Release v20.36.0](https://github.com/Cratis/Arc/releases/tag/v20.36.0)): **`skip-generated-proxies`** (processor) — skips Arc-generated proxy files wholesale. They carry a `// @generated by Cratis` header (and a `**DO NOT EDIT**` banner), cannot be edited, and are regenerated by the build, so any lint finding on them is un-actionable. Keyed on the header because generated proxies sit intermixed with hand-written `.ts` under the same folders, with no path distinction. The pass-through preserves filenames (import resolution is unaffected) and keeps `--fix` working on hand-written files.
- **Arc** ([Release v20.36.0](https://github.com/Cratis/Arc/releases/tag/v20.36.0)): **`no-hooks-in-view-model`** (rule) — forbids React hook calls inside MVVM view models (classes named `*ViewModel`). A view model must be a plain, React-free class; inject Cratis abstractions instead of calling hooks. Only bare-identifier hook calls are flagged, so view-model methods that merely start with `use` are not false positives. The class suffix and hook pattern are configurable.
- **Arc** ([Release v20.36.0](https://github.com/Cratis/Arc/releases/tag/v20.36.0)): Named per the ESLint scoped-plugin convention (`@scope/eslint-plugin-*`). The plugin namespace is `@cratis/arc`, so rule IDs read `@cratis/arc/no-hooks-in-view-model`.
- **Arc** ([Release v20.36.0](https://github.com/Cratis/Arc/releases/tag/v20.36.0)): Ships as raw ESM (no build step), declares only `eslint` as a peer dependency, and exposes `meta.version` plus per-rule docs URLs. It owns these rules because Arc owns the proxy generator and `@cratis/arc.react.mvvm`.
- **Arc** ([Release v20.35.0](https://github.com/Cratis/Arc/releases/tag/v20.35.0)): `@cratis/eslint-plugin-arc`: ESLint rules for projects that consume Cratis Arc, designed to compose on top of `@cratis/eslint-config`.
- **Arc** ([Release v20.35.0](https://github.com/Cratis/Arc/releases/tag/v20.35.0)): **`skip-generated-proxies`** (processor) — skips Arc-generated proxy files wholesale. They carry a `// @generated by Cratis` header (and a `**DO NOT EDIT**` banner), cannot be edited, and are regenerated by the build, so any lint finding on them is un-actionable. Keyed on the header because generated proxies sit intermixed with hand-written `.ts` under the same folders, with no path distinction. The pass-through preserves filenames (import resolution is unaffected) and keeps `--fix` working on hand-written files.
- **Arc** ([Release v20.35.0](https://github.com/Cratis/Arc/releases/tag/v20.35.0)): **`no-hooks-in-view-model`** (rule) — forbids React hook calls inside MVVM view models (classes named `*ViewModel`). A view model must be a plain, React-free class; inject Cratis abstractions instead of calling hooks. Only bare-identifier hook calls are flagged, so view-model methods that merely start with `use` are not false positives. The class suffix and hook pattern are configurable.
- **Arc** ([Release v20.35.0](https://github.com/Cratis/Arc/releases/tag/v20.35.0)): Named per the ESLint scoped-plugin convention (`@scope/eslint-plugin-*`). The plugin namespace is `@cratis/arc`, so rule IDs read `@cratis/arc/no-hooks-in-view-model`.
- **Arc** ([Release v20.35.0](https://github.com/Cratis/Arc/releases/tag/v20.35.0)): Ships as raw ESM (no build step), declares only `eslint` as a peer dependency, and exposes `meta.version` plus per-rule docs URLs. It owns these rules because Arc owns the proxy generator and `@cratis/arc.react.mvvm`.
- **Components** ([Release v2.3.0](https://github.com/Cratis/Components/releases/tag/v2.3.0)): `@cratis/eslint-plugin-components`: ESLint rules for projects that consume Cratis Components, designed to compose on top of `@cratis/eslint-config`.
- **Components** ([Release v2.3.0](https://github.com/Cratis/Components/releases/tag/v2.3.0)): **`no-root-barrel-import`** (rule) — disallows importing from the `@cratis/components` root barrel. Use a subpath export (`@cratis/components/CommandDialog`, `@cratis/components/DataPage`, `@cratis/components/Toolbar`, …); the root pulls the whole optional-peer-heavy surface and hides intent. Covers `import` and re-`export … from`. Configurable package name and allow-list.
- **Components** ([Release v2.3.0](https://github.com/Cratis/Components/releases/tag/v2.3.0)): **`no-primereact-dialog`** (rule) — disallows importing `Dialog` from `primereact/dialog`. Use `CommandDialog` from `@cratis/components/CommandDialog`, or `Dialog` from `@cratis/components/Dialogs` — the wrappers add Arc command binding, overlay/focus fixes, and theming.
- **Components** ([Release v2.2.0](https://github.com/Cratis/Components/releases/tag/v2.2.0)): `@cratis/eslint-plugin-components`: ESLint rules for projects that consume Cratis Components, designed to compose on top of `@cratis/eslint-config`.
- **Components** ([Release v2.2.0](https://github.com/Cratis/Components/releases/tag/v2.2.0)): **`no-root-barrel-import`** (rule) — disallows importing from the `@cratis/components` root barrel. Use a subpath export (`@cratis/components/CommandDialog`, `@cratis/components/DataPage`, `@cratis/components/Toolbar`, …); the root pulls the whole optional-peer-heavy surface and hides intent. Covers `import` and re-`export … from`. Configurable package name and allow-list.
- **Components** ([Release v2.2.0](https://github.com/Cratis/Components/releases/tag/v2.2.0)): **`no-primereact-dialog`** (rule) — disallows importing `Dialog` from `primereact/dialog`. Use `CommandDialog` from `@cratis/components/CommandDialog`, or `Dialog` from `@cratis/components/Dialogs` — the wrappers add Arc command binding, overlay/focus fixes, and theming.
- **Arc** ([Release v20.34.0](https://github.com/Cratis/Arc/releases/tag/v20.34.0)): `@cratis/eslint-plugin-arc`: ESLint rules for projects that consume Cratis Arc, designed to compose on top of `@cratis/eslint-config`.
- **Arc** ([Release v20.34.0](https://github.com/Cratis/Arc/releases/tag/v20.34.0)): **`skip-generated-proxies`** (processor) — skips Arc-generated proxy files wholesale. They carry a `// @generated by Cratis` header (and a `**DO NOT EDIT**` banner), cannot be edited, and are regenerated by the build, so any lint finding on them is un-actionable. Keyed on the header because generated proxies sit intermixed with hand-written `.ts` under the same folders, with no path distinction. The pass-through preserves filenames (import resolution is unaffected) and keeps `--fix` working on hand-written files.
- **Arc** ([Release v20.34.0](https://github.com/Cratis/Arc/releases/tag/v20.34.0)): **`no-hooks-in-view-model`** (rule) — forbids React hook calls inside MVVM view models (classes named `*ViewModel`). A view model must be a plain, React-free class; inject Cratis abstractions instead of calling hooks. Only bare-identifier hook calls are flagged, so view-model methods that merely start with `use` are not false positives. The class suffix and hook pattern are configurable.
- **Arc** ([Release v20.34.0](https://github.com/Cratis/Arc/releases/tag/v20.34.0)): Named per the ESLint scoped-plugin convention (`@scope/eslint-plugin-*`). The plugin namespace is `@cratis/arc`, so rule IDs read `@cratis/arc/no-hooks-in-view-model`.
- **Arc** ([Release v20.34.0](https://github.com/Cratis/Arc/releases/tag/v20.34.0)): Ships as raw ESM (no build step), declares only `eslint` as a peer dependency, and exposes `meta.version` plus per-rule docs URLs. It owns these rules because Arc owns the proxy generator and `@cratis/arc.react.mvvm`.
- **Fundamentals** ([Release v7.14.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.14.0)): `@cratis/eslint-config`: a shareable ESLint flat-config package for Cratis projects. It exposes a `consumer` preset for projects that build on Cratis (house TypeScript/React hygiene plus the `for_*` BDD spec relaxations) and an `internal` preset that adds the Cratis MIT license-header rule for use inside the Cratis product repos. The `base` and `specs` building blocks are exported for custom composition.
- **Chronicle** ([Release v15.33.0](https://github.com/Cratis/Chronicle/releases/tag/v15.33.0)): `InstanceCountToSkip` and `InstanceCount` concepts for type-safe pagination parameters with implicit conversion operators
- **Chronicle** ([Release v15.33.0](https://github.com/Cratis/Chronicle/releases/tag/v15.33.0)): `IMaterializedReadModels` interface with optional `skip` and `take` parameters on `GetInstances<TReadModel>()` and `ObserveInstances<TReadModel>()` methods (defaults: skip=0, take=50)
- **Chronicle** ([Release v15.33.0](https://github.com/Cratis/Chronicle/releases/tag/v15.33.0)): `IMaterializedReadModels` gRPC service contract with corresponding `ObserveInstancesRequest` and `ObserveInstancesResponse` types
- **Chronicle** ([Release v15.33.0](https://github.com/Cratis/Chronicle/releases/tag/v15.33.0)): `IReadModels.Materialized` property returning `IMaterializedReadModels` for accessing materialized read model operations
- **Chronicle** ([Release v15.33.0](https://github.com/Cratis/Chronicle/releases/tag/v15.33.0)): `IReadModelsCompliance` interface for PII decryption operations on read model instances
- **Chronicle** ([Release v15.33.0](https://github.com/Cratis/Chronicle/releases/tag/v15.33.0)): `ReadModelsCompliance` implementation of `IReadModelsCompliance` to centralize PII decryption logic
- **Chronicle** ([Release v15.33.0](https://github.com/Cratis/Chronicle/releases/tag/v15.33.0)): `IEventCompliance` interface for PII decryption operations on event content
- **Chronicle** ([Release v15.33.0](https://github.com/Cratis/Chronicle/releases/tag/v15.33.0)): `EventCompliance` implementation of `IEventCompliance` to centralize PII decryption logic
- **Chronicle** ([Release v15.33.0](https://github.com/Cratis/Chronicle/releases/tag/v15.33.0)): `ISink.ObserveInstances(ReadModelContainerName? occurrence, int skip, int take)` for sink-level observation
- **Chronicle** ([Release v15.33.0](https://github.com/Cratis/Chronicle/releases/tag/v15.33.0)): Client and Kernel implementations of `MaterializedReadModels` service with automatic Release() calls on all returned instances
- **Chronicle** ([Release v15.33.0](https://github.com/Cratis/Chronicle/releases/tag/v15.33.0)): Comprehensive documentation for materialized read models pagination and observation at `Documentation/read-models/materialized-pagination.md`
- **Chronicle** ([Release v15.33.0](https://github.com/Cratis/Chronicle/releases/tag/v15.33.0)): Specs for optional parameter behavior on `GetInstances` and `ObserveInstances`
- **Chronicle** ([Release v15.32.3](https://github.com/Cratis/Chronicle/releases/tag/v15.32.3)): Reactors can now control the append metadata of the side-effect events they return — event source id, event stream id and type, event source type, and subject — through the `ICanProvideEventSourceId`, `ICanProvideEventStreamId` and `ICanProvideSubject` interfaces and the `[EventStreamId]`, `[EventStreamType]` and `[EventSourceType]` attributes.
- **Fundamentals** ([Release v7.13.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.13.0)): ConceptAs abstract class with value property, valueOf(), and toString() methods
- **Fundamentals** ([Release v7.13.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.13.0)): Union type support with recommended export pattern: concept class with "Concept" suffix and clean union type export (e.g., `class UserIdConcept` → `export type UserId = UserIdConcept | string`)
- **Fundamentals** ([Release v7.13.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.13.0)): Flexible assignment of both ConceptAs instances and primitives through exported union types
- **Fundamentals** ([Release v7.13.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.13.0)): Recursive serialization pattern following C# implementation (recognize ConceptAs → unwrap → serialize inner value)
- **Fundamentals** ([Release v7.13.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.13.0)): Prototype chain-based type detection in JsonSerializer for ConceptAs subclasses
- **Fundamentals** ([Release v7.13.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.13.0)): 216 comprehensive tests covering creation, serialization, deserialization, and union type scenarios
- **Fundamentals** ([Release v7.13.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.13.0)): Complete documentation at Documentation/typescript/concept_as.md with union type export pattern, examples, and best practices
- **Fundamentals** ([Release v7.13.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.13.0)): Comparison table highlighting differences between C# and TypeScript implementations
- **Fundamentals** ([Release v7.12.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.12.0)): ConceptAs abstract class with value property, valueOf(), and toString() methods
- **Fundamentals** ([Release v7.12.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.12.0)): Union type support with recommended export pattern: concept class with "Concept" suffix and clean union type export (e.g., `class UserIdConcept` → `export type UserId = UserIdConcept | string`)
- **Fundamentals** ([Release v7.12.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.12.0)): Flexible assignment of both ConceptAs instances and primitives through exported union types
- **Fundamentals** ([Release v7.12.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.12.0)): Recursive serialization pattern following C# implementation (recognize ConceptAs → unwrap → serialize inner value)
- **Fundamentals** ([Release v7.12.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.12.0)): Prototype chain-based type detection in JsonSerializer for ConceptAs subclasses
- **Fundamentals** ([Release v7.12.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.12.0)): 216 comprehensive tests covering creation, serialization, deserialization, and union type scenarios
- **Fundamentals** ([Release v7.12.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.12.0)): Complete documentation at Documentation/typescript/concept_as.md with union type export pattern, examples, and best practices
- **Fundamentals** ([Release v7.12.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.12.0)): Comparison table highlighting differences between C# and TypeScript implementations
- **Fundamentals** ([Release v7.11.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.11.0)): ConceptAs abstract class with value property, valueOf(), and toString() methods
- **Fundamentals** ([Release v7.11.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.11.0)): Union type support with recommended export pattern: concept class with "Concept" suffix and clean union type export (e.g., `class UserIdConcept` → `export type UserId = UserIdConcept | string`)
- **Fundamentals** ([Release v7.11.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.11.0)): Flexible assignment of both ConceptAs instances and primitives through exported union types
- **Fundamentals** ([Release v7.11.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.11.0)): Recursive serialization pattern following C# implementation (recognize ConceptAs → unwrap → serialize inner value)
- **Fundamentals** ([Release v7.11.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.11.0)): Prototype chain-based type detection in JsonSerializer for ConceptAs subclasses
- **Fundamentals** ([Release v7.11.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.11.0)): 216 comprehensive tests covering creation, serialization, deserialization, and union type scenarios
- **Fundamentals** ([Release v7.11.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.11.0)): Complete documentation at Documentation/typescript/concept_as.md with union type export pattern, examples, and best practices
- **Fundamentals** ([Release v7.11.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.11.0)): Comparison table highlighting differences between C# and TypeScript implementations
- **Components** ([Release v2.1.0](https://github.com/Cratis/Components/releases/tag/v2.1.0)): `Source/Filter/` module: standalone `FilterPanel`, `FilterEditor`, `RangeHistogramFilter`, `useFilterState` hook, and full TypeScript type definitions (`FilterDefinition`, `FilterEditorProps`, `FilterEditorSlotProps`, `FilterValues`, `RangeValues`, `CustomFilterValues`) (#102)
- **Components** ([Release v2.1.0](https://github.com/Cratis/Components/releases/tag/v2.1.0)): `FilterEditor` slot component — declares a custom editor for a specific filter group as a declarative child of `<FilterPanel>`; value tracked separately in `customValues` (#102)
- **Components** ([Release v2.1.0](https://github.com/Cratis/Components/releases/tag/v2.1.0)): `type: 'custom'` filter type as an explicit opt-in for fully custom filter editors (#102)
- **Components** ([Release v2.1.0](https://github.com/Cratis/Components/releases/tag/v2.1.0)): 5 Storybook stories for `FilterPanel`: single-select, multi-select, numeric range/histogram, custom editor, and mixed filter types (#102)
- **Components** ([Release v2.1.0](https://github.com/Cratis/Components/releases/tag/v2.1.0)): `./Filter` subpath export in `package.json` for direct imports via `@cratis/components/Filter` (#102)
- **Components** ([Release v2.1.0](https://github.com/Cratis/Components/releases/tag/v2.1.0)): `Documentation/Filter/index.md` — full API reference covering all exported types, `FilterPanel` props, `FilterEditor` props, `useFilterState` hook, and usage examples for every filter type (#102)
- **Components** ([Release v2.1.0](https://github.com/Cratis/Components/releases/tag/v2.1.0)): BDD specs in `Source/Filter/for_useFilterState/` covering `buildFilterValues` and `buildRangeValues` — 9 tests across 4 spec files (#102)
- **Components** ([Release v2.1.0](https://github.com/Cratis/Components/releases/tag/v2.1.0)): `Source/Filter/utils.ts` exporting `buildFilterValues` and `buildRangeValues` as pure, testable utility functions (#102)
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): Reactor handlers can return side-effect events directly, including single and multiple event return shapes (#3307)
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): Observer in-flight event persistence with subscribe-time partition recovery after interruption (#1682)
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): Observer handled-event counters, including total and per-event-type visibility in observer information (#1557)
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): Stream completion support with dedicated closed-stream constraint storage and validation (#1446)
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): Nested projection object coverage for nested-in-nested and nested-in-children scenarios (#3142)
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): Constraint change metadata and dedicated constraint reindex job flow for affected definitions

## Changed
- **cli** ([Release v1.6.1](https://github.com/Cratis/cli/releases/tag/v1.6.1)): `DetailOverlayWindow` exposes its per-tab editors (`TabEditors`) so a tab’s content can be updated after `Build` — used to fill the Instances tab once the async fetch completes. The fetch runs on a background task (`Task.Run` + `ConfigureAwait(false)`) and the result is marshalled back onto the UI thread via `EnqueueOnUIThread`.
- **Arc** ([Release v20.39.2](https://github.com/Cratis/Arc/releases/tag/v20.39.2)): All streaming transports (`ObservableQueryDemultiplexer`, `ClientObservable`, `ClientObservableSSE`, `ClientEnumerableObservable`, `ClientEnumerableObservableSSE`) now share a single `IReadModelInterceptors.InterceptEmission` helper that intercepts each emission, unwrapping collection emissions to the read model element type.
- **Chronicle.Elixir** ([Release v0.3.2](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v0.3.2)): `Chronicle.ReadModels.get_instance_by_id/3`, `get_instances/2`, `all/2`, `query/2`, and `get_snapshots_by_id/3` now apply client-side compliance decryption (via the Chronicle compliance `Release` endpoint) when the read model is backed by a reducer. Projection-backed models are unaffected — the server handles compliance for those.
- **Chronicle.Elixir** ([Release v0.3.1](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v0.3.1)): Improved context documentation with richer explanations of correlation, identity, causation chains, delegation, and on-behalf-of patterns.
- **Chronicle.Elixir** ([Release v0.3.1](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v0.3.1)): Console sample now cycles through three mock users (press `I`) so each operation records a distinct causer in the event log.
- **Chronicle.TypeScript** ([Release v0.2.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v0.2.1)): Bumped `@cratis/chronicle.contracts` to `15.33.3`.
- **Chronicle** ([Release v15.33.3](https://github.com/Cratis/Chronicle/releases/tag/v15.33.3)): `ComplianceMetadataType` is now a string instead of a `Guid`; the built-in PII type is simply `"PII"`.
- **Chronicle.Elixir** ([Release v0.2.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v0.2.0)): The client now connects, detects a dead connection, reconnects, and re-registers all observers through a single connection lifecycle rather than each observer polling and retrying independently.
- **Chronicle.Elixir** ([Release v0.2.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v0.2.0)): Modules are organized into domain-driven folders (auditing, connections, correlation, event sequences, events, identity, reactors, read models, reducers, seeding).
- **Arc** ([Release v20.39.1](https://github.com/Cratis/Arc/releases/tag/v20.39.1)): All streaming transports (`ObservableQueryDemultiplexer`, `ClientObservable`, `ClientObservableSSE`, `ClientEnumerableObservable`, `ClientEnumerableObservableSSE`) now share a single `IReadModelInterceptors.InterceptEmission` helper that intercepts each emission, unwrapping collection emissions to the read model element type.
- **Components** ([Release v2.3.0](https://github.com/Cratis/Components/releases/tag/v2.3.0)): Add the `ESLint` workspace to the repo `workspaces`.
- **Components** ([Release v2.3.0](https://github.com/Cratis/Components/releases/tag/v2.3.0)): Named per the ESLint scoped-plugin convention (`@scope/eslint-plugin-*`). The plugin namespace is `@cratis/components`, so rule IDs read `@cratis/components/no-root-barrel-import`.
- **Components** ([Release v2.3.0](https://github.com/Cratis/Components/releases/tag/v2.3.0)): Ships as raw ESM (no build step), declares only `eslint` as a peer dependency, and exposes `meta.version` plus per-rule docs URLs. It owns these rules because Components owns its subpath export surface and the dialog wrappers.
- **Components** ([Release v2.2.0](https://github.com/Cratis/Components/releases/tag/v2.2.0)): Add the `ESLint` workspace to the repo `workspaces`.
- **Components** ([Release v2.2.0](https://github.com/Cratis/Components/releases/tag/v2.2.0)): Named per the ESLint scoped-plugin convention (`@scope/eslint-plugin-*`). The plugin namespace is `@cratis/components`, so rule IDs read `@cratis/components/no-root-barrel-import`.
- **Components** ([Release v2.2.0](https://github.com/Cratis/Components/releases/tag/v2.2.0)): Ships as raw ESM (no build step), declares only `eslint` as a peer dependency, and exposes `meta.version` plus per-rule docs URLs. It owns these rules because Components owns its subpath export surface and the dialog wrappers.
- **Fundamentals** ([Release v7.14.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.14.0)): Fundamentals now lints its own source through `@cratis/eslint-config`'s `internal` preset instead of a hand-maintained rule set, removing configuration that is otherwise duplicated across the Arc and Components repos. The effective rule set is unchanged: the existing lint gate passes, and the MIT license-header rule still fires on un-headered files.
- **Fundamentals** ([Release v7.14.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.14.0)): The package ships as raw ESM (no build step) and declares only `eslint` as a peer dependency. It is the foundation that `@cratis/arc.eslint` and `@cratis/components.eslint` compose on top of.
- **Components** ([Release v2.1.3](https://github.com/Cratis/Components/releases/tag/v2.1.3)): Filter clear buttons now appear in header next to count badge/indicator, not at bottom of filter content (#issue)
- **Components** ([Release v2.1.3](https://github.com/Cratis/Components/releases/tag/v2.1.3)): Clear button styled as round icon with × character, hover/active states, and descriptive tooltips (#issue)
- **Components** ([Release v2.1.3](https://github.com/Cratis/Components/releases/tag/v2.1.3)): `RangeHistogramFilter` no longer renders its own clear button—handled by parent `FilterPanel` (#issue)
- **Components** ([Release v2.1.3](https://github.com/Cratis/Components/releases/tag/v2.1.3)): Custom filter examples updated to remove inline clear buttons following new pattern (#issue)
- **Components** ([Release v2.1.3](https://github.com/Cratis/Components/releases/tag/v2.1.3)): Documentation updated with clear button behavior for all filter types and guidance for custom editors (#issue)
- **Components** ([Release v2.1.3](https://github.com/Cratis/Components/releases/tag/v2.1.3)): String/option filters: next to selection count, calls `onFilterClear(filterKey)`
- **Components** ([Release v2.1.3](https://github.com/Cratis/Components/releases/tag/v2.1.3)): Range filters: next to "Range" indicator, calls `onRangeChange(filterKey, null)`
- **Components** ([Release v2.1.3](https://github.com/Cratis/Components/releases/tag/v2.1.3)): Custom filters: next to dot indicator, calls `onCustomValueChange(filterKey, undefined)`
- **Chronicle** ([Release v15.33.0](https://github.com/Cratis/Chronicle/releases/tag/v15.33.0)): Moved paginated `GetInstances` and observable `WatchInstances` methods from `IReadModels` to `IMaterializedReadModels`
- **Chronicle** ([Release v15.33.0](https://github.com/Cratis/Chronicle/releases/tag/v15.33.0)): `skip` and `take` parameters are now optional with defaults (skip: 0, take: 50) on `IMaterializedReadModels` interface methods
- **Chronicle** ([Release v15.33.0](https://github.com/Cratis/Chronicle/releases/tag/v15.33.0)): MongoDB Sink now supports observable instances via Arc's `.Observe()` with change stream monitoring
- **Chronicle** ([Release v15.33.0](https://github.com/Cratis/Chronicle/releases/tag/v15.33.0)): SQL Sink now supports observable instances via Arc's EF `.Observe()` with proper DbContext scope lifetime management
- **Chronicle** ([Release v15.33.0](https://github.com/Cratis/Chronicle/releases/tag/v15.33.0)): InMemorySink and NullSink updated with observation support for testing scenarios
- **Chronicle** ([Release v15.33.0](https://github.com/Cratis/Chronicle/releases/tag/v15.33.0)): Both `ReadModels` and `MaterializedReadModels` services now use injected `IReadModelsCompliance` for PII decryption
- **Chronicle** ([Release v15.33.0](https://github.com/Cratis/Chronicle/releases/tag/v15.33.0)): Converted `ReadModelsCompliance` from static helper to injectable service following the `IEventCompliance` pattern
- **Chronicle** ([Release v15.33.0](https://github.com/Cratis/Chronicle/releases/tag/v15.33.0)): Renamed `IEventComplianceHelper` → `IEventCompliance` and `EventComplianceHelper` → `EventCompliance` for consistency with read models compliance naming
- **Arc** ([Release v20.33.19](https://github.com/Cratis/Arc/releases/tag/v20.33.19)): Updated `Cratis.Chronicle`, `Cratis.Chronicle.AspNetCore` and `Cratis.Chronicle.Testing` to `15.32.3`.
- **Arc** ([Release v20.33.19](https://github.com/Cratis/Arc/releases/tag/v20.33.19)): `ICanProvideEventSourceId`, `ICanProvideEventStreamId`, `ICanProvideSubject` and `EventStreamIdAttribute` now come from `Cratis.Chronicle` (the `Cratis.Chronicle.Events` namespace) instead of being duplicated in Arc. Command code that implements these should import them from `Cratis.Chronicle.Events`.
- **Arc** ([Release v20.33.18](https://github.com/Cratis/Arc/releases/tag/v20.33.18)): Updated `Cratis.Chronicle`, `Cratis.Chronicle.AspNetCore` and `Cratis.Chronicle.Testing` to `15.32.3`.
- **Arc** ([Release v20.33.18](https://github.com/Cratis/Arc/releases/tag/v20.33.18)): `ICanProvideEventSourceId`, `ICanProvideEventStreamId`, `ICanProvideSubject` and `EventStreamIdAttribute` now come from `Cratis.Chronicle` (the `Cratis.Chronicle.Events` namespace) instead of being duplicated in Arc. Command code that implements these should import them from `Cratis.Chronicle.Events`.
- **Arc** ([Release v20.33.17](https://github.com/Cratis/Arc/releases/tag/v20.33.17)): Updated `Cratis.Chronicle`, `Cratis.Chronicle.AspNetCore` and `Cratis.Chronicle.Testing` to `15.32.3`.
- **Arc** ([Release v20.33.17](https://github.com/Cratis/Arc/releases/tag/v20.33.17)): `ICanProvideEventSourceId`, `ICanProvideEventStreamId`, `ICanProvideSubject` and `EventStreamIdAttribute` now come from `Cratis.Chronicle` (the `Cratis.Chronicle.Events` namespace) instead of being duplicated in Arc. Command code that implements these should import them from `Cratis.Chronicle.Events`.
- **Chronicle** ([Release v15.32.3](https://github.com/Cratis/Chronicle/releases/tag/v15.32.3)): Moved `ICanProvideEventSourceId`, `ICanProvideEventStreamId` and `ICanProvideSubject` to the `Cratis.Chronicle.Events` namespace so they are shared by reactors and commands.
- **Fundamentals** ([Release v7.13.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.13.0)): JsonSerializer now follows C# pattern: recognizes ConceptAs types, unwraps to inner value, then recursively serializes using reliable type detection
- **Fundamentals** ([Release v7.13.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.13.0)): JsonSerializer serializes both ConceptAs instances and primitives to inner values and deserializes JSON primitives back to ConceptAs instances based on @field decorator
- **Fundamentals** ([Release v7.13.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.13.0)): Updated TypeScript documentation index and table of contents to include ConceptAs
- **Fundamentals** ([Release v7.13.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.13.0)): Reorganized test structure: moved serialization tests from `for_ConceptAs` to `for_JsonSerializer` to reflect that serialization is a JsonSerializer concern, while keeping ConceptAs creation tests self-contained
- **Fundamentals** ([Release v7.12.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.12.0)): JsonSerializer now follows C# pattern: recognizes ConceptAs types, unwraps to inner value, then recursively serializes using reliable type detection
- **Fundamentals** ([Release v7.12.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.12.0)): JsonSerializer serializes both ConceptAs instances and primitives to inner values and deserializes JSON primitives back to ConceptAs instances based on @field decorator
- **Fundamentals** ([Release v7.12.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.12.0)): Updated TypeScript documentation index and table of contents to include ConceptAs
- **Fundamentals** ([Release v7.12.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.12.0)): Reorganized test structure: moved serialization tests from `for_ConceptAs` to `for_JsonSerializer` to reflect that serialization is a JsonSerializer concern, while keeping ConceptAs creation tests self-contained
- **Fundamentals** ([Release v7.11.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.11.0)): JsonSerializer now follows C# pattern: recognizes ConceptAs types, unwraps to inner value, then recursively serializes using reliable type detection
- **Fundamentals** ([Release v7.11.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.11.0)): JsonSerializer serializes both ConceptAs instances and primitives to inner values and deserializes JSON primitives back to ConceptAs instances based on @field decorator
- **Fundamentals** ([Release v7.11.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.11.0)): Updated TypeScript documentation index and table of contents to include ConceptAs
- **Fundamentals** ([Release v7.11.0](https://github.com/Cratis/Fundamentals/releases/tag/v7.11.0)): Reorganized test structure: moved serialization tests from `for_ConceptAs` to `for_JsonSerializer` to reflect that serialization is a JsonSerializer concern, while keeping ConceptAs creation tests self-contained
- **Arc** ([Release v20.33.3](https://github.com/Cratis/Arc/releases/tag/v20.33.3)): Changed Chronicle read model setup to register the compliance interceptor in each service collection (#2152)
- **Components** ([Release v2.1.0](https://github.com/Cratis/Components/releases/tag/v2.1.0)): `FilterPanel` accepts `children?: ReactNode` — uses `React.Children` + `isValidElement` to discover `<FilterEditor>` slots and render them in the matching filter group (#102)
- **Components** ([Release v2.1.0](https://github.com/Cratis/Components/releases/tag/v2.1.0)): `PivotViewer/components/FilterPanel.tsx` is now a thin adapter: converts `PivotFilter<TItem>[]` + computed options into `FilterDefinition[]`, generates `<FilterEditor>` children from any `PivotFilter.renderEditor`, and delegates all rendering to the new standalone component — no breaking changes to the public API (#102)
- **Components** ([Release v2.1.0](https://github.com/Cratis/Components/releases/tag/v2.1.0)): `PivotFilter<TItem>` retains `renderEditor?` and `type: 'custom'` so PivotViewer consumers can inject custom filter editors without any workarounds (#102)
- **Components** ([Release v2.1.0](https://github.com/Cratis/Components/releases/tag/v2.1.0)): `Source/Filter/useFilterState.ts` now imports `buildFilterValues` and `buildRangeValues` from `./utils` (#102)
- **Components** ([Release v2.1.0](https://github.com/Cratis/Components/releases/tag/v2.1.0)): `Documentation/toc.yml` updated with Filter entries in both the Storybook section and Common Components section (#102)
- **Components** ([Release v2.1.0](https://github.com/Cratis/Components/releases/tag/v2.1.0)): `eslint.config.mjs` — added `argsIgnorePattern: '^_'` to the `@typescript-eslint/no-unused-vars` rule to honour the `_`-prefix convention for intentionally unused parameters (#102)
- **Arc** ([Release v20.33.2](https://github.com/Cratis/Arc/releases/tag/v20.33.2)): Changed Chronicle read model setup to register the compliance interceptor in each service collection (#2152)
- **Chronicle** ([Release v15.32.1](https://github.com/Cratis/Chronicle/releases/tag/v15.32.1)): Registered the required Chronicle observation activity sources for reactor and reducer gRPC services.
- **Chronicle** ([Release v15.32.1](https://github.com/Cratis/Chronicle/releases/tag/v15.32.1)): Extended append-many client/test harness support with per-event subject assertions and an in-process PII integration scenario.
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): Constraint definitions are persisted as versions; latest is active while prior versions are retained
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): Constraint updates now classify change impact and trigger targeted reindex only when required
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): Observer count behavior now aligns with replay semantics (full replay reset, partition replay adjustment) (#1557)
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): Event compliance handling is consumed through a dedicated injectable helper contract (#1557)
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): Stream completion behavior now returns explicit completion results and rejects unsupported completion cases (#1446)
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): Observer state keeps a backward-compatible alias for handled-event-type counts while guiding consumers to the new property name (#1557)
- **Components** ([Release v2.0.1](https://github.com/Cratis/Components/releases/tag/v2.0.1)): Move UI runtime libraries (allotment, framer-motion, pixi.js, primeicons, primereact) from peer dependencies to dependencies for package consumers.
- **Components** ([Release v2.0.1](https://github.com/Cratis/Components/releases/tag/v2.0.1)): Keep only framework-level peers (React, Cratis Arc, fundamentals, reflect-metadata, tsyringe) as peer dependencies.

## Fixed
- **Chronicle** ([Release v15.33.8](https://github.com/Cratis/Chronicle/releases/tag/v15.33.8)): SQL backend: Workbench event-store list and namespace dropdown now populate correctly — SSE observable subscriptions were silently receiving no data because the BehaviorSubject's initial emission was swallowed by a non-replaying Subject intermediary before any subscriber was attached
- **Chronicle** ([Release v15.33.8](https://github.com/Cratis/Chronicle/releases/tag/v15.33.8)): SQL backend: Appending events no longer fails with `value too long for type character varying(200)` when a unique constraint value (e.g. a long email address) exceeds 200 characters — the `Value` column is now created as unbounded text, and existing tables are automatically altered in-place on next startup
- **Chronicle** ([Release v15.33.7](https://github.com/Cratis/Chronicle/releases/tag/v15.33.7)): SQL read model instances query failing with \`42703: column does not exist\` when two read models share the same container name across namespaces and the existing table was created by a different read model with a different column set.
- **Chronicle** ([Release v15.33.6](https://github.com/Cratis/Chronicle/releases/tag/v15.33.6)): `ClusterStorage.ObserveEventStores`, `EventTypesStorage.GetAllGenerationsForEventType`, `NamespaceStorage.ObserveAll`, and `ObserverStateStorage.ObserveAll` in the SQL storage backend no longer throw `NotImplementedException` at runtime — each is now fully implemented following the same `ReplaySubject`/`NotifyChange` pattern used by the rest of the SQL storage layer.
- **Chronicle.Elixir** ([Release v1.0.1](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v1.0.1)): The \`Artifacts.discover_loaded/0\` test assertion was missing \`:projections\` from the expected artifact category keys, causing CI to fail after projections support was added.
- **Chronicle** ([Release v15.33.5](https://github.com/Cratis/Chronicle/releases/tag/v15.33.5)): OpenIddict storage registrations now route to SQL-backed implementations when the configured storage type is SQLite, MS SQL, or PostgreSQL, preventing authentication failures with SQL backends
- **cli** ([Release v1.6.1](https://github.com/Cratis/cli/releases/tag/v1.6.1)): Read model instances now load asynchronously: the detail overlay opens immediately and the UI thread no longer blocks on the instances fetch when activating a read model row.
- **Chronicle** ([Release v15.33.4](https://github.com/Cratis/Chronicle/releases/tag/v15.33.4)): Fixing so that we don't fall back to production tag - but development slim when other databases are configured for Aspire setup.
- **Arc** ([Release v20.39.2](https://github.com/Cratis/Arc/releases/tag/v20.39.2)): Observable (`ISubject<T>`) and `IAsyncEnumerable<T>` model-bound query results no longer crash under read model interception. `QueryPipeline.ApplyInterceptors` now leaves streaming results untouched for the streaming transport to intercept per emission.
- **Arc** ([Release v20.39.2](https://github.com/Cratis/Arc/releases/tag/v20.39.2)): Collection observable queries (`ISubject<IEnumerable<TReadModel>>`) now have compliance/PII release applied to each item. The streaming transports previously keyed interception on the enumerable type, found no matching interceptor, and silently served undecrypted values.
- **Chronicle.TypeScript** ([Release v0.2.3](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v0.2.3)): Calling the compliance \`Release\` gRPC service no longer crashes the entire client with \`requestEncode is not a function\`. The service definition was wired with empty placeholder objects instead of proper protobuf message functions; replaced with correct binary encode/decode implementations.
- **Chronicle.TypeScript** ([Release v0.2.2](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v0.2.2)): `getSnapshotsById` now releases (decrypts) compliance-protected PII fields in read model snapshots when the read model is owned by a reducer, matching the behavior already applied to `getInstanceById` and `getInstances`.
- **Chronicle.Elixir** ([Release v0.3.1](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v0.3.1)): `ComplianceMetadataType.pii()` now returns `"PII"` instead of the opaque GUID `"cae5580e-83d6-44dc-9d7a-a72e8a2f17d7"`, aligning the Elixir client with the Chronicle kernel which changed to string-based compliance type identifiers.
- **Chronicle.TypeScript** ([Release v0.2.1](https://github.com/Cratis/Chronicle.TypeScript/releases/tag/v0.2.1)): `ComplianceMetadataType` now uses a plain `string` value instead of `Guid`, matching the kernel concept that was changed to a string representation. The `PII` sentinel is updated from a UUID to `'PII'`.
- **Chronicle.Elixir** ([Release v0.3.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v0.3.0)): Model-bound `from` declarations with no options now correctly trigger auto-mapping instead of producing an empty property set.
- **Chronicle.Elixir** ([Release v0.3.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v0.3.0)): Console sample interactive input no longer requires pressing Enter after each keypress.
- **Chronicle** ([Release v15.33.3](https://github.com/Cratis/Chronicle/releases/tag/v15.33.3)): Personally Identifiable Information is now decrypted on every path that returns a read model or events — including `getInstanceById` (immediate projections and stored read models) and read model snapshots.
- **Chronicle** ([Release v15.33.3](https://github.com/Cratis/Chronicle/releases/tag/v15.33.3)): Encrypting a batch of events that contained several PII events for the same subject could overwrite the subject's encryption key and leave earlier events undecryptable; concurrent encryptions for a subject now share a single key.
- **Chronicle** ([Release v15.33.2](https://github.com/Cratis/Chronicle/releases/tag/v15.33.2)): Unique constraints are now enforced across events appended in the same `AppendMany` batch — two events in one batch can no longer both claim the same unique value and both be appended.
- **Chronicle.Elixir** ([Release v0.2.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v0.2.0)): Reducers no longer fail to register with a server-side `ReducerRegistrationFailed` / `NullReferenceException`: observers now register their observation streams only after their read-model and projection definitions exist on the kernel.
- **Chronicle.Elixir** ([Release v0.2.0](https://github.com/Cratis/Chronicle.Elixir/releases/tag/v0.2.0)): Seeding no longer fails with `:not_connected` at startup: seeders run once the connection is ready and retry idempotently.
- **Arc** ([Release v20.39.1](https://github.com/Cratis/Arc/releases/tag/v20.39.1)): Observable (`ISubject<T>`) and `IAsyncEnumerable<T>` model-bound query results no longer crash under read model interception. `QueryPipeline.ApplyInterceptors` now leaves streaming results untouched for the streaming transport to intercept per emission.
- **Arc** ([Release v20.39.1](https://github.com/Cratis/Arc/releases/tag/v20.39.1)): Collection observable queries (`ISubject<IEnumerable<TReadModel>>`) now have compliance/PII release applied to each item. The streaming transports previously keyed interception on the enumerable type, found no matching interceptor, and silently served undecrypted values.
- **Chronicle** ([Release v15.33.1](https://github.com/Cratis/Chronicle/releases/tag/v15.33.1)): The `development` and `development-slim` container images no longer abort at startup demanding an encryption certificate and HTTPS. Development security relaxations (ephemeral OpenIddict keys, optional TLS) are once again gated on the compile-time `DEVELOPMENT` flag the images are built with, instead of a runtime environment-variable check the images never set. Production images still require an encryption certificate.
- **Arc** ([Release v20.33.19](https://github.com/Cratis/Arc/releases/tag/v20.33.19)): The subject is now included when a command appends events for explicit event source ids (`EventForEventSourceId`), matching the behavior of the other event appenders.
- **Arc** ([Release v20.33.18](https://github.com/Cratis/Arc/releases/tag/v20.33.18)): The subject is now included when a command appends events for explicit event source ids (`EventForEventSourceId`), matching the behavior of the other event appenders.
- **Arc** ([Release v20.33.17](https://github.com/Cratis/Arc/releases/tag/v20.33.17)): The subject is now included when a command appends events for explicit event source ids (`EventForEventSourceId`), matching the behavior of the other event appenders.
- **Arc** ([Release v20.33.16](https://github.com/Cratis/Arc/releases/tag/v20.33.16)): Date objects in URL query parameters and route replacements now serialize as ISO 8601 for .NET DateTimeOffset binding compatibility
- **Arc** ([Release v20.33.15](https://github.com/Cratis/Arc/releases/tag/v20.33.15)): Date objects in URL query parameters and route replacements now serialize as ISO 8601 for .NET DateTimeOffset binding compatibility
- **Arc** ([Release v20.33.14](https://github.com/Cratis/Arc/releases/tag/v20.33.14)): Date objects in URL query parameters and route replacements now serialize as ISO 8601 for .NET DateTimeOffset binding compatibility
- **Arc** ([Release v20.33.13](https://github.com/Cratis/Arc/releases/tag/v20.33.13)): Date objects in URL query parameters and route replacements now serialize as ISO 8601 for .NET DateTimeOffset binding compatibility
- **Arc** ([Release v20.33.12](https://github.com/Cratis/Arc/releases/tag/v20.33.12)): Date objects in URL query parameters and route replacements now serialize as ISO 8601 for .NET DateTimeOffset binding compatibility
- **Arc** ([Release v20.33.11](https://github.com/Cratis/Arc/releases/tag/v20.33.11)): Incorrect TypeScript import generation for nullable primitive types (e.g. `import { Date } from '../Nullable\`1'`)
- **Arc** ([Release v20.33.10](https://github.com/Cratis/Arc/releases/tag/v20.33.10)): Incorrect TypeScript import generation for nullable primitive types (e.g. `import { Date } from '../Nullable\`1'`)
- **Arc** ([Release v20.33.9](https://github.com/Cratis/Arc/releases/tag/v20.33.9)): ProxyGenerator crash when processing nullable DateTimeOffset query parameters due to Nullable.GetUnderlyingType() returning null for MetadataLoadContext types
- **Arc** ([Release v20.33.8](https://github.com/Cratis/Arc/releases/tag/v20.33.8)): ProxyGenerator crash when processing nullable DateTimeOffset query parameters due to Nullable.GetUnderlyingType() returning null for MetadataLoadContext types
- **Arc** ([Release v20.33.7](https://github.com/Cratis/Arc/releases/tag/v20.33.7)): Add integration specs for generic type parameter and dictionary with generic key scenarios that previously caused null reference exceptions
- **Arc** ([Release v20.33.7](https://github.com/Cratis/Arc/releases/tag/v20.33.7)): Replace null-forgiving operators with proper null guards throughout TypeExtensions for all `type.FullName` usages
- **Arc** ([Release v20.33.6](https://github.com/Cratis/Arc/releases/tag/v20.33.6)): Add integration specs for generic type parameter and dictionary with generic key scenarios that previously caused null reference exceptions
- **Arc** ([Release v20.33.6](https://github.com/Cratis/Arc/releases/tag/v20.33.6)): Replace null-forgiving operators with proper null guards throughout TypeExtensions for all `type.FullName` usages
- **Arc** ([Release v20.33.5](https://github.com/Cratis/Arc/releases/tag/v20.33.5)): ProxyGenerator now correctly maps nullable value types (`DateTimeOffset?`, `DateTime?`, `int?`, `Guid?`, `bool?`) to their underlying TypeScript types (`Date`, `number`, `boolean`, `Guid`) instead of the literal type name `Nullable`
- **Arc** ([Release v20.33.4](https://github.com/Cratis/Arc/releases/tag/v20.33.4)): ProxyGenerator now correctly maps nullable value types (`DateTimeOffset?`, `DateTime?`, `int?`, `Guid?`, `bool?`) to their underlying TypeScript types (`Date`, `number`, `boolean`, `Guid`) instead of the literal type name `Nullable`
- **Arc** ([Release v20.33.3](https://github.com/Cratis/Arc/releases/tag/v20.33.3)): Fixed open generic read model interceptors being skipped by Arc query interception (#2152)
- **Arc** ([Release v20.33.3](https://github.com/Cratis/Arc/releases/tag/v20.33.3)): Fixed DI-registered read model interceptors not running for query read models (#2152)
- **Components** ([Release v2.1.1](https://github.com/Cratis/Components/releases/tag/v2.1.1)): Date range for filters didn't format properly, now it has more options.
- **Components** ([Release v2.1.0](https://github.com/Cratis/Components/releases/tag/v2.1.0)): Storybook static build (`storybook build`) now completes successfully — fixed a pre-existing `[lightningcss minify] Invalid empty selector` crash by adding `cssMinify: false` to the `viteFinal` config in `Source/.storybook/main.ts` (#102)
- **Components** ([Release v2.1.0](https://github.com/Cratis/Components/releases/tag/v2.1.0)): CI build failure caused by ESLint flagging `_props` in `FilterEditor.tsx` as unused — resolved by adding `argsIgnorePattern: '^_'` to the ESLint rule config (#102)
- **Arc** ([Release v20.33.2](https://github.com/Cratis/Arc/releases/tag/v20.33.2)): Fixed open generic read model interceptors being skipped by Arc query interception (#2152)
- **Arc** ([Release v20.33.2](https://github.com/Cratis/Arc/releases/tag/v20.33.2)): Fixed DI-registered read model interceptors not running for query read models (#2152)
- **Chronicle** ([Release v15.32.1](https://github.com/Cratis/Chronicle/releases/tag/v15.32.1)): Fixed `AppendMany` subject propagation for compliance and PII encryption.
- **Chronicle** ([Release v15.32.1](https://github.com/Cratis/Chronicle/releases/tag/v15.32.1)): `AppendMany(EventSourceId, IEnumerable<object>)` now resolves `[Subject]` from each event and sends it per event.
- **Chronicle** ([Release v15.32.1](https://github.com/Cratis/Chronicle/releases/tag/v15.32.1)): `AppendMany(IEnumerable<EventForEventSourceId>)` now preserves an explicit per-event `Subject` override, or derives it from `[Subject]` when no override is provided.
- **Chronicle** ([Release v15.32.1](https://github.com/Cratis/Chronicle/releases/tag/v15.32.1)): The gRPC contract, kernel append-many model, compliance application, SQL storage, in-memory storage, and the API append-many endpoint now carry the subject through consistently.
- **Chronicle** ([Release v15.32.1](https://github.com/Cratis/Chronicle/releases/tag/v15.32.1)): Batched events whose PII belongs to a person different from the event source are now encrypted under the person subject instead of falling back to the aggregate event source id.
- **Chronicle** ([Release v15.32.1](https://github.com/Cratis/Chronicle/releases/tag/v15.32.1)): Fixed child projection parent-key resolution when the parent projection is identified by `$eventSourceId` and the child key is a different type.
- **Chronicle** ([Release v15.32.1](https://github.com/Cratis/Chronicle/releases/tag/v15.32.1)): Fixed projection sink updates that combine parent collection property changes with child add/remove operations in the same update across MongoDB, SQL, and in-memory storage.
- **Chronicle** ([Release v15.32.1](https://github.com/Cratis/Chronicle/releases/tag/v15.32.1)): Fixed repeated MongoDB redaction handling so already-redacted events preserve the original event type and do not trigger another observer rewind.
- **Chronicle** ([Release v15.32.1](https://github.com/Cratis/Chronicle/releases/tag/v15.32.1)): Fixed redaction detection to compare against the event type id instead of the full event type value.
- **Chronicle** ([Release v15.32.1](https://github.com/Cratis/Chronicle/releases/tag/v15.32.1)): Fixed compliance release handling for non-string subjects and multiple PII properties.
- **Chronicle** ([Release v15.32.1](https://github.com/Cratis/Chronicle/releases/tag/v15.32.1)): Fixed observer event decryption when event type schemas with PII metadata are loaded lazily while handling events.
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): Unique constraint definition updates now rebuild affected indexes to prevent stale uniqueness behavior
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): Constraint change propagation now carries actionable change details instead of generic change signals
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): Integration regressions caused by scenario setup overwrites of explicit identifiers
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): Observer state serialization issues for concept-keyed read-only dictionary payloads (#1557)
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): Build failure caused by an analyzer-triggering unnecessary using in specs (#3142)
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): CI/package restore failures caused by branch-local GitHub Packages source configuration
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): Integration spec and benchmark regressions caused by legacy observer handled-event count property usage (#1557)

## Removed
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): Observer handled-count Orleans grain path in favor of persisted incremental state (#1557)
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): Legacy append error path for completed streams in favor of constraint violations (#1446)
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): Completed-stream collection ownership from event sequence state, now moved to dedicated constraint storage (#1446)
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): Branch-local `NuGet.config` that redirected package restore to GitHub Packages
- **Components** ([Release v2.0.1](https://github.com/Cratis/Components/releases/tag/v2.0.1)): Remove optional peer dependency metadata for libraries now included as runtime dependencies.

## Security
- No updates

## Deprecated
- **Chronicle** ([Release v15.32.0](https://github.com/Cratis/Chronicle/releases/tag/v15.32.0)): `ObserverState.HandledEventTypesCount` in favor of `ObserverState.HandledEventCountPerEventType` (#1557)
