Screenplay (Release v4.3.0): Add an immutable executable semantic model with stable semantic, document, query-argument, and event-contract identities. (#135)
Screenplay (Release v4.3.0): Add canonical ESM and identity-catalog serialization with deterministic revisions and explicit migration contracts. (#135)
Screenplay (Release v4.3.0): Add recursive collection and composite values with strict type, optionality, cardinality, and enumeration validation. (#135)
Screenplay (Release v4.3.0): Add net8, net9, and net10 canonical-byte conformance vectors in CI. (#135)
Chronicle (Release v16.38.0): EventTypeGenerationFor<TEventType> attribute for declaring a previous generation of an event type - the event type id is resolved from the referenced current-generation type, so it can never drift from it (#3815)
Chronicle (Release v16.38.0): Roslyn analyzers CHR0049 and CHR0050, validating that EventTypeGenerationFor<T>’s referenced type is itself a valid, directly-marked [EventType], and that a type never carries both attributes at once (#3815)
Chronicle (Release v16.38.0): Runtime checks that fail loudly at event type registration: an EventTypeMigration<TUpgrade, TPrevious> whose two generations resolve to different event type ids, or two migrators that both bridge the same generation pair for one event type (#3815, #3816)
Screenplay.CritterStack (Release v0.21.0): Discover exact current and legacy authored saga state, legal lifecycle roles, messages, correlation evidence, and lifecycle provenance. (#50)
Screenplay.CritterStack (Release v0.21.0): Add framework-neutral signature-stable method identity shared by Marten document operations and Wolverine handler evidence. (#44)
Screenplay.CritterStack (Release v0.21.0): Add generated-source, overload, constructor, nested payload, direct delivery, event-stream, query, and ambiguity characterization. (#50)
cli (Release v2.16.0): Preserve aligned actual/logical project metadata and linked-document source contexts through provider, Arc, and Critter generation. (#102)
Components (Release v3.5.0): Added an ESLint rule preventing hand-written raw CommandForm marker strings (#112) (#171)
Components (Release v3.5.0): Added packed-consumer coverage for Arc 20, 21, and current 22.1
Screenplay.Generation (Release v0.9.0): Add immutable source-path policies, project source contexts, and typed stable file identities with fail-closed path validation. (#21)
Screenplay.Generation (Release v0.9.0): Add project-aware evidence APIs and deterministic canonical ordering for same-display files from different projects. (#21)
Screenplay.CritterStack (Release v0.19.0): Admit exact current DcbModel and legacy BoundaryModel workflows with correlated sync, Task, or ValueTask EventTagQuery companions. (#4)
Screenplay.CritterStack (Release v0.19.0): Retain ordered tag/event conditions and direct request source members as aggregate boundary reads. (#4)
Screenplay.CritterStack (Release v0.19.0): Retain safe declarative state returns, explicit boundary appends, and persistence-wrapper payloads while preserving ordinary tuple siblings. (#4)
Screenplay.CritterStack (Release v0.19.0): Report unlowerable DCB boundaries and unresolved bounded queries as WOLVERINE0014 and WOLVERINE0015. (#4)
Screenplay.Generation (Release v0.8.0): Add nullable typed Unknown, Conflict, and Unsupported outcomes to generation diagnostics. (#5)
Screenplay.Generation (Release v0.8.0): Add Unknown = -1 sentinels to public fact discriminator enums without renumbering existing values. (#5)
Screenplay.Generation (Release v0.8.0): Validate artifact, placement, slice, relationship, evidence, concept representation, primitive, attribute, and validation-rule discriminators before resolution. (#5)
Screenplay.CritterStack (Release v0.18.0): Retain current and legacy Single/Conjoined event tenancy declarations as MARTEN0013. (#3)
Screenplay.CritterStack (Release v0.18.0): Retain exact per-document fluent tenancy, tenancy attributes, and global policy declarations without expanding their effects. (#3)
Screenplay.CritterStack (Release v0.18.0): Add pinned canonical tenancy evidence while preserving generated source and artifact counts. (#3)
Arc (Release v22.1.0): Exposed observable-query readiness through the TypeScript and React query-result APIs. (#2589)
Arc (Release v22.1.0): Added runtime binding support for custom command-form fields rendered through opaque layouts. (#2582)
Screenplay.CritterStack (Release v0.17.0): Retain independent same-model and different-model stream bindings, identities, reads, and appends. (#4)
Screenplay.CritterStack (Release v0.17.0): Discover exact receiver-bound AppendOne and safe direct AppendMany payloads while reporting unresolved opaque writes as WOLVERINE0013. (#4)
Screenplay.CritterStack (Release v0.17.0): Retain commandless HTTP, metadata-only loaded streams, current and legacy stream APIs, and deterministic conventional-version ambiguity. (#4)
Screenplay.CritterStack (Release v0.17.0): Exclude authored saga-state return slots before event, response, and cascade classification without inventing saga workflow facts. (#4)
Screenplay.CritterStack (Release v0.16.0): Retain exact current Marten alias, naming-style, suffix, and schema-version declarations as MARTEN0011. (#3)
Screenplay.CritterStack (Release v0.16.0): Retain typed, raw JSON, and recognized class-upcaster registrations as MARTEN0012. (#3)
Screenplay.CritterStack (Release v0.16.0): Cover reduced and static extension syntax, current CLR/System.Text.Json/Json.NET upcaster bases, constants, and authored source locations. (#3)
Screenplay.CritterStack (Release v0.16.0): Add pinned canonical alias/upcast evidence while preserving the generated Screenplay hash and sole domain event. (#3)
cli (Release v2.15.0): Report Vogen package, assembly, and value-object capability provenance independently from the Cratis adapter package. (#87)
cli (Release v2.15.0): Admit exact Vogen 8.0.7 canonical evidence and fail closed for missing, malformed, divergent, unreviewed, or unsupported versions. (#87)
cli (Release v2.15.0): Generate authored Vogen concepts and Critter Stack artifacts together through the default CLI facade. (#87)
cli (Release v2.15.0): Count VOG diagnostics as lowering loss while retaining independent support and semantic-conformance dimensions. (#87)
Screenplay.Generation (Release v0.7.1): Add a candidate-package current-source consumer covering authored trees, concepts, validation, exact subjects, conflicts, provenance, order independence, and compiler verification. (#5)
cli (Release v2.14.0): Report stable CLI0015 and CLI0016 diagnostics before provider interpretation when target selection is ambiguous or unavailable. (#87)
Screenplay.CritterStack (Release v0.15.0): Compose Vogen concepts by default only when exact authored Vogen evidence exists. (#25)
Screenplay.CritterStack (Release v0.15.0): Add external adapter-list composition with one shared resolver/lowerer/printer/verifier pipeline. (#25)
Screenplay.CritterStack (Release v0.15.0): Add a pinned Vogen 8.0.7 canonical fixture covering concepts, validation, nullable usage, loss diagnostics, and usage-driven identity. (#25)
Screenplay.CritterStack (Release v0.14.0): Discover exact projection name/version and lifecycle metadata as explicit source-bound loss evidence. (#3)
Screenplay.CritterStack (Release v0.14.0): Discover async daemon mode and statically resolvable subscription registration, filters, start positions, versions, and archived-event policy. (#3)
Screenplay.CritterStack (Release v0.14.0): Support current and legacy Marten/JasperFx metadata names. (#3)
Screenplay.Generation (Release v0.7.0): Map exact authored Vogen Validate(T) hooks to neutral named concept-validation rules. (#7)
Screenplay.Generation (Release v0.7.0): Preserve a proven constant Validation.Invalid message and authored implementation file. (#7)
Screenplay.Generation (Release v0.7.0): Report NormalizeInput and named Instance declarations as explicit non-representable evidence. (#7)
Screenplay.CritterStack (Release v0.13.0): Validate Cratis.CritterStack.Screenplay against its public 0.1.0 baseline. (#7)
Screenplay.CritterStack (Release v0.13.0): Add a clean package consumer for the generator API and dependency graph. (#7)
Screenplay.Generation (Release v0.6.0): Validate Generation, Contracts, and DotNet packages against public 0.1.0 baselines. (#3)
Screenplay.Generation (Release v0.6.0): Validate the Vogen package against its first public 0.2.0 baseline. (#3)
Screenplay.Generation (Release v0.6.0): Add binary consumer verification that runs baseline-compiled consumers against current packages. (#3)
AuthProxy (Release v2.21.0): Configurable OAuth authorization-request parameters for direct and Aspire provider registration, with framework-owned collision protection. (#106)
Screenplay.CritterStack (Release v0.12.0): Discover exact Identity and Identities member selectors with one-to-one/one-to-many evidence. (#3)
Screenplay.CritterStack (Release v0.12.0): Discover direct and IEvent FanOut child selectors and grouping mode. (#3)
Screenplay.CritterStack (Release v0.6.0): Discover pure direct-bus handlers as reactions with message triggers and publish relationships. (#4)
Screenplay.CritterStack (Release v0.6.0): Preserve the current reaction lowering gap as an explicit diagnostic. (#4)
Screenplay.CritterStack (Release v0.5.0): Discover direct send, publish, request/reply, scheduling, delivery-option scheduling, and topic-broadcast consequences. (#4)
Screenplay.CritterStack (Release v0.5.0): Report direct delivery semantics that the current Screenplay language cannot preserve. (#4)
Screenplay.CritterStack (Release v0.4.0): Record ordinary handler returns as cascades when direct event-stream appends establish persistence. (#4)
Prompter (Release v0.2.1): A check requiring exactly one major, minor or patch label before a pull request can be merged.
Synopsis (Release v1.1.1): A check requiring exactly one major, minor or patch label before a pull request can be merged.
cli (Release v2.12.0): Report resolved source-package provenance and explicit compatibility dimensions for Screenplay generation. (#87)
cli (Release v2.12.0): Fail closed for unknown or unsupported Marten and Wolverine generations. (#87)
Screenplay.CritterStack (Release v0.3.0): Generic, instance-based, snapshot, and live Marten projection registration discovery with explicit async/live lifecycle diagnostics. (#3)
Screenplay.CritterStack (Release v0.3.0): Pinned MartenWithProjectAspire verification for single-stream, multi-stream, and event projections. (#3)
Screenplay.CritterStack (Release v0.3.0): A compatibility reference with exact canonical package sets, support tiers, and version-provenance guidance. (#17)
Screenplay.CritterStack (Release v0.3.0): Evidence-based classification guidance for State Change, State View, Automation, and Translation patterns. (#3, #4)
cli (Release v2.11.0): Add --provider auto|arc|marten|critter-stack with conservative source-framework detection.
cli (Release v2.11.0): Generate verified Screenplay definitions from Marten and Critter Stack projects through the new official adapter package.
cli (Release v2.11.0): Add a real package compatibility spec and end-to-end validation for Arc, BankAccountES, and canonical IncidentService source.
Screenplay.CritterStack (Release v0.2.0): Discover document shapes from Marten registration, Store, Insert, Update, Delete, Load, and Query source usage. (#3)
Screenplay.CritterStack (Release v0.2.0): Record handler-to-document Store, Update, Delete, and Read relationships with source provenance. (#3)
Screenplay.CritterStack (Release v0.2.0): Report the missing ordinary document-state Screenplay construct through MARTEN0003. (#3)
Screenplay.CritterStack (Release v0.2.0): Verify document CRUD and IMartenOp document storage against pinned CqrsMinimalApi and Reports samples. (#3)
Studio (Release v0.82.1): A play session’s Chronicle Workbench is reachable at /workbench under the session, so the events a model produced can be inspected without publishing the container’s own port
Studio (Release v0.82.0): A play session’s Chronicle Workbench is reachable at /workbench under the session, so the events a model produced can be inspected without publishing the container’s own port
Stage (Release v3.8.0): The session’s Chronicle Workbench is served at /workbench, on the model’s own port. The bundled kernel serves one already, but on a port a play session does not publish — so there was no way to look at the events a model produced. It follows a path-prefixed reverse proxy: the page is told where it is really being served from, and Arc’s client takes that as its API base path for every command, query, SSE and WebSocket URL
Screenplay.CritterStack (Release v0.1.0): Generate markerless Marten events, aggregate snapshots, read models, reducers, commands, and queries from source.
Screenplay.CritterStack (Release v0.1.0): Interpret Wolverine HTTP endpoints, aggregate workflows, response wrappers, direct event/document operations, and outgoing messages.
Screenplay.CritterStack (Release v0.1.0): Expose a complete CritterStackScreenplayGenerator façade plus stable Marten/Wolverine diagnostics.
Screenplay.CritterStack (Release v0.1.0): Cover current and legacy Critter Stack conventions with synthetic fixtures and real BankAccountES, IncidentService, and CritterStackHelpDesk smoke validation.
Screenplay.Generation (Release v0.1.0): Add a reusable Roslyn SDK for project-qualified symbols, source provenance, generated-source detection, and type shapes.
Chronicle (Release v16.37.0): Cratis:Chronicle:Authentication:Enabled turns authentication off entirely — no token authority, no identity endpoints, no bootstrap admin user, and every gRPC service and HTTP endpoint answers anonymously. For a Chronicle embedded in one container or process with its own client over loopback, where the credential exchange protects nothing and costs every client seconds of cold start. Anywhere a network can reach the server, leaving it off publishes the whole event store (#3791)
Chronicle (Release v16.37.0): auth=none in a connection string, and WithoutAuthentication() on the builder, connect without presenting credentials. Omitting credentials still means client credentials with the development pair, as it always has — auth=none is the explicit form and overrides anything else the connection string carries (#3791)
Studio (Release v0.78.2): The topic list says when a topic was started — minutes, hours, “Yesterday”, then the date and time in the browser’s own timezone. (Cratis/StudioIssues#249)
Studio (Release v0.78.2): A spec that fails the build if a command takes a read model that Chronicle cannot resolve, so this class of regression cannot ship again. It compiles, passes command specs, and fails only in production, on every execution — see Cratis/Arc#2587.
Studio (Release v0.78.0): Agents answer with action. An agent mentioned in a conversation can now carry out what it was asked, using the same tools the “Ask Studio to do this” affordance uses, and reports what it changed. (Cratis/StudioIssues#137)
Studio (Release v0.78.0): MCP tools for changing an event model that already exists: rename a module, feature or slice, move a slice between features, move a feature between modules, and remove a module, feature or slice. (Cratis/StudioIssues#137)
Studio (Release v0.78.0): A feature can be moved from one module to another, taking its sub-features with it. (Cratis/StudioIssues#137)
Studio (Release v0.78.0): An organization that has no MCP credential can issue one from Settings → MCP. Credentials are provisioned automatically, but an organization whose provisioning failed previously had no way back — the page offered only a Rotate button that was disabled precisely because there was nothing to rotate.
Studio (Release v0.78.0): Documentation for the Model Context Protocol server: how it works and the security model behind it. (Cratis/StudioIssues#137)
cli (Release v2.10.0): cratis init --no-context writes the skill and prompt files but leaves the tool’s instruction file alone, for repositories that generate AGENTS.md, CLAUDE.md or .github/copilot-instructions.md from a shared corpus and propagate them. Appending to such a file is undone by the next sync — the reference disappears at an unpredictable later moment, which is harder to notice than never adding it. The skip is reported and names what to add instead, so the catalog does not end up on disk with nothing pointing at it. (#81)
cli (Release v2.9.0): cratis init now configures Pi, writing the Chronicle skill to .pi/skills/chronicle-cli/SKILL.md, the diagnose prompt to .pi/prompts/, and the @CHRONICLE.md reference to AGENTS.md. Pi is detected from a project’s .pi/ directory and from the PI_* variables it exports, so running cratis init inside a Pi session configures it even on a project that has nothing yet. --tool pi targets it explicitly. (#79)
Studio (Release v0.76.0): A job engine for work that outlives a request: persistent, grain-backed, resumable after a restart, with its state recorded as events (Cratis/StudioIssues#216)
Studio (Release v0.76.0): A jobs panel in the top bar showing what Studio is working on and what it has worked on, with a count on the button while anything is still going. Recent by default — everything unfinished plus everything that finished in the last two hours — with the full history behind a second tab (Cratis/StudioIssues#216)
Studio (Release v0.76.0): The board history’s “All time” tab now reaches the whole history: entries load a window at a time as the list is scrolled, with a spinner while the next window is fetched (Cratis/StudioIssues#240)
Screenplay (Release v4.2.0): A file reference in a .play document is now a link — cmd-click opens the file it names (#120)
Screenplay (Release v4.2.0): screenplay.sourceRoot setting, to say what a repo-relative path in a document is resolved against (#120)
Screenplay (Release v4.2.0): A file reference that could mean more than one file is left unlinked, with a tooltip naming every candidate — and is never resolved from a search that may have been cut short (#120)
Screenplay (Release v4.2.0): A file reference whose name contains *, ?, [, ], { or } resolves to the file literally named that, so route files such as [id].tsx are linked (#120)
Screenplay (Release v4.2.0): Links are re-resolved when a file appears or disappears outside the editor, such as from a git checkout or a run of the generator (#120)
Studio (Release v0.75.0): A chat message on an event model, module, feature or slice can be handed to Studio to carry out, next to replying to it. Studio says it is on it, works through the organization’s own Studio tools, and reports back in the same conversation (Cratis/StudioIssues#195)
Studio (Release v0.75.0): Studio’s own agents can use the organization’s Studio tools over the MCP server, authenticated with the organization’s own credential
Studio (Release v0.75.0): Every event appended by an event-model, brainstorming or concepts command carries its board kind as the event stream type, and the individual board as the event stream id where the command names one (Cratis/StudioIssues#186)
Studio (Release v0.75.0): The whole history of an event model or brainstorming board, leaving nobody out — it is a record of the board rather than a report to a person, so your own changes are in it (Cratis/StudioIssues#187)
Studio (Release v0.75.0): The event-tagging strategy is written down in .agents/PROJECT.md, including what to do when adding a board command and what is still missing (Cratis/StudioIssues#186)
Screenplay (Release v4.1.0): file <path> on concept, type, event, readmodel, projection, slice, specification and the top-level trigger, naming the repository relative file the declaration is realized by. #120
Screenplay (Release v4.1.0): PLAY0264 warns when a file path is absolute rather than repository relative.
Screenplay (Release v4.1.0): file offered as a completion in the declaration bodies that accept it.
Screenplay (Release v4.1.0): A file references page covering what the keyword means on each construct and the rules a path follows.
Studio (Release v0.74.0): The identity carries the seat’s details — why it is or is not usable, the SKU it grants and when it expires — so everything gated on licensing has the answer on the first render (Cratis/StudioIssues#188)
Studio (Release v0.73.1): A CI guard that walks shell continuation chains for this exact mistake and parses every committed shell
Chronicle (Release v16.36.0): CannotWaitForObserverCompletion names the case where completion cannot be established
Studio (Release v0.73.0): An MCP server at mcp.cratis.studio, served from its own container behind its own AuthProxy. Agents connect
Studio (Release v0.73.0): Named tools for the work people ask for — read the structure, read an event model, add modules, features and
Studio (Release v0.73.0): studio_locate, which turns the names a person uses — “the ordering slice in the sales model in the Acme
Studio (Release v0.73.0): Catalog tools that reach the whole of Studio’s command and query surface on demand, so the full API is
Studio (Release v0.73.0): An MCP tab in organization settings showing the endpoint and credential, with connect-your-agent
Studio (Release v0.73.0): Every organization is issued an MCP credential when it is created, stored encrypted with the organization’s
Stage (Release v3.3.1): A check requiring exactly one major, minor or patch label before a pull request can be merged.
Chronicle (Release v16.35.4): Every published Docker image variant (production, development, development-slim, workbench) is booted the way a consumer runs it before being pushed — the container must start, stay up, and listen on its port, or the publish fails with the container logs (#3446)
Stage (Release v3.3.0): A unique constraint a slice declares is now rendered as a Chronicle [Unique] attribute on the event it names, so a rendered application actually enforces the uniqueness the document states (#13)
Studio (Release v0.72.0): Added inline rename (pencil icon) for domains and event models in the project tree. (Cratis/StudioIssues#215)
Studio (Release v0.72.0): Added visual feedback (spinner → checkmark) when transferring Brainstorming events to an event model. (Cratis/StudioIssues#212)
Studio (Release v0.72.0): Slices created from transferred Brainstorming events now get a sensible generated command name (e.g. “Order Placed” → PlaceOrder) instead of a generic placeholder. (Cratis/StudioIssues#220)
Studio (Release v0.72.0): Added a schema/property editor for Brainstorming events, with a hover preview. (Cratis/StudioIssues#224)
Studio (Release v0.72.0): Added a sidebar view for Brainstorming chat conversations, @mentioning agents, and an emoji picker in the chat composer. (Cratis/StudioIssues#229)
Studio (Release v0.72.0): Added a local onboarding step that merges the Studio production cluster into your own kubectl config. (Cratis/StudioIssues#219)
Studio (Release v0.71.0): Events, sticky notes, and regions on a Brainstorming board can now be copied (Ctrl/Cmd+C) and pasted (Ctrl/Cmd+V), for a single selected item or many at once, alongside the existing multi-select delete (Delete/Backspace). A new Copy button sits next to Delete on the selection toolbar. (Cratis/StudioIssues#207)
Studio (Release v0.71.0): Paste is keyboard-only — it isn’t scoped to a current selection, and the selection toolbar only renders anchored to one, so a “Paste” button there wouldn’t be reachable once you’d deselected. Delete and Copy both act on a selection and stay on the toolbar as before.
Studio (Release v0.71.0): A pasted event whose name collides with the (still-present) original is disambiguated the same way a newly added event is (Name (2), Name (3), …).
Studio (Release v0.70.0): A unique-module-name constraint: creating a module with a name already in use in the same event model is rejected with a validation message instead of silently creating a stacked twin (Cratis/StudioIssues#199)
Studio (Release v0.70.0): Success and failure feedback when transferring brainstorming events to an event model — a toast names the created module and offers to open it on the event-model board (Cratis/StudioIssues#199)
Studio (Release v0.70.0): A post-deploy Chronicle observer check in the production deploy: fails the deploy run loudly when a release leaves failed partitions or orphaned projection definitions behind (Cratis/StudioIssues#202, Cratis/StudioIssues#204)
cli (Release v2.8.2): --debug now prints the resolved event store and namespace together with the source each value came from (option, context, or built-in default) (#75)
Chronicle (Release v16.38.0): CHR0037 now also validates migrations that use EventTypeGenerationFor<T> (checking it points at the migration’s own upgrade type), instead of silently no longer checking anything the moment a migration doesn’t use the older explicit-id style (#3815)
Chronicle (Release v16.38.0): An EventTypeMigration<TUpgrade, TPrevious> whose two generations resolve to different event type ids now throws at startup instead of registering successfully and failing later, or silently registering an incorrect schema. Any application already relying on the old mismatched-id pattern was already non-functional against a production Chronicle kernel; this surfaces that failure immediately and clearly instead of downstream as EventTypeSchemaChanged (#3816)
Screenplay.CritterStack (Release v0.21.0): Keep saga state distinct from events, messages, cascades, HTTP read models, document operations, DCB payloads, and side effects. (#50)
Screenplay.CritterStack (Release v0.21.0): Report unsupported or runtime-only saga roles and correlation with stable located diagnostics instead of inventing semantics. (#50)
cli (Release v2.16.0): Update all four Generation packages to 0.9.0 while retaining Arc 22.1.0, Critter Stack 0.19.0, and no target Vogen runtime. (#102)
Screenplay.CritterStack (Release v0.20.0): Update all four Generation packages to 0.9.0 and migrate Marten/Wolverine evidence to project-aware source APIs. (#29)
Screenplay.CritterStack (Release v0.20.0): Exercise stable source identity and legacy fallback in the clean package consumer. (#29)
Stage (Release v3.8.2): Document Stage runtime, specification-runner, rendering responsibilities, .play input, current limitations, and deferred frontend rendering. (#19)
Components (Release v3.5.0): Expanded the supported Arc peer range through Arc 22 and verified Arc 22.1 explicitly (#166)
Components (Release v3.5.0): Documented complete-result filtering as a server-side query responsibility (#159)
Components (Release v3.5.0): Made Components 3 Storybook discovery and Vite configuration clean under the current toolchain (#171)
Components (Release v3.5.0): Run JavaScript and Storybook gates when workflow or package-build inputs change
Screenplay.Generation (Release v0.9.0): Use explicit source identity in Vogen evidence when a host supplies it, without adding a Vogen runtime dependency or changing display paths. (#21)
Screenplay.Generation (Release v0.9.0): Validate public package compatibility against the released 0.8.0 baseline. (#21)
cli (Release v2.15.2): Update all four Screenplay Generation packages to 0.8.0 and Critter Stack Screenplay to 0.19.0. (#87)
cli (Release v2.15.2): Preserve newly visible unsupported Aggregate roles as explicit GEN0004 lowering loss instead of expecting silent omission. (#87)
cli (Release v2.15.2): Report the actual Arc 22.1.0 and Critter Stack 0.19.0 provider versions in assembly metadata and package sentinels. (#87)
Studio (Release v0.82.5): Play sessions now run Stage 3.8.1, which starts noticeably faster — it bundles Chronicle 16.37.2 in place of 16.37.0
Stage (Release v3.8.1): Updated the bundled Chronicle kernel and client packages to 16.37.2, which starts noticeably faster than the 16.37.0 kernel the image shipped before
Chronicle (Release v16.37.2): The -development container image is now built with optimizations enabled, making kernel startup measurably faster for everything based on it (#3813)
Screenplay.Generation (Release v0.8.0): Advance package compatibility validation to the published 0.7.1 baseline while retaining legacy 0.1/0.5 binary consumers. (#5)
cli (Release v2.15.1): Update the bundled Critter Stack Screenplay adapter to 0.17.0 for receiver-targeted current/legacy event streams and Marten event schema evidence. (#87)
cli (Release v2.15.1): Keep Arc 22.0.0 and all four Generation packages at 0.7.1. (#87)
cli (Release v2.15.0): Update bundled packages to Screenplay Generation 0.7.1 and Critter Stack 0.15.0. (#87)
cli (Release v2.15.0): Document Vogen provenance, generated-source authority, and support boundaries. (#87)
Screenplay.Generation (Release v0.7.1): Advance all package-validation baselines to the published 0.7.0 compatibility floor while retaining 0.1.0/0.5.0 legacy binary smoke. (#5)
Screenplay.Generation (Release v0.7.1): Refresh implementation status through Generation 0.7, Critter Stack 0.15, and CLI 2.14. (#5)
cli (Release v2.14.0): Preserve single-target dependency projects while selecting the requested variant from each multi-target application project. (#87)
cli (Release v2.13.0): Take Screenplay Generation 0.6.0 and Critter Stack Screenplay 0.13.0. (Cratis/cli#87)
cli (Release v2.13.0): Preserve authored syntax-tree provenance required by current source adapters. (Cratis/cli#87)
cli (Release v2.13.0): Report exact canonical package sets with the current bundled provider. (Cratis/cli#87)
Screenplay.CritterStack (Release v0.13.1): Build and validate the Critter Stack adapter against Screenplay Generation 0.6.0.
Screenplay.CritterStack (Release v0.13.1): Keep the public 0.1.0 Critter Stack package compatibility baseline unchanged.
Screenplay.CritterStack (Release v0.13.0): Update Generation, Contracts, and DotNet dependencies to 0.5.0. (#7)
Screenplay.CritterStack (Release v0.13.0): Remove obsolete GitHub release package bootstrap now NuGet trusted publishing is available. (#7)
Screenplay.Generation (Release v0.6.0): Preserve compatible additive API evolution while rejecting removals and signature breaks. (#3)
AuthProxy (Release v2.21.0): Canonical OAuth sessions now require reauthentication when configured or effective authorization parameters change. (#106)
AuthProxy (Release v2.21.0): Repository AI quality gates now target AuthProxy and use the canonical prompt and agent corpus.
Prompter (Release v0.2.1): Releases are cut on push to main instead of on the pull request closing, so contributions from forks publish like any other.
Prompter (Release v0.2.1): The Publish run now fails when a merge releases nothing because the version label was missing, instead of reporting success.
Synopsis (Release v1.1.1): Releases are cut on push to main instead of on the pull request closing, so contributions from forks publish like any other.
Synopsis (Release v1.1.1): The Publish run now fails when a merge releases nothing because the version label was missing, instead of reporting success.
cli (Release v2.12.0): Emit one deterministic machine-readable provenance and diagnostics payload on standard error. (#87)
cli (Release v2.11.0): Align Arc Screenplay, Screenplay, Stage, and Prologue packages on the current Screenplay 4 generation.
cli (Release v2.11.0): Retain markerless non-spec projects for Critter Stack analysis while preserving Arc-specific project filtering.
cli (Release v2.10.2): Default destructive confirmation prompts to No and require --yes in noninteractive environments.
cli (Release v2.10.2): Honor CRATIS_NONINTERACTIVE and recognized agent hosts without treating ordinary VS Code terminals as agent processes.
Studio (Release v0.82.1): Play sessions run Stage 3.8.0. Container start to first answer, measured at the half core a play pod was getting: 30.4s to 11.4s for a 120-slice model, 21.8s to 10.9s for a one-slice one
Studio (Release v0.82.1): A play pod requests a whole core rather than half of one. The request, not the limit, is what a contended node hands out, so a pod requesting 500m got about 500m however high its limit was
Studio (Release v0.82.0): Play sessions run Stage 3.8.0. Container start to first answer, measured at the half core a play pod was getting: 30.4s → 11.4s for a 120-slice model, 21.8s → 10.9s for a one-slice one
Studio (Release v0.82.0): A play pod requests a whole core rather than half of one. The request, not the limit, is what a contended node hands out — CPU is shared in proportion to requests — so a pod requesting 500m got about 500m however high its limit was. That is why raising the limit alone changed nothing. A whole core is where the measurements stop improving; the limit stays at two so a burst is still allowed where there is headroom
Stage (Release v3.8.0): A play session’s Chronicle runs with authentication turned off. It is embedded in the container with its only client, reached over loopback, and thrown away with the container — the credential exchange protected nothing and cost 1.9s of cold start unconstrained, 3.7s under the CPU limit a session runs on. It also means nobody has to sign in to look at a disposable sandbox’s Workbench
Stage (Release v3.8.0): Chronicle pinned to 16.37.0 and Arc to 21.19.4, and the bundled kernel image tracks the Chronicle pin as it must
Arc (Release v22.0.0): Generate Screenplay reaction declarations and named trigger sources instead of the removed reactor syntax. (#2558)
Arc (Release v22.0.0): Require Cratis.Screenplay 4.2.1 and verify generated documents across single- and multi-project Arc applications. (#2558)
Studio (Release v0.81.0): AI generation from the “Generate” dialogs now runs as a background job through the Job engine, so it survives a restart and shows up in the Jobs panel/badge like every other tracked job, instead of only being visible from the dialog that started it. (#252)
Studio (Release v0.81.0): A blueprint response that got cut off before the model finished is now retried once with an explicit request for a smaller result, and fails with a clear, actionable error if it still doesn’t fit — instead of silently coming back as an incomplete blueprint.
Studio (Release v0.81.0): When a generation silently falls back to Studio’s built-in model because the configured AI provider failed, that’s now reported in the generation dialog’s live output, not only in the server log — an unexpectedly slow or thin generation is diagnosable from the dialog instead of a mystery.
Studio (Release v0.80.0): The agents every organization starts with have names with some character — Atlas, Merlin, Quill, Sherlock and Echo, in place of Modeler, Coder, Writer, Analyst and Companion. An agent an organization renamed itself is left alone.
Studio (Release v0.78.8): A play session’s container now states what it needs — half a core guaranteed, bursting to two while it starts, and memory set clear of what it settles at. A stage wants a full core for the few seconds it takes to boot its Chronicle kernel and almost nothing afterwards; measured against cratis/stage:3.7.0, a fifth of a core answers in 107 seconds, half in 16, a whole one in 8, and two in 7.
Studio (Release v0.78.8): Core, Admin and Lobby may use 2 CPU / 2Gi rather than 1 CPU / 1Gi. They co-host an Orleans silo and register every tenant namespace with Chronicle before they listen, against a ceiling close to what they already use.
Studio (Release v0.78.7): The post-deploy Chronicle observer check is removed from the production deploy. It fails every deploy on a pre-existing condition it did not cause, and the scheduled health check already reports the same thing every fifteen minutes.
Studio (Release v0.78.7): Registry retention runs every four hours instead of daily, keeping the 3 most recent release versions per repository. The registry VM has a single small disk and no separate data volume, so a day of pushes can fill it before a daily run would reach it.
Studio (Release v0.78.1): The sample event model seeded for development now carries a board — a module, a feature and three state-change slices — so play works on a fresh environment.
Studio (Release v0.78.0): A reply that already did the work is no longer offered for handing over to Studio. Taking it up would do the work a second time, which for a rename or a removal is not a harmless repeat.
Studio (Release v0.78.0): Studio identifies itself as the author of the work it reports. Its acknowledgement and report previously appeared under a generic “User”, indistinguishable from an unidentified person in the thread.
Studio (Release v0.78.0): Removing part of an event model over MCP states plainly that it is permanent and is only for when the person asked for it — an agent that thinks something is redundant is told to say so and let them decide. Core continues to refuse a removal unless everything being removed is still in the “Not started” status.
Studio (Release v0.77.0): The Screenplay a play session (and the Screenplay export) is generated from now follows Screenplay 4 — reaction replaces reactor, and the layout/template taxonomy of 4.0 — which is what the current stage image compiles. Cratis.Screenplay 4.2.1, Cratis.Stage 3.2.0.
cli (Release v2.9.0): cratis init now reports when CHRONICLE.md was generated by a different version of the CLI, and names cratis init --refresh as the fix. The embedded command catalog is a snapshot rather than a live lookup, so after an upgrade it kept describing the surface it was generated from — commands added since were invisible to an agent, and ones renamed or removed were still advertised, with nothing saying so. (#79)
cli (Release v2.9.0): cratis init --refresh now also updates the Pi skill, alongside the Claude and Copilot ones. (#79)
Stage (Release v3.7.0): The Host honors the standard X-Forwarded-Host, X-Forwarded-Proto and X-Forwarded-Prefix headers, so a play session reached through a path-prefixed reverse proxy (for example https://<studio>/api/play/<session>/…) reports its public address in the OpenAPI document’s servers entry and in Scalar’s “Try it” requests rather than the internal service name.
Stage (Release v3.7.0): Scalar resolves its base server URL from the page’s own origin and path base.
Stage (Release v3.7.0): Cratis/Arc packages updated to 21.19.3; Chronicle client packages to 16.36.2; Screenplay to 4.2.1.
Studio (Release v0.76.0): A type is never named after its technical role. The C# rule already banned Async, Impl and Service; it now says why, covers Grain, Manager, Handler and the rest, and spells out the exception so CommandValidator and JobStep are not read as violations
Arc (Release v21.19.3): serializeArgsForDependency moved out of useObservableQuery into its own module so every query hook derives its argument dependency the same way (#2584)
Screenplay (Release v4.2.1): ValidationIssue carries an optional code. The structural checks the capture and projection validators make have no compiler counterpart and deliberately carry none - documented in diagnostics.md, under In the editor.
Prologue (Release v2.0.0): The Prologue packages now build against Cratis.Screenplay 4.2.0, up from 2.1.0. Cratis.Prologue.Screenplay exposes Screenplay types on its public surface, so taking this release takes Screenplay 4.x with it.
Studio (Release v0.75.0): The history button is always available. A count badge appears on it when there is something unread, instead of the whole button appearing and disappearing (Cratis/StudioIssues#187)
Studio (Release v0.75.0): The history panel has two tabs: what has happened since you were last here, and the board’s whole history (Cratis/StudioIssues#187)
Studio (Release v0.75.0): Acting deliberately cannot fall back to the built-in model — acting means calling tools, and the built-in model must never be given any, so an organization with no AI provider configured is told exactly that rather than answered with prose that changes nothing (Cratis/StudioIssues#45)
Stage (Release v3.6.0): A query now renders as a method on the read model its return type names. A query returning a read model the file does not render is no longer rendered against the read model that is there — it gets no method, and is reported by name (#13)
Stage (Release v3.6.0): A query is reported as missing its narrowing only when it has a rendered method to be narrowed (#13)
Screenplay (Release v4.1.0): ScreenplaySyntaxWalker.VisitFileReference reaches every file a document names, whichever construct named it.
Screenplay (Release v4.1.0): Syntax nodes grow by init-only property rather than by a trailing optional record parameter, which is a binary break. Set File with an object initializer or a with expression.
Studio (Release v0.74.0): Being shut out now says which of the reasons it is: no seat was ever assigned, the seat expired (with the date), or it is suspended while a payment is outstanding (Cratis/StudioIssues#188)
Studio (Release v0.73.2): On a touch device a slice is picked up by a long press anywhere on it, rather than by any movement (Cratis/StudioIssues#237)
Studio (Release v0.73.2): The slice being dragged is shown as the slice itself, dimmed and tilted, instead of a header-sized box with its name in it (Cratis/StudioIssues#237)
Studio (Release v0.73.2): Where the slice would land is marked clearly — a lit, pulsing gap and an outline around the feature about to receive it — and turns red when the drop would be refused (Cratis/StudioIssues#237)
Stage (Release v3.5.0): A query declared observable now renders as a live query returning ISubject<...>, instead of silently rendering as a one-shot read (#13)
Stage (Release v3.4.0): A read model now exposes the queries the document declares, named after them, instead of a fixed All/ById pair that appeared whatever the document said (#13)
Stage (Release v3.4.0): A query is reported as unrendered only when it states narrowing that rendering cannot give it — a filter, or a performer holding the body (#13)
Chronicle (Release v16.36.0): Waiting for observer completion on an append that carries no observer surface now fails by name instead of reporting success, so an in-process spec can no longer assert that downstream work finished when none of it was started
Studio (Release v0.73.0): The Organization folder is now Organizations, matching how every other feature folder is named. Pure
Stage (Release v3.3.1): Releases are cut on push to main instead of on the pull request closing, so contributions from forks publish like any other.
Stage (Release v3.3.1): The Publish run now fails when a merge releases nothing because the version label was missing, instead of reporting success.
Arc (Release v21.19.1): Cratis.Chronicle updated from 16.26.0 to 16.35.3, bringing the transitive Cratis.Metrics.Roslyn and Microsoft.Extensions versions it requires along with it
Stage (Release v3.3.0): Only the constraints with no rendered form are reported as unrendered — one backed by a file, or one naming an event or property the slice does not declare (#13)
Stage (Release v3.2.1): Bumped Cratis, Cratis.Arc*, Cratis.Chronicle*, and Cratis.Screenplay package references to their current latest versions.
Studio (Release v0.72.0): Brainstorming chat messages now sync in real time instead of only after a refresh, and inline chat no longer fights the canvas for scroll/pan gestures. (Cratis/StudioIssues#229)
Chronicle (Release v16.35.0): Projections a client no longer registers are retired when the client registers its full set: the observer is unsubscribed in every namespace, jobs and failed partitions are cleared, and the definition is removed from the engine and storage. The sink container is never dropped (#3725)
Chronicle (Release v16.35.0): When a retired projection wrote to the same container as another registered projection - a renamed read model keeps its container name - a replay recommendation is raised for the successor so the container can be rebuilt cleanly (#3725)
Chronicle (Release v16.35.0): Partial projection registrations (such as saving a single projection from the Workbench) never retire anything, and the client SDK only declares a full set when every discovered artifact produced a definition (#3725)
Studio (Release v0.70.0): The event-model board coalesces its live updates: a burst of changes now reaches each client as one push per 200 ms window carrying the latest state, instead of one full-board push per written event (Cratis/StudioIssues#198)
Studio (Release v0.70.0): Board updates re-render only what actually changed — unchanged modules and collections keep their identity across updates, and updates arriving faster than the board can render collapse to the latest (Cratis/StudioIssues#198)
Studio (Release v0.70.0): The appearance is Acrylic only: the Liquid Glass / Acrylic choice and the glass tuning sliders are gone from Appearance settings, and the WebGL glass pipeline is disabled and out of the bundle (a stored Liquid Glass preference silently falls back to Acrylic) (Cratis/StudioIssues#203)
Studio (Release v0.70.0): An idle board no longer does per-frame work: the collaborator-cursor follower, selection toolbar, glass toolbar measurement, tour anchors and the canvas ticker all suspend when nothing moves (Cratis/StudioIssues#200)
Studio (Release v0.70.0): Transfer/create-slices buttons are disabled with a busy state while a transfer is running, so repeated clicks cannot fire duplicate commands (Cratis/StudioIssues#199)
Studio (Release v0.70.0): Module collections that share the same stored position render with a visible cascade offset instead of stacking invisibly on top of each other (Cratis/StudioIssues#199)
Chronicle (Release v16.38.1): Chronicle now continues starting when persisted client projection definitions are stale, allowing clients to reconnect and register their current definitions without losing observer progress.
Chronicle (Release v16.38.0): Fixed event type registration sending an empty placeholder schema for a generation instead of its real schema, non-deterministically, depending on dictionary enumeration order - independent of whether the generations’ ids matched (#3816)
Stage (Release v3.8.2): Render exact role alternatives per generated query method and block conjunctions, claims, code, missing, or mixed policies that cannot be preserved. (#20)
Stage (Release v3.8.2): Propagate typed rendering failure, suppress false completion, and leave a non-overwriting advisory marker for unsafe direct-write targets. (#20)
Stage (Release v3.8.2): Deny Stage query authorization and anonymous access until declared query policies can be carried and executed, preventing performer execution or data exposure. (#30)
Components (Release v3.5.0): Added regression and browser coverage for DataPage default filters without reproducing the reported empty-table failure (#149)
Components (Release v3.5.0): Aligned DatePickerInput pass-through typing with the live input slot (#150)
Components (Release v3.5.0): Prevented DatePickerInput validation state from leaking to the DOM (#151)
Components (Release v3.5.0): Routed Dropdown identity and accessibility props to the focusable combobox (#152)
Components (Release v3.5.0): Suppressed query empty states until the first result is available (#160)
Components (Release v3.5.0): Restored publication for labeled pull requests merged to main (#172)
Screenplay (Release v4.2.2): A validation rule’s file reference and inline code block are no longer written for rule kinds the compiler cannot read them back on. A syntax tree carrying one on, say, a not empty rule used to print a document that failed to compile with PLAY0141; the omission is now stated in a comment on the line it would have occupied, and the printed document compiles. (#123)
Screenplay (Release v4.2.2): A handler, a performer and a rule <Name> predicate that carry both a file reference and an inline code block now print only the file reference - the one the compiler reads back - and name the omitted block in a comment, instead of writing both and failing to compile with PLAY0034, PLAY0048 or PLAY0141. (#123)
Stage (Release v3.8.1): The Chronicle base image tag and the client package pins are back on the same version — the base image had drifted to 16.37.0-development while the client packages were on 16.37.1
Screenplay.CritterStack (Release v0.19.0): Reject unrelated, missing, generated, mismatched, or no-request companion methods instead of borrowing another workflow’s query evidence. (#4)
Screenplay.CritterStack (Release v0.19.0): Keep tag types, state, query objects, wrappers, responses, side effects, and boundary ordinary returns out of persisted events. (#4)
Screenplay.Generation (Release v0.8.0): Omit only malformed semantic units while preserving source, subject, unrelated valid output, and deterministic order. (#5)
Screenplay.Generation (Release v0.8.0): Keep unknown slice kinds from becoming state changes and keep unsupported unplaced artifacts or relationships from disappearing silently. (#5)
Screenplay.Generation (Release v0.8.0): Preserve conflict variants and source evidence in typed diagnostics. (#5)
Screenplay.CritterStack (Release v0.18.0): Prevent attributes, policies, callbacks, and configuration-only types from originating documents, tenant-specific artifacts, relationships, or topology. (#3)
Arc (Release v22.1.0): Prevented subscription teardown from being logged as an emission-guard security failure or sending late stream messages. (#2588)
Arc (Release v22.1.0): Re-sent active SSE subscriptions when a connection ID changes while a subscribe request is in flight. (#2597)
Arc (Release v22.1.0): Bound nested CommandForm fields while preserving custom layouts, columns, population metadata, and validation behavior. (#2582)
Screenplay.CritterStack (Release v0.17.0): Prevent first-stream event and identity leakage across multiple targets. (#4)
Screenplay.CritterStack (Release v0.17.0): Prevent generated source and unrelated same-named identity/stream APIs from originating semantics. (#4)
Screenplay.CritterStack (Release v0.17.0): Preserve ordinary HTTP responses, cascades, side effects, messages, and unmarked-stream boundaries separately from persisted events. (#4)
Screenplay.CritterStack (Release v0.16.0): Keep configuration-only types from originating events, artifacts, or behavioral relationships. (#3)
cli (Release v2.15.0): Detect split-project Critter Stack applications across the complete application scope instead of requiring Marten and Wolverine in one compilation. (#87)
cli (Release v2.13.1): Publish the CLI tool with its MIT license and a user-facing package description. (#91)
Screenplay.CritterStack (Release v0.15.0): Bind artifact type references to exact concept subjects without identity-by-name or Guid inference. (#25)
Screenplay.CritterStack (Release v0.14.0): Keep raw custom projection/subscription processing from fabricating State View, Automation, Translation, document, message, or event consequences. (#3)
Screenplay.Generation (Release v0.6.1): Validate the Vogen package against first correctly sourced listed version 0.5.0 instead of mispublished historical 0.2.0. (#13)
Screenplay.Generation (Release v0.6.1): Compile and run the binary Vogen consumer against 0.5.0. (#13)
Screenplay.Generation (Release v0.6.1): Document the unlisting remediation and baseline boundary. (#13)
Screenplay.CritterStack (Release v0.12.0): Fail closed for computed/conditional selectors, custom groupers/slicers, and tenancy-dependent grouping. (#3)
Screenplay.CritterStack (Release v0.12.0): Keep fan-out child evidence as projection consumption rather than persisted Produces relationships. (#3)
Screenplay.CritterStack (Release v0.11.0): Keep EventProjection document returns out of persisted event facts. (#3)
Screenplay.CritterStack (Release v0.10.0): Keep shadowed or ambiguous identity members unmarked. (#3)
Screenplay.CritterStack (Release v0.9.0): Keep package presence, unrelated IHttpPolicy implementations, and unrelated ConfigureEndpoints calls from fabricating validation or authorization. (#4)
Chronicle (Release v16.37.1): Prevented [Passive] read models with fluent projections from registering empty duplicate model-bound projections. (#3757)
Chronicle (Release v16.37.1): Added post-push Docker Hub verification for every Chronicle image variant so incomplete releases fail visibly. (#3770)
Chronicle (Release v16.37.1): Prevented root-level join events from applying blind MongoDB updates to unrelated read-model documents. (#3784)
Chronicle (Release v16.37.1): Configured ASP.NET Data Protection and certificate-rotation diagnostics to use the same shared grain-backed key repository. Upgrading invalidates existing authentication cookies and outstanding Identity/OpenIddict tokens once; users and clients must sign in again, while durable Chronicle secrets remain unaffected. (#3803)
Screenplay.Generation (Release v0.5.0): Exclude generated-only/lookalike declarations and unsupported backing types without String or identity inference. (#7)
Screenplay.Generation (Release v0.4.0): Reject conflicting, mismatched, invalid, or newline-bearing rules without dropping concepts. (#6)
Screenplay.CritterStack (Release v0.8.0): Keep disabled, ignored, generated, generic, abstract, middleware, and inactive methods from becoming handlers. (#4)
Arc (Release v22.0.2): Prevented SSE subscriptions from reading disposed request contexts when clients disconnect mid-subscribe. (#2568)
Arc (Release v22.0.2): Prevented React observable-query hooks from deserializing already converted models a second time. (#2567)
Arc (Release v22.0.2): Restored AI corpus validation by removing obsolete prompt stubs and refreshing canonical rule guidance.
Screenplay.CritterStack (Release v0.7.0): Keep response, side-effect, persistence-wrapper, document-operation, ignored, and inactive methods from becoming automations or persisted events. (#4)
Screenplay.CritterStack (Release v0.6.0): Avoid inventing commands or persisted events for message-only automations. (#4)
Screenplay.CritterStack (Release v0.5.0): Ignore unrelated methods that merely share Wolverine bus method names. (#4)
Screenplay.CritterStack (Release v0.4.0): Recognize current Wolverine handler, return, response, ignore, and event-stream metadata names. (#4)
Screenplay.CritterStack (Release v0.4.0): Keep HTTP responses, persisted events, persistence wrappers, cascades, outgoing messages, and side effects distinct. (#4)
Screenplay.CritterStack (Release v0.4.0): Exclude ignored, open-generic, and abstract handlers from conventional activation. (#4)
Arc (Release v22.0.1): Model-bound queries now keep enum arguments in generated proxies and bind them from callers instead of attempting dependency resolution (#2595)
cli (Release v2.10.2): Validate destructive confirmation before connecting to Chronicle or loading connection credentials.
cli (Release v2.10.2): Keep declined and missing-confirmation output machine-readable across JSON and quiet JSON formats.
Screenplay.CritterStack (Release v0.2.0): Name methods in plural Wolverine endpoint containers distinctly and exclude [Entity] parameters from request-command inference. (#3)
Studio (Release v0.82.4): A play session no longer answers 500 Internal Server Error while its Stage is starting. Holding the navigation open was implemented as a retry loop around IHttpForwarder.SendAsync on the same HttpContext, and a forward that fails marks that context as handled — not merely HasStarted, which stays false, so the guard did not catch it. The next SendAsync on it throws “The request cannot be forwarded, the response has already started”, which surfaced as a 500 for every session whose Stage was not up on the first try. What repeats is now the reachability check, which never touches the context, and the forward happens exactly once against a Stage known to be listening
Studio (Release v0.82.2): A play session whose stage never starts now says so, instead of showing a proxy error page. The iframe is mounted straight away so the browser learns the stage is up the moment it is, but that also means it renders whatever comes back — and a browser’s own error page fires the load event just like a real one, so the overlay crossfaded away to reveal it and its “stage failed to start” message never appeared. Core now answers that case with a page that tells the parent, from its own origin, and the overlay reports it
Studio (Release v0.82.1): The overlay no longer polls for the stage to come up. Core holds the iframe’s own navigation open until the stage answers, so the browser learns at the moment it is up instead of at the next tick of a poll
Studio (Release v0.82.0): The overlay no longer polls for the stage to come up. It asked the backend every two seconds whether the container was accepting connections, then probed the proxy every one and a half — both intervals landing on the critical path in full, so up to three and a half seconds of every start was the page not having asked yet. Core now holds the iframe’s own navigation open until the stage answers, so the browser learns at the moment it is up. Only navigations wait; a request from the loaded page still fails fast, so a stage that goes away is reported rather than hanging the page
Stage (Release v3.8.0): The wait for the bundled kernel no longer rounds up to the next two-second tick — it threw away 2.06s of a 14.9s start at half a core, and 1.18s of 8s on a fast machine
Chronicle (Release v16.37.0): Connecting a client no longer waits a full keep-alive interval. The server withheld its first heartbeat for KeepAliveIntervalSeconds while the client waits on exactly that heartbeat to consider itself connected, so every connect everywhere cost the interval — a flat second by default, unaffected by how much CPU the machine had, because it was a delay rather than work (#3790)
Chronicle (Release v16.37.0): The “started successfully - ready and listening” message is logged once Kestrel has bound the port, rather than roughly half a second before it. Entrypoint scripts, test fixtures and orchestrators that gate on that line were connecting to a socket that did not exist yet (#3792)
Chronicle (Release v16.37.0): The Workbench works when served under a path prefix. It already learns its prefix from the base-path meta tag and hands it to Arc, but its auth probe, login, logout and post-login redirect asked for root-absolute paths regardless — so under a prefix the probe hit whatever else was at the root and the Workbench sent the user to a /login that was not there
Arc (Release v21.19.4): Applications with many commands and queries now start in a fraction of the time — Arc mapped its generated endpoints in O(n²), rebuilding the entire ASP.NET endpoint table before every single registration. A model-driven host registering ~480 endpoints spent 54 seconds in UseCratisArc() on an idle 14-core machine; it is now unmeasurable. Every Arc application pays this on startup, in proportion to how many commands and queries it has (#2591)
cli (Release v2.10.1): Chronicle diagnostics now discovers event stores instead of reporting none found against current servers.
cli (Release v2.10.1): Event store, namespace, job, user, and application commands now work with Chronicle 16.36.3.
Chronicle (Release v16.36.3): Jobs, users, and applications can be read through generated gRPC clients without timestamp serialization failures. (#3788)
Studio (Release v0.80.1): A build no longer depends on what happens to be on the machine running it. The Toolbar alias applied whenever a sibling Components checkout existed on disk, so a workstation that had one produced a bundle carrying that working copy while CI — which has no such directory — produced a different bundle from the same commit. It now requires CRATIS_LOCAL_COMPONENTS=true, so pointing the build at a local checkout is a deliberate act rather than an accident of a directory existing.
Studio (Release v0.80.0): A chat topic names itself from its first message again, and a mentioned agent answers again.
Studio (Release v0.80.0): The Jobs panel opens on both tabs instead of hanging on “Looking…”, and says so plainly when nothing has run yet.
Studio (Release v0.80.0): The board history no longer claims a board has no history while it is still loading.
Studio (Release v0.80.0): The Jobs panel now sits above any other panel that is already open.
Studio (Release v0.78.7): Pressing play now shows the running stage. The overlay polls readiness on an interval rather than scheduling a single re-check — a “still starting” answer changes nothing the effect depended on, so it never ran a third time, and the container’s own state made no difference.
Studio (Release v0.78.6): Starting a play session no longer fails at random. A workload’s input files travel in the pod specification and are written by its init container, instead of being streamed in over an exec whose buffered stdin raced the session being torn down — which left the workload starting against an empty directory whenever the race was lost.
Studio (Release v0.78.6): A model that cannot be compiled is reported before a container is started, with the compiler’s own message and the rule it broke — for example a read model that two slices both build. Every rule the Screenplay language defines is covered, rather than a hand-maintained subset of them.
Studio (Release v0.78.5): Dragging a component from the toolbox onto a prototype surface shows what is being dragged, and outlines where it will land.
Studio (Release v0.78.5): A dropped Button or SplitButton lands centered on the drop point. The size overrides for those components were applied when creating the element but not when computing the drop position.
Studio (Release v0.78.4): Renaming a slice by double clicking its name works again.
Studio (Release v0.78.3): Starting a play session no longer hangs. The extraction and the marker the pod waits on are now a single command, so the marker cannot exist unless the extraction that precedes it succeeded — which is what makes it proof that the upload finished, without waiting on anything that never completes.
Studio (Release v0.78.3): Input that never arrives is reported rather than leaving a pod in Init and its caller blocked on it indefinitely.
Studio (Release v0.78.2): Saving a UI prototype for a slice persists again. It appeared to save, then disappeared, and was gone after a refresh. (Cratis/StudioIssues#250)
Studio (Release v0.78.2): A failed prototype save is now reported instead of silently leaving an empty row behind. (Cratis/StudioIssues#250)
Studio (Release v0.78.2): The avatar of whoever started a chat topic shows in the topic list. Topics started by an agent are also named correctly, where they previously showed as “User” with a generic initial. (Cratis/StudioIssues#249)
Studio (Release v0.78.1): A play session no longer starts a container that has not received the model. Uploading a file into a pod now waits for the transfer to finish rather than returning as soon as the last byte is handed over — the container could previously start with the file truncated or missing and report only that it found no model.
Studio (Release v0.78.1): A model that cannot be played is rejected with a message naming the slice, the feature and the module it is in, instead of starting a stage that fails to compile it. Two slices with the same name in one feature resolve to the same generated command, which is what a stage refuses to start on; the same name reused across two different features runs fine and is not reported.
Studio (Release v0.78.1): Pressing play on a board that cannot run says why, instead of quietly leaving play mode.
Studio (Release v0.77.0): Playing an event model works in production: the stage is reached through Core (/api/play/{playSessionId}/…) instead of the browser trying to reach the container directly, which only ever worked against a local Docker daemon.
Studio (Release v0.77.0): A play session runs a pinned stage image (cratis/stage:3.7.0, overridable with Play:StageImage) instead of latest, whose current release does not boot.
Studio (Release v0.77.0): A stage that never comes up is reported after three minutes instead of spinning forever.
Stage (Release v3.7.0): The cratis/stage image no longer crashes at boot with TypeLoadException: Could not load type 'Cratis.Chronicle.Contracts.EnsureEventStore'. The Chronicle client (Cratis.Chronicle, Cratis.Chronicle.AspNetCore) is now referenced directly by the Stage library and the Host, so the version pinned in Directory.Packages.props is the one that ships - it previously arrived transitively through the Cratis meta-package at whatever version that package was built against, which is how 3.6.0 shipped Cratis.Chronicle 16.26.0 beside Cratis.Chronicle.Contracts 16.36.2.
Stage (Release v3.7.0): The cratis/stage image’s bundled Chronicle kernel is pinned to the same version as the client (cratis/chronicle:16.36.2-development) instead of floating on latest-development, so the two cannot drift apart between releases.
Studio (Release v0.75.3): An organization on the administration listing no longer keeps showing its seat allocation as unknown after a trial arrives. The trial is recorded separately from the organization and lands after it, and the listing had no reason to look again once the organization’s own row had settled. (Cratis/StudioIssues#236)
Studio (Release v0.75.2): An organization’s trial is always reported to Admin, instead of being dropped for good when a read model had not caught up at the moment it was asked (Cratis/StudioIssues#246)
Arc (Release v21.19.3): useQuery and useQueryWithPaging no longer re-subscribe on every render when a query argument is an object such as a Guid, a DateOnly, or a generated concept — arguments are compared by serialized value instead of by reference identity (#2584)
Screenplay (Release v4.2.1): The editor reports the compiler’s PLAY code for every condition it checks, so the same problem carries the same code whether it was found by the CLI or by a squiggle - lookup, suppression and log matching all work from one catalogue. A Monaco marker gets it as code, a VS Code diagnostic as Diagnostic.code, and diagnosticCodes names them for a consumer. (#86)
Screenplay (Release v4.2.1): A query whose return type is dotted is scanned as a query again. The editor matched [\w[\]?]+ where the compiler takes [\w.]+(?:\[\])?\??, so such a query registered no symbol at all - its by and filter parameters went un-type-checked and it was missing from data … via query completions, with nothing reported. (#86)
Studio (Release v0.75.1): The application no longer fails to render when a seat’s expiry does not arrive as the type it is declared as (Cratis/StudioIssues#188)
Chronicle (Release v16.36.2): Publishing several merges at once no longer loses releases to a race on the next version number: runs queue behind each other instead of computing the same version in parallel
Arc (Release v21.19.2): The MongoDB Observe, ObserveSingle and ObserveById extensions no longer document an “Async Task” return they do not have; they return ISubject<...> directly (#2569)
Arc (Release v21.19.2): ObserveSingle is now documented as returning a single instance instead of a collection (#2569)
Arc (Release v21.19.2): The <returns> docs now reference the returned ISubject{T} rather than the concrete Subject{T} (#2569)
Screenplay (Release v4.1.0): The syntax tree compatibility page said appending an optional record parameter keeps consumers working. It is source compatible and binary breaking, so the page now states the hazard and prescribes the init property.
Chronicle (Release v16.36.1): Production Docker images publish again — none were published for 16.35.4 through 16.36.0, and the latest tag stayed on 16.35.3 (#3770)
Chronicle (Release v16.36.1): Job state now round-trips correctly on SQL storage backends (SQLite, PostgreSQL and MSSQL) — a job’s request payload was lost when its state was written and reading it back failed, leaving projection retirement silently incomplete. MongoDB was unaffected
Studio (Release v0.74.0): The “you do not have a license” screen no longer flashes on every load. The gate waits for the identity instead of reading its absence as a refusal (Cratis/StudioIssues#188)
Studio (Release v0.74.0): Switching organization no longer blanks the application while the identity is re-read (Cratis/StudioIssues#188)
Studio (Release v0.73.2): A slice can be dragged from anywhere on it. Its title and cells are editable labels, and starting a drag on one used to be refused outright (Cratis/StudioIssues#237)
Studio (Release v0.73.2): A slice’s title no longer shows a text caret when it is not being edited (Cratis/StudioIssues#237)
Studio (Release v0.73.2): One finger can pan the board again while resting on a slice — a touch is only taken over once it has become a long press (Cratis/StudioIssues#237)
Studio (Release v0.73.1): The post-deploy Chronicle observer check no longer fails the deploy with a shell syntax error, so a red
Chronicle (Release v16.35.8): The image boot gate no longer fails every production publish: it now supplies the TLS and token-encryption certificates the production image requires, instead of starting it in a configuration it deliberately refuses
Chronicle (Release v16.35.6): Asking a MongoDB-backed event sequence for the next sequence number at or after a position now answers with the nearest qualifying event instead of the furthest, matching the SQL and in-memory implementations (#3743)
Stage (Release v3.2.2): The solution builds again — an automated package update left it failing restore with NU1603
Chronicle (Release v16.35.3): Changing a password from the Workbench (including the forced change at login) failed with “Current password is required.” because the current password was no longer sent to the kernel
Chronicle (Release v16.35.3): Adding an application with a client id that is already registered is rejected with a clear message instead of creating a second application with the same client id
Chronicle (Release v16.35.3): The Workbench’s event store and namespace lists were empty on the in-memory storage backend because the observed names failed to serialize
Studio (Release v0.72.2): Fixed AI-driven event model generation getting permanently stuck or timing out (“Timed out after 60 seconds waiting for the default event model…”). The generation flow made success depend on an asynchronous, best-effort reactor chain (DefaultDomainReactor → DefaultEventModelReactor) completing within a fixed 60-second budget — any transient hiccup in reactor dispatch reproduced the same timeout regardless of how correct the underlying tenant-context handling was. The default domain and event model are now created synchronously, through the same commands the manual “add domain”/“add event model” UI already uses, in the same request that creates the application — nothing is polled or waited on anymore. (Cratis/StudioIssues#231, Cratis/StudioIssues#234)
Stage (Release v3.2.1): Fixed a TypeLoadException at host startup (AddCratisArcCore()) when Stage is used against Chronicle 16.34.0 or newer. Chronicle renamed the EnsureEventStore contract to EnsureEventStoreRequest and moved it into the Cratis.Chronicle.Contracts.EventStores namespace; Stage was still built against the pre-rename contract, so its own compiled self-binding metadata referenced a type that no longer exists in current Chronicle packages.
Studio (Release v0.72.1): The selection toolbar now stays over the selection while it’s being dragged, instead of freezing at the drag’s start position until the drag ends. (Cratis/StudioIssues#206)
Studio (Release v0.72.1): Fixed users seeing stale “latest version” release notes in the history/info dialog. The earlier Cache-Control: no-cache fix only covered responses cached after it shipped — a browser that had already cached the manifest or a version’s notes under heuristic freshness kept reusing that stale copy indefinitely. Release-notes fetches now bypass the HTTP cache unconditionally. (Cratis/StudioIssues#218)
Studio (Release v0.72.1): Fixed a production crash (React error #185, “Maximum update depth exceeded”) in the collaborator cursors overlay while a remote collaborator was dragging board items. The root cause: useCollaborators passed a freshly-created subscribe/getSnapshot pair to useSyncExternalStore on every render, which forces a resubscribe-and-tear-check cycle on every commit — racing that against a presence stream that updates up to 30 times a second while dragging could chain re-renders into themselves. Both functions are now stable for the lifetime of the collaboration client, and redundant presence updates (no actual position/area change) are skipped as additional hardening. (Cratis/StudioIssues#230)
Studio (Release v0.72.1): Cratis/StudioIssues#208 and #209 (double-click-to-rename and drag-to-move not working from anywhere on an event’s surface): traced through the full history of EventCard.tsx — the pointer and double-click handlers have always been attached to the entire card surface, not a restricted sub-area, in every revision of this file. Could not find a code path that would produce the reported “have to fiddle to find the drag area” symptom; likely already resolved by an earlier, unrelated refactor of this component. Commenting on both issues with this evidence rather than closing unilaterally, since neither of us has been able to reproduce the original report against current code.
Studio (Release v0.72.0): Fixed sticky note text shrinking below a readable minimum, and added a delete command for sticky notes in Event Modeling. (Cratis/StudioIssues#211)
Studio (Release v0.72.0): Fixed a square-cornered toolbar button poking out of the rounded glass toolbar. (Cratis/StudioIssues#213)
Studio (Release v0.72.0): Event names are now kept unique within a module in both Brainstorming and Event Modeling. (Cratis/StudioIssues#217)
Studio (Release v0.72.0): Fixed Brainstorming region headers being covered by other board items. (Cratis/StudioIssues#221)
Studio (Release v0.72.0): Fixed the canvas cursor showing a grab hand when not actively panning. (Cratis/StudioIssues#222)
Studio (Release v0.72.0): Fixed the board history unread badge not clearing when the panel was opened and closed. (Cratis/StudioIssues#223)
Studio (Release v0.72.0): Fixed multi-selected items in Brainstorming not moving together when one of them was dragged. (Cratis/StudioIssues#225)
Studio (Release v0.72.0): Fixed clicking a Brainstorming region’s empty background not selecting it. (Cratis/StudioIssues#226)
Studio (Release v0.72.0): Fixed sticky notes being covered by other board items, and dragging a newly-placed note starting an unwanted text selection. (Cratis/StudioIssues#227)
Studio (Release v0.72.0): Fixed pinch/trackpad gestures over the canvas zooming the browser page instead of the canvas. (Cratis/StudioIssues#228)
Studio (Release v0.72.0): Fixed board history entries showing “Untitled” for items that don’t carry a name. (Cratis/StudioIssues#232)
Studio (Release v0.72.0): Fixed module/feature columns misaligning in Event Modeling when a long name wraps. (Cratis/StudioIssues#233)
Studio (Release v0.72.0): Fixed a pasted Brainstorming item reappearing on the board after being deleted. (Cratis/StudioIssues#235)
Studio (Release v0.72.0): Set explicit no-cache headers on the release notes page to reduce stale content from caching; the primary suspected cause (session affinity a
Studio (Release v0.71.3): Local development with a sibling Components checkout present no longer crashes every page with “PrimeReactProvider not found” — the conditional local-Components alias now correctly resolves PrimeReact through Studio’s single deduplicated copy instead of pulling in a second instance with its own React context. Only affects that local-dev setup; clean Docker/CI builds were never affected.
Studio (Release v0.71.2): The Brainstorming selection toolbar’s Copy button now duplicates the selection onto the board immediately, placed clear of existing items, instead of only copying to the board clipboard (which required a separate Ctrl/Cmd+V to see anything happen). Keyboard Ctrl/Cmd+C still copies without pasting, so Ctrl/Cmd+V keeps working as a normal, repeatable paste. (Cratis/StudioIssues#207)
Studio (Release v0.71.1): Text on events in the Brainstorming canvas is now centered vertically inside the card, not just horizontally. (Cratis/StudioIssues#210)
Studio (Release v0.70.1): Dragging a slice to reorder it within a feature in the Event Modeling grid works again, and can now be started from anywhere on the slice’s surface (not just the header). (Cratis/StudioIssues#214)
Chronicle (Release v16.35.2): Listing failed partitions across observers no longer crashes with a duplicate-key error when two observers have failed on the same partition (#3727)
Chronicle (Release v16.35.1): Keyed child updates in hierarchical projections no longer re-resolve the child’s creation event on every subsequent event of the same event source: when the event carries the child’s key and the child is already projected under the document the resolved parent key identifies, its placement is resolved with a single sink lookup — eliminating the per-event FromParentHierarchy Warning flood and the redundant event-sequence lookups that preceded each warning (#3723)
Chronicle (Release v16.35.1): The creation-event rejection guard in FromParentHierarchy now logs at Debug when the current event is itself the earliest candidate creation event — the normal steady-state outcome; only a creation event strictly later than the current event is still rejected with a Warning, as the genuine infinite-cycle anomaly (#3723)
Chronicle (Release v16.35.1): A child projection event that does not carry the property configured as its parent key now fails with a descriptive MissingParentKeyForChildEvent — naming the projection, the children collection, the identified-by property, and the event type, sequence number and event source — instead of a bare ArgumentNullException (Parameter 'value') that left failed partitions without a usable message (#3725)
Chronicle (Release v16.35.0): One rejected projection definition no longer aborts the whole registration: failures are isolated per definition, every other definition still lands, and the failed ones are reported and retried on the next registration instead of being left silently stale (#3722)
Chronicle (Release v16.35.0): A projection whose pipeline cannot be built - for example a stale definition referencing a child collection the read model schema no longer has - no longer fails its grain activation and retries blindly forever; the failed partition now carries a descriptive error naming the projection, the child property and the read model, and the pipeline heals as soon as the definition is corrected (#3722)
Chronicle (Release v16.35.0): Re-registering a projection with only a child collection changed now correctly evicts the cached pipeline in the observer subscriber (#3722)
Studio (Release v0.70.0): The activity list for a brainstorming board no longer fails entirely when a board item has no name (Cratis/StudioIssues#201)
Chronicle (Release v16.34.3): The kernel logs SkippingIncompleteConcurrencyScope at Debug instead of Warning. With CheckFirstAppendIntoAScope off — the shipped default — every first append into a new event source skips the check by design, so an application creating many event sources flooded the log with warnings; a caller that opts into the check sends an expectation the kernel validates rather than skips, so the skipped case never signals a check the caller asked for, and the append result keeps reporting the check as not performed (#3724)
cli (Release v2.8.2): An explicit -n Default (or -e default) is now honored literally instead of being treated as “no value given” and silently falling back to the active context’s namespace or event store; only an omitted option falls back to the context, then the built-in default (#75)
Chronicle (Release v16.34.2): The *-development and *-development-slim container images start again without an encryption certificate. Since 16.33.1 they aborted at startup with An encryption certificate is required in production for OpenIddict key security, because the check for a development build had regressed to the DOTNET_ENVIRONMENT / ASPNETCORE_ENVIRONMENT variables the images never set; it is a compile-time DEVELOPMENT check again, matching how the development TLS certificate is decided.
Chronicle (Release v16.34.2): The Workbench renders with its PrimeReact 10 look again — text-style toolbar buttons, the sidebar and namespace selector surfaces, bold table heads, styled inputs and the password field on the sign-in page — through PrimeReact 11’s styled mode instead of the baseline theme.
cli (Release v2.13.0): Remove obsolete GitHub release package bootstrap and local dependency sources now trusted NuGet publishing is available. (Cratis/cli#87)
Studio (Release v0.82.3): The IsContainerRunning query and its ContainerRunningStatus read model. They existed for the play overlay’s readiness poll, and that poll is gone — Core holds the iframe’s own navigation open until the stage answers, so nothing asks whether the container is up any more
Studio (Release v0.81.0): The ad-hoc in-memory queue and background worker that used to run AI generation, superseded by the Job engine.
Studio (Release v0.72.2): Removed IDefaultEventModelResolver/DefaultEventModelResolver, which existed solely to poll for the reactor-created default event model — no longer needed now that generation creates it directly.
Studio (Release v0.78.0): Issuing and rotating an organization’s MCP credential now resolve the organization from the caller’s own context rather than from a value supplied by the browser, so a credential can no longer be written into an organization other than the one asking.