Release digest: August 10 - 17, 2026 (Week 33)
Version movement
Section titled “Version movement”| 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’sdefaults) together with a@primeuix/themespreset, emitted into theprimereactcascade layer so an application’s own CSS overrides the theme as it did on PrimeReact 10.CratisPresetis Lara on the blue primary and gray surfaces oflara-light-blue/lara-dark-blue; any preset can be passed instead.@primereact/stylesand@primeuix/themesare 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 thelara-bluevalues in both schemes, so CSS written against them keeps resolving. - Components (Release v3.4.0):
Messagerenders the severity glyph PrimeReact 10 showed; aniconprop replaces or removes it. - Components (Release v3.3.0):
Buttonfrom@cratis/components/Common— preserves PrimeReact 10’slabel/icon/loading/tooltip/text/outlinedauthoring model over PrimeReact 11’s children-onlyButton. Accepts a PrimeIcons class name or an element foricon, renders a spinner whileloading, and setsiconOnlyautomatically 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,Chartand a plain-arrayDataTable— so the existinglabel/iconand<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 compositionalMessage.Root/Content/Textparts. - Components (Release v3.2.0):
ProgressSpinner— an indeterminate spinner from@cratis/components/Display, preserving the flat<ProgressSpinner />call shape over PrimeReact 11’sRoot/Track/Rangeparts. - Components (Release v3.1.0):
DataTableCoreis now exported from@cratis/components/DataTables, so an application can render rows it already holds — fetched by hand, computed, or assembled from several sources — withColumnchildren, selection, filtering and scrolling, without driving a query throughDataTableForQueryorDataTableForObservableQuery. - 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,scrollTopandimage. - Scene (Release v2.0.0):
MenuItemandTreeNodeare exported from@cratis/scene.primereact. PrimeReact 11 removedprimereact/menuitemandprimereact/treenode, and the authored{ label, icon, items }shape was always Scene’s vocabulary. - Components (Release v3.0.0):
@cratis/components/Notifications—Toaster, the imperativetoast, andtoastCommandResult(result)mapping an ArcICommandResultto 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,ToggleSwitchFieldandRatingFieldforCommandForm - Components (Release v3.0.0):
Column(with per-column filter menus),StepperPanelandActionMenubaras Cratis-owned replacements for theprimereactmodules 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):
dismissableandcloseAriaLabelonDialog - 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 profileper 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.
IsCompleteis the single check a build gates on. (#39) - Stage (Release v3.2.0): A
ui profile’slayoutandthemenow survive translation intoCratis.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):
UiProfilegainedLayoutandTheme— the application shell a target renders inside, and the visual theme it applies. Screenplay’sui profilecould 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.Modelinstances - 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 existingLoadFromDirectoryAsync, to load the translated model from a directory of.playfiles - Scene (Release v1.0.0): Packages. A
ui profilelists packages by name;ScenePackageis 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 areComponentLibrary,StylingandBlueprint. - Scene (Release v1.0.0): Dependency resolution.
PackageDependencyResolverexpands 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.PackageCataloganswers 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.
ScreenTemplateis a reusable shape that goes inside a layout, at module, feature or slice level;FitsSlotnames the slot on its parent it fills, andScreenTemplateResolverturns those names into a tree. The same rule applies at every level, so nesting has no depth limit.DialogTemplateis the same for overlays, which fill no slot. - Scene (Release v1.0.0): Themes carry attribution.
Themegained design tokens plusAuthor,AuthorUrlandLicense, 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 keepcontributes <ContributionPoint>, which makes the shell the natural home of an application-wideNavigationpoint. - Screenplay (Release v4.0.0):
layout <Name>on aui profile, exactly parallel to the existingtheme <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 nofits 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 templatesdocumentation 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
ReactorDeliveryparameter 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. Usedelivery.Idas 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
clearstatement.clear <property>takes a value away, alongsideincrement,decrementandcount, and accepts a property path soclear owner.noteclears a member of a nested object.property = nullstill compiles to exactly the same mapping (#3711) - Chronicle (Release v16.34.0):
CHR0048reports 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.previousholds 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-certificatesreports 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> = nullkeeps parsing exactly as it does today - Screenplay (Release v3.1.0):
ClearMappingSyntaxandScreenplaySyntaxWalker.VisitClearMappingfor consumers walking the syntax tree, with printing that bringsclearback out asclear - Screenplay (Release v3.1.0):
clearin 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
wherecondition is reported, since the rendered handler runs for every occurrence - Screenplay (Release v3.0.0):
reaction <Name>— behavior that runs when something happens, replacingreactor(#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, andat <HH:mm>optionally narrowed byon <Weekday>oron 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):
TriggerDefinitionandIScreenplayLanguageRegistry.Triggers, so a consumer can register a trigger and optionally state what an occurrence carries (#102) - Screenplay (Release v3.0.0): Built-in
StartupandShutdowntriggers (#102) - Screenplay (Release v3.0.0): Reaction and trigger support in the Monaco language service and the VS Code extension, including completing the commands
invokescan name (#102) - Screenplay (Release v3.0.0): Reactions and Triggers documentation pages, with the matching EBNF productions (#102)
- release-action (Release v1.2.0):
reasonoutput 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
Fin 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 optionalFlowArrangement/FreeformSlotArrangementdescribing how a layout’s own named slots position relative to each other, filling a gap where Screenplay’stemplate/row/column/grid/variantconstructs (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 toFlowLeaf/ElementPlacement, used only within aLayout’s own arrangement tree - Scene (Release v0.7.0):
FreeformSlotArrangementEvaluator(+ TypeScriptevaluateFreeformSlotArrangement): selects aLayout’s macro placement variant for a size class, mirroringFreeformArrangementEvaluator - Scene (Release v0.6.0):
UiStartermodel 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 sandboxedUiProfilea 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()andIsCompatible()/isThemeCompatible()- reuse the exact rule Screenplay’s compiler already applies (ValidateThemes): every package aui profiledeclares must be in the theme’scompatibleWithlist, with no implicit exemption forcore. 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, whichScene.Reactscopes 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 explicitorder(unordered contributions sort after every ordered one, in their original relative order). Resolving which contribution point acontribute totargets already happens before aContributionexists inScene.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):
NavBarwidget (@cratis/scene.react) - renders the aggregatedNavigationcontributions. Hownavigate to <Screen>becomes a concrete route is a caller-suppliedrenderRoutecallback 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 aNavigationItemout of aNavigationcontribution’sExternalComponent.propertiesbag. - 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 matchingwhen 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):
FlowArrangementgained anOverrideslist (C#) /overrides(TypeScript) - the model previously had no field at all for Screenplay’swhen width/height <class>override construct, unlikeFreeformArrangementwhich 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) andresolveComponentName()(TypeScript,@cratis/scene.engine) - resolve a bare or package-qualified component name against aui profile’s package list. A bare name walks the package list from highest to lowest priority (corealways 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 patternscene-model-shape.jsonalready establishes forScene.Model’s shape. - Scene (Release v0.2.0): New
Cratis.Scene.EngineC# project, sibling toScene.Model, mirroring the existing TypeScriptmodel/enginepackage split - keepsScene.Model’s strict shape-parity manifest free of behavioral types. - Screenplay (Release v2.6.0):
arrangement flow(default) - a layout’stemplateblock can now nest slots underrow/column/gridcontainers with sizing attributes (width,height,grow,span,gap), and declarewhen width <compact|regular>[, height <compact|regular>](orwhen height ...alone) overrides that replace the tree for a given size class. A baretemplateof 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 declarevariant width <compact|regular>, height <compact|regular>blocks, each placing slots at pixel-precise coordinates withplace <Slot> at x,y size w,h(either dimension may befill) or hiding one withplace <Slot> hidden. Onescreen/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 anorientationprimitive. - Screenplay (Release v2.6.0): A
freeformlayout’svariantthat 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-PLAY0244for 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
flowfor most of a layout with one pixel-precisefreeformregion (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 profiletargeting a size class with no matchingvariant/whenshould 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 withCS9057- a pre-existing, unrelated issue (Microsoft.Net.Compilers.Toolsetpinned to5.6.0, the GH Actions runner’s SDK needs5.9.0+). Confirmeddotnet build/dotnet testpass 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.cssonce in your Storybook preview andStoryContainer,StorySection,StoryGrid,StoryDividerandStoryBadgerender as documented (#2544) - Components (Release v2.9.0):
AutoCommandForm- generates aCommandForm’s field list from the command’s ownpropertyDescriptorsinstead of writing one field per property by hand, choosing each field’s component by property type through aFieldTypeProviderregistry. Built-in providers coverstring,number,booleanandDate. - 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):
excludeprop onAutoCommandFormto 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 (alongsideui profile) declaring a named visual theme and the component packages it is compatible with, via one or morecompatible with <Package>lines. - Screenplay (Release v2.5.0):
ui profilegains an optionaltheme <Name>line selecting a theme. - Screenplay (Release v2.5.0): A
ui profileselecting 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):
CommandFormacceptspopulateFromQuery/populateFromObservableQuery(plus sharedpopulateFromQueryArgs) 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 outsideCommandForm. - Arc (Release v21.16.0): Two new field props (available on every field type, since they flow through
asCommandFormField):noInitialValueskips a field entirely;initialValueoverrides 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 -
hasChangesreadsfalseright 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 alayouttemplate 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 amodule(alongsidelayout,formandfeature) or on afeatureat any nesting depth. Carries an optionalnavigate to <Screen> [by <param>](reusing the exact navigation shape screens already use),label "<text>", andorder <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 alongsidelayoutinside amodule, and discovered by itsforbinding 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>]andpopulate 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.Formswas added as a trailing optional parameter (not inserted betweenLayouts/Features) to keep the change source- and binary-compatible with existing callers, matching the conventionApplicationSyntax.UiProfilesalready 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-packagesjob is expected to fail on this PR - it’s a pre-existing, repo-wideCS9057analyzer/compiler version mismatch (Microsoft.Net.Compilers.Toolsetpinned to 5.6.0 vs. the runner SDK’s 5.9.0+ codestyle analyzers), unrelated to this change and already occurring onmain. 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 namedcompact/regular/expandedclasses rather than raw pixel breakpoints), and an orderedpackageslist 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
packagesblock 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
screennever 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–PLAY0207for malformed/duplicateui profiledeclarations. - Screenplay (Release v2.2.0): A
ui profileround-trips through compile → print → recompile byte-identically. - Screenplay (Release v2.2.0): Resolving a bare widget name used inside a
screenagainst 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: theSceneElement → VisualElement → FrameworkElement → Control → Panel/ItemsControl/ContentControl/ExternalComponentelement hierarchy,Layout(flow and freeform arrangement per slot, width × height size classes),Form(the three population/mapping tiers), contribution points and navigation, andUiProfile/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 sharedscene-model-shape.jsonmanifest that both a C# spec (reflection over the assembly) and a TypeScript spec (walking each type’s ownPropertyNamesconst) assert against independently, so a desync on either side fails its own build. - Scene (Release v0.1.0):
@cratis/scene.engine— theRenderer<TOutput>contract a renderer implements (one method per concrete element kind), and arenderElement()tree walk. Binding resolution is injected via aBindingResolvercallback 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 smallcorecomponent 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 fromCratis/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 testclean (Debug + Release, 0 warnings),yarn ciclean across all three JS packages,yarn build-storybooksucceeds, 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 renderrenders 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.--targetchooses 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 passTemplateEngineProjectScaffoldertoCratisRendererto keep today’s behavior. (#34) - Stage (Release v2.4.0): A Screenplay
specificationexercising its slice’s command renders as a Cratis spec — aCommandScenario<T>in thewhen_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):
CHR0046warns 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):
CHR0047warns on aSetValuedeclaring null and onClearWithapplied 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):
useIsCommandExecutingfor reading whether aCommandForm’s command is currently executing (#2497) - Arc (Release v21.14.0):
formRefonCommandForm, exposingexecute()plusisExecuting,isValidandisAuthorizedto a parent rendering its own submit control (#2497) - Arc (Release v21.14.0):
onStateChangeonCommandForm, notifying a parent when execution, validity or authorization changes (#2497) - Arc (Release v21.14.0):
isExecutingon 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):
UseFixedTenancyandFixedTenantIdResolver, giving single-tenant production deployments a registration API that is not named for the development environment (#2478) - Arc (Release v21.13.0):
Tenancy:FixedTenantIdconfiguration, whichTenancy:DevelopmentTenantIdnow forwards to (#2478) - AuthProxy (Release v2.19.0):
WithInviteEmailBindingon 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
RequireRolecomponent 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):
isLoadingon 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):
ShouldHaveConstraintViolationForfor 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:MigrateFromDefaultStoragesupports 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:
WithTlsCertificateandWithEncryptionCertificateon 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.AddEventsfor ordered cross-source events and independently labelled exact concurrency scopes in the existing transaction (cratis/chronicle#3683) - Chronicle (Release v16.26.0): Add
IUnitOfWork.AddEventsfor 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 markedobservablein 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):
CommandDefinitionnow carries the command’sauthorizerequirement, itsrequirerules and itsreadsdeclarations (#23). - Stage (Release v2.1.0): Command authorization is carried as a requirement tree —
PolicyReferenceandLogicalRequirement— soA or B and Cstays 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):
ProducedEventnow carries the event source aproduces … forclause names (#23). - Stage (Release v2.1.0):
EventDefinitionnow carries the tags declared on the event (#23). - Stage (Release v2.1.0):
Specificationnow carriesgiven readmodelandthen readmodelsteps, which the existingSpecificationRunStepKind.ThenReadModelhad nothing to feed it (#23). - Stage (Release v2.1.0): A concept’s
@piiand@sensitiveattributes, 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):
WithTlsCertificateandWithEncryptionCertificateon 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 throughUseSubdomainTenancy(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 anIEventStoreready to inject, configured undercratis.chronicle. - Chronicle.Kotlin (Release v2.10.0): Spring Boot multi-tenancy: the injected
IEventStoreroutes 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):
IEventStoreNamespaceResolverfor 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:Attestationconfiguration, with rotating signing keys selected by key identifier, enabling the signed envelope (#82) - Components (Release v2.8.0):
StepperCommandDialogcan 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):
ResponseModesetting per OIDC provider (Querydefault,FormPostfor providers that mandate it, such as Apple) — choosingFormPostswitches that provider’s handshake cookies toSameSite=None; Secure - AuthProxy (Release v2.17.0): Embeddable credential-link flow:
/.cratis/linkserves a provider-selection page for the product to frame,/.cratis/link/completeends a successful link, and the pages report the outcome over aBroadcastChanneland an origin-checkedpostMessageto the embedding page - AuthProxy (Release v2.17.0):
Link:EmbedAncestorssetting naming the origins allowed to frame the link pages (selffor the proxy’s own origin); when empty — the default — the link pages sendframe-ancestors 'none'andX-Frame-Options: DENY - AuthProxy (Release v2.17.0):
link-select-provider.htmlandlink-complete.htmlwell-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 theDomainit 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 withPath=/and theSecureattribute 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.
Publicremains 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.BestEffortremains the default and behaves exactly as before, denying only on403(#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-failedpage 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
reasonquery 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 get401— instead of proxying the request without identity headers - AuthProxy (Release v2.14.0): A
Failed Sign-insdocumentation page covering thereasoncontract, handshake-cookie hygiene, and the forwardable-identity guard - cli (Release v2.5.0):
--modules-from-namespace-rootsonscreenplay generate, taking each outermost namespace segment as a module rather than nesting everything under one - cli (Release v2.5.0):
.slnfsolution filters are accepted as a generation target - Chronicle (Release v16.22.0):
Compliance:Encryption:MigrateFromDefaultStoragesupports 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
identifierproperty resolves the event source id at runtime; a command without one keeps getting a freshUuid - Components (Release v2.7.0):
initialFocusonDialog, forwarded byCommandDialog, choosing where focus lands when the dialog opens:DialogInitialFocus.Confirm(the default, unchanged),Cancel, orContent.Canceldegrades toContentwhere no dismissing button exists.
Changed
Section titled “Changed”- Components (Release v3.4.0):
Dropdownreadslabel/valueoff option objects when nooptionLabel/optionValueis 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-0and--cratis-surface-100resolve 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/typesandprimeiconsitself, since@cratis/components3.0.0 makes PrimeReact a peer dependency. - Chronicle (Release v16.34.1): Component styling comes from
@cratis/components/tokens,/stylesand/theme, imported once at the app and Storybook entry points. PrimeReact 11 ships no stylesheet, soprimereact/resources/themes/lara-dark-blueno 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.defaultand@cratis/scene.blueprint.componentsnow requireprimereact ^11.0.0,primeicons ^8.0.0and@cratis/components ^3.0.0, and declare@primereact/coreand@primereact/headlesswhere they import them directly. - Scene (Release v2.0.0): 13 abstract names follow a PrimeReact rename without changing their Scene name —
dropdownis nowSelect,calendarisDatePicker,overlayPanelisPopover,tabViewisTabs, and so on. - Scene (Release v2.0.0):
multiSelectis re-expressed overSelect’smultiple;orderListandpickListover@primereact/headlesshooks, which ship the behavior but no presentation. - Scene (Release v2.0.0): Theming is rebuilt on
@primeuix/themespresets. A theme is now an object handed toPrimeReactProviderrather than a stylesheet to load, so switching neither fetches nor flashes, and a theme name can no longer 404.usePrimeReactThemereturns 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):
PrimeReactProvideris 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/headlessandprimeiconsare now peer dependencies. Previouslyprimereactwas a regular dependency, so an app that also depended on it could resolve two copies — and two copies means twoPrimeReactProvidercontexts, which makes overlays stack wrongly andpt/unstyledsilently not apply, with no error. Apps that carried aresolutions/overridespin to work around this can delete it (#118) - Components (Release v3.0.0): Component CSS now ships through the
@cratis/components/stylesentry point instead of being imported by each component. Apps mustimport '@cratis/components/tokens'andimport '@cratis/components/styles'explicitly../stylesalso vendors theallotmentstylesheetDataPageneeds, 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/*.cssis gone. Supply a@primeuix/themespreset throughCratisComponentsProvider(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
Columnfrom@cratis/components/DataTablesandStepperPanelfrom@cratis/components/CommandDialog; the authoring model is unchanged - Components (Release v3.0.0): Data-table selection reports a
DataTableSelectionChangeEvent(event.valueunchanged), replac - Stage (Release v3.2.0):
Cratis.Stage.ContractstakesCratis.Scene.Model1.1.0 and addsCratis.Scene.Engine1.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-scopedscreen template(a reusable shape inside that shell, naming the slot it fits withfits slot), and adialog 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
Layoutis an application’s base navigational look and an application has one; aScreenTemplategoes inside it and an application has many. They were previously the same word for both. - Scene (Release v1.0.0):
FlowContainercarries itsKind. C# distinguished aFlowRowfrom aFlowColumnby 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 nowscreen 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 oflayout <Name>. - Screenplay (Release v4.0.0): The arrangement tree hangs directly off
arrangement; the separatetemplateblock inside it is gone.arrangement freeformlikewise holds itsvariantblocks directly. This frees the wordtemplateto 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:
LayoutSyntaxis now the application layout,ScreenTemplateSyntax/DialogTemplateSyntaxare the module-scoped ones,ModuleSyntax.LayoutsisModuleSyntax.ScreenTemplates(plusDialogTemplates),TemplateSyntaxand its tree areArrangementSyntax/ArrangementNodeSyntax/ArrangementContainerSyntax/ArrangementSlotSyntax/ArrangementOverrideSyntax/ArrangementContainerKind,LayoutArrangementisArrangementMode, andScreenLayoutSyntaxisScreenTemplateReferenceSyntax. The matching - Stage (Release v3.0.0): Upgraded to Cratis.Screenplay 3.0.0, which replaces
reactorwithreactionand makes what sets one off a first-class trigger - Screenplay (Release v3.0.0):
Slice.Reactorsis nowSlice.Reactions, andReactorSyntax/ReactorTriggerSyntaxare nowReactionSyntax/ReactionTriggerSyntaxcarrying aTriggerSourceSyntax(#102) - Screenplay (Release v3.0.0):
ScreenplaySyntaxWalker.VisitReactor/VisitReactorTriggerare nowVisitReaction/VisitReactionTrigger, joined byVisitTriggerandVisitTriggerData(#102) - Screenplay (Release v3.0.0):
IScreenplayLanguageRegistrygains aTriggersmember (#102) - Screenplay (Release v3.0.0):
PLAY0136–PLAY0139now 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: falseis required under thepushtrigger. - 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.Slotschanges fromIEnumerable<string>toIEnumerable<SlotSyntax>to carry the newcontributesmarker - a breaking shape change to that one property.ScreenplaySyntaxWalker.VisitLayout/VisitFormwere 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 toblock is declared: the issue’s own example wraps it in an unexplainednavigation-itemconstruct that’s never defined anywhere else in the issue. I treated that as illustrative, not literal syntax, and madecontribute toa bare directive attachable directly to amoduleorfeature. - 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):
orderis implemented (used in the issue’s own worked example);groupis 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.Releasesubject 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
EventSequencesgrain, 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/componentsaccept 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(orTls.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.Corewhen 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.AspNetCoreandCratis.Chronicle.Testingare updated to16.26.0 - Arc (Release v21.9.0): Chronicle 16.24.0:
IReadModels.GetInstanceByIdresolves 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.GetInstancesreturns 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
AddEventbehavior (#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):
SP0015no 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):
SP0020now 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.performresolves 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 asQueryFailed, 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.GetInstanceByIdresolves 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.GetInstancesreturns 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
queryresponse mode, so the provider callback is a top-level GET theSameSite=Laxhandshake cookies accompany (Cratis/StudioIssues#104) - AuthProxy (Release v2.17.0): A credential link with no (or an invalid)
returnUrlends 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-providernow 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
returnUrlforward when served on its own path instead of looping back into itself after sign-in - cli (Release v2.6.0):
screenplay validatereports the diagnostic code the compiler assigns, for exampleerror PLAY0027:, alongside the file and position it already carried - cli (Release v2.6.0):
Cratis.Screenplayto 2.1.0,Cratis.Arc.Screenplayto 21.2.0, theCratis.Prologuepackages to 1.2.0 and theCratis.Chroniclepackages to 16.19.3 (#64) - cli (Release v2.5.0):
Cratis.Arc.Screenplay20.68.0 to 21.0.1, Chronicle packages 16.11.0 to 16.19.1,Cratis.Fundamentals7.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
authenticationprovider 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.Screenplay1.8.0 to 2.0.0. - Arc (Release v21.2.0): A generated
authorizeblock 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
claimrequirement 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):
Buttonfrom@cratis/components/Commonnow stamps itsseverityas adata-severityattribute, matchingTag, so the Cratis theme’s severity colors apply. Previously aseverity='danger'button rendered in the primary color. - Components (Release v3.3.3):
Buttonfrom@cratis/components/Commonnow forwards the nativetitleandautoFocusattributes. - Components (Release v3.3.2):
DataTableForQueryandDataTableForObservableQuerynow 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 itsselectionandonSelectionChangeasobject. - Components (Release v3.3.1):
Buttonfrom@cratis/components/Commonnow acceptslink, mapping to PrimeReact 11’svariant: 'link', alongside the existingtextandoutlinedflags. A PrimeReact 10<Button link />previously rendered as a filled button. - Stage (Release v3.1.0):
EventModelLoadermerging multiple.playfiles together now carriesui profile,themeandlayoutdeclarations 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 todirective is now translated instead of failing the conversion - Stage (Release v3.1.0):
ui profile’sthemeandlayoutreferences, a form’son submit navigate to, and a slot’scontributeshave 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
templatedirective (a Level 1 “intent” screen, where Studio generates the component) fills the layout’scontentslot directly and names no template - which is exactly whatScreen.ScreenTemplatedocumentsnullto mean. Nothing is synthesized for it. - Stage (Release v3.1.0): A document that declares no
layoutat all gets one synthesized shell for the whole application, never one per screen. - Arc (Release v21.19.0): Fixed normal generated
@fieldand@derivedTypeproxies 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.cssused//for its license header, which is not a comment in CSS. It shipped that way in bothdist/esmanddist/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):
useObservableQueryanduseObservableQueryWithPagingnow 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-contextno longer describes large result sets as “catalogues” — theevent-types listandread-models listdescriptions 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
triggerdeclaration 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):
Fdid 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
CS9057when the SDK’s code-style analyzers are built against a newer Roslyn than the pinned compiler - Arc (Release v21.17.0):
StoryContainer,StorySection,StoryGrid,StoryDividerandStoryBadgerendered as unstyled block elements in every consumer — the package emittedstory-*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
Idwhen its[Subject]member is null orNotSet, 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,CommandContextandObserverRunningStateambiguous — 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.Frameworksthat stopsMicrosoft.Build.Locatorfrom running. A host can now render and use MSBuild in the same process. (#34, #18) - cli (Release v2.6.2):
cratis screenplay generateno 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.SkipCertificateValidationand the connection string’sskipTlsValidationno 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
ObjectDisposedExceptiononGrpc.Net.Client.GrpcChannelat 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, matchingGetInstanceById<TReadModel>and the reducer/passive branch ofGetInstances. Previously, callingGetInstanceson 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.Coreis loaded while resolving handler declarations outside the current project graph - Stage (Release v2.3.0): A
$contextpath in aproducesmapping is rendered against what the enclosing artifact actually receives, so a rendered application compiles. A command handler receives Arc’sCommandContext, which carries none ofOccurred,Identity,Tenant,CausedByorCausation— those belong to Screenplay’s own context type — and rendering them as members of it produced 15 compilation errors on the language’s owninvoicing.play. The handler now asks the runtime for what the document reads: the tenant fromITenantIdAccessor, the caller fromIIdentityProvider, roles and claims fromICurrentPrincipalAccessor, the cause fromICausationManager, and$context.occurredfrom 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
Uuidconcept — is dropped and reported instead of rendered into a conversion that does not exist. (#32) - Stage (Release v2.3.0): A command handler reading
$eventContextor$eventSourceId, which it runs too early to have, is reported rather than rendered. (#32) - Arc (Release v21.14.0):
formRefdocumentation 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):
ReadModelScenariono longer drops a child collection when one event type both maps parent fields and feeds a child projection, in both theChildren(...).From<T>andAddChild(...)forms and for model-bound[ChildrenFrom<T>](#3689) - Arc (Release v21.13.0): The unknown tenant-resolver-type error now lists
SubdomainandFixed, which it omitted (#2478) - Chronicle (Release v16.26.2): Kernel event types are re-registered for the
Systemevent store afterResetKernelState(), so the kernel’s own events — such asApplicationAuthenticatedon every authentication — keep appending instead of failing withMissingEventSchemaForEventTypefor 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/Contractsbuilds in Release again —protobuf-net.BuildTools3.3.8 asks for a[ProtoModel]partial class, but that attribute is protobuf-net 3.3+ andprotobuf-net.Grpc1.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=trueon 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 with0(or, formatches, an empty pattern), sodueDate > todaybecame “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
SP0030for 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
IEventLogcould 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
readmodeland areducerit 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 compilationon 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
RCS1258to flag a redundantTypeAttributes.Classflag. 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
| undefinedinstead 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.Hostno longer truncates an IPv6 literal to its opening bracket (#2471) - Chronicle (Release v16.24.1): Applying or releasing compliance no longer fails with
CompliancePropertyNotFoundInSchemawhen a read model or event carries a[PII]value alongside a geospatialPoint,LineStringorPolygon; the geospatial value is left in the clear (#3673) - Components (Release v2.8.0):
StepperCommandDialogno 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
Escapeare withdrawn while aStepperCommandDialogcommand 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):
/inviteand/registerare 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):
useQuerysettles 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):
CommandFormno longer lets aninitialValueskey holdingundefinedoverwrite a value thatcurrentValuesresolved (#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-invitecookie 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.htmland 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.Federationsome providers leave as the principal’s authentication type. - Arc (Release v21.3.1):
CommandResult.MergeWithnow carries theAuthorizationFailureReasonfrom 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 withCommandResult.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:
RegisterAllruns 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
ToolbarFanOutItempanel 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
ToolbarGroupthat 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
IAsyncEnumerableobservable 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.Federationauthentication 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):
ReviseEventresolvesIEventSerializerin 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
usingwas 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
/.SelectProviderMiddlewaredeferred any request under/.cratis/select-providerto a separate fallback endpoint instead of answering it directly, so a redirect there (the cookie authentication handler’sOnRedirectToLogin, and the invite flow, both redirect there whenever more than one provider is configured) never reached the page a deployment customizes viaPagesPath. - 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
wwwrootasset) rendering a blank page for anyone signing in or accepting an invite.UseIngress()never calledapp.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 toSelectProviderMiddleware, which refuses unauthenticated, non-navigating callers with a401. - Components (Release v2.7.0): A dialog with a custom footer or
buttons={null}left focus ondocument.body, outside the modal.BusyIndicatorDialogshipped in that state; focus now moves to the dialog’s title.
Removed
Section titled “Removed”- 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,treeTableandvirtualScrollerare no longer declared. PrimeReact 11 removed all four with no equivalent and no headless hook. Usedropdownwith grouped options ortreeSelectinstead ofcascadeSelect,inputTextwith 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.Cratisno longer depends onCratis,Cratis.Arc.MongoDB,Cratis.Templatesor the threeMicrosoft.TemplateEngine.*packages. The package isCratis.Stage.ContractsandCratis.Screenplayand nothing else. (#34, #18) - Stage (Release v2.4.0):
TemplateEngineProjectScaffolder,SampleSlice,ScaffoldingFailed,TemplateNotFoundandTemplatePackageNotFoundmove 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):
$secretsexpressions no longer render, following their removal from the Screenplay language.
Security
Section titled “Security”- 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)
Deprecated
Section titled “Deprecated”- 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)