Releases: Cratis/Screenplay
Release list
Release v4.6.0
Summary
Add the normative framework-neutral execution plan and deterministic reference evaluator for the source-bound RegisterProject semantic vertical.
Added
- Add capability-admitted semantic execution plans with typed pre-execution unsupported issues. (#136)
- Add immutable world state and normalized Accepted, Rejected, Conflict, and Unsupported outcomes. (#136)
- Execute exact command contracts, command/concept
not emptyvalidation, unconditional facts, one-instance projections, and optional snapshot queries atomically. (#136) - Add deterministic specification execution/comparison and the source → ESM → plan → success/rejection RegisterProject vector. (#136)
- Document reference execution and its currently admitted capability subset. (#136)
Changed
- Make unsupported validation, conditional production, affected cardinality, and query delivery block plan creation rather than execute partially. (#136)
Release v4.5.0
Summary
Add the fail-closed source-to-ESM compiler phase and make every current syntax family explicitly bound, preserved, reported, blocked, migrated, or deferred.
Added
- Add
ISemanticModelBinderandISemanticModelCompilerwith identity-catalog, source-map, and file/folder semantic equivalence. (#135) - Bind concepts/composite types, modules/features/state slices, command/event behavior,
not emptyvalidation, read models, simple projections, optional keyed queries, and success/rejection/query specifications. (#135) - Add the complete Program v1 syntax disposition matrix and PLAY0268–PLAY0274 binding diagnostics. (#135)
- Add the end-to-end RegisterProject source → ESM vector and explicit report-only/deferred/blocking coverage. (#135)
Changed
- Make the delivery program, handover, diagnostics, and continuation prompt point at the durable syntax disposition matrix. (#135)
Release v4.4.0
Summary
Let a Screenplay specification prove not only projected state, but that callers can retrieve that state through an explicit query contract.
Added
- Add
then query,arguments, and repeatable orderedresultblocks to specifications. (#87) - Add query reference resolution, stable diagnostics, walker support, and binary-compatible syntax nodes. (#87)
- Add Monaco completions, hover vocabulary, VS Code highlighting, grammar, and reference documentation. (#87)
Changed
- Define Program v1 query assertions as exact results in authored order; explicit subset and unordered qualifiers remain additive future work. (#87)
Release v4.3.0
Summary
Introduce the versioned, fail-closed semantic foundation that subsequent Screenplay binding and execution work will build on.
Added
- Add an immutable executable semantic model with stable semantic, document, query-argument, and event-contract identities. (#135)
- Add canonical ESM and identity-catalog serialization with deterministic revisions and explicit migration contracts. (#135)
- Add recursive collection and composite values with strict type, optionality, cardinality, and enumeration validation. (#135)
- Add net8, net9, and net10 canonical-byte conformance vectors in CI. (#135)
Release v4.2.2
Fixed
- A validation rule's
filereference and inline code block are no longer written for rule kinds the compiler cannot read them back on. A syntax tree carrying one on, say, anot emptyrule used to print a document that failed to compile withPLAY0141; the omission is now stated in a// TODO:comment on the line it would have occupied, and the printed document compiles. (#123) - A
handler, aperformerand arule <Name>predicate that carry both afilereference and an inline code block now print only the file reference - the one the compiler reads back - and name the omitted block in a comment, instead of writing both and failing to compile withPLAY0034,PLAY0048orPLAY0141. (#123)
Release v4.2.1
Two places where the editor and the compiler described different languages, both silent and both user visible (#86).
Fixed
- The editor reports the compiler's
PLAYcode for every condition it checks, so the same problem carries the same code whether it was found by the CLI or by a squiggle - lookup, suppression and log matching all work from one catalogue. A Monaco marker gets it ascode, a VS Code diagnostic asDiagnostic.code, anddiagnosticCodesnames them for a consumer. (#86) - A query whose return type is dotted is scanned as a query again. The editor matched
[\w[\]?]+where the compiler takes[\w.]+(?:\[\])?\??, so such a query registered no symbol at all - itsbyandfilterparameters went un-type-checked and it was missing fromdata … via querycompletions, with nothing reported. (#86)
Changed
ValidationIssuecarries an optionalcode. The structural checks the capture and projection validators make have no compiler counterpart and deliberately carry none - documented in diagnostics.md, under In the editor.
Release v4.2.0
Added
- A
filereference in a.playdocument is now a link — cmd-click opens the file it names (#120) screenplay.sourceRootsetting, to say what a repo-relative path in a document is resolved against (#120)- A
filereference that could mean more than one file is left unlinked, with a tooltip naming every candidate — and is never resolved from a search that may have been cut short (#120) - A
filereference whose name contains*,?,[,],{or}resolves to the file literally named that, so route files such as[id].tsxare linked (#120) - Links are re-resolved when a file appears or disappears outside the editor, such as from a
git checkoutor a run of the generator (#120)
Release v4.1.0
Summary
Every declaration can now name the file it is realized by, so a document can be navigated back to the code. #120
Added
file <path>onconcept,type,event,readmodel,projection,slice,specificationand the top-leveltrigger, naming the repository relative file the declaration is realized by. #120PLAY0264warns when afilepath is absolute rather than repository relative.fileoffered as a completion in the declaration bodies that accept it.- A file references page covering what the keyword means on each construct and the rules a path follows.
Changed
ScreenplaySyntaxWalker.VisitFileReferencereaches every file a document names, whichever construct named it.- Syntax nodes grow by init-only property rather than by a trailing optional record parameter, which is a binary break. Set
Filewith an object initializer or awithexpression.
Fixed
- The syntax tree compatibility page said appending an optional record parameter keeps consumers working. It is source compatible and binary breaking, so the page now states the hazard and prescribes the init property.
Release v4.0.1
Changed
- 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.
🤖 Generated with Claude Code
Release v4.0.0
Summary
Four words in the language now mean exactly one thing each: a layout is the application's base navigational shell, a screen template is a reusable shape inside it, a dialog template is a shape that opens over it, and a screen is an instance that fills one of them.
Added
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.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.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.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.- A
Layouts and templatesdocumentation page covering the four constructs and how they nest.
Changed
-
The module-scoped
layout <Name>is nowscreen template <Name>. It was never a layout — it is a reusable shape that goes inside one. -
A screen names the structure it fills with
template <Name>instead oflayout <Name>. -
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. -
Slots are declared by name in the body, and the arrangement positions them:
layout AppShell navigation contributes Navigation content arrangement flow row navigation width 240 content growA body of plain slot names, with no
arrangement, is a complete declaration on its own.contributesbelongs on the declaration; sizing (width,height,grow,span) belongs in the arrangement, so a slot never says two different things about itself in two places. -
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 walker methods follow the same names.