Skip to content

Release digest: August 10 - 17, 2026 (Week 33)

Repository Previous version Current version
Arc v21.1.0 v21.19.0
AuthProxy v2.13.0 v2.20.0
Chronicle v16.20.0 v16.34.1
Chronicle.Kotlin v2.9.0 v2.10.0
cli v2.4.0 v2.8.1
Components v2.6.2 v3.4.0
Fundamentals v7.17.1 v7.18.0
Prologue v1.1.0 v1.2.0
release-action v1.1.2 v1.2.0
Scene First release v2.0.0
Screenplay v2.1.0 v4.0.1
Stage v1.2.0 v3.2.0
Synopsis First release v1.1.0
  • Components (Release v3.4.0): @cratis/components/styled — styledMode() configures the provider for PrimeReact 11’s styled mode: primeReactStyles (PrimeReact’s component styles for every primitive, applied through the provider’s defaults) together with a @primeuix/themes preset, emitted into the primereact cascade layer so an application’s own CSS overrides the theme as it did on PrimeReact 10. CratisPreset is Lara on the blue primary and gray surfaces of lara-light-blue / lara-dark-blue; any preset can be passed instead. @primereact/styles and @primeuix/themes are optional peers, needed only for this path.
  • Components (Release v3.4.0): @cratis/components/primereact-v10-palette — the --surface-*, --text-color, --primary-color, --highlight-*, --focus-ring, --surface-0…900, --primary-* and color-scale variables PrimeReact 10’s themes published, with the lara-blue values in both schemes, so CSS written against them keeps resolving.
  • Components (Release v3.4.0): Message renders the severity glyph PrimeReact 10 showed; an icon prop replaces or removes it.
  • Components (Release v3.3.0): Button from @cratis/components/Common — preserves PrimeReact 10’s label / icon / loading / tooltip / text / outlined authoring model over PrimeReact 11’s children-only Button. Accepts a PrimeIcons class name or an element for icon, renders a spinner while loading, and sets iconOnly automatically when there is an icon and no label.
  • Chronicle (Release v16.34.1): Workbench-owned wrappers for the PrimeReact 11 primitives that became compositional namespaces with no Cratis equivalent — Button, Card, Message, ProgressSpinner, Paginator, Tabs, Chart and a plain-array DataTable — so the existing label/icon and <Column field header body sortable /> authoring model still applies.
  • Chronicle (Release v16.34.1): Storybook stories for the Workbench DataTable, covering sorting, nested fields, filtering, grouping and selection.
  • Components (Release v3.2.0): Message — a declarative inline message from @cratis/components/Display, preserving PrimeReact 10’s flat <Message severity text /> call shape over PrimeReact 11’s compositional Message.Root/Content/Text parts.
  • Components (Release v3.2.0): ProgressSpinner — an indeterminate spinner from @cratis/components/Display, preserving the flat <ProgressSpinner /> call shape over PrimeReact 11’s Root/Track/Range parts.
  • Components (Release v3.1.0): DataTableCore is now exported from @cratis/components/DataTables, so an application can render rows it already holds — fetched by hand, computed, or assembled from several sources — with Column children, selection, filtering and scrolling, without driving a query through DataTableForQuery or DataTableForObservableQuery.
  • Scene (Release v2.0.0): 14 abstract names whose PrimeReact component was removed in v11 are now backed by Cratis-owned implementations: menubar, megaMenu, tieredMenu, panelMenu, tabMenu, steps, dock, splitButton, confirmDialog, column, treeSelect, blockUI, scrollTop and image.
  • Scene (Release v2.0.0): MenuItem and TreeNode are exported from @cratis/scene.primereact. PrimeReact 11 removed primereact/menuitem and primereact/treenode, and the authored { label, icon, items } shape was always Scene’s vocabulary.
  • Components (Release v3.0.0): @cratis/components/Notifications — Toaster, the imperative toast, and toastCommandResult(result) mapping an Arc ICommandResult to the right toast (validation → per-field messages, exceptions → generic, never stack traces)
  • Components (Release v3.0.0): @cratis/components/Display — Tag, Badge, Chip, Skeleton, Avatar, ProgressBar
  • Components (Release v3.0.0): @cratis/components/theme — a license-free Cratis baseline theme (light + dark) that skins every component from the token layer without a PrimeUI key
  • Components (Release v3.0.0): PasswordField, ToggleSwitchField and RatingField for CommandForm
  • Components (Release v3.0.0): Column (with per-column filter menus), StepperPanel and ActionMenubar as Cratis-owned replacements for the primereact modules v11 removed
  • Components (Release v3.0.0): Per-column filter menus, a global search box and a paginator range report on the data tables
  • Components (Release v3.0.0): dismissable and closeAriaLabel on Dialog
  • Components (Release v3.0.0): Source/MIGRATION.md — the consumer upgrade guide
  • Stage (Release v3.2.0): Stage resolves a render plan per deployment target from a translated Screenplay application — one per ui profile per platform, with the profile’s packages expanded to their transitive closure in override-priority order, every component name a screen references bound to the package that wins it, the selected shell and theme resolved, screen templates nested inside the shell, and every arrangement evaluated at the target’s size class. EventModelLoader.LoadRenderPlanFromDirectoryAsync(directory, catalog) compiles and resolves in one call; RenderPlanner.Plan(application, catalog) resolves an application you already hold. (#39)
  • Stage (Release v3.2.0): A render plan reports what a target could not resolve as build findings on the result rather than throwing — a package the catalog does not declare, a dependency nothing satisfies, a version conflict, a dependency cycle, a shell or theme nothing declares, a theme incompatible with an active package, a component name that binds to nothing, an unplaced or cyclic screen template, a screen left on another shell, and a freeform arrangement with no variant for the target’s size class. IsComplete is the single check a build gates on. (#39)
  • Stage (Release v3.2.0): A ui profile’s layout and theme now survive translation into Cratis.Scene.Model, so a target’s shell and theme are resolved from what the document actually declares instead of being dropped.
  • Stage (Release v3.2.0): Render plans documents what a plan contains, every finding and what it means, and the multi-target answer.
  • Scene (Release v1.1.0): UiProfile gained Layout and Theme — the application shell a target renders inside, and the visual theme it applies. Screenplay’s ui profile could already state both (layout AppShell, theme Aurora), but the model had nowhere to hold them, so translation dropped them.
  • Stage (Release v3.1.0): Translation from a compiled Screenplay application into Cratis.Scene.Model instances - the seam between the Screenplay language and the object model Scene’s engine and renderers consume (#37)
  • Stage (Release v3.1.0): EventModelLoader.LoadSceneApplicationFromDirectoryAsync, alongside the existing LoadFromDirectoryAsync, to load the translated model from a directory of .play files
  • Scene (Release v1.0.0): Packages. A ui profile lists packages by name; ScenePackage is the declaration behind such a name — what it contributes (components, layouts, screen and dialog templates, themes) and what else has to be active for it to work. Kinds are ComponentLibrary, Styling and Blueprint.
  • Scene (Release v1.0.0): Dependency resolution. PackageDependencyResolver expands a chosen set of packages into the complete list, ordered so a package always follows what it depends on — which is also the correct override priority. Missing dependencies, version conflicts and cycles are reported rather than guessed at. PackageCatalog answers what a package picker asks: which component libraries are a base to build on, and what else fits what is already selected.
  • Scene (Release v1.0.0): Screen and dialog templates. ScreenTemplate is a reusable shape that goes inside a layout, at module, feature or slice level; FitsSlot names the slot on its parent it fills, and ScreenTemplateResolver turns those names into a tree. The same rule applies at every level, so nesting has no depth limit. DialogTemplate is the same for overlays, which fill no slot.
  • Scene (Release v1.0.0): Themes carry attribution. Theme gained design tokens plus Author, AuthorUrl and License, so a theme adopted from elsewhere credits its original creator.
  • Scene (Release v1.0.0): @cratis/scene.primereact — 87 component names across PrimeReact’s families, and 25 of PrimeTek’s free themes, each credited.
  • Scene (Release v1.0.0): @cratis/scene.components — the Arc-bound Cratis Components composites, with a binding registry so a screen can name a query or command that a host resolves to a real class at render time.
  • Scene (Release v1.0.0): @cratis/scene.tailwind — the styling package component libraries declare themselves written against.
  • Scene (Release v1.0.0): @cratis/scene.blueprint.default — application shells with eight menu modes, 23 screen templates, 3 dialog templates and two themes.
  • Scene (Release v1.0.0): @cratis/scene.blueprint.components — whole Arc-bound pages built from Cratis Components, layered on the default blueprint rather than shipping a rival shell.
  • Fundamentals (Release v7.18.0): Added standard TypeScript decorator support for field and derived-type metadata while retaining legacy decorator compatibility. (Cratis/Arc#2440)
  • Screenplay (Release v4.0.0): layout <Name> — a new top level construct declaring the application’s base navigational look: named slots, arranged the same way a template’s are. Its slots keep contributes <ContributionPoint>, which makes the shell the natural home of an application-wide Navigation point.
  • Screenplay (Release v4.0.0): layout <Name> on a ui profile, exactly parallel to the existing theme <Name> line — at most one per profile. This is where an application states which shell it uses. Naming a layout the document does not declare is reported as a warning, the way an unknown theme already is.
  • Screenplay (Release v4.0.0): dialog template <Name> at module scope — a reusable shape for content that opens over the application. It declares no fits slot, because it occupies no slot.
  • Screenplay (Release v4.0.0): fits slot <name> on a screen template — names the slot of its parent the template fills. One rule for every level: a module’s template fits a slot on the application layout, a feature’s fits a slot the module’s template declares, a slice’s fits one the feature’s declares.
  • Screenplay (Release v4.0.0): A Layouts and templates documentation page covering the four constructs and how they nest.
  • Arc (Release v21.18.0): Added opt-in decorator-free metadata registration for generated TypeScript proxies, enabling React Native, Expo, Hermes, and toolchains without legacy decorator transforms. (#2440)
  • Chronicle (Release v16.34.0): Reactors can take a ReactorDelivery parameter on a handler method to get a stable identity for that delivery of that event — the same value when a failed partition is recovered and the event is delivered again, and different for every distinct delivery. Use delivery.Id as the key for your own record of completed side effects (#3643)
  • Chronicle (Release v16.34.0): Read model members can be cleared. [ClearWith<TEvent>] on a scalar property or record parameter, [SetValue<TEvent>(null)], and the fluent .Clear(m => m.Property) all write the member back to no value every time the event is observed, replay included — at the root, on a child item, and on a nested object’s members (#3711)
  • Chronicle (Release v16.34.0): The fluent projection builder gained .Clear(m => m.Property), available everywhere .Set(...) is. It is the recommended way to clear; .Set(...).ToValue(null) means the same thing and keeps working (#3711)
  • Chronicle (Release v16.34.0): The projection declaration language gains a clear statement. clear <property> takes a value away, alongside increment, decrement and count, and accepts a property path so clear owner.note clears a member of a nested object. property = null still compiles to exactly the same mapping (#3711)
  • Chronicle (Release v16.34.0): CHR0048 reports a clear declared for a member that cannot hold null — for [ClearWith], a null [SetValue], .Clear(...) and .Set(...).ToValue(null) alike — as a warning. It is scheduled to become an error in the next major; building the projection refuses the declaration outright, so an unaddressed warning fails at startup rather than at build time (#3711)
  • Chronicle (Release v16.34.0): A unique constraint can be released by more than one event. Declare RemovedWith<T>() once for each way the lifecycle ends — accepted, revoked, expired — and every one of them frees the value on its own. The same holds for the attribute form: several event types may carry [RemoveConstraint] for one constraint name (#3697)
  • Chronicle (Release v16.34.0): Encryption certificates can be rotated without downtime: encryptionCertificate.previous holds an ordered list of previously active certificates, kept for decryption while the active one protects everything new (#3690)
  • Chronicle (Release v16.34.0): GET /diagnostics/encryption-certificates reports the certificate ring, which certificate is active, and how many stored Data Protection keys still depend on each — including keys that depend on a certificate no longer in the ring (#3690)
  • Chronicle (Release v16.34.0): The encryption-certificate ring is logged at every boot, one line per certificate, with a warning for any that has expired (#3690)
  • Chronicle (Release v16.34.0): IEventStore.PII.AllowNewEncryptionKeyFor(subject) authorizes a fresh encryption key for a subject whose key was erased, so a later lawful lifecycle can protect their data again under an independent key (#3600)
  • Chronicle (Release v16.34.0): Encryption key stores record erasures beside the keys — a revision floor, the fingerprints of the destroyed key material, and whether a new lifecycle is authorized — so “erased” is a state Chronicle can tell apart from “never provisioned” (#3600)
  • Chronicle (Release v16.34.0): Erasing a subject and authorizing a new
  • Screenplay (Release v3.1.0): clear <property> in the projection declaration language, for removing the value a read model property holds — the language half of Cratis/Chronicle#3711, from review of Cratis/Chronicle#3713. <property> = null keeps parsing exactly as it does today
  • Screenplay (Release v3.1.0): ClearMappingSyntax and ScreenplaySyntaxWalker.VisitClearMapping for consumers walking the syntax tree, with printing that brings clear back out as clear
  • Screenplay (Release v3.1.0): clear in projection completion, hover and syntax highlighting for the Monaco language service and the VS Code extension
  • Stage (Release v3.0.0): A reaction set off by the clock, or by a trigger an integration provides, is now reported in the generated file and the diagnostics instead of skipped — a Chronicle reactor is set off by an event, so neither has an equivalent to render
  • Stage (Release v3.0.0): A reaction’s where condition is reported, since the rendered handler runs for every occurrence
  • Screenplay (Release v3.0.0): reaction <Name> — behavior that runs when something happens, replacing reactor (#102)
  • Screenplay (Release v3.0.0): Trigger clauses on a reaction: when <Name> for an event or a trigger, every <n> <seconds|minutes|hours|days> for an interval, and at <HH:mm> optionally narrowed by on <Weekday> or on day <n> (#102)
  • Screenplay (Release v3.0.0): Bare names under a trigger select the values the occurrence hands the reaction, checked against what the event or trigger declares (#102)
  • Screenplay (Release v3.0.0): where <condition> on a reaction, narrowing which occurrences run it (#102)
  • Screenplay (Release v3.0.0): trigger <Name> — a top-level declaration of a kind of occurrence and the values it provides (#102)
  • Screenplay (Release v3.0.0): TriggerDefinition and IScreenplayLanguageRegistry.Triggers, so a consumer can register a trigger and optionally state what an occurrence carries (#102)
  • Screenplay (Release v3.0.0): Built-in Startup and Shutdown triggers (#102)
  • Screenplay (Release v3.0.0): Reaction and trigger support in the Monaco language service and the VS Code extension, including completing the commands invokes can name (#102)
  • Screenplay (Release v3.0.0): Reactions and Triggers documentation pages, with the matching EBNF productions (#102)
  • release-action (Release v1.2.0): reason output telling you why the action published nothing, so a workflow can fail on a release that went missing without failing on the ones that are expected.
  • Screenplay (Release v2.6.2): Catalogue entries for the 58 diagnostic codes the compiler could report but the documentation did not list (#106)
  • cli (Release v2.8.0): A floating filter panel on F in the workbench that filters as you type and shows how many rows match
  • cli (Release v2.8.0): Click the store, namespace, theme or refresh interval in the workbench status bar to change it
  • cli (Release v2.8.0): Right-click a row for its actions, with the destructive ones kept apart
  • Scene (Release v0.7.0): Layout.Arrangement: an optional FlowArrangement/FreeformSlotArrangement describing how a layout’s own named slots position relative to each other, filling a gap where Screenplay’s template/row/column/grid/variant constructs (which arrange slots) had nowhere to go in the object model - only a single slot’s own filled content could be arranged before this
  • Scene (Release v0.7.0): FlowSlotLeaf/SlotPlacement: the slot-referencing counterparts to FlowLeaf/ElementPlacement, used only within a Layout’s own arrangement tree
  • Scene (Release v0.7.0): FreeformSlotArrangementEvaluator (+ TypeScript evaluateFreeformSlotArrangement): selects a Layout’s macro placement variant for a size class, mirroring FreeformArrangementEvaluator
  • Scene (Release v0.6.0): UiStarter model type: a packaged, versioned UI starting point bundling a package list, compatible themes, and a gallery of sample screen names (#6)
  • Scene (Release v0.6.0): StarterProfileBuilder / buildStarterProfile: builds the sandboxed UiProfile a starter’s gallery boots through, scoped to exactly its own package list (#6)
  • Scene (Release v0.6.0): StarterThemeValidation / incompatibleStarterThemes: finds which of a starter’s declared themes are incompatible with its own packages, reusing the theme compatibility engine (#6)
  • Scene (Release v0.5.0): ThemeCompatibility.IncompatiblePackages()/incompatiblePackages() and IsCompatible()/isThemeCompatible() - reuse the exact rule Screenplay’s compiler already applies (ValidateThemes): every package a ui profile declares must be in the theme’s compatibleWith list, with no implicit exemption for core. Sharing this rule here means Stage’s build-time warning and Studio’s design-time theme-picker filtering don’t each reimplement it. (#5)
  • Scene (Release v0.5.0): ThemeCompatibility.ApplicablePackages()/applicableThemePackages() - the renderer-facing half: the packages a profile activates that a theme also declares compatible, which Scene.React scopes token application to (rather than applying a theme’s tokens globally). Computing it fresh from the current theme/profile pair, rather than caching a resolved result, is what makes theme switching a live re-resolution with no reload. (#5)
  • Scene (Release v0.5.0): A shared JSON fixture corpus (theme-compatibility-fixtures.json) asserted independently by both the C# and TypeScript specs, following the pattern established in #3/#4.
  • Scene (Release v0.4.0): aggregateContributions() (@cratis/scene.engine) - collects every contribution targeting a given contribution point, ordered ascending by its explicit order (unordered contributions sort after every ordered one, in their original relative order). Resolving which contribution point a contribute to targets already happens before a Contribution exists in Scene.Model (see its own doc comment), so there was no ambiguity left for the engine to resolve here, only ordering - this is narrower than the issue’s original proposal, which assumed the engine would still walk a nearest-enclosing resolution; that already happened upstream. (#2)
  • Scene (Release v0.4.0): NavBar widget (@cratis/scene.react) - renders the aggregated Navigation contributions. How navigate to <Screen> becomes a concrete route is a caller-supplied renderRoute callback rather than a fixed URL scheme, so the same widget works unmodified across renderers, per the issue’s own “configurable per renderer” requirement. (#2)
  • Scene (Release v0.4.0): extractNavigationItem() - reads a NavigationItem out of a Navigation contribution’s ExternalComponent.properties bag.
  • Scene (Release v0.3.0): SizeClassCalculator.Compute() (C#) / computeSizeClass() (TypeScript) - computes the current width x height size class from actual available dimensions, shared by every renderer so they all agree on when a class boundary is crossed. (#4)
  • Scene (Release v0.3.0): FlowArrangementEvaluator.Evaluate() / evaluateFlowArrangement() - selects the most specific matching when width/height <class> override’s tree for the current size class (both dimensions targeted beats one; the last declared wins among equally specific matches), falling back to the base tree when nothing matches. (#4)
  • Scene (Release v0.3.0): FreeformArrangementEvaluator.Evaluate() / evaluateFreeformArrangement() - selects the placement variant with an exact size-class match, or nothing - deliberately no fallback, matching the language’s own “warn, don’t silently pick” design for a size class with no matching variant. (#4)
  • Scene (Release v0.3.0): FlowArrangement gained an Overrides list (C#) / overrides (TypeScript) - the model previously had no field at all for Screenplay’s when width/height <class> override construct, unlike FreeformArrangement which was already keyed by size class.
  • Scene (Release v0.3.0): A shared JSON fixture corpus (layout-evaluation-fixtures.json) asserted independently by both the C# and TypeScript specs, following the same pattern established for the package resolver in #3/#9.
  • Scene (Release v0.2.0): PackageResolver.Resolve() (C#, Cratis.Scene.Engine) and resolveComponentName() (TypeScript, @cratis/scene.engine) - resolve a bare or package-qualified component name against a ui profile’s package list. A bare name walks the package list from highest to lowest priority (core always the lowest-priority fallback); a package-qualified name (e.g. Internal.Widgets.TrendChart) resolves directly against its named package, bypassing priority order entirely. (#3)
  • Scene (Release v0.2.0): Every resolution also reports which other active packages declared the same bare name but were shadowed by the winner, directly answering the issue’s own open question (“why did my button render as PrimeReact’s and not core’s”) without needing separate CLI tooling. (#3)
  • Scene (Release v0.2.0): A shared JSON fixture corpus (package-resolution-fixtures.json) asserted independently by both the C# and TypeScript specs, so the two implementations of the algorithm cannot drift apart - the same pattern scene-model-shape.json already establishes for Scene.Model’s shape.
  • Scene (Release v0.2.0): New Cratis.Scene.Engine C# project, sibling to Scene.Model, mirroring the existing TypeScript model/engine package split - keeps Scene.Model’s strict shape-parity manifest free of behavioral types.
  • Screenplay (Release v2.6.0): arrangement flow (default) - a layout’s template block can now nest slots under row/column/grid containers with sizing attributes (width, height, grow, span, gap), and declare when width <compact|regular>[, height <compact|regular>] (or when height ... alone) overrides that replace the tree for a given size class. A bare template of plain slot names still parses exactly as before - this is a purely additive language change.
  • Screenplay (Release v2.6.0): arrangement freeform - a layout can instead declare variant width <compact|regular>, height <compact|regular> blocks, each placing slots at pixel-precise coordinates with place <Slot> at x,y size w,h (either dimension may be fill) or hiding one with place <Slot> hidden. One screen/data/action/form contract still applies across every variant - only placement varies.
  • Screenplay (Release v2.6.0): Width/height size classes (compact/regular) are a new two-dimensional vocabulary scoped to layout arrangement, reused across both modes so phone portrait/landscape, tablet, and desktop narrow/wide fall out of the matrix without an orientation primitive.
  • Screenplay (Release v2.6.0): A freeform layout’s variant that omits a slot another variant of the same layout places (or hides) now gets a compile-time warning.
  • Screenplay (Release v2.6.0): New diagnostics PLAY0233-PLAY0244 for the above, documented in the diagnostics catalogue.
  • Screenplay (Release v2.6.0): New Layout arrangement documentation page, cross-linked from Screens.
  • Screenplay (Release v2.6.0): Scope decision: arrangement is declared per-layout, not per-slot. Mixing responsive flow for most of a layout with one pixel-precise freeform region (e.g. a chart in an otherwise-responsive dashboard) is real and common but needs slot-level arrangement - a larger grammar change tracked as a follow-up rather than folded into this PR. Documented as an explicit “out of scope for now” in the new page.
  • Screenplay (Release v2.6.0): Whether a ui profile targeting a size class with no matching variant/when should warn is a build-time concern (it depends on which layouts a profile’s screens actually resolve to) - left to Stage’s build pipeline, not the Screenplay compiler.
  • Screenplay (Release v2.6.0): The CI build (Release) check is expected to fail with CS9057 - a pre-existing, unrelated issue (Microsoft.Net.Compilers.Toolset pinned to 5.6.0, the GH Actions runner’s SDK needs 5.9.0+). Confirmed dotnet build/dotnet test pass locally in both Debug and Release.
  • Arc (Release v21.17.0): The Arc React story kit now ships its stylesheet inside the package — import @cratis/arc.react/stories/styles.css once in your Storybook preview and StoryContainer, StorySection, StoryGrid, StoryDivider and StoryBadge render as documented (#2544)
  • Components (Release v2.9.0): AutoCommandForm - generates a CommandForm’s field list from the command’s own propertyDescriptors instead of writing one field per property by hand, choosing each field’s component by property type through a FieldTypeProvider registry. Built-in providers cover string, number, boolean and Date.
  • Components (Release v2.9.0): registerFieldTypeProvider - registers a provider for any other property type (a Cratis concept, an enum, a custom value object). Most-recently-registered wins, so a provider registered by consuming application code overrides one of the built-in defaults.
  • Components (Release v2.9.0): exclude prop on AutoCommandForm to leave specific properties out of the generated field list.
  • Components (Release v2.9.0): New AutoCommandForm documentation page and a Storybook story.
  • Screenplay (Release v2.5.0): theme <Name> - an application-level block (alongside ui profile) declaring a named visual theme and the component packages it is compatible with, via one or more compatible with <Package> lines.
  • Screenplay (Release v2.5.0): ui profile gains an optional theme <Name> line selecting a theme.
  • Screenplay (Release v2.5.0): A ui profile selecting a theme not declared compatible with one of the profile’s own packages is reported at compile time - the same warning class as an ambiguous or unknown name, naming the incompatible package. Selecting a theme nothing in the document declares gets the same unresolved-name treatment.
  • Screenplay (Release v2.5.0): New Theme documentation page, cross-linked from UI profile.
  • Screenplay (Release v2.4.1): Round-trip specs proving a `contribute to` block’s `label` and a `form` field’s `label` both accept an unquoted `$strings.` token, stored and printed the same way every other localizable operand already is.
  • Screenplay (Release v2.4.1): Both operands added to `Documentation/screenplay/internationalization.md`‘s operand list, and cross-referenced from the Contributions and Forms pages.
  • Arc (Release v21.16.0): CommandForm accepts populateFromQuery/populateFromObservableQuery (plus shared populateFromQueryArgs) to seed its initial values from a single-instance query’s result, matched onto the command’s properties by name.
  • Arc (Release v21.16.0): usePopulateFromQuery/usePopulateFromObservableQuery - the underlying hooks, usable directly outside CommandForm.
  • Arc (Release v21.16.0): Two new field props (available on every field type, since they flow through asCommandFormField): noInitialValue skips a field entirely; initialValue overrides how a field’s value is derived from the population source - either a property accessor matched by name, or a function composing a value from the whole source.
  • Arc (Release v21.16.0): A query that turns out to return multiple instances throws QueryReturnsMultipleInstances - a form’s initial values only ever come from one instance.
  • Arc (Release v21.16.0): The resolved data becomes the form’s baseline through the command’s own change tracking, not just a value overlay - hasChanges reads false right after population, and validation only reruns when the resolved data itself changes.
  • Arc (Release v21.16.0): New “Populating a Form from a Query” documentation section, cross-linked from the existing manual fetch-and-seed pattern.
  • Screenplay (Release v2.4.0): <slot-name> contributes <ContributionPoint> - marks a layout template slot as the target for a named contribution point, opening it up to many contributors instead of the one parent that fills a plain slot.
  • Screenplay (Release v2.4.0): contribute to <ContributionPoint> - one contributed item, declared directly on a module (alongside layout, form and feature) or on a feature at any nesting depth. Carries an optional navigate to <Screen> [by <param>] (reusing the exact navigation shape screens already use), label "<text>", and order <number>.
  • Screenplay (Release v2.4.0): A contribution resolves to the nearest enclosing template that declares a matching contribution point: its own module first (which stops it bubbling further once found), then every other module in the document. Unknown and ambiguous contribution points are warnings, mirroring how every other reference in the document resolves.
  • Screenplay (Release v2.4.0): New Contributions documentation page, linked from the Screens page’s layout templates section.
  • Screenplay (Release v2.3.0): form <Name> for <Command> - a named, module-level input surface bound to a command. Declared alongside layout inside a module, and discovered by its for binding wherever that command is invoked, rather than referenced from a screen’s directive tree.
  • Screenplay (Release v2.3.0): populate via query <Query> [by <param>] and populate from item - seed a form’s initial values from a query result or an already-bound item in scope.
  • Screenplay (Release v2.3.0): field <property> [from <source>|compose using <Callback>] [label "<text>"] - bind a form field to a command property, with an explicit rename, a compositional callback, or a display label.
  • Screenplay (Release v2.3.0): on submit navigate to <Screen> [by <param>] - navigate after a successful submit, reusing the same navigation shape screens already use.
  • Screenplay (Release v2.3.0): The command a form binds to, the query it populates from, and the screen it navigates to on submit resolve the same inside-out way every other bare name in the document does, warning when nothing in scope declares them.
  • Screenplay (Release v2.3.0): Every field a form declares now must bind to a property its command actually has - the same rename-breaks-the-build guarantee AutoMap already gives a projection.
  • Screenplay (Release v2.3.0): New Forms documentation page, and a correction to the Screens page, which named forms as a screen widget even though no such widget exists.
  • Screenplay (Release v2.3.0): ModuleSyntax.Forms was added as a trailing optional parameter (not inserted between Layouts/Features) to keep the change source- and binary-compatible with existing callers, matching the convention ApplicationSyntax.UiProfiles already established.
  • Screenplay (Release v2.3.0): The issue’s open questions (compose-using callback scope, reusing one form shape across multiple commands) are left for a follow-up - this PR implements the syntax, printing, and the validations the issue calls out explicitly as required, without pre-deciding those two open design questions.
  • Screenplay (Release v2.3.0): CI’s publish-dotnet-packages job is expected to fail on this PR - it’s a pre-existing, repo-wide CS9057 analyzer/compiler version mismatch (Microsoft.Net.Compilers.Toolset pinned to 5.6.0 vs. the runner SDK’s 5.9.0+ codestyle analyzers), unrelated to this change and already occurring on main. See PR #97 for the same failure and its investigation.
  • Screenplay (Release v2.2.0): A top-level ui profile <Name> block declares a named target: the platform(s) it runs on (target platform), its default size class (target size, using named compact/regular/expanded classes rather than raw pixel breakpoints), and an ordered packages list a build resolves widget names against. A document may declare more than one profile; profile names must be unique.
  • Screenplay (Release v2.2.0): Package declaration order within a packages block is override priority — a later package shadows an earlier one on a name collision. core, the built-in vocabulary, is always the final fallback.
  • Screenplay (Release v2.2.0): A screen never declares which profile it targets — profile selection stays a build/Stage concern, so the same screen resolves against different package chains per build.
  • Screenplay (Release v2.2.0): New diagnostic codes PLAY0201–PLAY0207 for malformed/duplicate ui profile declarations.
  • Screenplay (Release v2.2.0): A ui profile round-trips through compile → print → recompile byte-identically.
  • Screenplay (Release v2.2.0): Resolving a bare widget name used inside a screen against a profile’s active packages (the “ambiguous name → named-candidates warning” behavior described in the issue) is a build-time concern owned by Stage and the package resolution engine (Cratis/Scene#3) — the Screenplay compiler has no visibility into what widgets an external package like PrimeReact defines, so it cannot check that itself. What this PR validates at compile time is the profile declaration’s own shape: duplicate profile names and duplicate packages within one profile are both compile errors.
  • Scene (Release v0.1.0): Cratis.Scene.Model (C#) — the platform-agnostic Screen object model: the SceneElement → VisualElement → FrameworkElement → Control → Panel/ItemsControl/ContentControl/ExternalComponent element hierarchy, Layout (flow and freeform arrangement per slot, width × height size classes), Form (the three population/mapping tiers), contribution points and navigation, and UiProfile/Theme. No React, DOM or CSS vocabulary anywhere in this project.
  • Scene (Release v0.1.0): @cratis/scene.model — the TypeScript mirror, hand-maintained and guarded by a real cross-language parity spec: a shared scene-model-shape.json manifest that both a C# spec (reflection over the assembly) and a TypeScript spec (walking each type’s own PropertyNames const) assert against independently, so a desync on either side fails its own build.
  • Scene (Release v0.1.0): @cratis/scene.engine — the Renderer<TOutput> contract a renderer implements (one method per concrete element kind), and a renderElement() tree walk. Binding resolution is injected via a BindingResolver callback rather than solved here — the profile/contribution/layout/theme resolution engines are separate, later issues.
  • Scene (Release v0.1.0): @cratis/scene.react — implements the renderer contract against real React/DOM, with a small core component set (core:text/button/card) and Storybook wired at the package level.
  • Scene (Release v0.1.0): Repository scaffold: .ai/ instruction corpus and its Copilot/Claude/Codex adapters, build/lint/format config, and CI workflows (dotnet + JS build, NuGet + npm trusted publishing, semver label gate) — copied from Cratis/Arc, the closest real dual-stack framework repo.
  • Scene (Release v0.1.0): The design-time editor building on this object model belongs in Studio (StudioIssues#156), not here.
  • Scene (Release v0.1.0): Verified end to end: dotnet build/dotnet test clean (Debug + Release, 0 warnings), yarn ci clean across all three JS packages, yarn build-storybook succeeds, and the parity spec genuinely fails on both sides when deliberately desynced (verified, then reverted).
  • Chronicle (Release v16.33.0): Event Type detail view: new Observers tab listing every observer consuming the event type, with namespace, observer id, type, and running state (#3147)
  • Chronicle (Release v16.33.0): Observer detail panel: new Event Types tab listing every event type the observer consumes, alongside the existing Summary tab (#3147)
  • Chronicle (Release v16.32.0): Stored projection read models transparently preserve PII ownership per property, allowing multiple subjects in one document across MongoDB and SQL. (#3644)
  • Chronicle (Release v16.31.0): Persistent event sequence queries in the Workbench: build a query, keep several open as tabs, and organize them in a resizable tree of folders under “Only me” and “Everyone”. Which tabs were open, and how wide the tree was left, are restored on the next visit (#1911)
  • Chronicle (Release v16.31.0): Filtering on event type, event source, event source type, event stream type, correlation, tags and time range, using the same filter panel the pivot viewer uses. The time range is dragged over a histogram the backend counts across the whole sequence, so it shows the real distribution rather than the loaded page (#1911)
  • Chronicle (Release v16.31.0): Sorting the results by clicking a column, and an event sequence picker for targeting any sequence in the store — both saved with the query and applied in storage (#1911)
  • Chronicle (Release v16.31.0): Export of the whole filtered result, produced by the server rather than from the page currently on screen (#1911)
  • Chronicle (Release v16.31.0): REST endpoints for saving, listing and deleting sequence queries and query folders, and for reading a sequence’s events per time bucket
  • Chronicle (Release v16.31.0): A paged event sequence query that applies its filter and ordering in storage, so a query over a large sequence only transfers the page being shown
  • Chronicle (Release v16.31.0): A Development Tools page for resetting Chronicle, offered only by servers built with development tools compiled in
  • cli (Release v2.7.0): cratis render renders a Screenplay document, or every document beneath a folder, into a Cratis application, reporting everything the document says that the rendered application does not carry. --target chooses the directory, defaulting to ./out (#62)
  • Stage (Release v2.4.0): Cratis.Stage.Rendering.Cratis.Scaffolding — scaffolds the Cratis project a rendered application is placed into, from the Cratis templates. Take it alongside the renderer and pass TemplateEngineProjectScaffolder to CratisRenderer to keep today’s behavior. (#34)
  • Stage (Release v2.4.0): A Screenplay specification exercising its slice’s command renders as a Cratis spec — a CommandScenario<T> in the when_ folder layout, wrapped in #if DEBUG. Appended events are asserted against the event source the command’s identifier names, narrowed to the values the specification states; a rejection asserts both that the command failed and that it failed as validation. (#14)
  • AuthProxy (Release v2.20.0): Add opt-in local session termination for Required identity-verification denials, including Aspire configuration and real cookie-pipeline coverage. (#103)
  • Chronicle (Release v16.30.0): [SubjectFrom(nameof(property))] declares which property holds the subject a read model value’s personal data belongs to (#3601)
  • Chronicle (Release v16.29.0): CHR0046 warns when a passive read model’s projection redirects the root document key, which makes the read replay a stream the events were never appended to (#3609)
  • Chronicle (Release v16.29.0): CHR0047 warns on a SetValue declaring null and on ClearWith applied to a property or parameter, neither of which the projection builder reads (#3641)
  • Components (Release v2.8.1): A CI check that loads every published export subpath in Node, so a published package that cannot be imported is caught before release rather than by a consumer (#118)
  • Arc (Release v21.14.0): useIsCommandExecuting for reading whether a CommandForm’s command is currently executing (#2497)
  • Arc (Release v21.14.0): formRef on CommandForm, exposing execute() plus isExecuting, isValid and isAuthorized to a parent rendering its own submit control (#2497)
  • Arc (Release v21.14.0): onStateChange on CommandForm, notifying a parent when execution, validity or authorization changes (#2497)
  • Arc (Release v21.14.0): isExecuting on the command form context (#2497)
  • Chronicle (Release v16.28.0): health.exclusive, which restricts the dedicated health port to the health endpoint so the Workbench, REST API and OAuth endpoints are no longer reachable on it. Off by default (#3604)
  • Arc (Release v21.13.0): UseFixedTenancy and FixedTenantIdResolver, giving single-tenant production deployments a registration API that is not named for the development environment (#2478)
  • Arc (Release v21.13.0): Tenancy:FixedTenantId configuration, which Tenancy:DevelopmentTenantId now forwards to (#2478)
  • AuthProxy (Release v2.19.0): WithInviteEmailBinding on the Aspire builder, binding an invitation to the address it was issued to so only the invited recipient can redeem it (#85)
  • Arc (Release v21.12.0): ICommandResponseValueHandler<TValue>, an optional typed declaration that marks a command response value type as consumed on the server (#2537)
  • Arc (Release v21.11.0): A RequireRole component that renders its children only for an identity that is authenticated and allowed, with slots for the loading and forbidden outcomes so an application supplies its own navigation (#2496)
  • Arc (Release v21.11.0): isLoading on the React identity context, separating an identity that has not been fetched yet from one that came back anonymous (#2496)
  • Arc (Release v21.10.0): The name of the violated constraint on a validation result, so a client can tell one constraint rejection from another without matching on the message text (#2487)
  • Arc (Release v21.10.0): ShouldHaveConstraintViolationFor for asserting a command result names a given constraint, matching the assertion already available against a raw append (#2487)
  • Arc (Release v21.9.0): Chronicle 16.21.0: Allow reactors to return ordered cross-stream events with exact concurrency scopes in one atomic append. (cratis/chronicle#3651)
  • Arc (Release v21.9.0): Chronicle 16.22.0: Compliance:Encryption:MigrateFromDefaultStorage supports read-through migration from default compliance key storage to Vault or Azure Key Vault. (cratis/chronicle#3639)
  • Arc (Release v21.9.0): Chronicle 16.23.0: A diagnostic reports [EventSourceType] and [EventStreamType] declared on an event type, where they have no effect (cratis/chronicle#3642)
  • Arc (Release v21.9.0): Chronicle 16.25.0: WithTlsCertificate and WithEncryptionCertificate on the Aspire builder, which mount a certificate into the Chronicle container read-only and point the configuration at it (cratis/chronicle#3607)
  • Arc (Release v21.9.0): Chronicle 16.26.0: Add IUnitOfWork.AddEvents for ordered cross-source events and independently labelled exact concurrency scopes in the existing transaction (cratis/chronicle#3683)
  • Chronicle (Release v16.26.0): Add IUnitOfWork.AddEvents for ordered cross-source events and independently labelled exact concurrency scopes in the existing transaction (#3683)
  • Arc (Release v21.8.0): A query returning ISubject<T> is now marked observable in the generated document, so a live read that keeps pushing as the read model changes is no longer written as though it answers once
  • Stage (Release v2.1.0): CommandDefinition now carries the command’s authorize requirement, its require rules and its reads declarations (#23).
  • Stage (Release v2.1.0): Command authorization is carried as a requirement tree — PolicyReference and LogicalRequirement — so A or B and C stays distinguishable from (A or B) and C. AuthorizationRequirement.Policies() gives the flat set of names to a consumer that only needs those (#23).
  • Stage (Release v2.1.0): ProducedEvent now carries the event source a produces … for clause names (#23).
  • Stage (Release v2.1.0): EventDefinition now carries the tags declared on the event (#23).
  • Stage (Release v2.1.0): Specification now carries given readmodel and then readmodel steps, which the existing SpecificationRunStepKind.ThenReadModel had nothing to feed it (#23).
  • Stage (Release v2.1.0): A concept’s @pii and @sensitive attributes, and the reason each was declared for, now travel on the schema of every property typed as that concept. They were dropped entirely on import, leaving personal data indistinguishable from any other value (#23).
  • Chronicle (Release v16.25.0): WithTlsCertificate and WithEncryptionCertificate on the Aspire builder, which mount a certificate into the Chronicle container read-only and point the configuration at it (#3607)
  • Arc (Release v21.6.0): TenancyOptions.BaseDomain, configured through UseSubdomainTenancy(baseDomain, fallbackHeaderName) (#2471)
  • Arc (Release v21.6.0): TenancyOptionsValidator, which validates tenancy configuration while the host starts (#2471)
  • Chronicle.Kotlin (Release v2.10.0): io.cratis:chronicle-spring-boot-starter — a connected client, artifacts registered before the first request is served, and an IEventStore ready to inject, configured under cratis.chronicle.
  • Chronicle.Kotlin (Release v2.10.0): Spring Boot multi-tenancy: the injected IEventStore routes to the namespace the current work belongs to, resolved from a fixed value, an HTTP header, the request subdomain, or a claim on the authenticated principal.
  • Chronicle.Kotlin (Release v2.10.0): Spring Boot gives each request an identity taken from the authenticated principal, a causation trail describing the call, and a unit of work that commits on success and rolls back on failure. Each can be switched off on its own.
  • Chronicle.Kotlin (Release v2.10.0): Chronicle — the Java-facing Spring bean exposing the everyday operations without coroutines, for Java callers and blocking MVC handlers.
  • Chronicle.Kotlin (Release v2.10.0): IEventStoreNamespaceResolver for hosts that decide the namespace themselves.
  • Chronicle.Kotlin (Release v2.10.0): Spring Boot samples for Kotlin and Java, each with a walkthrough.
  • Chronicle.Kotlin (Release v2.10.0): A guide for Spring Boot support.
  • AuthProxy (Release v2.18.0): The sign-in notification can carry a signed envelope binding its origin, audience, method and target, a digest of the exact bytes posted, its issue time and a single-use identifier, so an application can verify that a sign-in it is told about really came from the auth proxy (#82)
  • AuthProxy (Release v2.18.0): SignIn:Attestation configuration, with rotating signing keys selected by key identifier, enabling the signed envelope (#82)
  • Components (Release v2.8.0): StepperCommandDialog can show an opt-in Cancel action in its footer, with a configurable label (#121)
  • Chronicle (Release v16.23.0): A diagnostic reports [EventSourceType] and [EventStreamType] declared on an event type, where they have no effect (#3642)
  • Arc (Release v21.4.0): The identity provider the ingress authenticated a caller with is carried on the authenticated principal as a reserved claim, available to the identity details an application provides (#2501)
  • AuthProxy (Release v2.17.0): ResponseMode setting per OIDC provider (Query default, FormPost for providers that mandate it, such as Apple) — choosing FormPost switches that provider’s handshake cookies to SameSite=None; Secure
  • AuthProxy (Release v2.17.0): Embeddable credential-link flow: /.cratis/link serves a provider-selection page for the product to frame, /.cratis/link/complete ends a successful link, and the pages report the outcome over a BroadcastChannel and an origin-checked postMessage to the embedding page
  • AuthProxy (Release v2.17.0): Link:EmbedAncestors setting naming the origins allowed to frame the link pages (self for the proxy’s own origin); when empty — the default — the link pages send frame-ancestors 'none' and X-Frame-Options: DENY
  • AuthProxy (Release v2.17.0): link-select-provider.html and link-complete.html well-known pages, deployment-replaceable like every other page
  • AuthProxy (Release v2.16.0): Cratis:AuthProxy:Logout:AdditionalCookies — a list of additional cookies the session-termination sweep deletes on top of the cookies AuthProxy issues itself. Each entry names a cookie exactly (Name) and may carry the Domain it was scoped to (e.g. .cratis.studio); when set, the deletion is issued for that domain as well as the request host, which is what it takes to kill a cookie another proxy scoped to a parent domain. Deletions go out with Path=/ and the Secure attribute mirroring the request scheme, and happen on the logout endpoint (both legs of a full-chain logout) and on the sign-in sweep when a provider callback completes — so a fresh sign-in also heals a browser still carrying the stale cookie.
  • AuthProxy (Release v2.15.0): An opt-in capability-gated admission mode. A closed deployment admits a caller only after a verifier it names accepts a capability the caller presents once; every refusal answers one byte-identical 404, so a wrong capability, an unknown route and an unreachable verifier are indistinguishable. The capability is never stored and never becomes an identity - what is stored is a sealed entry transaction proving a verifier said yes. Public remains the default. An entry outlives a provider handshake by default, so a slow sign-in does not come back to a refusal (#81)
  • AuthProxy (Release v2.15.0): An opt-in private management health listener, off until a deployment names a port and bound to loopback unless told otherwise. Liveness consults nothing, so a storage outage cannot restart the fleet; readiness round-trips the data-protection key ring and nothing else, so a deployment whose backends are all down still becomes ready. The two management paths are refused on the public socket, and everything else is refused on the management one (#83)
  • AuthProxy (Release v2.15.0): Aspire builders for capability-gated admission and the management listener, as new methods so an app host compiled against an earlier package keeps working (#81, #83)
  • AuthProxy (Release v2.15.0): An opt-in per-service identity verification mode. In Required, an identity service that cannot give an unambiguous positive denies the request instead of authorizing it, clears the sealed authorization record, the identity cookie and the cached result, and logs a bounded reason code. BestEffort remains the default and behaves exactly as before, denying only on 403 (#77)
  • AuthProxy (Release v2.15.0): A configurable verification timeout, applied where a missing answer is a denial. An unstated timeout stays unbounded in BestEffort (#77)
  • AuthProxy (Release v2.15.0): A configurable positive-result cache duration, including a value meaning never cache (#77)
  • AuthProxy (Release v2.15.0): An explicit trusted-proxy boundary: forwarding headers are believed only from configured addresses or networks, with a configurable forward limit and startup validation that names an unusable entry (#79)
  • AuthProxy (Release v2.15.0): Aspire builders for identity verification, trusted proxies and the forward limit, as new methods so an app host compiled against an earlier package keeps working (#77, #79)
  • AuthProxy (Release v2.15.0): A link-failed page a deployment can customize (#80)
  • Arc (Release v21.3.0): An opt-in guard consulted before each observable-query emission, so an application can withhold an emission or end a subscription when authorization changes mid-stream. Authorization was previously evaluated once, when the subscription was established, and never again — nothing ended a stream on token expiry, session end or role revocation. With no guard registered nothing is allocated and no dispatch happens, so existing applications are unaffected (#2476)
  • AuthProxy (Release v2.14.0): Failed remote sign-ins (correlation failure, invalid OAuth state, provider errors, cancelled consent) now redirect to the provider-selection page with a reason query parameter (remote-failure / access-denied) instead of surfacing as a blank 500 error page; the bundled selection pages show a matching message
  • AuthProxy (Release v2.14.0): A guard in front of the reverse proxy that terminates an authenticated session that cannot be turned into a forwardable identity — the browser is sent to provider selection with reason=invalid-session, API callers get 401 — instead of proxying the request without identity headers
  • AuthProxy (Release v2.14.0): A Failed Sign-ins documentation page covering the reason contract, handshake-cookie hygiene, and the forwardable-identity guard
  • cli (Release v2.5.0): --modules-from-namespace-roots on screenplay generate, taking each outermost namespace segment as a module rather than nesting everything under one
  • cli (Release v2.5.0): .slnf solution filters are accepted as a generation target
  • Chronicle (Release v16.22.0): Compliance:Encryption:MigrateFromDefaultStorage supports read-through migration from default compliance key storage to Vault or Azure Key Vault. (#3639)
  • Chronicle (Release v16.21.0): Allow reactors to return ordered cross-stream events with exact concurrency scopes in one atomic append. (#3651)
  • Stage (Release v1.4.0): Render a single slice, feature or module, with optional module and feature names for placement
  • Stage (Release v1.4.0): A rendered file reports what could not be rendered from its source, instead of leaving it unsaid
  • Stage (Release v1.3.0): A command’s identifier property resolves the event source id at runtime; a command without one keeps getting a fresh Uuid
  • Components (Release v2.7.0): initialFocus on Dialog, forwarded by CommandDialog, choosing where focus lands when the dialog opens: DialogInitialFocus.Confirm (the default, unchanged), Cancel, or Content. Cancel degrades to Content where no dismissing button exists.
  • Components (Release v3.4.0): Dropdown reads label / value off option objects when no optionLabel / optionValue is given, as PrimeReact 10’s Dropdown did, and renders the trigger chevron and clear glyph again.
  • Components (Release v3.4.0): Table column headers render through PrimeReact’s title part, so a theme’s column-title weight applies, and the empty-message row is padded and bordered like a data row.
  • Components (Release v3.4.0): --cratis-surface-0 and --cratis-surface-100 resolve from PrimeReact 11’s form-field and hover surface tokens rather than --p-surface-0/100, which are white in both color schemes.
  • Chronicle (Release v16.34.1): The Workbench now declares primereact, @primereact/core, @primereact/headless, @primereact/types and primeicons itself, since @cratis/components 3.0.0 makes PrimeReact a peer dependency.
  • Chronicle (Release v16.34.1): Component styling comes from @cratis/components/tokens, /styles and /theme, imported once at the app and Storybook entry points. PrimeReact 11 ships no stylesheet, so primereact/resources/themes/lara-dark-blue no longer exists; the Cratis baseline theme replaces it and keeps the Workbench’s dark look.
  • Chronicle (Release v16.34.1): Tables, dropdowns, tabs, dialogs, tooltips, menubars and status chips are now built on the Cratis wrappers (Column, Dropdown, ActionMenubar, Tag/Badge/Chip/ProgressBar, Tooltip, Dialog) where 3.0.0 provides one.
  • Chronicle (Release v16.34.1): The event-sequence table sorts through the server again, and the read-model instance pager keeps its rows-per-page selector alongside the new pager.
  • Scene (Release v2.0.0): @cratis/scene.primereact, @cratis/scene.components, @cratis/scene.blueprint.default and @cratis/scene.blueprint.components now require primereact ^11.0.0, primeicons ^8.0.0 and @cratis/components ^3.0.0, and declare @primereact/core and @primereact/headless where they import them directly.
  • Scene (Release v2.0.0): 13 abstract names follow a PrimeReact rename without changing their Scene name — dropdown is now Select, calendar is DatePicker, overlayPanel is Popover, tabView is Tabs, and so on.
  • Scene (Release v2.0.0): multiSelect is re-expressed over Select’s multiple; orderList and pickList over @primereact/headless hooks, which ship the behavior but no presentation.
  • Scene (Release v2.0.0): Theming is rebuilt on @primeuix/themes presets. A theme is now an object handed to PrimeReactProvider rather than a stylesheet to load, so switching neither fetches nor flashes, and a theme name can no longer 404. usePrimeReactTheme returns the provider configuration instead of mutating the DOM.
  • Scene (Release v2.0.0): The theme catalog is 24 themes across the Aura, Lara, Nora and Material families, replacing the 25 PrimeTek v10 themes. Their license is recorded as PrimeUI Commercial.
  • Scene (Release v2.0.0): PrimeReactProvider is now mandatory anywhere Scene components render — PrimeReact 11 throws without it rather than falling back to a default configuration.
  • Components (Release v3.0.0): primereact, @primereact/core, @primereact/headless and primeicons are now peer dependencies. Previously primereact was a regular dependency, so an app that also depended on it could resolve two copies — and two copies means two PrimeReactProvider contexts, which makes overlays stack wrongly and pt/unstyled silently not apply, with no error. Apps that carried a resolutions/overrides pin to work around this can delete it (#118)
  • Components (Release v3.0.0): Component CSS now ships through the @cratis/components/styles entry point instead of being imported by each component. Apps must import '@cratis/components/tokens' and import '@cratis/components/styles' explicitly. ./styles also vendors the allotment stylesheet DataPage needs, so that no longer has to be imported separately (#118)
  • Components (Release v3.0.0): Theming is token-based. PrimeReact 11 ships no CSS; primereact/resources/themes/*.css is gone. Supply a @primeuix/themes preset through CratisComponentsProvider (value={{ theme: { preset } }}), use the new license-free baseline theme, or stay unstyled-first
  • Components (Release v3.0.0): The package is ESM-only — the CommonJS build is gone, as PrimeReact 11 is ESM-only
  • Components (Release v3.0.0): Import Column from @cratis/components/DataTables and StepperPanel from @cratis/components/CommandDialog; the authoring model is unchanged
  • Components (Release v3.0.0): Data-table selection reports a DataTableSelectionChangeEvent (event.value unchanged), replac
  • Stage (Release v3.2.0): Cratis.Stage.Contracts takes Cratis.Scene.Model 1.1.0 and adds Cratis.Scene.Engine 1.1.0. Every resolution rule — package closure and priority, component binding, theme compatibility, template placement, size classes, arrangement evaluation — is Scene’s engine used unmodified, so a build-time plan and a running renderer can never disagree about what a screen resolves to.
  • Stage (Release v3.1.0): The translation follows Screenplay 4.0.0’s taxonomy, which splits what used to share the word “layout”: an application-level layout (the navigational shell, one in force), a module-scoped screen template (a reusable shape inside that shell, naming the slot it fits with fits slot), and a dialog template (the same, for content that opens over the application). A screen names the template it fills; the shell is resolved once for the application, because a screen never names it.
  • Scene (Release v1.0.0): A layout and a template are now different things. A Layout is an application’s base navigational look and an application has one; a ScreenTemplate goes inside it and an application has many. They were previously the same word for both.
  • Scene (Release v1.0.0): FlowContainer carries its Kind. C# distinguished a FlowRow from a FlowColumn by type, but the TypeScript mirror could not — interfaces with identical members are the same type — so a renderer had no way to tell a row from a column.
  • Screenplay (Release v4.0.1): Package validation is enabled again, with the baseline moved to 4.0.0. It was switched off for the 4.0.0 major itself, where every API break was deliberate and validating against the 3.x line it was leaving had no answer to give. With 4.0.0 published, the baseline moves to it and the protection resumes — leaving it off past a major is what previously let releases ship without the break being caught.
  • Screenplay (Release v4.0.0): The module-scoped layout <Name> is now screen template <Name>. It was never a layout — it is a reusable shape that goes inside one.
  • Screenplay (Release v4.0.0): A screen names the structure it fills with template <Name> instead of layout <Name>.
  • Screenplay (Release v4.0.0): The arrangement tree hangs directly off arrangement; the separate template block inside it is gone. arrangement freeform likewise holds its variant blocks directly. This frees the word template to mean a screen or dialog template and nothing else.
  • Screenplay (Release v4.0.0): Slots are declared by name in the body, and the arrangement positions them:
  • Screenplay (Release v4.0.0): Syntax types renamed to match: LayoutSyntax is now the application layout, ScreenTemplateSyntax / DialogTemplateSyntax are the module-scoped ones, ModuleSyntax.Layouts is ModuleSyntax.ScreenTemplates (plus DialogTemplates), TemplateSyntax and its tree are ArrangementSyntax / ArrangementNodeSyntax / ArrangementContainerSyntax / ArrangementSlotSyntax / ArrangementOverrideSyntax / ArrangementContainerKind, LayoutArrangement is ArrangementMode, and ScreenLayoutSyntax is ScreenTemplateReferenceSyntax. The matching
  • Stage (Release v3.0.0): Upgraded to Cratis.Screenplay 3.0.0, which replaces reactor with reaction and makes what sets one off a first-class trigger
  • Screenplay (Release v3.0.0): Slice.Reactors is now Slice.Reactions, and ReactorSyntax/ReactorTriggerSyntax are now ReactionSyntax/ReactionTriggerSyntax carrying a TriggerSourceSyntax (#102)
  • Screenplay (Release v3.0.0): ScreenplaySyntaxWalker.VisitReactor/VisitReactorTrigger are now VisitReaction/VisitReactionTrigger, joined by VisitTrigger and VisitTriggerData (#102)
  • Screenplay (Release v3.0.0): IScreenplayLanguageRegistry gains a Triggers member (#102)
  • Screenplay (Release v3.0.0): PLAY0136–PLAY0139 now describe reactions rather than reactors (#102)
  • release-action (Release v1.2.0): A commit that already has a release no longer publishes a second, higher version when its run is repeated (#103).
  • release-action (Release v1.2.0): Documented that cancel-in-progress: false is required under the push trigger.
  • cli (Release v2.8.0): Enter or double-click opens a read-only detail view. Replay, retry, stop and the rest need an explicit key, a button, or the context menu — a reflexive double-click can’t change anything now
  • cli (Release v2.8.0): Actions declare whether they’re destructive instead of it being guessed from the label, so they’re tinted consistently wherever they show up
  • cli (Release v2.8.0): One key for themes instead of three, listing all of them
  • cli (Release v2.8.0): Throughput and observer count are line graphs — bar sparklines rounded 3 and 4 events per tick to the same full-height column
  • cli (Release v2.8.0): Tables and graphs let the background through, and colors follow a theme change straight away instead of on the next refresh
  • Arc (Release v21.17.0): The story kit documentation states where the styling comes from and which single import brings it in, instead of describing styling as automatic (#2544)
  • Arc (Release v21.17.0): The story kit’s theme contract is now documented precisely: dark by default, switching to light wherever data-theme="light" is set on <html>, <body> or any ancestor (#2544)
  • Screenplay (Release v2.4.0): LayoutSyntax.Slots changes from IEnumerable<string> to IEnumerable<SlotSyntax> to carry the new contributes marker - a breaking shape change to that one property. ScreenplaySyntaxWalker.VisitLayout/VisitForm were also completed to walk their previously-unwalked children (LayoutSyntax.Slots, FormSyntax.Populate/OnSubmit) - a latent gap from #98 caught by this PR’s own walker-completeness spec (for_ScreenplaySyntaxWalker), fixed here since it’s a small, directly-related correction.
  • Screenplay (Release v2.4.0): Where a contribute to block is declared: the issue’s own example wraps it in an unexplained navigation-item construct that’s never defined anywhere else in the issue. I treated that as illustrative, not literal syntax, and made contribute to a bare directive attachable directly to a module or feature.
  • Screenplay (Release v2.4.0): Nesting depth: the issue describes three tiers (“app nav, module subnav, feature sub-subnav”). Since layouts are module-scoped only today, this PR implements the two tiers that are actually expressible (own-module vs. every-other-module) and documents the third as a deliberate gap, not a silent omission - it would need feature-scoped layouts, which don’t exist in the grammar.
  • Screenplay (Release v2.4.0): The explicit in <ContributionPoint> override the issue gestures at (no concrete syntax given, paired with an ambiguity-handling question the issue itself marks open) is deferred rather than guessed at.
  • Screenplay (Release v2.4.0): order is implemented (used in the issue’s own worked example); group is not (explicitly flagged in the issue as “worth scoping now vs. later,” no worked example uses it).
  • Arc (Release v21.15.0): A specification step that names a value the specification holds is read as the construction that value was put together by, so a scenario stating its event or its command through a member reads the same as one constructing it inline (#2412)
  • Chronicle (Release v16.33.1): Subject guidance now distinguishes managed projection ownership from manual IReadModels.Release subject selection. (#3708)
  • Chronicle (Release v16.32.0): Historical joins release stored event PII before projecting it, so backfilled values remain readable and erasable under their source subject. (#3644)
  • Chronicle (Release v16.31.0): The Sequences page is now the query workspace rather than a single fixed view of the event log. Append, redact, revise and export remain available on the results (#1911)
  • Chronicle (Release v16.31.0): Saving a query is a deliberate act instead of happening on every edit: the first save asks for a name, who it is visible to and which folder it belongs in, and later saves write it back where it already lives (#1911)
  • Chronicle (Release v16.31.0): A query is renamed where its name is shown — on its node in the tree or by double-clicking its tab — and the new name is saved straight away (#1911)
  • Chronicle (Release v16.31.0): Deleting a query or a folder asks for confirmation first, and deleting a folder deletes the queries filed in it (#1911)
  • Chronicle (Release v16.31.0): The event sequences an event store offers now come from the EventSequences grain, which reports the sequences a namespace actually holds rather than a hardcoded set
  • Chronicle (Release v16.31.0): Event sequence storage can narrow on event source type, event stream type and correlation id, and order by any of the columns a query shows
  • Chronicle (Release v16.31.0): Range filters in @cratis/components accept pre-counted histogram buckets, so a range picker can reflect a data set larger than the browser holds
  • Stage (Release v2.4.0): CratisRenderer.CreateDefault() renders into the target directory without scaffolding a project around it, which is what regenerating from a document into a project that already exists needs. (#34)
  • Stage (Release v2.4.0): A specification that cannot be rendered faithfully is reported with the reason instead of being rendered — one that establishes prior state with given, states read model state, exercises another slice’s command, or asserts nothing. (#14)
  • Stage (Release v2.4.0): Specifications are no longer counted in a slice’s unrendered-construct list, since each one now either renders or says on its own why it does not. (#14)
  • cli (Release v2.6.1): Chronicle moves from 16.19.3 to 16.30.1, which restores connecting to a development server with no certificate setup. (#67)
  • Chronicle (Release v16.30.1): The .NET client skips TLS certificate validation by default again, so a development server and client connect with no certificate setup on either side. Set skipTlsValidation=false (or Tls.SkipCertificateValidation = false) to require full certificate chain validation against a server whose certificate is verifiable.
  • Arc (Release v21.14.1): The proxy generator only inspects assemblies referencing Cratis.Arc.Core when discovering declared response value handlers, instead of every managed dependency of the application
  • Arc (Release v21.12.0): The proxy generator no longer generates client response models for server-consumed response types, whether returned directly or wrapped in Result, OneOf, tuples, or collections (#2537)
  • Arc (Release v21.12.0): Typed handler declarations are discovered from the application and its referenced packages, replacing the fixed built-in list of well-known types (#2537)
  • Arc (Release v21.12.0): All built-in Arc and Chronicle response value handlers declare their consumed types (#2537)
  • Stage (Release v2.2.0): A read model that no declared query returns now renders as requiring an authenticated caller, and reports it as a diagnostic, rather than being left open to everyone. A slice that declares no query at all is unchanged and still renders as [AllowAnonymous].
  • Arc (Release v21.9.0): Cratis.Chronicle, Cratis.Chronicle.AspNetCore and Cratis.Chronicle.Testing are updated to 16.26.0
  • Arc (Release v21.9.0): Chronicle 16.24.0: IReadModels.GetInstanceById resolves a materialized reducer-backed read model from the materialized store instead of replaying its events, with PII released server-side (cratis/chronicle#3605)
  • Arc (Release v21.9.0): Chronicle 16.24.0: IReadModels.GetInstances returns the stored instances for a materialized read model instead of replaying the event log; passing an explicit event count still replays (cratis/chronicle#3605)
  • Arc (Release v21.9.0): Chronicle 16.24.0: A reducer-backed read model no longer needs a connected reducer client to be read by key (cratis/chronicle#3605)
  • Arc (Release v21.9.0): Chronicle 16.24.0: Read model instance reads are eventually consistent unless the read model is marked [Passive] — mark it passive where a read must reflect an append that just happened (cratis/chronicle#3605)
  • Arc (Release v21.9.0): Chronicle 16.24.1: Geospatial documentation now describes the JSON schema Chronicle emits — a leaf carrying only its format, with GeoJSON on the wire — and records that marking a geospatial value [PII] is not supported, since an erased subject cannot be materi
  • Chronicle (Release v16.26.0): Materialize and validate ordered events and scope inputs before staging while preserving pure legacy AddEvent behavior (#3683)
  • Arc (Release v21.7.0): A generated slice now carries every projection it declares, instead of the first one and a diagnostic for the rest. An application whose slice builds several read models - the one a screen binds to and the one a command reads to decide - now gets all of them
  • Arc (Release v21.7.0): A reducer’s read model now stands beside the slice’s projections instead of competing with them, so a slice mixing projections and reducers no longer loses most of its read side
  • Arc (Release v21.7.0): SP0015 no longer reports a second projection in a slice; it is left for the constructs within a projection that the language genuinely has no word for
  • Arc (Release v21.7.0): SP0020 now says what is actually lost - the read model is carried as a projection over the events the reducer observes, and only the fold itself goes unstated
  • Arc (Release v21.6.2): Generating from a single project now reads every project it references as well, instead of only the project named. An application whose events, commands and concepts live in contracts projects below the one named no longer generates a document that leaves all of them out (#2521)
  • Chronicle (Release v16.25.0): An Aspire AppHost configured for production must now supply a TLS certificate, and an encryption certificate when the internal OAuth authority is enabled — without them the production image does not start (#3607)
  • Arc (Release v21.6.0): Subdomain tenancy resolves a tenant only for a host that sits below the configured base domain, and falls back to the tenant header for anything else — an apex domain, a deeper host, or an address (#2471)
  • Arc (Release v21.6.0): A host is matched case-insensitively and in punycode form, so one domain is always one tenant regardless of how it was written (#2471)
  • Arc (Release v21.6.0): A resolved tenant must be a valid DNS label, so a host cannot put a wildcard, user information, a control character or an unbounded string into a tenant identifier (#2471)
  • Chronicle (Release v16.24.1): Geospatial documentation now describes the JSON schema Chronicle emits — a leaf carrying only its format, with GeoJSON on the wire — and records that marking a geospatial value [PII] is not supported, since an erased subject cannot be materialized back into one (#3673)
  • Chronicle.Kotlin (Release v2.10.0): The README is rewritten around what the client does for you, with Kotlin and Java shown side by side throughout.
  • Arc (Release v21.5.0): QueryFor.perform resolves with an unsuccessful result when the request never reaches the server, instead of rejecting (#2473)
  • Arc (Release v21.5.0): A query that fails in transport now surfaces through useSuspenseQuery’s error boundary as QueryFailed, where it previously left the boundary pending forever (#2473)
  • Arc (Release v21.5.0): Only a successful query result is cached, so a failed attempt no longer seeds a later mount of the same query (#2473)
  • Chronicle (Release v16.24.0): IReadModels.GetInstanceById resolves a materialized reducer-backed read model from the materialized store instead of replaying its events, with PII released server-side (#3605)
  • Chronicle (Release v16.24.0): IReadModels.GetInstances returns the stored instances for a materialized read model instead of replaying the event log; passing an explicit event count still replays (#3605)
  • Chronicle (Release v16.24.0): A reducer-backed read model no longer needs a connected reducer client to be read by key (#3605)
  • Chronicle (Release v16.24.0): Read model instance reads are eventually consistent unless the read model is marked [Passive] — mark it passive where a read must reflect an append that just happened (#3605)
  • AuthProxy (Release v2.17.0): OIDC providers request the code flow’s standard query response mode, so the provider callback is a top-level GET the SameSite=Lax handshake cookies accompany (Cratis/StudioIssues#104)
  • AuthProxy (Release v2.17.0): A credential link with no (or an invalid) returnUrl ends on the flow’s own completion page instead of the application root
  • AuthProxy (Release v2.17.0): Sign-in selection pages (provider selection, its SPA, invitation selection) always refuse framing
  • AuthProxy (Release v2.17.0): The selection SPA served at /.cratis/select-provider now matches the static selection pages’ design instead of its own dark theme (Cratis/StudioIssues#104)
  • AuthProxy (Release v2.17.0): A challenge navigation identified as framed (Sec-Fetch-Dest) is answered with the link selection page instead of a redirect the external identity provider would refuse to render framed
  • AuthProxy (Release v2.15.0): A failed credential-link exchange no longer redirects to the completion path. Only an explicit success signals completion; every failure answers one generic page, identical for all six causes, so the response is not an oracle for whether a provider identity or an application account exists (#80)
  • AuthProxy (Release v2.15.0): The client address and scheme are resolved once, from normalized connection state. Geo headers are answered empty unless the immediate peer is trusted (#79)
  • AuthProxy (Release v2.15.0): A deployment that configures no trusted proxies keeps today’s behavior an
  • Components (Release v2.7.1): A data page without a details component no longer renders a split view, and a data page now requires an ancestor with a real height — documented, with a minimum height so a page that does not provide one stays usable rather than collapsing (#126)
  • AuthProxy (Release v2.14.0): A single-provider deployment serves the selection page instead of auto-challenging when a sign-in failure reason is present, so a persistent failure cannot become a redirect loop
  • AuthProxy (Release v2.14.0): Every provider callback — failed or successful — now sweeps leftover .AspNetCore.Correlation.* / .AspNetCore.OpenIdConnect.Nonce.* handshake cookies, including legacy callback-path-scoped ones the logout endpoint can never reach, so one sign-in attempt heals a poisoned browser
  • AuthProxy (Release v2.14.0): The provider-selection page carries the explicit returnUrl forward when served on its own path instead of looping back into itself after sign-in
  • cli (Release v2.6.0): screenplay validate reports the diagnostic code the compiler assigns, for example error PLAY0027:, alongside the file and position it already carried
  • cli (Release v2.6.0): Cratis.Screenplay to 2.1.0, Cratis.Arc.Screenplay to 21.2.0, the Cratis.Prologue packages to 1.2.0 and the Cratis.Chronicle packages to 16.19.3 (#64)
  • cli (Release v2.5.0): Cratis.Arc.Screenplay 20.68.0 to 21.0.1, Chronicle packages 16.11.0 to 16.19.1, Cratis.Fundamentals 7.16.6 to 7.17.1
  • Prologue (Release v1.2.0): Screenplay documents are generated with Cratis.Screenplay 2.1.0.
  • Stage (Release v2.0.0): Screenplay documents are compiled with Cratis.Screenplay 2.0.0.
  • Stage (Release v2.0.0): A slice may now declare more than one projection. The first renders as the read model; the rest are reported as not rendered rather than dropped in silence.
  • Stage (Release v2.0.0): An authentication provider carries an optional alias instead of a settings block — how to reach a provider belongs to whatever runs the document.
  • Arc (Release v21.2.0): Cratis.Screenplay 1.8.0 to 2.0.0.
  • Arc (Release v21.2.0): A generated authorize block states what it requires on one line, keeping the roles it accepts as alternatives to each other and a named policy as a demand on top of them.
  • Arc (Release v21.2.0): The value a generated claim requirement is matched against is written as a quoted string rather than as a bare word.
  • Components (Release v3.4.0): The Cratis baseline theme positions the dialog backdrop and centers the dialog; both rendered in normal flow below the page content.
  • Components (Release v3.3.4): Button from @cratis/components/Common now stamps its severity as a data-severity attribute, matching Tag, so the Cratis theme’s severity colors apply. Previously a severity='danger' button rendered in the primary color.
  • Components (Release v3.3.3): Button from @cratis/components/Common now forwards the native title and autoFocus attributes.
  • Components (Release v3.3.2): DataTableForQuery and DataTableForObservableQuery now accept a query proxy typed the way Arc generates them — QueryFor<Row[], Arguments> — while the row type is named explicitly (<DataTableForQuery<TheProxy, Row, Arguments>>). Previously that combination failed with TS2344, so a selectable table could only type its selection and onSelectionChange as object.
  • Components (Release v3.3.1): Button from @cratis/components/Common now accepts link, mapping to PrimeReact 11’s variant: 'link', alongside the existing text and outlined flags. A PrimeReact 10 <Button link /> previously rendered as a filled button.
  • Stage (Release v3.1.0): EventModelLoader merging multiple .play files together now carries ui profile, theme and layout declarations through - previously only modules/concepts/policies survived a multi-file merge, so a real project split across files would lose them entirely
  • Stage (Release v3.1.0): A screen’s navigate to directive is now translated instead of failing the conversion
  • Stage (Release v3.1.0): ui profile’s theme and layout references, a form’s on submit navigate to, and a slot’s contributes have no field on the corresponding Scene types yet - all called out as deliberate, documented gaps rather than silently dropped.
  • Stage (Release v3.1.0): A screen with no template directive (a Level 1 “intent” screen, where Studio generates the component) fills the layout’s content slot directly and names no template - which is exactly what Screen.ScreenTemplate documents null to mean. Nothing is synthesized for it.
  • Stage (Release v3.1.0): A document that declares no layout at all gets one synthesized shell for the whole application, never one per screen.
  • Arc (Release v21.19.0): Fixed normal generated @field and @derivedType proxies so they compile and run with TypeScript standard decorators through Fundamentals 7.18.0 while remaining compatible with legacy decorators. (#2440)
  • Components (Release v2.9.1): TimeMachine/Properties.css used // for its license header, which is not a comment in CSS. It shipped that way in both dist/esm and dist/cjs, so a consumer building with Vite’s lightningcss minifier had the whole bundle rejected. It is now the /* */ form every other stylesheet in the repo already uses.
  • Fundamentals (Release v7.18.0): Fixed NuGet restore failures caused by duplicate case-insensitive Handlebars package pins.
  • Arc (Release v21.17.1): useObservableQuery and useObservableQueryWithPaging now always establish a fresh subscription when a query’s arguments change, even when the argument object’s key count changes between renders (e.g. going from no arguments to an object, or back) (#2551)
  • Stage (Release v3.0.1): The 3.0.0 release can be published — package validation no longer fails the pack on the deliberate breaks that taking Screenplay 3 introduced
  • Stage (Release v3.0.1): A binary break is caught in the pull request that causes it, rather than failing the release after merge
  • Screenplay (Release v3.0.1): A binary break is caught in the pull request that causes it again, rather than failing the release after merge (#113)
  • cli (Release v2.8.1): cratis llm-context no longer describes large result sets as “catalogues” — the event-types list and read-models list descriptions now use American English like the rest of the CLI.
  • Screenplay (Release v3.0.0): A malformed trigger reported both its own error and “reaction states no trigger”, so one mistake produced two diagnostics and the second pointed at the header rather than at the line to fix (#102)
  • Screenplay (Release v3.0.0): A trigger declaration is now carried through when a folder is compiled as one application (#102)
  • cli (Release v2.8.0): The table you were looking at never refreshed — rows only rebuilt while a view was inactive, so a live dashboard sat frozen
  • cli (Release v2.8.0): F did nothing when the sidebar had focus, which is every view you reach by navigating there
  • cli (Release v2.8.0): Tables collapsed to a few rows instead of filling the height, and the store and namespace pickers opened as a box that was mostly chrome
  • cli (Release v2.8.0): A sorted table that refreshes can’t reach the comparer that throws At least one object must implement IComparable — every column gets a typed comparer when the table is built (#47)
  • Screenplay (Release v2.6.1): The build no longer fails with CS9057 when the SDK’s code-style analyzers are built against a newer Roslyn than the pinned compiler
  • Arc (Release v21.17.0): StoryContainer, StorySection, StoryGrid, StoryDivider and StoryBadge rendered as unstyled block elements in every consumer — the package emitted story-* class names and shipped no CSS defining them (#2544)
  • Arc (Release v21.15.0): Screenplay options are resolved once, at whichever entry point sees them first, so emitting a model directly and reaching the same model through a generation no longer resolve the domain name against two different fallbacks (#2401)
  • Chronicle (Release v16.33.1): Manual PII release falls back to the read model Id when its [Subject] member is null or NotSet, and warns when no usable subject exists. (#3708)
  • Chronicle (Release v16.33.0): Event Types view pagination that limited display to 20 items and broke column filtering (#3396)
  • Arc (Release v21.14.3): Fixed the TypeScript proxy generator producing a different module layout for the same C# source depending on whether the project was built Debug or Release — an enum declared in its own file could end up as its own module in one configuration and folded into a neighbouring module in the other, with whichever configuration was built last deleting the other’s output from disk (#2547)
  • Stage (Release v2.4.0): Consuming the renderer no longer contributes 28 global usings to the consuming project, which made User, AppendedEvent, CommandContext and ObserverRunningState ambiguous — 160 compilation errors in the CLI alone. (#34)
  • Stage (Release v2.4.0): Consuming the renderer no longer brings the Arc, Chronicle and MongoDB runtime it generates code for, nor a NuGet.Frameworks that stops Microsoft.Build.Locator from running. A host can now render and use MSBuild in the same process. (#34, #18)
  • cli (Release v2.6.2): cratis screenplay generate no longer captures projections declared inside specifications as though the application shipped them, which made a read model appear to be built more than once and stopped the generated document from compiling.
  • Arc (Release v21.14.2): A type a specification declares is no longer captured as an artifact the application ships. A fixture declared to assert something about a contract is Debug-only and stripped from any deployed build, and where it stands in for a real artifact — a second projection over a read model that already has one — the captured document said the read model was built twice, which is not legal Screenplay, so the document did not compile and nothing downstream could read it.
  • Chronicle (Release v16.30.1): Tls.SkipCertificateValidation and the connection string’s skipTlsValidation no longer combine so that an omitted value overrides an explicit one — either setting alone is now enough to turn certificate validation on, and an omitted second setting can never silently turn it back off (#3606)
  • Chronicle (Release v16.30.1): A client connecting to a development kernel no longer fails the TLS handshake and then crashes with ObjectDisposedException on Grpc.Net.Client.GrpcChannel at the first call after the connect timeout
  • Chronicle (Release v16.29.1): IReadModels.GetInstances<TReadModel>() now releases (decrypts) [PII]-protected values for materialized (sink-backed projection) read models, matching GetInstanceById<TReadModel> and the reducer/passive branch of GetInstances. Previously, calling GetInstances on a projected read model with PII properties returned ciphertext silently. (#3703)
  • Arc (Release v21.14.1): The proxy generator releases its metadata load context when initialization fails part way through, instead of leaking it and its assembly resolving handler until the next run
  • Arc (Release v21.14.1): The proxy generator no longer fails when more than one copy of Cratis.Arc.Core is loaded while resolving handler declarations outside the current project graph
  • Stage (Release v2.3.0): A $context path in a produces mapping is rendered against what the enclosing artifact actually receives, so a rendered application compiles. A command handler receives Arc’s CommandContext, which carries none of Occurred, Identity, Tenant, CausedBy or Causation — those belong to Screenplay’s own context type — and rendering them as members of it produced 15 compilation errors on the language’s own invoicing.play. The handler now asks the runtime for what the document reads: the tenant from ITenantIdAccessor, the caller from IIdentityProvider, roles and claims from ICurrentPrincipalAccessor, the cause from ICausationManager, and $context.occurred from the clock. (#32)
  • Stage (Release v2.3.0): A context value the document maps onto a property that cannot hold it — the runtime’s string tenant onto a Uuid concept — is dropped and reported instead of rendered into a conversion that does not exist. (#32)
  • Stage (Release v2.3.0): A command handler reading $eventContext or $eventSourceId, which it runs too early to have, is reported rather than rendered. (#32)
  • Arc (Release v21.14.0): formRef documentation no longer implies an inline callback ref attaches only once; it attaches on every render, so a stable ref is required (#2497)
  • Chronicle (Release v16.27.0): Schema validation now checks property value types, so a payload whose value does not match its declared type is rejected at append instead of being reported as valid (#3613)
  • Chronicle (Release v16.27.0): An object schema handed a non-object value now reports a wrong-property-type error; the check was inverted and fired only when the schema did not want an object (#3613)
  • Chronicle (Release v16.26.3): ReadModelScenario no longer drops a child collection when one event type both maps parent fields and feeds a child projection, in both the Children(...).From<T> and AddChild(...) forms and for model-bound [ChildrenFrom<T>] (#3689)
  • Arc (Release v21.13.0): The unknown tenant-resolver-type error now lists Subdomain and Fixed, which it omitted (#2478)
  • Chronicle (Release v16.26.2): Kernel event types are re-registered for the System event store after ResetKernelState(), so the kernel’s own events — such as ApplicationAuthenticated on every authentication — keep appending instead of failing with MissingEventSchemaForEventType for the rest of the kernel’s lifetime (#3687)
  • Chronicle (Release v16.26.2): ReadModelScenario<T> isolates each read model instance’s state by event source, so [ChildrenFrom] children no longer accumulate onto a document seeded later in the same scenario (#3688)
  • Chronicle (Release v16.26.1): Source/Kernel/Contracts builds in Release again — protobuf-net.BuildTools 3.3.8 asks for a [ProtoModel] partial class, but that attribute is protobuf-net 3.3+ and protobuf-net.Grpc 1.2.2 holds the runtime below it, so the diagnostic is now opted out of with a note to adopt compile-time serializers deliberately once the runtime moves up (#3696)
  • Arc (Release v21.12.1): waitForFirstResult=true on a MongoDB collection-backed observable query now resolves on the initial query result instead of the empty seed emission that preceded it (#2535)
  • Arc (Release v21.12.1): A subscriber that connects to a MongoDB observable query after its initial query completed now receives that result, rather than waiting for the next change
  • Arc (Release v21.12.0): Generated TypeScript import statements for generic types now reference the correct proxy file name
  • Stage (Release v2.2.1): A command validation rule stated against a value the application resolves while it runs — dueDate > today, or a threshold naming another property — is no longer carried with a substituted operand. Screenplay allows it, a Stage rule holds a fixed value, and the conversion filled the gap with 0 (or, for matches, an empty pattern), so dueDate > today became “greater than zero”. The rule is dropped instead, leaving a caller free to report what was not carried rather than reading a rule the document never stated.
  • Arc (Release v21.10.0): A client-composed validation failure no longer loses its reason, which had reported every such result as an authored rule (#2487)
  • Arc (Release v21.9.2): Report SP0030 for a property whose type is an interface or an abstract class. The document names such a type without ever declaring it, and until now nothing said so — only a constructed generic or a type parameter was recognised, and a contract matched neither. (#2527)
  • Arc (Release v21.9.1): Start a Development application that uses a Chronicle command response value. Arc’s discovered extension points were resolved from the root service provider, so a handler depending on the scoped IEventLog could not be created once the host turned scope validation on, and every such command threw. (#2505)
  • Arc (Release v21.9.1): Resolve command filters, command execution scopes and query filters from the scope the work runs in, so an implementation of any of these that depends on a scoped service works instead of throwing in Development. (#2505)
  • Arc (Release v21.6.3): Generating from a single project again names the document after that project, instead of falling back to the neutral default. Handing over the projects it references made the application several projects, and several projects are named by none of them (#2521)
  • Stage (Release v2.1.0): A binary break in a published contract now fails the build instead of surfacing as a missing-method fault in a consumer at run time.
  • Stage (Release v2.0.2): Rendering now reports a readmodel and a reducer it does not render, instead of dropping them silently. A slice declaring either previously rendered an application that looked complete while nothing held or populated the state they declare.
  • Arc (Release v21.6.2): Generating a Screenplay document no longer fails with SyntaxTree is not part of the compilation on an application written as several projects. A scenario naming a value another project declares - a sentinel identity, a well known identity, a member of an enumeration - is now read through the project that actually holds it, so it is recognized for what it is instead of taking generation down with it (#2521)
  • Arc (Release v21.6.2): A value a scenario states that no handed-over project declares is now left unrecovered and reported, rather than throwing (#2521)
  • Stage (Release v2.0.1): Restored the Release build, which stopped compiling when Roslynator 4.16.0 promoted RCS1258 to flag a redundant TypeAttributes.Class flag. The flag is zero, so the emitted dynamic read-model and command types are unchanged.
  • Arc (Release v21.6.1): A generated command proxy declares an optional property as optional, so its accessors carry | undefined instead of claiming a value is always present (#2494)
  • Chronicle (Release v16.25.0): An Aspire AppHost that configures Chronicle for production now runs the production image, instead of the development image that ships development credentials and an anonymous state-reset endpoint (#3607)
  • Chronicle (Release v16.25.0): A TLS certificate without a password now loads, instead of failing the server’s startup with a cryptographic error
  • Chronicle (Release v16.25.0): A certificate path that does not exist now fails the AppHost immediately, instead of producing a container that reports itself running while its process has died (#3607)
  • Chronicle (Release v16.25.0): Configuring either certificate twice now replaces the earlier call, instead of producing a container Docker refuses to start (#3607)
  • Arc (Release v21.6.0): An apex domain no longer resolves to a tenant named after the site (#2471)
  • Arc (Release v21.6.0): An IPv4 or IPv6 literal is no longer read as a tenant, in any spelling (#2471)
  • Arc (Release v21.6.0): IHttpRequestContext.Host no longer truncates an IPv6 literal to its opening bracket (#2471)
  • Chronicle (Release v16.24.1): Applying or releasing compliance no longer fails with CompliancePropertyNotFoundInSchema when a read model or event carries a [PII] value alongside a geospatial Point, LineString or Polygon; the geospatial value is left in the clear (#3673)
  • Components (Release v2.8.0): StepperCommandDialog no longer offers to cancel a command it has already committed to running, so an operator can no longer be told a write was cancelled while it lands
  • Components (Release v2.8.0): The header close and Escape are withdrawn while a StepperCommandDialog command is running, matching the footer Cancel
  • AuthProxy (Release v2.17.5): An invitation link no longer asks for an identity provider a second time after signing in, and completes on the first attempt.
  • AuthProxy (Release v2.17.5): /invite and /register are answered by the invitation and registration flows in every deployment, instead of being redirected to provider selection wherever a catch-all route covers them.
  • Arc (Release v21.5.0): useQuery settles as unsuccessful when a query fails in transport, carrying the exception message, instead of reporting that it is still performing forever (#2473)
  • Arc (Release v21.5.0): An aborted, superseded query request can no longer settle over the newer request that replaced it (#2473)
  • Arc (Release v21.5.0): CommandForm no longer lets an initialValues key holding undefined overwrite a value that currentValues resolved (#2493)
  • AuthProxy (Release v2.17.4): Accepting an invitation no longer shows a second provider-selection page: the invitation now completes on the provider sign-in callback itself, so it no longer depends on the browser presenting the fresh session cookie on the follow-up request.
  • AuthProxy (Release v2.17.4): After a completed invitation, the sign-in redirects straight to the lobby for a create-organization invitation and to the original return URL for a tenant-issued one; a failed exchange on the callback answers with the same page or redirect the post-login exchange produces.
  • AuthProxy (Release v2.17.4): A browser replaying the invitation URL or a stale pending-invitation cookie after completion is recognized as already answered instead of being offered provider selection again or re-running the exchange.
  • Chronicle (Release v16.24.0): PII is now released on the non-generic IReadModels.GetInstanceById(Type, ...) for reducer-backed read models, which is how reactors resolve read model parameters — it previously returned encrypted values (#3605)
  • Chronicle (Release v16.24.0): A read model instance request for a reducer-backed read model is made against the event sequence that reducer reduces from, rather than always the event log (#3605)
  • AuthProxy (Release v2.17.3): Accepting an invitation no longer loops back to provider selection after a successful sign-in: the completion gate now accepts any session that was signed in while the invitation was pending — the person’s deliberate choice for it — and only a session that predates the invitation is taken through provider selection. This repairs the regression 2.17.2 introduced for deployments where the challenge’s capability binding does not survive the provider round trip.
  • Chronicle (Release v16.23.0): The duplicate context-mapping diagnostic now reports two [SetFromContext<T>] for one event type split across a positional record’s parameter and its generated property (#3626)
  • Chronicle (Release v16.23.0): [EventSourceType] and [EventStreamType] no longer document a placement on an event type that nothing reads (#3642)
  • AuthProxy (Release v2.17.2): An invitation is now completed only with the identity that authenticated for that invitation. A session the browser was already carrying — from an earlier sign-in, possibly with a different provider — no longer completes a pending invitation, so an organization can no longer be bound permanently to an account the person did not choose for it.
  • AuthProxy (Release v2.17.2): A caller who is already signed in and opens an invitation link is now always shown the invitation provider-selection page, including where only a single identity provider is configured, and the invitation completes with the identity that comes back from the provider they pick.
  • AuthProxy (Release v2.17.2): A pending invitation is left in place when it cannot yet be completed, so it stays valid for the lifetime of the .cratis-invite cookie instead of being consumed by the wrong session.
  • AuthProxy (Release v2.17.2): Invite-token re-validation at the post-login exchange is unchanged: a forged, expired, or otherwise invalid capability is still refused with invitation-invalid.html / invitation-expired.html and cleared from the browser before anything else is decided.
  • AuthProxy (Release v2.17.1): Microsoft sign-ins and credential links through a multi-tenant authority (common, organizations, consumers) no longer fail issuer validation (IDX10205) — the issuer is validated against the tenant the token itself names, for both organizational and personal accounts.
  • AuthProxy (Release v2.17.1): Sign-ins and credential links are now attributed to the identity provider that was actually challenged, instead of falling back to the meaningless AuthenticationTypes.Federation some providers leave as the principal’s authentication type.
  • Arc (Release v21.3.1): CommandResult.MergeWith now carries the AuthorizationFailureReason from merged-in results: when the result’s own reason is empty, the first non-empty reason from the merged results is used, and an already-set reason is never overwritten. Previously a command filter rejecting with CommandResult.Unauthorized(correlationId, reason) surfaced as an unauthorized result with a blank reason, leaving callers with no explanation for the rejection.
  • AuthProxy (Release v2.17.0): OIDC sign-ins and credential links no longer fail with “Correlation failed” and loop through provider selection (Cratis/StudioIssues#104)
  • AuthProxy (Release v2.17.0): A failed link challenge ends on the link-failed page instead of the sign-in selection page, which offered full sign-ins that would replace the preserved session (Cratis/StudioIssues#104)
  • Chronicle (Release v16.22.2): Registering projection definitions that are identical to the ones already registered no longer repeats the registration fan-out - the kernel only processes definitions that are new or changed, so restarting or reconnecting clients of the same version register near-instantly and queued duplicate registrations collapse instead of piling up
  • Chronicle (Release v16.22.2): The .NET client no longer stacks registration retries: RegisterAll runs as a single flight per event store - a call arriving while a registration is in flight joins that run instead of sending a duplicate - and a run that follows a failure waits an exponentially growing, jittered backoff before hitting the kernel again
  • Chronicle (Release v16.22.2): An interrupted registration is retried in full on the next attempt instead of being skipped as already registered
  • Components (Release v2.7.2): Hover tooltips on the outermost buttons of a ToolbarFanOutItem panel are no longer clipped at the panel’s edge. The clip-path that drives the reveal wipe is now released once the wipe has landed, and restored before the panel closes, so both animations keep their exact timing.
  • Components (Release v2.7.2): A ToolbarGroup that hosts a slot no longer clips the fan-out and folder panels of the buttons inside it — the slot section is only clipped while outgoing content is cross-fading out.
  • Components (Release v2.7.1): A stepper counts only the steps it actually renders. A conditionally rendered panel still reaches it as a child, so a hidden step was counted: Submit never appeared on the real last step, a dead Next took its place, and clicking it landed on a step with nothing in it. Each hidden step cost another click, and the per-step validation gate read past the end of its own array and stopped blocking (#120)
  • Components (Release v2.7.1): A step that disappears after the user has already passed it no longer strands the wizard. The index is kept within the steps that still exist, so Submit stays reachable, Previous moves rather than absorbing a click per vanished step, and hiding every step no longer leaves a dead Next behind (#120)
  • Components (Release v2.7.1): A data page keeps its paginator inside the height it was given. The table grew to its content instead of filling the pane, so a full page of rows pushed the paging controls past the bottom of the frame and clipped them, leaving no way to reach the next page. A short page fit and looked correct (#126)
  • Components (Release v2.7.1): A data page with a details component keeps its paginator in frame too. The split view sizes its panes from a stylesheet the package never imported, so the pane grew to content and clipped the paginator exactly as before, and the two panes stacked instead of siding. The stylesheet now ships with the component, so there is nothing for a consumer to import (#126)
  • Chronicle (Release v16.22.1): The compliance key cache no longer restores a key that was deleted or evicted while a read of it was in flight. The cache releases its lock to call the backing store and takes it again to record the answer; an erasure landing in that window was overwritten by the older answer, so a shredded key came back and was served again
  • Chronicle (Release v16.22.1): An erasure no longer leaves the key cacheable for the length of the durable delete. The cache was cleared before that call, so a read starting afterwards could still find the key in the store and cache it, and cached keys have no time-to-live. Erasing one revision no longer evicts the others
  • Chronicle (Release v16.22.1): A partially failed erasure still clears the cache rather than keeping a key that may already be destroyed, and still evicts from every silo. A composite key store attempts every store and then reports the failure, so the key can be gone and the call still throw
  • Chronicle (Release v16.22.1): Saving a key no longer loses to a read that began before it. After a rotation the cache could serve the superseded key, so values encrypted under the new revision failed to decrypt until something evicted the entry
  • Arc (Release v21.3.0): A command that did not succeed no longer carries its response value. The value was bound before execution scopes completed, and a commit-time constraint or concurrency failure returned it alongside the failure, serialized into the error body — so a caller could act on a value produced by a command whose transaction rolled back (#2495)
  • Arc (Release v21.3.0): Model-bound IAsyncEnumerable observable queries now work over WebSocket and Server-Sent Events. Both transports previously failed on connect: the observable was cast to an interface it does not implement and the null dereferenced before a single item was streamed
  • AuthProxy (Release v2.14.0): Canonical OIDC sessions are resolved against the scheme that authenticated the request instead of the identity’s AuthenticationTypes.Federation authentication type — previously every proxied request on such a session went out without identity headers, leaving the application blank after a seemingly successful login
  • AuthProxy (Release v2.14.0): Logout documentation now lists the complete set of cookies actually cleared, including .cratis-identity-authorization, .cratis-invite-state, and the transient handshake cookies
  • cli (Release v2.5.0): A multi-targeted project was read once per target framework, and its spec projects were not recognised as such, so spec code entered the generated document
  • cli (Release v2.5.0): Projects that cannot declare a command or an event are no longer read when generating from a solution, so test hosts and analyzer projects stop describing the application
  • cli (Release v2.5.0): Generating against a solution that has not been restored reported every consequence of the missing restore instead of the missing restore itself
  • Chronicle (Release v16.22.0): Rejected seed batches no longer disconnect clients or trigger reconnect loops; they remain unseeded for correction. (#3662)
  • Chronicle (Release v16.22.0): ReviseEvent resolves IEventSerializer in the current event-store scope. (#3663)
  • Chronicle (Release v16.22.0): Compliance-key erasure attempts every configured store and reports incomplete erasure. (#3664)
  • Chronicle (Release v16.22.0): An unavailable compliance key store is reported as unavailable, not as a missing key. (#3665)
  • Chronicle (Release v16.22.0): Refused or unconvertible join writes are logged as warnings without exposing key values. (#3656)
  • Prologue (Release v1.2.0): A slice declaring more than one projection now generates all of them. Only the first was emitted, and the rest were dropped silently.
  • Chronicle (Release v16.21.0): Prevent CHR0043 from hanging or losing AutoMap state across helper-returned and member-held projection builders. (#3614)
  • Chronicle (Release v16.21.0): Resolve integration fixture services from scenario-owned scopes and always complete database cleanup. (#3649)
  • Chronicle (Release v16.21.0): Prevent Orleans MongoDB services from capturing Arc scoped clients regardless of registration order. (#3650)
  • Stage (Release v1.4.0): A slice referencing an event declared in another slice produced code that did not compile, because no using was emitted for the declaring namespace
  • Stage (Release v1.4.0): State View and reactor slices never rendered the events they declare
  • Stage (Release v1.4.0): Scaffolding wrote the template’s placeholders verbatim, so the project’s target framework, name and solution reference were literal text
  • Stage (Release v1.4.0): [FromAll] was placed on a read model type rather than a property
  • Stage (Release v1.4.0): A projection whose key names an event property crashed the slice it belonged to
  • Stage (Release v1.4.0): An expression or condition that cannot be rendered produced an always-true guard or a null value, silently changing behaviour
  • Stage (Release v1.3.0): Every command execution opened a brand-new event stream, so a register-then-update lifecycle was impossible
  • Stage (Release v1.3.0): The specs did not run in CI: the workflow tested a Release build, which strips every spec file, so it passed having discovered none
  • AuthProxy (Release v2.13.2): Fixed the sign-in page a caller sees after being redirected to accept an invite or from any other unauthenticated deep link no longer matching the branded selection page shown on a direct visit to /. SelectProviderMiddleware deferred any request under /.cratis/select-provider to a separate fallback endpoint instead of answering it directly, so a redirect there (the cookie authentication handler’s OnRedirectToLogin, and the invite flow, both redirect there whenever more than one provider is configured) never reached the page a deployment customizes via PagesPath.
  • AuthProxy (Release v2.13.2): Fixed the single-provider direct-challenge redirect landing back on the selection page’s own wrapper URL instead of the caller’s real destination when reached this way.
  • AuthProxy (Release v2.13.1): Fixed the login-selection page (and any other bundled wwwroot asset) rendering a blank page for anyone signing in or accepting an invite. UseIngress() never called app.UseRouting() explicitly, so once the reverse proxy had a configured backend — the case in every real deployment — ASP.NET Core’s implicit routing insertion matched the proxy’s catch-all route against every request, including AuthProxy’s own bundled assets. UseStaticFiles() is endpoint-aware and skips serving a file once a route is already matched, so every asset request fell through to SelectProviderMiddleware, which refuses unauthenticated, non-navigating callers with a 401.
  • Components (Release v2.7.0): A dialog with a custom footer or buttons={null} left focus on document.body, outside the modal. BusyIndicatorDialog shipped in that state; focus now moves to the dialog’s title.
  • Chronicle (Release v16.34.1): The custom per-column filter dropdowns on Event Types, Read Model Types and Observers. PrimeReact 11 has no filterElement, so those columns use the built-in filter menu; the columns still filter, but over raw values rather than labelled option lists.
  • Chronicle (Release v16.34.1): The password mask toggle on the login screen and the ripple effect on sidebar items, neither of which PrimeReact 11 provides.
  • Chronicle (Release v16.34.1): Expand/collapse of row groups on Connected Clients and Events Seeding — PrimeReact 11 groups rows but cannot collapse a group. The subheaders remain.
  • Scene (Release v2.0.0): cascadeSelect, inputMask, treeTable and virtualScroller are no longer declared. PrimeReact 11 removed all four with no equivalent and no headless hook. Use dropdown with grouped options or treeSelect instead of cascadeSelect, inputText with validat
  • Arc (Release v21.19.0): Removed the v21.18 opt-in explicit metadata registration option from MSBuild, CLI, and programmatic proxy generation. (#2440)
  • Chronicle (Release v16.32.0): [SubjectFrom], [ReleaseUnder], CHR0038, and CHR0044 because projection provenance now provides ownership automatically. (#3644)
  • Chronicle (Release v16.31.0): The unrouted sequences prototype built on view models over mock data, along with its bookmark tree and mock histogram
  • Stage (Release v2.4.0): Cratis.Stage.Rendering.Cratis no longer depends on Cratis, Cratis.Arc.MongoDB, Cratis.Templates or the three Microsoft.TemplateEngine.* packages. The package is Cratis.Stage.Contracts and Cratis.Screenplay and nothing else. (#34, #18)
  • Stage (Release v2.4.0): TemplateEngineProjectScaffolder, SampleSlice, ScaffoldingFailed, TemplateNotFound and TemplatePackageNotFound move to the new scaffolding package, keeping their namespace. (#34)
  • Arc (Release v21.6.0): The UseSubdomainTenancy(fallbackHeaderName) overload — subdomain tenancy now requires a base domain, and the header name is the second argument (#2471)
  • Stage (Release v2.0.0): $secrets expressions no longer render, following their removal from the Screenplay language.
  • Chronicle (Release v16.26.1): SSH.NET moved to 2026.0.0 in every project that uses Testcontainers, past GHSA-q939-rpr3-3284 (arbitrary file write via server-controlled SCP filenames). Testcontainers 4.13.0 still depends on the affected 2025.1.0, so the projects using it reference SSH.NET directly to pull the transitive dependency forward
  • Stage (Release v2.2.0): A read model is now guarded by the authorization declared by the queries that read it, instead of by every query in its slice. A slice declaring several read models rendered each of them with the union of all their queries’ authorization, so a single unguarded query on one read model rendered the others as [AllowAnonymous] — the rendered application was more permissive than the document it came from.
  • Chronicle (Release v16.25.0): An Aspire AppHost configured for production no longer runs a development-compiled Chronicle, which seeds a documented default administrator password and a fixed OAuth client secret, and exposes an unauthenticated endpoint that erases the event store (#3607)
  • Arc (Release v21.6.0): Subdomain tenancy configured without a valid base domain now fails at startup, instead of resolving no tenant from any host and falling back to a client-supplied header that selects the namespace and database (#2471)
  • AuthProxy (Release v2.18.0): A configured sign-in notification that cannot be signed is no longer sent at all, rather than falling back to an unsigned call (#82)
  • AuthProxy (Release v2.18.0): Signing refuses an RSA key smaller than 2048 bits (#82)
  • AuthProxy (Release v2.18.0): A sign-in notification endpoint carrying a query string is rejected at startup, because the route binding deliberately excludes the query and would otherwise leave it unprotected (#82)
  • AuthProxy (Release v2.18.0): The attestation signing contract no longer renders its private key when written as text (#82)
  • Chronicle (Release v16.22.0): Rejected seed diagnostics omit event-source IDs and constraint messages that may contain compliance subjects. (#3662)
  • Chronicle (Release v16.30.0): [ReleaseUnder] in favor of [SubjectFrom]; it still compiles and behaves identically, and now warns at the point it is applied (#3601)