---
title: Release digest for week of 2026-06-29 to 2026-07-06
---

## Added
- **Arc** ([Release v20.49.0](https://github.com/Cratis/Arc/releases/tag/v20.49.0)): New `ARCCHR0005` analyzer that warns at compile time when a project sets up Arc with `AddCratisArc` but never calls `WithChronicle()` or `AddCratis()`, yet uses Chronicle in the same project (an aggregate root, reactor, reducer, projection, `[EventType]` event, or a type injecting `IEventLog`/`IEventStore`). It stays silent when Chronicle genuinely is not used.
- **Chronicle** ([Release v15.38.4](https://github.com/Cratis/Chronicle/releases/tag/v15.38.4)): Chronicle clients can delete a subject's PII encryption key to satisfy GDPR right-to-erasure (crypto-shredding), via `IPIIManager.DeleteEncryptionKeyFor` and `IEventStore.PII`. `IPIIManager` can also be injected directly.
- **Chronicle** ([Release v15.38.0](https://github.com/Cratis/Chronicle/releases/tag/v15.38.0)): `ReadModelScenario<T>.Instances` and `InstanceForEventSourceId(id)` for asserting a specific materialized read model when a projection spans multiple event sources — for example a `[Join]` whose join-source event is seeded before the entity under test, which previously shadowed it in `Instance`.
- **Chronicle** ([Release v15.36.1](https://github.com/Cratis/Chronicle/releases/tag/v15.36.1)): A `CHR0023` analyzer that warns when a `[ChildrenFrom]` collection omits `parentKey` and the parent key cannot be inferred unambiguously — the event has more than one property of the parent read model's identifier type besides the child key. Specify `parentKey` to resolve it.
- **Chronicle** ([Release v15.36.0](https://github.com/Cratis/Chronicle/releases/tag/v15.36.0)): A `CHR0023` analyzer that warns when a `[ChildrenFrom]` collection omits `parentKey` and the parent key cannot be inferred unambiguously — the event has more than one property of the parent read model's identifier type besides the child key. Specify `parentKey` to resolve it.

## Changed
- **Arc** ([Release v20.49.0](https://github.com/Cratis/Arc/releases/tag/v20.49.0)): Resolving a Chronicle service such as `IEventLog` without Chronicle configured now throws an actionable error that names the command, query, or validator and its parameter, and points at the fix (`WithChronicle()` or `AddCratis()`) instead of a raw "Unable to resolve service for type `EventStoreName`" container exception.
- **Arc** ([Release v20.49.0](https://github.com/Cratis/Arc/releases/tag/v20.49.0)): Expanded the IntelliSense/API documentation on `AddCratis`, `UseCratis`, `AddCratisArc`, `UseCratisArc`, and `WithChronicle` (all overloads): they clarify that the application hosts the Chronicle client — which connects to a separately running Chronicle instance — rather than an embedded engine, and include runnable examples for the common setups.
- **Chronicle** ([Release v15.38.4](https://github.com/Cratis/Chronicle/releases/tag/v15.38.4)): Reading a PII value whose encryption key has been deleted now returns an empty value instead of throwing, so read models and queries for an erased subject keep working.
- **Arc** ([Release v20.48.2](https://github.com/Cratis/Arc/releases/tag/v20.48.2)): Raised the Cratis.Chronicle dependency floor to 15.38.0.
- **Arc** ([Release v20.48.2](https://github.com/Cratis/Arc/releases/tag/v20.48.2)): Updated Microsoft.EntityFrameworkCore, Microsoft.Extensions.*, and other third-party dependencies to their latest patch versions.
- **Arc** ([Release v20.48.1](https://github.com/Cratis/Arc/releases/tag/v20.48.1)): Raised the Cratis.Chronicle dependency floor to 15.38.0.
- **Arc** ([Release v20.48.1](https://github.com/Cratis/Arc/releases/tag/v20.48.1)): Updated Microsoft.EntityFrameworkCore, Microsoft.Extensions.*, and other third-party dependencies to their latest patch versions.
- **Chronicle** ([Release v15.36.1](https://github.com/Cratis/Chronicle/releases/tag/v15.36.1)): The `ReadModelScenario<T>` test harness gives each driven event a distinct, monotonically increasing occurred time, so a time-based `[FromAll]` (for example a last-updated value mapped from `EventContext.Occurred`) reflects append order.
- **Chronicle** ([Release v15.36.0](https://github.com/Cratis/Chronicle/releases/tag/v15.36.0)): The `ReadModelScenario<T>` test harness gives each driven event a distinct, monotonically increasing occurred time, so a time-based `[FromAll]` (for example a last-updated value mapped from `EventContext.Occurred`) reflects append order.

## Fixed
- **Arc** ([Release v20.49.2](https://github.com/Cratis/Arc/releases/tag/v20.49.2)): Restored a broken build caused by the Chronicle 15.38.4 package sweep: the in-memory command-scenario event store now implements the newly added `IEventStore.PII` member, and the Roslyn analyzer packages are pinned back to a version compatible with the shipped SDK compiler.
- **Arc** ([Release v20.49.2](https://github.com/Cratis/Arc/releases/tag/v20.49.2)): **`CS9057`** — the sweep bumped `Microsoft.CodeAnalysis.CSharp`/`.Workspaces`/`.Workspaces.Common` to `5.6.0`; analyzers built against `5.6.0` cannot be loaded by the Roslyn `5.3.0` compiler in the pinned SDK. Reverted to `5.3.0`.
- **Arc** ([Release v20.49.2](https://github.com/Cratis/Arc/releases/tag/v20.49.2)): **`CS0535`** — Chronicle `15.38.4` added `PII` to `IEventStore`; `EventStoreForScenario` did not implement it. Added it following the existing unsupported-operation pattern.
- **Chronicle** ([Release v15.38.3](https://github.com/Cratis/Chronicle/releases/tag/v15.38.3)): Chronicle server Docker images could not start — they exited with `Permission denied` (exit code 126) because the server executable was missing its executable bit. Restored in #3446 and shipped in this release; all server images published since 15.37.0 were affected.
- **Chronicle** ([Release v15.38.3](https://github.com/Cratis/Chronicle/releases/tag/v15.38.3)): Correct a stale `net6.0` output path in the Kernel README `dotnet counters` example (the Kernel targets `net10.0`).
- **Chronicle** ([Release v15.38.2](https://github.com/Cratis/Chronicle/releases/tag/v15.38.2)): Read models keyed by a property other than their event source id (for example `[FromEvent<T>(key: nameof(...))]`, or a re-keyed reducer) now decrypt their `[PII]` properties on read. Previously the value was encrypted under the source event's subject while the document was stored under a different key, so queries and command-side reads returned it as ciphertext. The read-model document now encrypts and releases its PII under its own resolved key, so it stays decryptable for the document's whole lifetime.
- **Chronicle** ([Release v15.38.1](https://github.com/Cratis/Chronicle/releases/tag/v15.38.1)): A read model whose property is a `[PII]` collection no longer freezes its reducer: the encrypted list is released back into an array that deserializes into the read model's collection type instead of failing as a raw string.
- **Chronicle** ([Release v15.38.1](https://github.com/Cratis/Chronicle/releases/tag/v15.38.1)): Removing a `[ChildrenFrom]` child that carries a `[PII]` member now removes it from the MongoDB read model instead of silently leaving it in place.
- **Arc** ([Release v20.48.3](https://github.com/Cratis/Arc/releases/tag/v20.48.3)): Resolved 9 `MA0206` (unnecessary braces in type declaration) errors that were blocking Release-configuration builds after `Meziantou.Analyzer` was bumped to `3.0.117`.
- **Arc** ([Release v20.48.2](https://github.com/Cratis/Arc/releases/tag/v20.48.2)): Resolved a high-severity vulnerability (GHSA-v5pm-xwqc-g5wc) in the transitive Microsoft.OpenApi dependency.
- **Chronicle** ([Release v15.38.0](https://github.com/Cratis/Chronicle/releases/tag/v15.38.0)): Read-model properties that are collections of bare concepts (for example `IReadOnlyList<ConceptAs<string>>`) no longer persist empty to MongoDB — the concept elements are now stored as their underlying values, matching the in-memory sink.
- **Chronicle** ([Release v15.36.1](https://github.com/Cratis/Chronicle/releases/tag/v15.36.1)): Docker images (`cratis/chronicle` and the `-workbench`, `-development`, and `-development-slim` variants) are published again. The 15.36.0 publish failed to push them because the cache-saving build jobs were denied cache writes under GitHub's new Actions cache service.
- **Chronicle** ([Release v15.36.1](https://github.com/Cratis/Chronicle/releases/tag/v15.36.1)): `[FromAll]` and `[FromEvery]` are now applied when declared on a positional record property (`[property: FromAll(...)]`). Previously the attribute was dropped, so the property was never projected, and `[FromAll(contextProperty: ...)]` was additionally mis-converted into a non-existent event-property lookup.
- **Chronicle** ([Release v15.36.1](https://github.com/Cratis/Chronicle/releases/tag/v15.36.1)): `[ChildrenFrom]` with an omitted `parentKey` no longer mis-infers the child key as the parent key when the parent identifier and the event's child key share a type (such as a raw `Guid`), so the children resolve. When more than one event property still matches, the first by declaration order is used; specify `parentKey` to disambiguate.
- **Chronicle** ([Release v15.36.1](https://github.com/Cratis/Chronicle/releases/tag/v15.36.1)): `[ChildrenFrom]` child collections now project in `ReadModelScenario<T>` when a child value is a `decimal` or `TimeSpan`; previously such collections materialized empty.
- **Chronicle** ([Release v15.36.0](https://github.com/Cratis/Chronicle/releases/tag/v15.36.0)): `[FromAll]` and `[FromEvery]` are now applied when declared on a positional record property (`[property: FromAll(...)]`). Previously the attribute was dropped, so the property was never projected, and `[FromAll(contextProperty: ...)]` was additionally mis-converted into a non-existent event-property lookup.
- **Chronicle** ([Release v15.36.0](https://github.com/Cratis/Chronicle/releases/tag/v15.36.0)): `[ChildrenFrom]` with an omitted `parentKey` no longer mis-infers the child key as the parent key when the parent identifier and the event's child key share a type (such as a raw `Guid`), so the children resolve. When more than one event property still matches, the first by declaration order is used; specify `parentKey` to disambiguate.
- **Chronicle** ([Release v15.36.0](https://github.com/Cratis/Chronicle/releases/tag/v15.36.0)): `[ChildrenFrom]` child collections now project in `ReadModelScenario<T>` when a child value is a `decimal` or `TimeSpan`; previously such collections materialized empty.

## Removed
- **Chronicle** ([Release v15.38.4](https://github.com/Cratis/Chronicle/releases/tag/v15.38.4)): Removed the non-functional `CreateAndRegisterKeyFor` from `IPIIManager`; it only ever threw `NotImplementedException`, and encryption keys are already registered automatically on first use.

## Security
- No updates

## Deprecated
- No updates
