Release digest: June 15 - 22, 2026 (Week 25)
- Arc (Release v20.47.0): New
Cratis.CodeAnalysispackage that bundles the full set of Cratis Arc lint analyzers (ARC*andARCCHR*). A singleCratis.CodeAnalysisreference enables them all; the individualCratis.Arc.Core.CodeAnalysisandCratis.Arc.Chronicle.CodeAnalysispackages remain available for à-la-carte use. The lint analyzers are still not bundled into the functional packages, so referencingCratis.Arc.Core(or theCratismeta package) does not force them on you. - Arc (Release v20.46.0): Exported
observerfrom@cratis/arc.react.mvvmso a child component that reads view model observables directly can be given its own observer boundary, with guidance in the React MVVM documentation. - Arc (Release v20.46.0): Added a
no-direct-mobx-react-importESLint rule that flags direct imports frommobx-react/mobx-react-liteand points consumers to@cratis/arc.react.mvvminstead. - Arc (Release v20.45.0): Exported
observerfrom@cratis/arc.react.mvvmso a child component that reads view model observables directly can be given its own observer boundary, with guidance in the React MVVM documentation. - Arc (Release v20.45.0): Added a
no-direct-mobx-react-importESLint rule that flags direct imports frommobx-react/mobx-react-liteand points consumers to@cratis/arc.react.mvvminstead. - Arc (Release v20.44.0):
ARC0007analyzer — warns when a[Command]is declared as a class instead of a record. - Arc (Release v20.44.0):
ARC0008analyzer — warns when a[ReadModel]is declared as a class instead of a record. - Arc (Release v20.44.0):
ARC0009analyzer — warns when aConceptAs<T>is declared as a class instead of a record. - Arc (Release v20.44.0):
ARCCHR0002analyzer — warns when a[Command]has multiple event source id candidates (EventSourceId,EventSourceId<T>, a type with an implicit conversion toEventSourceId, or[Key]) but does not implementICanProvideEventSourceId; exempt whenHandlereturns onlyEventForEventSourceId. - Arc (Release v20.44.0):
ARCCHR0003analyzer — warns when a reactor injectsIEventLoginstead of returning side-effect events. - Arc (Release v20.44.0):
ARCCHR0004analyzer — warns when[EventType]specifies an explicit id (the type name is the identifier);generationstays allowed. - Chronicle (Release v15.35.0): Reactor handler methods can take dependencies beyond the event and
EventContext: read models (materialized strongly consistent from their reducer or projection) and services from the service provider. (#3358) - Chronicle (Release v15.35.0):
ICanResolveReadModelKeylets a reactor choose which key its read model dependencies are materialized with; it defaults to the triggering event’sEventSourceId. (#3358) - Arc (Release v20.43.0): Added
CancellationTokeninjection for model-bound commandProvide()andHandle()methods. - Arc (Release v20.43.0): Added cancellation-aware command pipeline overloads for programmatic command execution.
- Arc (Release v20.42.2): Added nullable-aware dependency resolution for command validators, Provide, and Handle so nullable read model parameters can receive null when the command-scoped read model does not exist.
- Arc (Release v20.42.2): Added ARC0006 analyzer guidance for non-nullable command-scoped read model parameters in validators, Provide, and Handle, including read models discovered through Chronicle IProjectionFor
projections. The rule now frames this as an explicit design choice: nullable when the command handles absence, non-nullable when the projection is required. - Arc (Release v20.42.2): Added documentation for Chronicle read model dependency semantics, validator existence checks, Provide / Handle consistency, and ARC0006.
- Arc (Release v20.42.0): Commands can define a
Provide()method that suppliesHandle()’s arguments — fetched or computed, with its own parameters resolved from dependency injection — without registering those values in the container. Single, tuple,Result<,>, and async (Task/ValueTask) return shapes are all supported. - Arc (Release v20.42.0): New analyzer rule ARC0005 warns when a value produced by
Provide()is not consumed by anyHandle()parameter.
Changed
Section titled “Changed”- Arc (Release v20.46.0): Raised the minimum required
Cratis.Chronicleto15.35.0. - Arc (Release v20.46.0): The
Cratismeta package no longer bundles the Cratis analyzers; the ARC*/ARCCHR* analyzers now flow through the individual packages. A project referencing onlyCratisstill gets full runtime and proxy generation, but receives the analyzers only when a sub-package such asCratis.Arc.CoreorCratis.Arc.MongoDBis referenced. - Arc (Release v20.46.0): Realigned the net8/net9 framework dependency versions to their target-framework major (8.x / 9.x), so building for net8 or net9 no longer resolves 10.x
Microsoft.Extensions.*packages. - Arc (Release v20.46.0): The recommended Cratis Arc ESLint config now reports direct
mobx-react/mobx-react-liteimports as errors. - Arc (Release v20.45.0): The recommended Cratis Arc ESLint config now reports direct
mobx-react/mobx-react-liteimports as errors. - Arc (Release v20.44.2): Raised the minimum required
Cratis.Chronicleto15.35.0. - Arc (Release v20.44.0): The
Cratismeta package now bundles every Cratis analyzer (Arc, Arc.Chronicle, the Arc source generator, the Fundamentals type discovery generator, and the Metrics analyzer), so installingCratisenables all analyzers without referencing the sub-packages directly. - Chronicle (Release v15.35.0): The reactor method analyzer (CHR0004) now allows dependency parameters and only flags parameters that can never be resolved (primitives, value types, or string). (#3358)
- Arc (Release v20.43.7): Clarified CommandForm validation docs to distinguish required field metadata from explicit empty-string validation rules. (#2307)
- Arc (Release v20.43.0): Command validation now receives the command execution cancellation token.
- Arc (Release v20.42.2): Registered discoverable validators are still resolved from DI first, while unregistered validators are constructed through the shared nullable-aware parameter resolver.
- Arc (Release v20.42.2): Non-nullable command and validator dependencies now report that the dependency could not be resolved or resolved to null, with guidance to make read models nullable when absence is valid or keep them non-nullable when absence should fail as required state.
- Arc (Release v20.42.1): Documentation: corrected
Result<,>type-parameter order toResult<TSuccess, TError>across the command, validation, authorization, and scenario examples. - Arc (Release v20.41.3): Arc React Storybook page now fills the entire content area with Storybook’s navigation and panels visible, matching the Components Storybook page layout.
- Arc (Release v20.46.0): Referencing the
Cratismeta package alongside a package that transitively bringsCratis.Arc.Core(such asCratis.Arc.MongoDB) no longer fails the build withCS0101 'Cratis.Arc.Generated.GeneratedMarker'. - Arc (Release v20.46.0): Arc no longer throws
MissingMethodExceptionat runtime against released Chronicle. The Chronicle floor now matches theAppendMany/Appendoverloads Arc actually calls, so an incompatible Chronicle version failsdotnet restoreinstead of crashing at runtime. - Arc (Release v20.46.0): The
ARCCHR0002analyzer no longer reports an ambiguous command event source id when the command’sHandlesupplies the event source explicitly through a tuple return — including new-stream-create commands that return a generated id deriving fromEventSourceId<T>. - Arc (Release v20.44.2): Building a project that references the
Cratismeta package together with a package that transitively bringsCratis.Arc.Core(such asCratis.Arc.MongoDB) no longer fails withCS0101 'Cratis.Arc.Generated.GeneratedMarker'caused by the Arc source generator being loaded and run twice. - Arc (Release v20.44.2): Arc no longer throws
MissingMethodExceptionat runtime against released Chronicle. The Chronicle floor now matches theAppendMany/Appendoverloads Arc actually calls, so an incompatible Chronicle version failsdotnet restoreinstead of crashing at runtime. - Arc (Release v20.44.2): The
ARCCHR0002analyzer no longer reports an ambiguous command event source id when the command’sHandlesupplies the event source explicitly through a tuple return — including new-stream-create commands that return a generated id deriving fromEventSourceId<T>. - Chronicle (Release v15.35.1):
ReadModelScenario<T>now correctly round-trips read-model properties typed as a collection of bare concepts (e.g.IReadOnlyList<MyConcept>whereMyConcept : ConceptAs<T>). Previously such a property threw aJsonException(“Cannot get the value of a token type ‘StartObject’ as a string”) when the projected instance was materialized, because the projection harness serialized the state without the concept-aware serializer options while deserializing with them. Scalar concept properties round-trip the same way. - Arc (Release v20.44.1): Commands with a property holding a cyclic or arbitrary object graph (for example
System.Text.Json.Nodes.JsonObject, whose child nodes back-reference their parent) no longer crash command execution with a stack overflow / HTTP 500. Nested validator behavior is unchanged. - Fundamentals (Release v7.16.2):
JsonSerializernow preserves the_derivedTypeIddiscriminator through both deserialization and serialization. Previously, deserializing a polymorphic value whose concrete type could not be resolved (e.g. its derived type was not yet registered) dropped the discriminator, so the value could never be re-resolved or round-tripped and serialized back with no type information. The discriminator now flows transparently in both directions. - Chronicle (Release v15.34.13): Fixed projection replay for deep joined or child-stream read models so nested children are rebuilt consistently instead of depending on partition scheduling. (#3345)
- Chronicle (Release v15.34.12): Read-model properties typed as a collection of concepts (e.g.
IReadOnlyList<MyConcept>whereMyConcept : ConceptAs<string>) are no longer silently persisted as an empty/missing array. Such a property now stores the unwrapped underlying values, the same way a scalar concept already did. A scalar concept and a collection of records in the same read model were always persisted correctly; only collections of bare concepts were affected. - Arc (Release v20.43.7): Fixed command required-property validation to treat only
nullandundefinedas missing, letting explicit validators decide whether empty strings are invalid. (#2307) - Arc (Release v20.43.7): Fixed
currentValuesanduseCommandvalue syncing so explicitnullandundefinedvalues clear command properties instead of leaving stale values. (#2307) - Fundamentals (Release v7.16.1):
JsonSerializernow populates fields inherited from base types when deserializing a derived (polymorphic) type. PreviouslygetFieldsForTypeonly read a type’s own field metadata, so a resolved derived type came back with its inherited properties unset. - Chronicle (Release v15.34.11): Fixed passive read model projections dropping child element updates.
- Chronicle (Release v15.34.11): Fixed MongoDB sink conflicts when a child add and child identifier update appear in the same changeset.
- Chronicle (Release v15.34.10): Fixed MongoDB read-model sink updates for reducer-owned child collections when an existing child element field changes.
- Arc (Release v20.43.4): Injecting a reducer-backed (
IReducerFor<T>) read model into a command’sCommandValidator<>,Provide(), orHandle()no longer fails at runtime. Reducer-backed read models are now registered for command-scope resolution and resolve by key just like projection-backed and model-bound read models, including the nullable “does not exist” behavior. - Chronicle (Release v15.34.9):
[RemovedWith<T>]on a child collection type now actually removes the item from the collection. Its key expression was stored verbatim (e.g.RoleId) while the projection’s other keys are camelCased, so it never matched the serialized event content and no removal was produced. (#135) - Chronicle (Release v15.34.9): In-memory read models now apply child removals — the in-memory sink silently ignored
ChildRemovedchanges (the MongoDB and SQL sinks already handled them). - Arc (Release v20.43.3):
ConceptAs<T>values now deserialize from MongoDB regardless of the stored BSON numeric type. Numeric concepts (for example anint-backed concept) read with a representation-specific reader previously threwReadInt32 can only be called when CurrentBsonType is Int32, not when CurrentBsonType is Doublewhen the stored value had a different numeric representation — which happens when integral values flow through JSON-based pipelines (such as Chronicle projections that materialize event content viaExpandoObject) and are persisted asDouble. The value is now read according to its actual stored BSON type and converted to the concept’s underlying type. - Arc (Release v20.43.2): Fixes the MongoDB derived type handling so that if a type is already its concrete type, it uses it.
- Arc (Release v20.43.1): Command and query validation no longer throws
Parameter count mismatchwhen the parameter graph contains a type with an indexer (for example aJsonElementheld in anobject-typed property). The recursive fluent validation filters now skip indexer properties. - Chronicle (Release v15.34.7): Event properties typed as a
[DerivedType]base (abstract/interface with derived types) now round-trip with their discriminator and concrete subtype properties intact. Previously the type discriminator and all subtype-specific properties were stripped on append, causing read-side deserialization to fail with “Cannot create an instance of <abstract type>”. - Chronicle (Release v15.34.7): The JSON schema generator now emits an open object schema for base types that have registered derivatives, so the schema-driven storage conversion preserves the full payload instead of stripping it to the base type’s properties.
- Chronicle (Release v15.34.7): The client event serializer now ensures the derived-type converter is present in its options, so the discriminator and concrete properties are actually written into the event content.
- Arc (Release v20.42.2): Fixed missing Chronicle read models resolving through command scopes by returning null instead of trying to release a null read model.
- Arc (Release v20.42.2): Fixed nullable read model injection for CommandValidator
, Provide, and Handle, which now supports validators and command methods that explicitly handle missing read model state without IReadModels lookups. - Arc (Release v20.42.2): Fixed non-nullable command-scoped read model parameters failing with generic DI construction errors by throwing clear CannotResolveCommandDependency or CannotResolveValidatorDependency exceptions.
- cli (Release v1.6.3): Update command now queries available version before updating and reports that version on success, avoiding false “already at latest” messages (#34)
- cli (Release v1.6.3): Added user guidance that new version takes effect on next CLI invocation (#34)
- Arc (Release v20.42.1): Read-model–dependent command validators now resolve through the command pipeline instead of failing with “No service for type … has been registered”. A
CommandValidatorcan take a read model, projection, or other service as a constructor dependency — resolved for the command’s event source id — exactly like the command handler andProvidemethod. - Arc (Release v20.41.4): A
CommandValidator<>can now take a read model as a constructor dependency, resolved for the command’s event source id — the same way a command’sHandle()method receives it. Validators are now resolved from the command scope, so this no longer fails as it did when they were resolved from the root provider (throwing under scope validation or returning a stale instance). - Arc (Release v20.41.4): Using a read-model validator on the MVC controller path now raises a clear
ReadModelValidatorRequiresCommandPipelineerror pointing to the command pipeline, instead of an opaque dependency-resolution failure.
Removed
Section titled “Removed”- Arc (Release v20.47.0): The
Cratis.Arc.Core.Generatorspackage is no longer published. That source generator ships insideCratis.Arc.Core(it emits AOT query metadata into the consuming assembly), so a standalone copy was redundant and referencing both at once failed the build withCS0101.
Security
Section titled “Security”- Chronicle (Release v15.34.12): Pin the native SQLite library (
SQLitePCLRaw.lib.e_sqlite3) to the patched3.50.3build, addressing a known high-severity vulnerability (GHSA-2m69-gcr7-jv3q) bundled in the2.1.11version pulled in transitively by EF Core Sqlite.
Deprecated
Section titled “Deprecated”- No updates