Studio (Release v0.36.1): Touch support on canvas surfaces — two fingers pan and zoom around the pinch midpoint, one finger on empty background pans (#976)
Studio (Release v0.36.1): data-liquid-glass-fixed="over" for viewport-pinned chrome that must be composited on top of the glass base scene rather than under it (#979)
Chronicle.Kotlin (Release v2.1.2): Documentation page snippets are compiled against the real library, so the pages cannot drift from the API again.
Arc (Release v20.69.0): A quick fix for ARCCHR0008, rewriting a command’s data annotations [Key] into the Chronicle one (#2303)
Stage (Release v1.1.0): Commands append the events their produces declarations describe. The guarding when condition is evaluated against the incoming payload, and each event property is resolved from a command property, a constant, the occurred time, the calling identity, an environment variable, or an interpolated template.
Stage (Release v1.1.0): The event model intermediate format carries a command’s produces declarations, so any consumer of the format — not just the host — can see which events a command appends and under what condition.
Stage (Release v1.1.0): The model’s event types are registered with Chronicle at startup, so a play session’s event types are listed in the Workbench and the projections reference types the kernel knows about.
Studio (Release v0.36.0): Seats can now be unassigned from users — the seat action in organization user settings turns into an unassign action for members holding a seat, freeing the seat back to the organization’s pool and revoking the user’s license immediately (#972)
Chronicle (Release v16.13.0): Captures are persisted per event store and survive kernel restarts - started captures resume automatically on startup (#3560)
Chronicle (Release v16.13.0): Start/Stop lifecycle for captures - a started capture runs on its poll interval via Orleans reminders and can not be changed until it is stopped (#3560)
Chronicle (Release v16.13.0): The capturing engine polls API sources through their configured HTTP external service (basic, bearer and OAuth authorization), diffs items by the capture’s key property and appends events for added, removed, changed and value-transition when clauses (#3560)
Chronicle (Release v16.13.0): Events ingested by a capture carry a capture causation and Capture + capture-name tags (#3560)
Chronicle (Release v16.13.0): Getting events by tags - the event sequence read surface supports an any-of tags filter across MongoDB, SQL and in-memory storage (#3560)
Chronicle (Release v16.13.0): Captures Workbench page persists to the kernel, shows live status, and has a data view showing the events a capture has ingested, with a toggle back to the editor (#3560)
Chronicle (Release v16.13.0): The capture editor validates against the backend while typing - compiler errors and semantic problems such as unknown external services, event types or poll intervals show as markers - and completes external service and event type names (#3560)
Chronicle (Release v16.13.0): ICaptures service contract with save, delete, start, stop, get, observe and validate-declaration operations (#3560)
Chronicle (Release v16.12.0): Several event types declared under the same constraint name form one constraint allowing at most one event from that set per event source, making mutually exclusive outcomes enforceable at append time.
Chronicle (Release v16.12.0): CHR0039 warns when a Task-returning testing assertion is discarded rather than awaited, where it can never fail and CS4014 does not fire.
Arc (Release v20.68.0): A command declares the key its read models are loaded by, in an application without Chronicle: a property marked with the data annotations [Key], or an ICanProvideKeyForCommand composing it. The key may be a Guid, int, long, string, or a ConceptAs<T> wrapping one of those (#2303)
Arc (Release v20.68.0): ICanResolveKeyForCommand, for keying commands your own way across an application. It is asked before the rule Arc ships, whichever order the two are discovered in (#2303)
Arc (Release v20.68.0): ARCCHR0008 reports a command marking its key with the data annotations [Key] in an application that uses Chronicle, where it silently resolves nothing (#2303)
Studio (Release v0.35.5): The state defined for a command’s validation now persists completely: the event sources and the source-to-state mapping are stored alongside the state schema, and reopening the command editor restores them. Rule editing has moved off the state read-model properties — rules belong to the command. (#966)
Chronicle.Mcp (Release v1.3.2): describe_system tool that deduces the system in an event store — clustering event types into entities, placing every event in its entity’s lifecycle, and mapping read surfaces and automations — with narrative guidance for describing the system and telling its story
Chronicle.Mcp (Release v1.3.2): suggest_next_event_types tool that finds lifecycle gaps (no explicit creation, a life without an end, facts frozen at creation) and suggests grounded event types to introduce next
Chronicle.Mcp (Release v1.3.2): run_ad_hoc_projection tool that folds events into per-event-source instances on demand with AutoMap semantics, answering ad-hoc queries without registering a projection
Chronicle.Mcp (Release v1.3.2): MCP prompts describe_system, suggest_next_event_types, and query_system packaging the workflows for clients that surface prompts
Chronicle.Mcp (Release v1.3.2): Documentation for the new capabilities in the design-time docs, README, and getting started
cli (Release v2.3.4): cratis run reports startup progress while the Stage container boots and prints Ready once the sandbox can actually accept requests.
cli (Release v2.3.4): cratis run --verbose streams the container’s output, as the command previously always did.
cli (Release v2.3.4): cratis run with -o json or -o json-compact emits the resolved endpoints, event model, and event store when the session becomes ready.
cli (Release v2.3.4): Markdown linting and link verification now run on pull requests that touch the documentation.
Stage (Release v1.0.6): The Chronicle Workbench is now exposed from the Stage image on port 35000, so a play session’s events, observers and read models can be inspected while it runs. Publish the port and browse https://localhost:35000 — the kernel’s API and OAuth authority are served there too.
Stage (Release v1.0.6): The container prints the session’s URLs — Stage API, API reference and Workbench — when it starts.
Stage (Release v1.0.6): Documentation for both images and for a running session: what is inside them, how they boot, their ports, mount points and configuration, and every URL a session exposes.
cli (Release v2.3.2): cratis run now publishes the Chronicle Workbench alongside the Stage API, so a play session’s events, observers and read models can be inspected while it runs. The Workbench is at https://localhost:35000 — sign in with the Stage image’s development credentials.
cli (Release v2.3.2): --workbench-port option on cratis run for choosing the host port the Workbench is published on.
Chronicle (Release v16.11.0): New defunctSiloCleanupPeriod and defunctSiloExpiration clustering configuration settings controlling how often defunct silo entries are swept out of the Orleans membership table and at what age they are removed. Defaults: sweep every hour, remove entries older than three hours; set the period to 00:00:00 to disable the sweep.
Arc (Release v20.66.0): A read model backed by Entity Framework Core or MongoDB can be injected by key into a command’s Handle(), Provide(), and CommandValidator<>, with nothing to wire up — an entity carried by a ReadOnlyDbContext resolves by its primary key, a [ReadModel] held in MongoDB by its document _id. Nullable and non-nullable resolution behave as for a Chronicle-backed read model (#2303)
Arc (Release v20.66.0): ICanResolveReadModelForCommand, for making the read models of another store injectable into a command the same way. A provider states whether it owns the read models it reports or can merely load them, so which one resolves a read model does not depend on registration order (#2303)
Arc (Release v20.66.0): SP0041 reports what an application says about how it is served and a Screenplay has no counterpart for: a query the host pages and sorts, and every route template declared with [Path], [Route] or an HTTP verb, including inherited ones (#2415)
Arc (Release v20.66.0): SP0042 reports the tags a read model carries, which the document has nowhere to hold while an event’s tags are printed (#2415)
Arc (Release v20.66.0): Chronicle 16.9.2: ComplianceMetadataActionFailed replaces the bare InvalidOperationException when applying or releasing compliance metadata fails. On a failed release it names the property, the subject the value was released under, and explains that the value was encrypted under a different subject, pointing at CHR0038 — rather than surfacing only the underlying OpenSSL oaep decoding error.
Arc (Release v20.66.0): Chronicle 16.10.0: [Replay] on a reactor handler method, marking it as the one to run while the observer is replaying. Only the marked handler runs during a replay; an event type without one behaves exactly as before. (cratis/chronicle#845)
Arc (Release v20.66.0): Chronicle 16.10.0: IEventStore.Identities with Rename(subject, name), exposing the identity renaming the kernel already supported to the .NET client. (cratis/chronicle#1684)
Arc (Release v20.66.0): Chronicle 16.10.0: [JsonSchemaType(typeof(T))] on a type, overriding how it is represented in the JSON schema generated for events and read models. Compliance metadata and nullability are preserved. (cratis/chronicle#1470)
Arc (Release v20.66.0): Chronicle 16.10.0: AddCratisChronicleMongoDB() for Aspire, provisioning a MongoDB container that initiates itself as a single-node replica set and hands back a directConnection connection string. (cratis/chronicle#3400)
Arc (Release v20.66.0): Chronicle 16.10.0: IReactorMiddleware.BeforeInvoke and AfterInvoke overloads that receive the ReactorId of the reactor observing the event. Chronicle calls these; they default to the existing overloads, so a middleware written against the previous interface keeps working unchanged. (cratis/chronicle#1009)
Arc (Release v20.66.0): Chronicle 16.10.0: CompliancePropertyNotFoundInSchema, thrown when a property being applied or released has no counterpart in the schema. The message names the property path, the compliance subject, and the
Studio (Release v0.34.0): Seat purchases are real subscriptions: checkout redirects to Mollie’s hosted payment page, and the recurring subscription is created once the first payment is confirmed; each renewal extends seat capacity and appears in the billing history (#823)
Studio (Release v0.34.0): Terms and conditions must be accepted at checkout, recorded with the accepted version (#823)
Studio (Release v0.34.0): Adding seats mid-period charges the backend-computed prorated amount for the remainder of the period as a separate transaction against the mandate, shown in the checkout UI and marked as prorated in the billing history (#823)
Studio (Release v0.34.0): Decreasing seats takes effect at the end of the paid period — the recurring amount is lowered immediately, the seat count drops at renewal, and the UI states the effective date (#823)
Studio (Release v0.34.0): Cancelling the subscription stops charging; seats stay usable until the paid period ends (#823)
Studio (Release v0.34.0): A failed subscription payment suspends the seats it funds at the next request — assignment seniority decides which seats survive on remaining granted capacity, and affected users see the no-license screen until payment is recovered (#823)
Studio (Release v0.34.0): Company details (name, VAT number) captured on the billing page, shown read-only once filled in, and used as the payment-provider customer identity (#823)
Studio (Release v0.34.0): The billing page shows the subscription’s plan, seats, recurring amount, renewal date, status and pending decreases, with decrease and cancel actions (#823)
Studio (Release v0.34.0): Mollie webhook endpoint (/webhooks/mollie) reachable without authentication through a dedicated ingress path; the handler authenticates by re-fetching the payment from Mollie and is idempotent against duplicate notifications (#823)
Arc (Release v20.65.4): Chronicle 16.9.2: ComplianceMetadataActionFailed replaces the bare InvalidOperationException when applying or releasing compliance metadata fails. On a failed release it names the property, the subject the value was released under, and explains that the value was encrypted under a different subject, pointing at CHR0038 — rather than surfacing only the underlying OpenSSL oaep decoding error.
Arc (Release v20.65.4): Chronicle 16.10.0: [Replay] on a reactor handler method, marking it as the one to run while the observer is replaying. Only the marked handler runs during a replay; an event type without one behaves exactly as before. (cratis/chronicle#845)
Arc (Release v20.65.4): Chronicle 16.10.0: IEventStore.Identities with Rename(subject, name), exposing the identity renaming the kernel already supported to the .NET client. (cratis/chronicle#1684)
Arc (Release v20.65.4): Chronicle 16.10.0: [JsonSchemaType(typeof(T))] on a type, overriding how it is represented in the JSON schema generated for events and read models. Compliance metadata and nullability are preserved. (cratis/chronicle#1470)
Arc (Release v20.65.4): Chronicle 16.10.0: AddCratisChronicleMongoDB() for Aspire, provisioning a MongoDB container that initiates itself as a single-node replica set and hands back a directConnection connection string. (cratis/chronicle#3400)
Arc (Release v20.65.4): Chronicle 16.10.0: IReactorMiddleware.BeforeInvoke and AfterInvoke overloads that receive the ReactorId of the reactor observing the event. Chronicle calls these; they default to the existing overloads, so a middleware written against the previous interface keeps working unchanged. (cratis/chronicle#1009)
Arc (Release v20.65.4): Chronicle 16.10.0: CompliancePropertyNotFoundInSchema, thrown when a property being applied or released has no counterpart in the schema. The message names the property path, the compliance subject, and the properties the schema does declare. (cratis/chronicle#690)
Arc (Release v20.65.4): Chronicle 16.10.0: An overview on the cratis/chronicle Docker Hub repository covering the published tag variants, ports, quick start and the environment variables that configure the server. (cratis/chronicle#1277)
Chronicle (Release v16.10.0): [Replay] on a reactor handler method, marking it as the one to run while the observer is replaying. Only the marked handler runs during a replay; an event type without one behaves exactly as before. (#845)
Chronicle (Release v16.10.0): IEventStore.Identities with Rename(subject, name), exposing the identity renaming the kernel already supported to the .NET client. (#1684)
Chronicle (Release v16.10.0): [JsonSchemaType(typeof(T))] on a type, overriding how it is represented in the JSON schema generated for events and read models. Compliance metadata and nullability are preserved. (#1470)
Chronicle (Release v16.10.0): AddCratisChronicleMongoDB() for Aspire, provisioning a MongoDB container that initiates itself as a single-node replica set and hands back a directConnection connection string. (#3400)
Chronicle (Release v16.10.0): IReactorMiddleware.BeforeInvoke and AfterInvoke overloads that receive the ReactorId of the reactor observing the event. Chronicle calls these; they default to the existing overloads, so a middleware written against the previous interface keeps working unchanged. (#1009)
Chronicle (Release v16.10.0): CompliancePropertyNotFoundInSchema, thrown when a property being applied or released has no counterpart in the schema. The message names the property path, the compliance subject, and the properties the schema does declare. (#690)
Chronicle (Release v16.10.0): An overview on the cratis/chronicle Docker Hub repository covering the published tag variants, ports, quick start and the environment variables that configure the server. (#1277)
cli (Release v2.3.1): cratis screenplay generate produces a Cratis Screenplay .play document from the source of an Arc application, without running it (#44)
cli (Release v2.3.1): cratis screenplay validate compiles .play files and reports their diagnostics, exiting non-zero when any are errors
Arc (Release v20.65.2): The integration specifications a slice carries are recovered into specification blocks, so a document states what the application is specified to do rather than only what it declares; a scenario with a step that cannot be read statically is reported rather than guessed at (#2404)
Arc (Release v20.65.2): An application split across several projects is described as one document: a namespace two projects declare into is one slice, a concept is declared once however many projects refer to it, and an event a sibling project declares is declared rather than imported (#2399)
Arc (Release v20.65.2): Events declared outside the application being read are imported by name, so a generated document no longer refers to an event it never introduces (#2394)
Arc (Release v20.65.2): Concepts reached only through a child record or a read model property are declared, so their validation rules and personal-data marking appear in the document instead of going missing (#2400)
Arc (Release v20.65.2): A validation message looked up from a resource is written as the key it is looked up by, so the document states which message a rule carries without baking one culture into it (#2409)
Arc (Release v20.65.2): A screen binding a query declared in another slice is reported, naming the screen, the query and the slice it lives in, instead of being dropped without a word (#2396)
Screenplay (Release v1.6.3): A general @ escape for names that collide with a directive keyword. @tag TagType declares a property called tag, @authorize AuthorizationCode a property called authorize, @validate an enumeration value called validate, and @key = x a projection mapping onto key. The escape already existed in projections and now works for property lines, property mappings, enumeration values and projection from mappings everywhere. (#27)
Screenplay (Release v1.6.2): screenplay <file>.play compiles a single file. Pointing the tool at a file previously failed with Directory '<path>' does not exist, so verifying one generated document meant copying it into a scratch directory first. (#31)
Screenplay (Release v1.6.2): --warnaserror makes warnings fail the run with exit code 1, so a pipeline that generates documents can require them to be clean. (#31)
Screenplay (Release v1.6.2): IPlayFileCompiler.CompileFile(path) compiles one known .play file without going through directory discovery. (#31)
Studio (Release v0.31.1): Development event seeding now grants each seeded user (Alice, Bob, Carol) an active single-user seat, so they hold a license out of the box for local development. Previously the seeded users had no seat — the trial seat is only granted through invitation acceptance, which the development seeding bypasses — so every Studio.Projects command was denied by the per-user licensing gate and the editor showed the “You do not have a license” screen locally.
Studio (Release v0.31.0): Event modeling editor: a board-level detail-level control with a compact, read-only Overview mode that hides specifications and property details and disables editing affordances, alongside the default Full view. The choice is remembered per browser. (#684)
Studio (Release v0.31.0): Brainstorming board: an “arrange as timeline” action on each region that spreads the region’s events evenly into a horizontal timeline, ordered left-to-right by their current position. It appears when a region holds two or more events, and the new layout persists and syncs live to other collaborators. (#725)
Studio (Release v0.31.0): Event modeling editor: link module collections to show how they flow — drag from a collection’s link handle onto another collection to draw a directed arrow between them, remove a link with the control on its arrow, and links render live on the canvas. (#527)
Studio (Release v0.31.0): Event modeling editor: state change slices can now define an optional read model (for example a passive read model used for command-side decisions), using the same affordance automation slices already have. (#746)
Studio (Release v0.31.0): Event modeling editor: a slice’s read model can now be used as the Given state of a specification for any slice that has one — state change, automation, and state view (previously only state view). (#746)
Arc (Release v20.65.1): Generated documents are compiled before they are returned; one the Screenplay language rejects is reported as an error naming the first rejected line, so a host exits non-zero instead of writing a document that does not compile
Arc (Release v20.65.0): Cratis.Arc.Screenplay package that generates a Screenplay .play document describing an Arc application - concepts, policies, modules, features and slices, with the commands, events, queries, projections, reactors, constraints and screens in each
Arc (Release v20.65.0): Generation from source rather than from a running application, so a .play file can be produced from a checkout and regenerated in CI
Arc (Release v20.65.0): Generation from a Roslyn Compilation, so the package can be driven from a CLI, an MSBuild task or a source generator
Arc (Release v20.65.0): Diagnostics naming any construct that has no Screenplay counterpart, and where it was found
Arc (Release v20.65.0): Model-bound [ChildrenFrom] and [Nested] projections are recovered, matching what the fluent form already produced (#2385)
Arc (Release v20.65.0): Named authorization policies are recovered, with their requirements read from AddPolicy registrations where those can be read (#2386)
Arc (Release v20.65.0): Aggregate roots are followed from the command that reaches them, so a handler that mutates an aggregate states the events it produces
Arc (Release v20.65.0): Screens are declared for the component beside each slice
Chronicle (Release v16.9.2): ComplianceMetadataActionFailed replaces the bare InvalidOperationException when applying or releasing compliance metadata fails. On a failed release it names the property, the subject the value was released under, and explains that the value was encrypted under a different subject, pointing at CHR0038 — rather than surfacing only the underlying OpenSSL oaep decoding error.
Studio (Release v0.30.0): Prototypes and prototype templates now have a layout selector in the top-right corner to choose how placed elements flow — absolute (the default, unchanged), flex row, flex column, or grid. Elements dragged onto the surface arrange according to the selected layout. (#923)
Studio (Release v0.30.0): The Admin organizations screen opens a side panel when an organization is selected, showing its granted and purchased seats from live queries that update as grants are added or revoked, with Grant and Revoke actions at the top of the panel. (#932)
Arc (Release v20.64.0): Optional eventSourceFactory prop on <Arc /> (and Globals.eventSourceFactory) that lets you substitute the EventSource implementation used by SSE observable query connections, falling back to the global EventSource constructor when not set. This unblocks environments like React Native that lack a native EventSource or need a more reliable native SSE client (#2376)
Arc (Release v20.64.0): Document eventSourceFactory in the Arc configuration reference and add a “Custom EventSource Factory” section with a React Native example
Chronicle (Release v16.9.1): [PII] can now be applied to a value-object type, classifying every value it holds wherever that type appears.
Chronicle (Release v16.9.1): [PII] can now be applied to a property typed as a value object, with the same effect scoped to that property.
Chronicle (Release v16.9.0): CHR0038: a model-bound [Join<TEvent>] copying a [PII] value out of a stream that is not the read model’s own compliance subject is now an error at build time, instead of freezing every partition of the projection at runtime with an OpenSSL oaep decoding error.
Chronicle (Release v16.9.0): InvalidDatabaseName when the event store name and namespace compose a name MongoDB rejects, naming the event store, the namespace, and the offending character instead of the driver’s bare Invalid namespace specified.
Arc (Release v20.63.0): TenantId.Default and TenantId.IsDefault for treating the default tenant — unset, or named — consistently across tenant-partitioned storage.
cli (Release v2.3.0): CRATIS_NO_UPDATE_CHECK disables the update check.
cli (Release v2.3.0): README GIFs, with the tapes and fixture that re-render them.
Studio (Release v0.28.0): An organization’s seats form a pool from its grants and purchases (each with a SKU and expiration); users are assigned seats from that pool.
Studio (Release v0.28.0): The invite dialog warns when the organization has no seat available, so the inviter knows the user will not be able to use Studio until a seat frees up.
Studio (Release v0.28.0): Admin shows an organization’s purchased seats alongside its grants on the organization detail.
Chronicle (Release v16.8.0): Benchmarks for projection, reducer and reactor throughput, projection replay, and passive-versus-materialized read models.
Chronicle (Release v16.8.0): Benchmarks comparing a single silo against a two-silo cluster, including a split-role topology.
Chronicle (Release v16.8.0): Startup warning when a clustered deployment is configured against local-only storage.
Chronicle (Release v16.8.0): Jobs.StepCheckpointFlushInterval, bounding how long a job step may hold an unpersisted checkpoint.
Chronicle (Release v16.8.0): ReadModels.GuardSinkWritesOnWatermark, the kill switch for the crash-recovery write guard.
Chronicle (Release v16.8.0): Events.ConstraintsVersionCheckInterval, bounding how often an active event sequence checks for constraint changes.
Studio (Release v0.27.0): External events in the event-modeling editor can be navigated to their source event, with hover highlighting linking a reference to its origin (#920)
Studio (Release v0.27.0): Prologue database-import wizard surfaces the machine’s public IP address so it can be allowlisted on the database, and generates API credentials (id/secret) for API sources (#917)
Studio (Release v0.25.0): Per-user seats as the unit of licensing: a user has access while they hold an active (non-expired) assigned seat. (#911)
Studio (Release v0.25.0): A maintainer can assign a seat — a SKU with an expiry — to an organization member from the Users settings. (#911)
Studio (Release v0.25.0): Organization invitations now include the SKU and expiry of the seat the invited user receives; the seat is assigned automatically when the invitation is accepted. (#909)
Studio (Release v0.25.0): A new organization starts on a trial: its owner is granted a seat valid for a limited period so they can use Studio immediately. (#900)
Studio (Release v0.25.0): Brainstorming is now its own type of board, created and named under a Domain from a new “Brainstormings” folder in the project tree, alongside a new “Event Models” folder. (#904)
Studio (Release v0.25.0): A Playwright performance/load-test harness that measures event-modeling canvas framerate at 100/1000/5000/10000 nodes to catch relative regressions over time. (#903)
Chronicle.Mcp (Release v1.3.0): describe_event_type tool — an event type’s real fields and types, read from its registered schema.
Chronicle.Mcp (Release v1.3.0): scaffold_read_model tool — generates a reviewable read model + model-bound projection from chosen event types, surfaces existing projections that already read them, and returns no code (rather than a fabricated shape) when the requested event types are not registered.
Chronicle.Mcp (Release v1.3.0): audit_unconsumed_event_types tool — reports event types nothing reads, plus consumers that reference an event type id that no longer exists.
Chronicle.Mcp (Release v1.3.0): generate_event_catalog tool — a living data dictionary of every event type, its fields, and its consumers.
Chronicle.Mcp (Release v1.3.0): explain_causal_trace tool — an event source’s ordered history with correlation and causation, for narrating what happened and why.
Chronicle.Mcp (Release v1.3.0): A Documentation folder covering getting started, configuration, how the server works, and a page per capability.
Arc (Release v20.69.2): Updated Cratis.Chronicle from 16.10.0 to 16.13.3.
Arc (Release v20.69.2): Updated Cratis.Fundamentals and Cratis.Metrics.Roslyn to 7.16.8, so a collection absent from a payload deserializes to an empty array rather than undefined.
Chronicle (Release v16.13.2): [OnceOnly] on a reactor handler method now takes effect — the handler is skipped for replayed events while the rest of the reactor still replays. Only class-level placement was honored before.
Chronicle (Release v16.13.2): The kernel now warns when it skips a concurrency check because the append declared a concurrency scope with no expected sequence number.
Chronicle.Kotlin (Release v2.1.2): Getting started and reference pages now match the current client API — published 2.1.1 coordinates, ChronicleOptions.development()/fromConnectionString, and the required event type registration step.
Chronicle.Kotlin (Release v2.1.2): Java examples use the io.cratis.chronicle.java bridges, since every call into the kernel is a Kotlin suspend function.
Chronicle.Kotlin (Release v2.1.2): The Docker Compose snippet starts a usable kernel: the development image with MongoDB storage on the single port Chronicle now serves.
Chronicle.Kotlin (Release v2.1.2): Configuration reference documents the connection string grammar, its query options, and the real TLS and authentication behavior.
cli (Release v2.4.0): cratis screenplay generate run against a solution now describes each application in it as its own module, taken from the outermost namespace segment, rather than gathering them all into one module named after the solution. Passing --module still produces that single module, and generating from a single project is unchanged.
Arc (Release v20.69.0): ARCCHR0008 says what happens if it is left alone — Chronicle resolves a new event source id for the command and every read model keyed by it resolves to nothing — and reports on the attribute rather than the property name (#2303)
Stage (Release v1.1.0): Each command execution appends to its own event source. Screenplay does not declare which command value identifies the event source, so events cannot yet be correlated across commands; that needs the language to say which property is the identity.
Chronicle (Release v16.12.0): A [PII] value that Chronicle never encrypted is passed through untouched when releasing, instead of being blanked.
Arc (Release v20.67.0): A Screenplay document generated from several projects now declares one module per outermost namespace segment, instead of gathering every project into a single module named after the solution. Naming a module still produces that one module, and generating from a single project is unchanged. (#2399)
Fundamentals (Release v7.16.7): Subjects returned by InvokeAndWrapWithSubject and InvokeAndWrapWithTransformSubject, and TransformingSubject itself, replay their most recent value to new subscribers. A subscriber attaching after a value has been produced now sees the current state rather than waiting for the next change.
cli (Release v2.3.5): screenplay generate describes every project of a solution in one document, instead of reporting a solution that holds more than one project as ambiguous and generating nothing
cli (Release v2.3.5): The domain defaults to the solution name when several projects are read; --domain still overrides it
cli (Release v2.3.5): The generated result names the projects the document was generated from
Chronicle.Mcp (Release v1.3.2): Updated all dependencies to their latest versions, including Chronicle 16.11.1 and the MCP SDK 2.0.0
Chronicle.Mcp (Release v1.3.2): The default connection string is now chronicle://localhost:35000 — Chronicle 16.11 removed the disableTls flag; the client always uses TLS, with skipTlsValidation controlling certificate validation
Stage (Release v1.0.8): Upgraded Cratis.Chronicle.Contracts from 16.10.0 to 16.11.1.
Stage (Release v1.0.8): [x] dotnet test Stage.slnx — all tests pass (68/68 in Contracts)
Chronicle (Release v16.11.1): Updated Cratis.Arc to 20.66.1 across NuGet and npm, picking up the fix for observable queries over primitive collections delivering empty values
Chronicle (Release v16.11.1): The SimpleConsole sample generates its 50-employee demo data set on demand with the G key instead of seeding it at startup
cli (Release v2.3.4): cratis run hides the Stage container’s output while it starts, and shows the reported error plus the captured output if it stops before becoming ready.
cli (Release v2.3.4): cratis run names the container it starts, so a running sandbox is recognizable in docker ps.
cli (Release v2.3.4): Ctrl+C on cratis run stops the sandbox and waits for Docker to remove it before exiting, instead of terminating the command while the container is still running.
Stage (Release v1.0.7): The startup banner and the documentation now state that the Workbench port is HTTPS only, and name the empty-response symptom you get from using http://. The kernel multiplexes HTTP/1.1 and HTTP/2 on that port through ALPN, which requires TLS, so there is no plaintext mode for it — https://localhost:35000 is the address.
cli (Release v2.3.3): cratis run now states that the Chronicle Workbench is HTTPS only when it prints the URL, and the documentation names the empty-response symptom (ERR_EMPTY_RESPONSE, curl: (52) Empty reply from server) you get from reaching it as http://. The Chronicle port multiplexes HTTP/1.1 and HTTP/2 through ALPN, which requires TLS, so it has no plaintext mode.
cli (Release v2.3.2): cratis run prints both the Stage API and the Chronicle Workbench URL when a session starts.
cli (Release v2.3.2): Package references updated to their latest releases, including Chronicle 16.11.0, Screenplay 1.6.4 and Fundamentals 7.16.6.
cli (Release v2.3.2): The disableTls connection-string option is replaced by skipTlsValidation, following Chronicle 16.11.0. The client always connects over TLS; the option now only controls whether the server’s certificate is validated, which is what lets the CLI trust a development server’s self-signed certificate.
Stage (Release v1.0.5): cratis/stage and cratis/stage-specrunner are now built from host-built, framework-dependent binaries and copied into the images, instead of compiling inside the Docker build — no more .NET compilation under QEMU emulation for the arm64 leg of the multi-arch publish.
Stage (Release v1.0.5): dockerize.sh moves to the repository root and publishes both apps before building both images.
Stage (Release v1.0.2): The publish pipeline now also cuts a release when .github/workflows/publish.yml itself changes, so pipeline-only fixes (like this one) can ship without an unrelated Source/ change.
Studio (Release v0.35.0): The event-modeling toolbar’s “Show details”, “Detail level” and “Visualization” buttons are consolidated into a single “View” menu (carrying the former Detail level icon) with three mutually exclusive sections: Detail level (Full — default / Overview), Properties (single toggle, off by default), and Visualization (Arrows — default / Lines). (#960)
Studio (Release v0.35.0): “Account profile”, “Organization settings”, “Switch organization” and “Log out” are consolidated into a menu triggered by the user’s avatar at the far right of the toolbar, with icons and text; the organization switcher appears as a submenu only when more than one organization is available. (#960)
Studio (Release v0.35.0): The shared toolbar dropdown gained section headers, check indicators, and left-flying submenus for right-aligned menus so the far-right menu never clips at the viewport edge.
Studio (Release v0.34.4): The root perf/ directory is now Performance/ (history-preserving rename), and the harness project is CanvasPerformance.
Studio (Release v0.34.4): The harness is pure C#: the TypeScript model generator, fixture specs, and live-benchmark Playwright specs are ported into the console runner (--verify-fixtures, --live); only the embedded page-evaluation JS inside the browser probe remains, as is inherent to browser probing.
Studio (Release v0.34.4): The fake backend now serves Core’s real read-model types serialized with the exact JSON options Arc uses, and the Stage fixture generator builds the real Cratis.Stage.Contracts records — both sets of hand-mirrored wire types (including every *Dto) are deleted, so the harness can never drift from production shapes.
AuthProxy (Release v2.10.2): The auth session is bounded by an absolute lifetime (default 12h, configurable via Cratis:AuthProxy:Session:Lifetime); sliding expiration is off by default so activity cannot extend a session indefinitely. The auth cookie remains session-scoped, so closing the browser ends it.
AuthProxy (Release v2.10.2): The identity-details cookie now expires after the identity re-validation interval (default 10 min), forcing periodic re-resolution of identity and authorization instead of living for the whole browser session.
AuthProxy (Release v2.10.2): A tenant resolved through the selection strategy is re-validated against the tenants endpoint on an interval (default 10 min); when the tenant is no longer available to the user, the tenant cookies are cleared and the request replays through fresh resolution.
AuthProxy (Release v2.10.2): Auth, correlation, and nonce cookies now use SecurePolicy.SameAsRequest instead of None.
Studio (Release v0.34.0): Assigning a seat no longer asks for a plan or expiration — seats are drawn from the organization’s available pool, from the first entitlement with unused capacity (grants first, then purchases in purchase order); the Users tab shows the assigned-versus-capacity count and the assign action is disabled with an explanatory tooltip when no seats remain
Studio (Release v0.34.0): Without a configured Mollie API key the checkout keeps its previous recorded-only behavior, so local development is unaffected
Arc (Release v20.65.4): Cratis.Chronicle, Cratis.Chronicle.AspNetCore and Cratis.Chronicle.Testing are updated to 16.10.0
Arc (Release v20.65.4): Chronicle 16.9.2: CHR0038 now also reports the fluent builder.Join<TEvent>(_ => _.On(...)) form, not just the model-bound [Join<TEvent>] attribute. A [PII] value counts as reaching the read model through an explicit .Set(...).To(...) mapping or through AutoMap matching an identically named property.
Arc (Release v20.65.4): Chronicle 16.10.0: Registering event types on conn
Chronicle (Release v16.10.0): Registering event types on connect issues one read and one bulk write for the whole batch instead of several round trips per event type, so startup no longer scales its database round trips with the number of event types. (#984)
Studio (Release v0.33.0): Core runs at two replicas in production for high availability, surviving a single pod or node loss. (#906)
Arc (Release v20.65.2): A host compilation that does not fully compile is reported as an error only when nothing trustworthy was recovered from it; when artifacts were recovered anyway it is a warning stating how many, and generation succeeds instead of failing (#2393)
Arc (Release v20.65.2): A specification value that is a freshly generated identity is no longer reported as unreadable, since an identity the source generates states nothing for the document to carry (#2404)
Studio (Release v0.32.1): Collaboration presence is shared across Core replicas so cursors and the collaborator roster stay correct when Core runs clustered; a single replica is unaffected. (#906)
Studio (Release v0.32.0): The board renders a zoom-driven level of detail — zoomed out it shows compact, then header-only, module placeholders — and large boards use a lightweight backdrop-filter control pill instead of the per-frame LiquidGlass capture that stalled pan/zoom. (#903)
Studio (Release v0.31.2): The event-modeling board culls slice columns scrolled out of the viewport with content-visibility, so a single canvas zoom/reflow drops from ~570ms to ~19ms on a 1000-node model (~258k DOM nodes). This is a first step toward smooth interaction at scale — a full fix for very large boards still needs viewport virtualization/LOD and scoping the LiquidGlass capture. (#903)
Screenplay (Release v1.5.3): String literals now support the backslash escapes \", \\, \n, \r and \t. Any other backslash sequence is kept verbatim, so regular expression operands such as matches "^\d+$" keep their meaning. (#25)
Studio (Release v0.30.1): The Admin organization detail panel is now a polished side window matching the Cratis Workbench detail pattern — a titled panel with the organization name, Grant and Revoke actions at the top, and the seat grants and purchases in structured tables. (#932)
Chronicle (Release v16.9.2): CHR0038 now also reports the fluent builder.Join<TEvent>(_ => _.On(...)) form, not just the model-bound [Join<TEvent>] attribute. A [PII] value counts as reaching the read model through an explicit .Set(...).To(...) mapping or through AutoMap matching an identically named property.
Chronicle (Release v16.9.0): Documented Chronicle’s MongoDB database naming, including that read models of the default namespace use the bare event store name while event sequences suffix every namespace.
Chronicle (Release v16.8.1): The Kernel serves the Workbench UI from the web root next to the binary as well as from the copy embedded in Cratis.Chronicle.Workbench, using whichever is present
Chronicle (Release v16.8.1): The warning logged when no Workbench UI can be found now names the web root that was checked
cli (Release v2.3.0): Workbench Overview names the sidebar entry to reach failures and recommendations.
Studio (Release v0.28.0): Granting seats to an organization assigns seats to users only up to the number available in the pool; if there are more users than seats, the remaining users are left without one.
Studio (Release v0.28.0): Accepting an invitation assigns the invited user a seat only when one is available at the moment of acceptance.
Chronicle (Release v16.8.0): Reduced storage round-trips and CPU on the append, observer, and projection paths through event-type schema caching, debounced observer-state persistence, memoized projection key resolution, striped projection locking, subscribed-queue routing, and coalesced observer dispatch.
Chronicle (Release v16.8.0): Appends no longer block on slow observer consumption; a full delivery queue spills to the observer catch-up path instead of applying backpressure.
Chronicle (Release v16.8.0): Event batches are routed only to queues whose subscribed observers care about the batch’s event types, and queues prefer co-location with their event sequence.
Chronicle (Release v16.8.0): Projections whose key collapses several partitions onto one read-model document now handle all partitions through a single activation.
Chronicle (Release v16.8.0): Documentation no longer claims projections and reducers are idempotent across a crash; that guarantee covers a deliberate replay only.
Chronicle (Release v16.8.0): SaveChanges, ProjectionPipelineManager and ReducerPipelineFactory each take an additional constructor parameter, which is source-breaking for anyone constructing them directly.
Studio (Release v0.27.0): External event cards are colored yellow to match the event-modeling color convention (#918)
Studio (Release v0.27.0): Prologue wizard highlights the active step, collapses completed steps, and assumes all tables when none are explicitly selected (#917)
Studio (Release v0.25.0): When a user has no active license the application is disabled and shows a no-license notice: a maintainer can open Billing to purchase seats, a member is asked to contact their organization admin. (#911)
Studio (Release v0.25.0): Commands within a project now require the current user to hold an active license. (#911)
Studio (Release v0.25.0): The ”+” for creating an event model moved from the Domain node onto the new “Event Models” folder; brainstorming boards are created from the new “Brainstormings” folder. (#904)
Chronicle.Mcp (Release v1.3.0): Updated to the Chronicle 16.x client (Cratis.Chronicle.Connections/.Contracts 16.0.6).
Studio (Release v0.36.2): The state defined for a command’s validation now persists completely and survives closing the dialog, reopening it, and reloading the page — event sources, source-to-state property mappings, and the state schema all round-trip (#966)
Studio (Release v0.36.2): Projection function mappings — count, increment, decrement, and event-context — as well as remove functions now persist and restore in both the command state editor and the read model projection editor (#966)
Studio (Release v0.36.2): The read model projection editor now restores its persisted mappings when reopened, and no longer overwrites the saved projection definition with an empty one when closed without changes (#966)
Studio (Release v0.36.2): Editing a command after its validation state has been defined (renaming it, changing its schema) no longer silently fails to update the model (#966)
Studio (Release v0.36.2): Closing a state editor without changes no longer appends a duplicate definition event, and a failed save is logged and retried instead of being treated as saved (#966)
Fundamentals (Release v7.16.8): JsonSerializer gives a field declared as a collection an empty array when the property is missing from the payload, instead of undefined. Producers legitimately omit empty collections, so readers previously needed a null guard on every collection to work around a value that contradicted its own declared type. An explicit null still deserializes as null.
Studio (Release v0.36.1): Sticky notes render in the intended handwritten face on iPad and any other platform that ships neither Patrick Hand nor Comic Sans — the font is now embedded instead of only named (#977)
Studio (Release v0.36.1): Note text is re-fitted once the embedded font loads, so it is no longer sized against fallback metrics (#977)
Studio (Release v0.36.1): The property tooltip on a command, event or read model card now disappears when the card’s editor opens, instead of floating on top of it (#978)
Studio (Release v0.36.1): Liquid Glass no longer refracts the project drawer, or an unrelated part of the page, while a canvas is panned (#979)
Chronicle (Release v16.13.3): The MongoDB event sequence storage narrows the tail sequence number by an actual event source type, and stops narrowing on the Default/Unspecified sentinel. It had the check inverted, so asking for the tail of one event source type answered across every type, and asking for the tail of everything answered with only the events carrying the sentinel.
Chronicle (Release v16.13.3): The optimistic concurrency strategy reads the expected tail with the same narrowing it puts on the scope. It read the tail of the event source alone while the kernel validates through the scope’s stream type, stream id and event source type, so the two could disagree — reporting conflicts between independent appends, or missing real ones.
Arc (Release v20.69.1): A command scoped with concurrency: true now actually participates in the concurrency check. The scope carries an expected sequence number resolved by the configured concurrency strategy, instead of a hardcoded EventSequenceNumber.Unavailable that the kernel skipped.
Arc (Release v20.69.1): Declaring concurrency: true no longer leaves a command with weaker protection than declaring nothing. The scope it built was not NotSet, so it displaced the strategy the event sequence would otherwise have applied.
Arc (Release v20.69.1): The scope is bound to the event source being appended to. A null event source id made the kernel compute the tail across every event source sharing the type.
Arc (Release v20.69.1): A command appending across streams gets a concurrency scope per target event source, instead of one scope carrying a single stream’s expected tail applied to all of them.
Chronicle (Release v16.13.2): A 16.12 or newer kernel can now read constraint definitions written by an older kernel, so an in-place upgrade no longer breaks constraint registration and client startup.
Chronicle (Release v16.13.2): Recovering a failed partition no longer clears it without re-running the handler, silently losing the missed side effect.
Chronicle (Release v16.13.2): The observer management API’s try-recover-failed-partition and replay routes were swapped, so recovery replayed and replay retried.
Chronicle (Release v16.13.2): A job step that handled no events no longer overwrites the sequence number recorded by an earlier step that did.
Chronicle.Kotlin (Release v2.1.2): Reducer examples take state as nullable, matching the null passed for an event source’s first event.
Chronicle.Kotlin (Release v2.1.2): @Projection no longer documents a readModel parameter, which does not exist; @Pii, @FromEvent and @SetFrom document their missing parameters.
Chronicle.Kotlin (Release v2.1.2): @Reactor and @Reducer KDoc states that id defaults to the class simple name, not the fully-qualified name.
Chronicle.Kotlin (Release v2.1.2): Documentation link verification no longer skips every link and reports success after scanning nothing.
Stage (Release v1.1.0): Read models populate again. The sink the read models project into was identified by an invented GUID; Chronicle identifies sink types by well-known name, so every projection write was rejected as an unknown sink — surfacing as a failed observer partition rather than a registration error.
Chronicle (Release v16.13.1): The Workbench lists event stores against in-memory and SQL storage. Each caller observing event stores now gets its own subject, so one client disconnecting no longer ends event store observation for every other client in the process.
Chronicle (Release v16.13.1): The Workbench lists event types against in-memory storage. Registered event types are now read back — GetLatestForAllEventTypes, GetFor and GetAllGenerationsForEventType returned an empty sequence regardless of what had been registered, and ObserveLatestForAllEventTypes returned a subject that was never fed. An event type nobody registered still resolves to an empty schema, so unknown event content is preserved as before.
Chronicle (Release v16.13.1): Observable queries no longer lose the first value when their source emits it synchronously on subscribe, via Cratis.Fundamentals 7.16.7. Every observable query backed by in-memory storage produced its first value that way.
Studio (Release v0.36.0): Source events and the projection setup defined for a command’s validation state are now fully persisted — a source added without a completed property mapping no longer vanishes when the dialog is reopened, and duplicating a slice now carries over both the command state projection and the read model projection definition (#966)
Studio (Release v0.36.0): The event selection dialog in the command state editor is no longer clipped when there are more events than fit the available height — the list now fits within the viewport and shows up/down chevron indicators when more items are above or below the visible area (#971)
Studio (Release v0.36.0): Dragging elements on the event modeling editor no longer selects text on other canvas elements or the surrounding toolbar (#973)
Studio (Release v0.36.0): Dragging a chat bubble whose author has an avatar no longer starts a native HTML image drag instead of moving the bubble
Chronicle (Release v16.13.0): SQL event storage silently dropped event tags on append; they are now persisted and returned when reading events (#3560)
Chronicle (Release v16.12.0): Releasing a [PII] value encrypted under a different subject no longer fails the whole read model and the query returning it. That property is surfaced as empty and the diagnostic goes to the Kernel log.
Chronicle (Release v16.12.0): Releasing a [PII] value for a subject that never had an encryption key no longer returns an empty value indistinguishable from crypto-shredded erasure.
Arc (Release v20.68.0): Injecting a read model into a command no longer fails as a validation error in an application that has Entity Framework Core or MongoDB but no Chronicle (#2303)
Studio (Release v0.35.6): Slice row-label titles (UI, Interaction, Events, actor names) no longer render skewed in Safari while zooming the event-model canvas. They were laid out with a vertical writing-mode plus a rotation, which WebKit shears under the zoom layer’s transform: scale(); they now use a plain rotation that composes correctly under an ancestor scale.
Studio (Release v0.35.6): Dragging a connection between two module collections now links them reliably. A quick release near the target collection could land a hair outside it — or have its final pointer move coalesced away — so the drop created no link even though the canvas showed “will connect”. The drop now honors the target the affordance last highlighted, and a browser-issued pointer-cancel at the end of the drag commits the link instead of dropping it.
Fundamentals (Release v7.16.7): Observable queries no longer lose the value their source emits synchronously on subscribe. InvokeAndWrapWithSubject, InvokeAndWrapWithTransformSubject, and TransformingSubject now buffer the most recent value, so the consumer that subscribes after wrapping still receives the current state.
Fundamentals (Release v7.16.7): The source subscription is now disposed when the wrapping subject completes, instead of leaking for the lifetime of the source.
cli (Release v2.3.7): The update hint no longer stays silent for up to 24 hours after a release. An “up to date” answer is now re-checked within the hour, so a check that ran moments before a release no longer hides every release after it.
cli (Release v2.3.7): Homebrew and other native installs are now checked against the GitHub releases they actually update from, rather than the NuGet package they never install.
cli (Release v2.3.7): cratis update now always asks the source rather than trusting a cached answer.
cli (Release v2.3.7): The update hint no longer goes missing after commands that take more than five seconds, such as workbench, run, and screenplay generate.
cli (Release v2.3.6): cratis screenplay generate failing with Could not load file or assembly 'Microsoft.CodeAnalysis.Workspaces', on both the dotnet tool package and the native downloads.
cli (Release v2.3.6): cratis screenplay generate failing with The build host could not be found on the native Homebrew and release downloads.
Studio (Release v0.35.5): Fixed a crash that took the whole backend down when loading an event model containing UI prototype elements or command validation rules — the canvas showed only sticky notes and connection dots while modules and features were missing. Polymorphic read-model values are now deserialized correctly, and an unresolvable value surfaces as a query error instead of terminating the process. Ships via Cratis Arc 20.62.6.
Arc (Release v20.62.6): Fixed an unbounded recursion that overflowed the stack and terminated the process when deserializing a read model with an interface- or abstract-typed polymorphic member (a [DerivedType] hierarchy) from MongoDB. The derived-type discriminator convention is now registered for the concrete derived types’ class maps as well, and an unresolvable polymorphic value now surfaces as a catchable exception instead of crashing the process.
cli (Release v2.3.5): A project named exactly Specs or Tests was taken for part of the application, putting test-only artifacts in the document
Chronicle (Release v16.11.1): Workbench views fed by name collections — event store selection, namespaces, sequences, the namespace selector, and projection preview — show their data again instead of blank entries
Chronicle (Release v16.11.1): Connected Clients shows one stable row per client instead of growing by one row per heartbeat
Chronicle (Release v16.11.1): Time Machine loads snapshots instead of spinning on “Loading snapshots…” forever, and states it clearly when an instance has no snapshots
cli (Release v2.3.4): cratis run no longer leaves the container running when the command is interrupted without Docker being signalled too.
cli (Release v2.3.4): Documentation link verification checked nothing — skipping localhost also skipped the local server linkinator crawls through, so every run passed after scanning zero links.
Studio (Release v0.35.4): Resolved an intermittent startup failure after deployment caused by generational event types for feature UI templates. These event types are now single-generation, so the application connects to the event store reliably on rollout.
Arc (Release v20.66.1): Observable queries returning a collection of primitives (string, numeric, bool) now deliver the actual values instead of empty ones, both for the initial payload and for change-set deltas
Arc (Release v20.66.1): Observable queries returning a single primitive value now deliver that value instead of an empty one
Arc (Release v20.66.1): Observable queries that describe themselves with Object now pass their payload through instead of losing it
Stage (Release v1.0.6): The specification runner container no longer fails when run without arguments. Its default --model pointed at /model/event-model.json, but a model is a folder of .play files, so the default is now the /model folder itself.
Chronicle (Release v16.11.0): Chronicle Server with MongoDB clustering now cleans up defunct silo membership entries automatically. Orleans ships with the cleanup disabled, so repeated restarts and failed rollouts accumulated dead silo entries forever, making joining nodes stall while validating against them.
Stage (Release v1.0.5): $causedBy.name / $causedBy.userName / $causedBy.subject mappings in projections no longer fail registration with Unknown read model property expression '$causedBy(name)' — they now resolve through the event context’s causing identity.
Stage (Release v1.0.5): Composite projection keys (key <Name> with parts) no longer fail registration — the Screenplay key type name is no longer emitted into the $composite(...) expression.
Stage (Release v1.0.5): A package-version-only bump (Directory.Packages.props / Directory.Build.props) now triggers the publish workflow, so dependency updates can cut a release.
Studio (Release v0.35.3): Virtualized content no longer pops in abruptly: columns mount progressively during pan/zoom (distance-prioritized, budget-limited) with a short fade-in, and off-screen areas render card/module silhouettes instead of blanks — nothing ever appears empty or bursts in at gesture end.
Studio (Release v0.35.3): The viewport no longer flickers to a wrong position during zoom/pan: the canvas transform now has a single writer (JSX styles frozen at mount, zero React state on the gesture path, atomic settle re-apply cancelled by new gestures). Removing the hidden per-frame React commits also massively lifted zoom performance: on a 10,000-element board, zoom went from 35 fps mean / 5.2 fps 1%-low to ~110 / 40.
Studio (Release v0.35.3): Slice row header pill text no longer jumps at zoom settle: text metrics are pinned (fixed line boxes, geometric-precision rendering) so the crisp re-render lands congruent with the scaled raster, verified at 0.00px geometry delta in Chromium and WebKit.
Studio (Release v0.35.3): Dropdowns, menus and tooltips inside slice columns float above the whole board instead of being clipped at the column border — overlays portal to the document body with anchored positioning and viewport flip, while the performance-critical paint containment on columns is kept. Verified against both artifacts from the report. (#959)
Studio (Release v0.35.2): The drag handle for connecting module collections is now vertically centered on the collection’s content height (headers + slice rows), excluding the specifications strip below — it previously centered on the full footprint and sat visibly too low.
Studio (Release v0.35.2): Module-collection connections (and the drag preview) render as the same smooth bezier splines used for the connections inside a slice, meeting collections at their facing content edges — previously straight line segments. The curve math is extracted into a shared, spec-covered module used by both.
Studio (Release v0.35.2): Connections reliably persist and re-render from stored state on reload. The backend Linking slice was verified sound (its command/event/read-model specs all pass); what was broken was the verification surface — the performance harness’s fake backend neither spoke the app’s WebSocket query transport nor served/persisted links, so the loop could not be exercised. It now implements the WebSocket hub protocol and a real link store, and the full drag → drop → persist → reload loop is screenshot-verified.
Studio (Release v0.35.1): Orleans membership table now self-heals: each Studio silo sweeps defunct entries hourly and removes them after three hours, so repeated crash-looped rollouts no longer bloat the MongoDB membership table with dead and phantom silo entries that stall new silos during join validation and wedge rollouts.
Studio (Release v0.35.1): Running Core without the Orleans cluster (Orleans:Enabled=false, the local-development default) no longer fails at startup: the single-replica leader election, collaboration backplane, and cross-pod stream relay are now registered explicitly, since the IFoo → Foo binding convention cannot discover their Local-prefixed implementations.
Stage (Release v1.0.3): cratis/stage-specrunner failed to build in Release with CS0246: FactAttribute could not be found. The Dockerfile never copied Source/Directory.Build.targets, the file that strips inline spec folders (for_*/, when_*/, given/) from Release builds, so the Screenplay event-model-loader specs were compiled without a test framework reference.
Stage (Release v1.0.2): cratis/stage and cratis/stage-specrunner are now built and pushed for both linux/amd64 and linux/arm64, fixing no matching manifest for linux/arm64/v8 when pulling on arm64 hosts.
Studio (Release v0.34.6): Opening Settings (Organization) no longer blanks the entire screen. Arc’s single-object query proxies report hasData as true with an empty object before the first response arrives, and the new seat-count surfaces from the seats/licensing work read fields from that empty object on first render — crashing the React tree. All three affected sites (Users tab seat counter, Billing subscription/company panels, add-seats proration preview) now guard on field presence.
Studio (Release v0.34.6): The Settings overlay is wrapped in an error boundary, so any future page crash renders a visible error inside the overlay (navigation stays usable) instead of unmounting the app.
Studio (Release v0.34.5): Intermittent 404s on /.cratis/queries/sse/subscribe — and the slow, inconsistent event-model loads they caused. Arc’s SSE transport splits the channel: the long-lived stream pins to one Core pod while subscribe POSTs round-robin across replicas, 404ing on the pod that does not own the connection (measured in production: 3,663 of 9,260 subscribes — 40% — rejected in 6 hours, with bursts of 600+/minute and 204 full stream reconnect cascades). The query transport now uses WebSocket, which carries subscriptions in-band on the single socket — a subscription structurally cannot reach the wrong pod.
Studio (Release v0.34.3): The event-model canvas now holds a constant frame rate during pan and zoom regardless of board size — measured to 50,000 elements. Pan floor went from multi-second stalls (min 0.1 fps at 50k) to 96+ fps with zero frames over 17 ms at every size; zoom 1%-low went from 14.8 to 38.6–40.3 fps across all sizes. Mounted DOM is now bounded (~8k nodes at 50k elements), making the board scale-invariant. (#903)
Studio (Release v0.34.2): Signing in without an existing session no longer shows “No organization”. The Chronicle server upgrade to 16.9.4 broke every fresh client connection — the 16.4.0 client SDK expects the removed ReloadState contract method, so reconnecting pods threw IncompatibleServerException, new pods crash-looped on startup, and tenant resolution (/api/internal/tenants/selectable) returned 500. Sessions with existing cookies bypassed resolution, which is why they kept working. The client packages are now aligned with the 16.9 server line.
Studio (Release v0.34.1): Zooming the event-model canvas is no longer jerky. Zoom did per-frame work panning never does: CSS zoom re-laid-out the whole mounted board every step (also firing the connection ResizeObservers), the rescaled boxes pushed many columns across the virtualization margin at once (mount/unmount churn mid-gesture), and the editor reconciled the entire board subtree on every transform frame. Gestures now stay on the GPU-composited transform path (the crisp CSS-zoom resting state returns 150 ms after the gesture settles), wheel events coalesce onto animation frames, virtualization holds still until the gesture ends, and the board subtree is memoized against per-frame transform re-renders. (#903)
Studio (Release v0.33.3): The version dropdown in the release notes / What’s New dialog now shows its option list. The app raises PrimeReact’s modal z-index tier to 10100+ so dialogs clear the full-screen overlay, but the Cratis Dropdown wrapper pins its body-appended panel to z-index 10000 — leaving the option list rendered behind the dialog, invisible and unclickable. The panel now carries a dedicated class raising it above the modal tier (and below toasts). (#941)
Chronicle (Release v16.10.0): Reading back a job whose request was not yet assigned no longer fails with a NullReferenceException, losing the status and progress the job state was written to record. (#3541)
Chronicle (Release v16.10.0): Reducer failures are written to the client log. A reducer method that throws was reported to the kernel as a failed observation without ever appearing in the client’s own log. (#1395)
Chronicle (Release v16.10.0): Applying or releasing compliance metadata for a property the schema does not declare no longer fails with a bare Sequence contains no matching element. (#690)
Chronicle (Release v16.10.0): Applying or releasing compliance metadata no longer fails when a schema flattened across inheritance declares the same property name more than once. (#690)
Studio (Release v0.33.2): Zooming the event-model board out is now smooth instead of jerky, and headers/labels (module, feature, row, UI-template) and sticky notes scale down properly instead of clamping and word-wrapping. The board zooms with transform: scale() at/below 100% (GPU-composited, scales fonts) and CSS zoom above 100% (re-rasterizes crisp when zoomed in). The two are identical at 100%, so the switch is seamless.
Studio (Release v0.33.2): Specifications and slices no longer disappear as you zoom out — the zoom-driven level-of-detail tiers that hid them are removed now that zoom-out is cheap again. Off-screen viewport virtualization is kept, so the DOM stays bounded on large boards.
Studio (Release v0.33.1): State Change slices no longer show a read model or the “define read model” affordance on the interaction row — a State Change slice’s interaction is the command only. Automation slices keep the affordance and State View slices keep their read model.
cli (Release v2.3.1): Projects whose resource classes are generated during the build are read correctly, instead of appearing not to compile (#49)
cli (Release v2.3.1): The generated document is written even when generation reports errors, so a partial result can be inspected rather than lost (#49)
Arc (Release v20.65.3): Roles declared with the [Roles("...")] constructor form are read by the proxy generator, not only the named-argument form (#2381)
Arc (Release v20.65.2): A command handing work to an aggregate root declared in another project is read instead of failing (#2399)
Arc (Release v20.65.2): Source written by the build no longer counts as part of a slice, removing incorrect reports of a slice being spread over several folders (#2395)
Arc (Release v20.65.2): Names carrying separators read as words instead of running together, so a constraint named unique-timesheet-start is written as UniqueTimesheetStart (#2398)
Arc (Release v20.65.2): A validation rule comparing one property against another is written as the comparison it is, rather than dropped as carrying no value (#2403)
Arc (Release v20.65.2): A validation rule guarded by a condition names that condition when it is left out, so what was dropped can be read (#2403)
Arc (Release v20.65.2): A validation message written as a lambda returning a constant is recovered; one that cannot be recovered now names the expression it could not read (#2397)
Arc (Release v20.65.2): Personal data marking is applied to the value a collection holds, not only to properties holding it directly (#2401)
Arc (Release v20.65.2): Commented-out imports in a component are no longer read as bindings the component makes (#2401)
Arc (Release v20.65.2): Parameters the host supplies, such as cancellation and paging, are left out of what a query asks a caller for (#2401)
Arc (Release v20.65.2): Accented characters survive in names instead of losing their accent (#2401)
Screenplay (Release v1.6.4): The only analyzer warning left in the repository (IDE0305). A Debug build is now clean, so a newly introduced warning is visible rather than lost next to a standing one.
Studio (Release v0.32.0): The event-model board no longer freezes or stutters on large models. Off-screen modules are virtualized so the mounted DOM is bounded by what is visible: a 5000-node board drops from ~61k DOM nodes (frozen, ~24 fps) to ~9k nodes and 55+ fps, and 10000 nodes stays interactive. (#903)
Chronicle (Release v16.9.4): Two links in the concepts docs pointed at /arc/backend/chronicle/aggregates/aggregate-root.md, which no longer exists — the Arc page is defining-an-aggregate-root.md. This was breaking the Documentation site’s internal-links check.
Screenplay (Release v1.6.3): A command property named description, validate, handler or concurrency no longer fails to compile. Those directives take no operand, so a line with property shape is now read as a property; description "..." and validate csharp keep their directive meaning. (#27)
Screenplay (Release v1.6.3): tag TagType in an event body no longer silently becomes a static tag and drops the property — it still declares the tag, but the compiler now warns that the line does not declare what it looks like and points at the @tag escape. (#27)
Screenplay (Release v1.6.3): A bare validate in an enumeration concept no longer silently becomes an empty validate block that swallows the value — it still opens the block, but the compiler now warns and points at the @validate escape. (#27)
Screenplay (Release v1.6.3): The printer re-escapes names that collide with a directive keyword, so a document containing them survives print, compile and reprint. (#27)
Studio (Release v0.31.2): The perf/ canvas-framerate harness can now run end to end against a local Core: it sends the full X-MS-CLIENT-PRINCIPAL-* header set (the /.cratis/me identity endpoint the SPA reads rejects the id-only header, leaving the board behind the “no license” gate), and its fixture no longer nests slices under a sub-feature — those never materialize on import due to a Chronicle nested-[ChildrenFrom] limitation (Cratis/Chronicle#3532). (#903)
Screenplay (Release v1.5.3): ScreenplayPrinter no longer emits culture-dependent numbers. decimal, float, int and long literals previously fell through to a culture-sensitive ToString() and printed 5,5 on a comma-decimal machine, producing text that failed to compile. (#25)
Screenplay (Release v1.5.3): ScreenplayPrinter now escapes quotes and backslashes in every string it emits — description, validation message, screen label and title, seed group ids, specification errors, capture translations and separators, policy roles and claims, and tags. A value containing a " previously terminated the literal early and produced invalid output. (#25)
Screenplay (Release v1.5.3): Comment stripping and top-level splitting no longer treat an escaped quote as the end of a string. (#25)
Chronicle (Release v16.9.3): CHR0038 no longer reports a fluent join when AutoMap cannot carry the value across — [NoAutoMap] on the read model, and [NoAutoMap] on the target property of a positional record, were both still reported. Since the rule is an error, each was a build break on correct code.
Studio (Release v0.30.1): The version dropdown in the What’s New / release-notes dialog now appears above the dialog and is selectable — the dialog no longer uses the liquid-glass surface that was capturing the dropdown panel and drawing it behind (verified in Storybook). (#924)
Studio (Release v0.30.1): Ticking ‘Show all releases’ after every release had been seen no longer closes the release-notes dialog. (#924)
Studio (Release v0.30.0): Dragging items around the brainstorming board no longer randomly selects text and HTML on the surface. (#933)
Studio (Release v0.30.0): The version dropdown in the What’s New / release-notes dialog now appears above the dialog instead of behind it, so releases can be seen and selected. (#924)
Studio (Release v0.29.1): Organization and tenant names are now rejected at creation time if they contain a space or any character that is invalid in a MongoDB database name (/ \ . " $ * < > : | ?) or the + namespace separator. Chronicle uses the organization name verbatim as its event-store namespace (the MongoDB database Studio+es+<name>), so a name such as “Hive Consulting” produced an invalid database name that could never be created — the provisioning reactors failed on every attempt and organization lookup (login) hung. The rule is applied in both organization-creation flows (SetupOrganization and RegisterOrganization).
Chronicle (Release v16.9.1): A [PII] concept held in a collection is now encrypted. It previously lost its classification and was stored in the clear, even though the same concept type was encrypted as a scalar.
Chronicle (Release v16.9.1): A compliance marker covering a whole value object now releases back into an object instead of a raw string, which previously left the read model unable to materialize.
Chronicle (Release v16.9.1): A property covered by a compliance marker as a whole is no longer also descended into, which encrypted members whose mutations were discarded and, on release, decrypted members that were never separately encrypted.
Chronicle (Release v16.8.1): The Workbench UI is reachable again in the published container images - https://localhost:35000 serves the Workbench instead of returning 401
Arc (Release v20.63.0): A tenant named Default now resolves the unsuffixed MongoDB database, matching where Chronicle materializes the default namespace’s read models. Previously it resolved <database>+Default, which does not exist, so both IMongoCollection<TReadModel> one-shot reads and .Observe() live queries returned no rows without erroring.
cli (Release v2.3.0): Chronicle commands in the generated CHRONICLE.md were missing their chronicle group and failed with “Unknown command”.
cli (Release v2.3.0): cratis config show and cratis events has were referenced in generated docs but do not exist.
cli (Release v2.3.0): Workbench opened with an empty content pane until the first keypress.
cli (Release v2.3.0): Workbench AI description advertised number keys 1-9, which are not bound.
cli (Release v2.3.0): README’s Linux install command returned 404; release assets carry the version in the filename.
Chronicle (Release v16.8.0): Projection read models could be corrupted in a multi-silo cluster when replay and catch-up ran the read-modify-write cycle concurrently for a partition-collapsing key.
Chronicle (Release v16.8.0): Accumulating projections and reducers no longer double-count events re-delivered by crash recovery, except where a resumed catch-up re-cuts the original batch boundaries.
Chronicle (Release v16.8.0): Every replay job reported CompletedWithFailures, because benign step-start outcomes were counted as failures and no failed-step record was written.
Chronicle (Release v16.8.0): Resuming a job reported a healthy running step as a failed resume, and reported genuine resume failures as successes.
Chronicle (Release v16.8.0): [Unique] could reject a value nothing held on in-memory storage, because changing a constrained value never released the previous one.
Chronicle (Release v16.8.0): Joined projection changes after the first were silently dropped, leaving a stale read model with no error.
Chronicle (Release v16.8.0): Concurrent resolution of event-store and namespace storage could serve a stale event-type schema or leave two sinks for one read model with divergent replay state.
Chronicle (Release v16.8.0): A cached event-type schema was nev
Studio (Release v0.27.0): Saving a command setup (validation rules, state, read model, and projections) now persists correctly (#916)
Studio (Release v0.27.0): The slice connection highlight stays visible while editing within a slice instead of disappearing when the pointer leaves the column (#919)
Studio (Release v0.26.0): Granting seats from Admin now actually licenses the organization’s users. GrantSeatsToOrganization (#900) previously produced SeatsGrantedToOrganization that never left the Admin store, so it granted no per-user license and members stayed locked out. Now an Admin reactor forwards a SeatsGrantedToTenant contract event (in Admin.Contracts) to the Admin outbox; a Core [EventStore("StudioAdmin")] inbox reactor picks it up for the target tenant and assigns a per-user seat (SKU + expiry) to each of the org’s users. Both reactors are [OnceOnly], so deploying them also backfills existing grants via replay.
Chronicle.Mcp (Release v1.3.1): The getting-started documentation linked to ../Source/docker-compose.yml, a repository file the aggregated docs site does not publish, which failed the site’s internal link check. It now links to the file on GitHub.
Studio (Release v0.24.7): The event modeling editor toolbar was noticeably wider than the prototype editor’s toolbar and switching between them looked jerky. The editor wrapped its tools in ToolbarGroups, so it drew several separate glass pills and carried the group padding on top of the toolbar’s own — a wider column — while the prototype toolbar’s tools are bare (one continuous pill). Switching therefore morphed between different shapes (several pills to one). The editor tools now render bare like the prototype, so the toolbar is a single continuous pill at the same width (70px → 58px, matching the prototype) and the regular↔prototype switch is a same-width content swap.
cli (Release v2.3.5): The CLI0002 ambiguous-project error, which no longer has a situation to report
Chronicle (Release v16.9.1): PIIAppliedToNonConceptAsType — applying [PII] to a type that does not derive from ConceptAs<T> is now supported, so the exception can no longer be thrown.
Studio (Release v0.28.0): Admin no longer tracks individual seat assignments — seat assignment is owned by Core and is not reported to any other service.
Studio (Release v0.25.0): The brainstorming toggle in the event-modeling editor; brainstorming boards now have their own route and are opened from the project tree. (#904)
Chronicle.Mcp (Release v1.3.0): The ManagementPort option and its CHRONICLE_MANAGEMENT_PORT environment variable. In Chronicle 16.x the OAuth token endpoint is derived from the server address, so a separate management port is no longer used.
Arc (Release v20.69.0): CommandContextExtensions.GetResolvedKey(CommandContext, IServiceProvider). A command’s key is now resolved while the command context values are being built, so GetResolvedKey() reads it without a service provider (#2303)