Skip to content

Update Cratis.Chronicle to 19.1.0 - #2703

Closed
cratis-bot wants to merge 1 commit into
mainfrom
chronicle-update/19.1.0
Closed

cratis-bot wants to merge 1 commit into
mainfrom
chronicle-update/19.1.0

Conversation

@cratis-bot

Copy link
Copy Markdown
Contributor

Summary

Cratis.Chronicle, Cratis.Chronicle.AspNetCore and Cratis.Chronicle.Testing are updated from 18.2.0 to 19.1.0, picking up 18.3.0, 18.3.1, 18.4.0, 18.4.1, 18.5.0, 18.5.1, 19.0.0, 19.0.1 and 19.1.0.

Added

  • Chronicle 18.3.0: .FromAll() fluent projections can now Count, Increment, and Decrement into a dictionary-typed read model property, with the key resolved per event from an EventContext value (e.g. one counter per event type) (All and Dictionaries Chronicle#2464)
  • Chronicle 18.3.0: The Projection Declaration Language's all block supports the same dynamic dictionary-key syntax on count/increment/decrement (All and Dictionaries Chronicle#2464)
  • Chronicle 18.3.0: The Workbench's per-language client-code preview (C#, Kotlin, TypeScript, Elixir) now renders the all/every block and .FromAll()/[FromAll] mappings, including the C# dynamic dictionary-key shape
  • Chronicle 18.3.0: Read models can now recover automatically when a projection or reducer definition changes shape (new event types added, filters changed) instead of requiring a manual rebuild, governed by a new evolution policy (automatic / partial-only / manual)
  • Chronicle 18.4.0: Opt-in append receipts containing persisted routing, sequence numbers, occurrence times, subjects, tags, hashes, and audit metadata. Batch receipts follow input order; rejected appends have no persisted receipts.
  • Chronicle 18.4.0: .NET append results and notifications expose the server-acknowledged event context. Malformed acknowledgments are reported explicitly without implying that retrying the append is safe.
  • Chronicle 18.4.1: --withdrawn excludes a named release from the wire compatibility gate, which a floor cannot do for the newest release of a major. It refuses a version that is not a released baseline, refuses one from another major, and says out loud when a run was narrowed.
  • Chronicle 18.5.0: EventSourceType on ForEventSourceIdAndEventTypesRequest, additive and wire-compatible with every released 18.x baseline (getForEventSourceIdAndEventTypes silently ignores the event source type filter Chronicle#4049)
  • Chronicle 19.0.0: skipCompatibilityCheck connection-string option, alongside the existing skipTlsValidation, for a deliberate, visible, audit-friendly override of the server compatibility check against a known-safe version skew (A newer client refuses an older kernel: the connect-time compatibility check reads every added field as a removal Chronicle#4058)
  • Chronicle 19.0.0: ChronicleOptions.SkipCompatibilityCheck, resolved together with the connection string's option — either input asking to skip is enough, since both default to performing the check
  • Chronicle 19.1.0: [VariantOf<TIdentity>] and [EntersOn<TEvent>] attributes to declare a model-bound
    read model as one variant of a mutually exclusive group, and [GlobalFor<TIdentity>]
    to declare a handler shared by every variant in the group (Read Model Variations Chronicle#3956)
  • Chronicle 19.1.0: A fluent equivalent — builder.VariantOf<TIdentity>(_ => _.Id).EntersOn<TEvent>() — on
    the projection builder (Read Model Variations Chronicle#3956)

Changed

  • Cratis.Chronicle, Cratis.Chronicle.AspNetCore and Cratis.Chronicle.Testing are updated to 19.1.0
  • Chronicle 18.4.1: An append notification reports the event as the caller asked for it, with the sequence number the kernel assigned, and claims nothing else. No invented occurrence time, no invented hash.

Fixed

  • Chronicle 18.3.0: A projection built only from the all block or .FromAll(), with no separate from block, never processed a single event at runtime — every event was filtered out before it reached a property mapper (All and Dictionaries Chronicle#2464)
  • Chronicle 18.3.0: A dynamic dictionary key resolved against an EventContext value could silently pick up an unrelated read-model property's schema (e.g. a string id property) and produce the wrong value type instead of the expected int64 (All and Dictionaries Chronicle#2464)
  • Chronicle 18.3.0: A dynamic dictionary-key mapping targeting a property that already has a concrete, non-dynamic schema now fails with a clear error instead of silently succeeding (All and Dictionaries Chronicle#2464)
  • Chronicle 18.3.0: Regenerating a projection declaration containing a keyword-named property nested in a dotted path (e.g. eventType.id) no longer produces a declaration that fails to re-parse
  • Chronicle 18.3.0: Reducer definitions are now compared by value, and a passive reducer's fingerprint and definition survive round-tripping through MongoDB and SQL storage correctly
  • Chronicle 18.3.0: An observer subscribed to all events (SubscribeToAllEvents, the mechanism behind all/.FromAll()) could get stuck disconnecting itself every time it entered its routing state, because the "no event types on the subscription" disconnect check does not distinguish a genuinely empty subscription from the empty-by-design subscription an all-events observer always has
  • Chronicle 18.3.0: The same all-events observer could also silently drop every live event it was handed instead of dispatching it to the subscriber, for the same reason
  • Chronicle 18.3.0: The catch-up job for an all-events observer resolved zero schemas and zero events to read, because it asked for event types from the observer's static, subscribe-time definition instead of the current, full set of registered event types
  • Chronicle 18.3.0: ObserverKeys (used to enumerate the partitions an observer must catch up) built its query with an unconditional $in filter on event type; MongoDB's $in with an empty array matches no document at all, so an all-events observer — whose definition carries no fixed event type list — always resolved zero partitions to catch up
  • Chronicle 18.3.1: Store canonical defaults for omitted event-source and stream metadata, including requests from older clients. Keep .NET concurrency inputs and append notifications consistent with the metadata sent to the kernel. (Single-event Append no longer normalizes an unspecified EventSourceType to Default Chronicle#4041)
  • Chronicle 18.3.1: Preserve explicit routing metadata on .NET single-source batch appends, including their tags, subjects, timestamps, and concurrency scope. (Single-event Append no longer normalizes an unspecified EventSourceType to Default Chronicle#4041)
  • Chronicle 18.3.1: Respect JSON naming policies and explicit property names in typed event migrations, including nested paths and value maps. Preserve existing raw string paths and public constructors.
  • Chronicle 18.3.1: Report unknown read-model identifiers with a meaningful error across keyed, collection, materialized, and session lookups, without rejecting passive models or confusing missing instances with missing definitions.
  • Chronicle 18.4.0: Preserve authorization verdicts across .NET, JVM, JavaScript, Elixir, and Python protobuf clients instead of omitting a successful verdict from the wire.
  • Chronicle 18.4.0: Apply one kernel policy to omitted routing metadata across all append endpoints, while preserving explicit routes and existing query-filter semantics. This centralizes the policy that 18.3.1 shipped; it does not change behavior.
  • Chronicle 18.4.0: Match MongoDB append acknowledgments to stored timestamp precision and preserve supplied hashes in in-memory storage.
  • Chronicle 18.4.0: Prevent concurrent gRPC generator builds from causing multi-target NuGet publication failures.
  • Chronicle 18.5.0: GetForEventSourceIdAndEventTypes now applies its event source type argument instead of ignoring it, so a read narrowed to one event source type no longer returns events of every other type (getForEventSourceIdAndEventTypes silently ignores the event source type filter Chronicle#4049)
  • Chronicle 18.5.1: A silo no longer terminates when a grain call made during startup cannot reach a sibling silo that has not stabilized yet. The failures a forming cluster produces are now retried wherever they occur in the startup task, rather than at whichever individual call site was last discovered to be unprotected. A step that still fails once the retry budget is spent fails the host as before, so a genuine defect is not started around (ChronicleServerStartupTask still hard-crashes on a sibling-silo timeout - two more call sites (PatternCapture.Subscribe, Reactors.Subscribe) beyond #3848/#3852/#3967 Chronicle#4051)
  • Chronicle 18.5.1: A projection can no longer stay permanently unsubscribed. The activation-time resubscribe no longer holds the projections manager's turn while it runs, so registrations arriving during it are answered instead of timing out; and a registration now reconciles projections that are registered but not subscribed, instead of deciding purely from whether definitions changed. Together these close a state where appends kept succeeding, commands kept returning success, the observer had no failed partitions — because it was observing nothing — and the read model simply never updated (A projection can stay permanently unsubscribed: the activation resubscribe timer starves Register, and Register's unchanged-definition fast path never re-subscribes Chronicle#4052)
  • Chronicle 19.0.0: ChronicleClient's direct construction path (used outside a host) now actually honors a request to skip the compatibility check; it previously ignored the setting entirely
  • Chronicle 19.0.0: AddCratisChronicleConnection's skipCompatibilityCheck parameter now falls back to the connection string's option when not explicitly specified, the same way skipTlsValidation already does
  • Chronicle 19.0.1: The kernel's connect-time compatibility check now orders the comparison by which side is actually older (by protocol version), rather than always treating the connecting client as the older side — a client that has only gained fields, methods, or messages since the kernel's release now connects successfully instead of being incorrectly refused (A newer client refuses an older kernel: the connect-time compatibility check reads every added field as a removal Chronicle#4058)
  • Chronicle 19.1.0: ReadModelScenario<TReadModel> now builds a variant's projection definition the same
    variant-aware way the real discovery pipeline does, so an in-process scenario for a
    variant read model actually exercises mutual exclusion instead of behaving like an
    ordinary upsert projection

Removed

  • Chronicle 18.4.1: AppendReceipt, AppendCausation and AppendIdentity, the IncludeReceipt/IncludeReceipts request flags and the Receipt/Receipts response fields.
  • Chronicle 18.4.1: AppendResult.Receipt, AppendManyResult.Receipts and the kernel plumbing behind them.
  • Chronicle 18.4.1: The routing-omission tracking that existed to serve receipts. It never changed what reached the kernel, because the client's defaults already equal the kernel's, and it broke value equality on EventForEventSourceId along the way.

@cratis-bot

Copy link
Copy Markdown
Contributor Author

Verification gate

Step Result
Build failure
Specs skipped
Bump patch

⚠️ Requires human review before merging — verification failed.

@cratis-bot

Copy link
Copy Markdown
Contributor Author

Superseded by #2704, which updates Cratis.Chronicle to 19.1.1 and includes everything this update carried. Closing it so only the newest Chronicle update stays open.

@cratis-bot cratis-bot closed this Sep 18, 2026
@cratis-bot
cratis-bot deleted the chronicle-update/19.1.0 branch September 18, 2026 00:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants