Release digest: June 29 - July 6, 2026 (Week 27)
- Arc (Release v20.49.0): New
ARCCHR0005analyzer that warns at compile time when a project sets up Arc withAddCratisArcbut never callsWithChronicle()orAddCratis(), yet uses Chronicle in the same project (an aggregate root, reactor, reducer, projection,[EventType]event, or a type injectingIEventLog/IEventStore). It stays silent when Chronicle genuinely is not used. - Chronicle (Release v15.38.4): Chronicle clients can delete a subject’s PII encryption key to satisfy GDPR right-to-erasure (crypto-shredding), via
IPIIManager.DeleteEncryptionKeyForandIEventStore.PII.IPIIManagercan also be injected directly. - Chronicle (Release v15.38.0):
ReadModelScenario<T>.InstancesandInstanceForEventSourceId(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 inInstance. - Chronicle (Release v15.36.1): A
CHR0023analyzer that warns when a[ChildrenFrom]collection omitsparentKeyand 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. SpecifyparentKeyto resolve it. - Chronicle (Release v15.36.0): A
CHR0023analyzer that warns when a[ChildrenFrom]collection omitsparentKeyand 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. SpecifyparentKeyto resolve it.
Changed
Section titled “Changed”- Arc (Release v20.49.0): Resolving a Chronicle service such as
IEventLogwithout Chronicle configured now throws an actionable error that names the command, query, or validator and its parameter, and points at the fix (WithChronicle()orAddCratis()) instead of a raw “Unable to resolve service for typeEventStoreName” container exception. - Arc (Release v20.49.0): Expanded the IntelliSense/API documentation on
AddCratis,UseCratis,AddCratisArc,UseCratisArc, andWithChronicle(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): 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): Raised the Cratis.Chronicle dependency floor to 15.38.0.
- Arc (Release v20.48.2): Updated Microsoft.EntityFrameworkCore, Microsoft.Extensions.*, and other third-party dependencies to their latest patch versions.
- Arc (Release v20.48.1): Raised the Cratis.Chronicle dependency floor to 15.38.0.
- Arc (Release v20.48.1): Updated Microsoft.EntityFrameworkCore, Microsoft.Extensions.*, and other third-party dependencies to their latest patch versions.
- Chronicle (Release 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 fromEventContext.Occurred) reflects append order. - Chronicle (Release 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 fromEventContext.Occurred) reflects append order.
- Arc (Release 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.PIImember, and the Roslyn analyzer packages are pinned back to a version compatible with the shipped SDK compiler. - Arc (Release v20.49.2):
CS9057— the sweep bumpedMicrosoft.CodeAnalysis.CSharp/.Workspaces/.Workspaces.Commonto5.6.0; analyzers built against5.6.0cannot be loaded by the Roslyn5.3.0compiler in the pinned SDK. Reverted to5.3.0. - Arc (Release v20.49.2):
CS0535— Chronicle15.38.4addedPIItoIEventStore;EventStoreForScenariodid not implement it. Added it following the existing unsupported-operation pattern. - Chronicle (Release 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): Correct a stale
net6.0output path in the Kernel READMEdotnet countersexample (the Kernel targetsnet10.0). - Chronicle (Release 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): 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): 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): Resolved 9
MA0206(unnecessary braces in type declaration) errors that were blocking Release-configuration builds afterMeziantou.Analyzerwas bumped to3.0.117. - Arc (Release v20.48.2): Resolved a high-severity vulnerability (GHSA-v5pm-xwqc-g5wc) in the transitive Microsoft.OpenApi dependency.
- Chronicle (Release 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): Docker images (
cratis/chronicleand the-workbench,-development, and-development-slimvariants) 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):
[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):
[ChildrenFrom]with an omittedparentKeyno 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 rawGuid), so the children resolve. When more than one event property still matches, the first by declaration order is used; specifyparentKeyto disambiguate. - Chronicle (Release v15.36.1):
[ChildrenFrom]child collections now project inReadModelScenario<T>when a child value is adecimalorTimeSpan; previously such collections materialized empty. - Chronicle (Release 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):
[ChildrenFrom]with an omittedparentKeyno 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 rawGuid), so the children resolve. When more than one event property still matches, the first by declaration order is used; specifyparentKeyto disambiguate. - Chronicle (Release v15.36.0):
[ChildrenFrom]child collections now project inReadModelScenario<T>when a child value is adecimalorTimeSpan; previously such collections materialized empty.
Removed
Section titled “Removed”- Chronicle (Release v15.38.4): Removed the non-functional
CreateAndRegisterKeyForfromIPIIManager; it only ever threwNotImplementedException, and encryption keys are already registered automatically on first use.
Security
Section titled “Security”- No updates
Deprecated
Section titled “Deprecated”- No updates