Every problem the compiler finds is reported as a diagnostic: a severity, a stable code, a message, and the line and column it came from. This page is the catalogue of those codes.
A message is written for a person and gets reworded whenever a clearer wording is found. A code never changes. So a code is what you match on, suppress on, and group by - anything reading the message text breaks the next time the message is improved.
The CLI prints a diagnostic in the format editors and build servers already parse - the file, the position, the severity, the code, and the message - followed by the offending line and a caret:
nested/broken.play(3,5): error PLAY0028: Unknown slice type 'Wat' - expected StateChange, StateView, Automation or Translate
3 | slice Wat DoIt
| ^
There are three severities. Error means the document does not compile. Warning means the document compiles but something is very likely wrong - almost always a name nothing declares. Information means something worth knowing that changes nothing.
The prefix is PLAY, after the .play documents this compiler reads.
Cratis Arc has its own catalogue, the SP codes, for generating a .play document from C# source. The two run one after the other - Arc generates a document and hands it straight to this compiler to read back - so both sets of diagnostics land in the same build log. A shared prefix would make SP0034 and a compiler code of the same number indistinguishable at a glance and identical to a SP\d{4} filter, which is why the prefixes deliberately have nothing in common. Arc’s codes describe what the generator could not express; the codes here describe what the compiler could not read.
A code is an identifier, not a position in a list.
A number is never reused. When a diagnostic is retired, its number is retired with it and left behind as a gap in the sequence. Handing that number to something else would silently change what an existing suppression means.
A number is never renumbered. Inserting a code in the middle of the catalogue would change the meaning of every code after it.
A new code is appended at the end of the sequence whatever it is about, so the number says when a code was added rather than where it belongs. Use this page, not the numbering, to find the codes for an area.
A code outlives its message. Two constructs hitting the same condition share one code - a property line the parser cannot read reports PLAY0016 whether it sits in a type or in an event.
The language service behind the VS Code extension and the Monaco editor checks a subset of what the compiler
checks, and it reports the compiler’s code for every condition in that subset. So the Unknown type 'Foo'
you get as a squiggle and the one the CLI prints are the same PLAY0165, and can be looked up here, filtered
on, and matched against a build log:
diagnosticCodes names the codes the editor reports, the same way DiagnosticCodes names them for the
compiler. A ValidationIssue carries the code as code, and it reaches the editor: a Monaco marker gets it as
code, a VS Code diagnostic as Diagnostic.code.
A few editor checks carry no code, deliberately. The capture and projection validators enforce structural
rules that no compiler run reports - a capture must include a source block, an append block must include a
when clause - and there is no PLAY number for something the compiler never emits. Minting one would make
this catalogue describe two different tools, which is the thing the PLAY prefix was chosen to avoid. Those
conditions are reported without a code until the compiler checks them too.
Event-source declarations and command stream routes are admitted by ESM v8.
Property-path mappings and handler commands remain refused with PLAY0268. Binding reports PLAY0273
for generated mappings, stored-name collisions (including pin-versus-name), the reserved stored source name
Default, the reserved stored stream name All (including id "All"), or a routed fixture whose source identifier type cannot be resolved. Reserved-name checks are binding-only; authoring validation still accepts the declarations. For All, rename the stream without retaining that stored-name pin.
A stream reference selects a classification, never the identity destination supplied by for.
Handler commands may author routes without declaring their returned events.
Code
Severity
Reported when
PLAY0503
Error
An event source or its source-owned stream has invalid syntax, a repeated directive or physical declaration, an invalid rename pin, or an optional, collection or known composite identifier type. Composite stream-id blocks also refuse fewer than two parts, duplicate names, modifiers, children, empty/repeated headers and mixed scalar/block forms. Duplicate physical sources make their child ownership ambiguous.
PLAY0504
Error
A known source’s stream does not resolve uniquely, or a command route or stream-id mapping is invalid, missing or incompatible, including missing, unknown, duplicated or mismatched-shape composite parts. Scalar literals and composite literal parts refuse empty, non-NFC or ill-formed text and integers outside ±9007199254740991 in Double numeric mode. A command identifier or known production destination type differing from the source’s nominal identifier type is refused, never silently retargeted.
PLAY0505
Error
An exact stream Source.Stream header resolves both to one source-owned stream and to a viable imported value type. Both candidates remain visible; neither is selected automatically.
PLAY0506
Error
A known scalar stream-id or composite part type falls outside text and UUID values and their nominal concepts, plus integer-backed concepts. Bare Int is rejected. Other types need a future portable formatting contract. Unavailable imported shapes remain unresolved.
PLAY0507
Information
A source or stream’s rename-only id pin repeats its current name. New declarations omit the pin.
PLAY0547
Error
A specification routing directive or composite part block is malformed, empty, repeated, conflicting, has invalid children, or leaves effective no stream on a given or when append event. Event examples and redelivery locators may carry no stream.
PLAY0548
Error
A when <Command> occurrence declares stream or no stream; the route belongs to the command declaration.
PLAY0549
Error
A specification stream reference is missing or ambiguous, its key mapping is missing or superfluous, or the scalar stream id or composite part is nonliteral or incompatible, or contains empty, non-NFC or ill-formed text or an integer outside ±9007199254740991 in Double numeric mode. Composite routes require every declared part exactly once and refuse unknown/duplicate names and mismatched scalar/block forms.
PLAY0550
Error
A routed given or when append lacks for, a routed identity is not a compatible concrete literal, or a source without identifier has no unambiguous known producer destination type.
PLAY0551
Error
A then route or destination type contradicts the command under test, which is the event’s only producer in the whole model. Other producers defer the comparison.
Command headers are classified against the complete immutable compilation input, including resolved file
imports. @stream Qualified.Type, stream String and modified property forms remain properties;
production stream = value and stream String = value remain payload mappings. When neither a source
nor a property type resolves, the header keeps its legacy property interpretation and unknown-type
evidence, including deeper legacy command members. A misspelled source name cannot be distinguished
from an unresolved qualified property by spelling alone. Stream-id children do not override this rule.
Candidate discovery uses the same inline-language registry as the committed parse; registered code
payloads cannot declare sources or property types.
Syntax JSON retains every ambiguous or duplicate header in CommandSyntax.streamCandidates, including
its property interpretation when ambiguous. stream holds at most one unambiguous route. Deeper legacy
properties remain command members, without duplicating the candidate property. Such invalid drafts
cannot be printed or expanded into .play files: export throws InvalidSyntaxJson rather than selecting
an interpretation or dropping a header. Retain syntax JSON until you repair the draft. Use @stream
for an intended qualified property, or remove the competing type interpretation for an intended route;
remove duplicate route headers before export.
A concept is declared over a primitive the language does not have.
PLAY0009
Error
A value of an enumeration concept is not an identifier.
PLAY0010
Error
A line in a concept body opens with a word a concept declares nothing by.
PLAY0011
Warning
A value of an enumeration is called validate, which the concept body reads as an empty validate block.
PLAY0012
Error
A concept gives a reason, scope or personal-data qualifier for a marker it does not carry.
PLAY0013
Error
A concept gives the reason for one attribute more than once.
PLAY0515
Error
A concept marked pii or secret is used as a command identifier, an explicit for destination, an event source identifier, a scalar stream id type, a composite stream id part type, or a command route mapping source (including nested property paths). The message names the attribute and position, never a value. A mapping using the same protected concept already reported at its resolved stream-id declaration is not reported again; a different protected source concept is still reported. Specification route literals rely on their declaration’s check. Use a surrogate Uuid identifier and keep personal data or operational secrets as properties. Reaction destinations also check values typed directly in the trigger clause, even for an undeclared or registered trigger. When a reaction source names both an event and a declared trigger, a protected destination in the resolved event shape or the trigger clause is rejected.
PLAY0653
Warning
A concept header repeats a compliance marker, including pii personal. Both compilers keep the first marker for each wire identity and attach body settings to it; canonical printing writes one marker. The concept-line repair removes later tokens with PreserveTrivia.
PLAY0565
Information
Legacy @pii, sensitive or @sensitive spelling. Use bare pii/secret; per-line and document repairs preserve notes and trivia.
PLAY0566
Error
Unknown concept compliance marker; expected pii, personal or secret.
PLAY0567
Error
Scope belongs to secret and must be subject, namespace or global.
PLAY0568
Error
A concept declares secret scope more than once.
PLAY0569
Warning
Explicit secret scope on pii secret is ignored because only Chronicle [PII] renders.
PLAY0570
Error
Invalid personal-data qualifier or unknown Art. 9(1) category.
PLAY0571
Error
A concept declares more than one pii special category.
PLAY0590
Error
An event marks more than one data-subject property; each extra mark names the first. Choose one; no automatic repair is safe.
PLAY0591
Error
A subject must be a required scalar String, Uuid or their concepts, or an Int-backed concept. Optional values, collections, composites, bare Int, enums, Decimal, Bool, Date and DateTime are refused.
PLAY0592
Error
A subject concept is pii or secret; EventContext.Subject is plaintext. Use a surrogate identity.
PLAY0593
Error
The subject modifier belongs only to event properties, not commands, types, operation inputs, trigger or reaction data or response fields (decision 0008).
PLAY0594
Error
Read model subjects are not yet supported; #559 covers the mark and Chronicle’s reserved _subject, __subject and __subjects names.
PLAY0595
Error
Subject is duplicated or out of modifier order. Write each modifier once: Type optional generated identifier subject.
A line in a module body opens with a word a module declares nothing by.
PLAY0023
Error
A feature line is not feature <Name>.
PLAY0024
Error
A line in a feature body opens with a word a feature declares nothing by.
PLAY0025
Error
A slot declared by a layout, screen template or dialog template is not an identifier optionally followed by contributes.
PLAY0026
Error
A line in a layout, screen template or dialog template body opens a block none of them declares anything by.
PLAY0027
Error
A slice line is not slice <Type> <Name>, or direction is malformed, repeated or declared outside Translate. Legacy directionless translations remain accepted.
PLAY0028
Error
A slice is declared with a type the language does not have.
PLAY0029
Warning
A line in a slice body opens with a word a slice declares nothing by.
A projection document holds a top level line that does not open a projection.
PLAY0055
Error
A projection document declares no projection at all.
PLAY0056
Error
A projection line is not projection <Name> [=> <ReadModel>].
PLAY0057
Error
A projection declares no directives, so it builds nothing.
PLAY0058
Error
A line in a projection body opens with a word a projection declares nothing by.
PLAY0059
Error
A projection declares more than one key.
PLAY0060
Error
A from block declares more than one key.
PLAY0061
Error
A from line names no event to read from.
PLAY0062
Error
An event reference is not a name the language can read as one.
PLAY0063
Error
A join line is not join <property> on <key>.
PLAY0064
Error
A join block holds a line that is not with <EventType>.
PLAY0065
Error
A children line is not children <collection> identified by <key>.
PLAY0066
Error
A nested line is not nested <property>.
PLAY0067
Error
A nested block reads from no event, so nothing ever fills it.
PLAY0068
Error
A remove line is neither remove with <EventType> nor remove via join on <EventType>.
PLAY0069
Error
A remove block holds a line other than parent.
PLAY0070
Error
A clear line is not clear with <EventType>.
PLAY0071
Error
clear with is written where there is nothing to clear.
PLAY0072
Error
A part of a composite key is not <property> = <expression>.
PLAY0073
Error
A composite key part is a template expression, which a key cannot be.
PLAY0074
Error
A composite key declares no parts.
PLAY0075
Error
A mapping line in a projection is not one the language can read.
PLAY0452
Warning
More than one automap or no automap appears in the same projection scope. The last setting wins; printing preserves the authored settings and their individual comments.
PLAY0514
Warning
A projection mapping, children, or nested target is absent from the declared read-model or element shape. Unknown or imported shapes are not guessed.
A specification document holds a top level line that opens neither a specification nor an example.
PLAY0093
Error
A specification document declares no specification at all.
PLAY0094
Error
A specification line is not specification <Name>.
PLAY0095
Error
A line in a specification body opens with a word a specification declares nothing by.
PLAY0096
Error
A when line is not when <CommandType>.
PLAY0097
Error
A specification issues more than one command, and a specification is one example.
PLAY0098
Error
A then error line is neither then error nor then error "<reason>".
PLAY0099
Error
A given readmodel or then readmodel line does not name a read model type.
PLAY0100
Error
A given or then line does not name an event type.
PLAY0101
Error
A value a specification step states is not <property> = <value>.
PLAY0453
Error
A then no readmodel line lacks a view or key, uses exactly, or has child mappings.
PLAY0518
Error
An example declaration is not example <Name> : <EventOrCommandOrReadModel>.
PLAY0519
Error
A fixture assigns the same property more than once, including across a step’s inline assignment and indented body. Assign it once; overriding a value from an example is a separate operation.
PLAY0520
Error
An example’s type or reference is unknown, ambiguous, or not an event, command, or read model. Qualify the declaration; example inheritance is not supported.
PLAY0521
Error
An example name collides with a type name or repeats in the same scope. Choose a distinct example name.
PLAY0522
Error
A step references an example of another kind. Use the corrected step spelling suggested by the diagnostic.
PLAY0523
Error
An example supplies an undeclared current-generation property, an invalid generated fixture, or for on a read model. Use only the current type’s allowed fixture lines.
PLAY0524
Error
Binding an exact-shape specification step found a missing required property after expansion. The diagnostic names the step, property, and example when used. Supply the property in the example or step; no defaults are assumed.
PLAY0525
Error
Semantic admission found a stated example value incompatible with its type, or for without one unambiguous required scalar destination type. Fix the value or its destination contract, even if the example is unused or that value is overridden. Partial top-level examples remain allowed. Ordinary fixture diagnostics also apply to null, nonconcrete, structured and generated values.
PLAY0526
Error
A command or read-model example states a route. Only event examples carry routes; a command’s route comes from its declaration, and read models have none. Top-level streamId = value is payload, not route metadata.
A constraint states nothing it holds the application to.
PLAY0134
Error
A line in a constraint body is not one the language can read.
PLAY0135
Error
A constraint mixes unique event and unique property rules, combines a file rule with another rule, repeats a singular option, or repeats a target, release, or property. An event cannot both claim and release the same constraint. Several distinct unique rules of the same kind are allowed.
A $causedBy expression names a property the cause does not carry. The short form admits what the event context catalog lists below causedBy: subject, name, userName and onBehalfOf, which is itself an identity with the same members.
PLAY0152
Error
An expression is not one the language can read.
PLAY0153
Warning
A $context path opens with a root the context does not have.
PLAY0154
Warning
A $context.causedBy path names a property the cause does not carry.
PLAY0155
Warning
A $identity or $context.identity path names a property the caller identity does not carry.
PLAY0156
Error
A template expression is never closed.
PLAY0157
Error
An interpolation inside a template expression is never closed.
A property names a type nothing in the document or its imports declares.
PLAY0166
Warning
An event is referred to that nothing in the document or its imports declares, including projection remove with, remove via join on, and capture append.
PLAY0167
Warning or error
A policy is referred to that nothing in the document declares. A persona’s unknown policy is an error during compilation, Safe authoring, and executable binding. Draft authoring retains it as a warning with explicit unresolved-reference debt; other unresolved policy references are warnings.
PLAY0168
Error
A concept and a type, or two of either, are declared under one name; also reused when an inline event repeats a typed payload property name.
PLAY0169
Error
An authentication block declares two providers under one name.
A reads line is not reads <ReadModel> [as <alias>] [by <value>] (or the header of a child by mapping block), or uses as, by, or reads as an alias. Under a reaction trigger, a bare reads line suggests @reads for a value named reads.
PLAY0177
Warning
A command or reaction trigger reads a read model no projection in the document produces.
PLAY0178
Warning
The by of a command’s reads declaration does not name a property of the command.
PLAY0442
Warning
A reaction trigger reads by a value it does not take.
PLAY0443
Error
A clock trigger reads by a value, but clock triggers take no values.
PLAY0444
Warning
A reaction trigger reads a primitive type name as a view; use @reads <PrimitiveType> if reads is a trigger value.
PLAY0451
Error
A reads line in a command or reaction trigger has children other than one by block, or combines that block with a single by value. Invalid children are skipped, not parsed as owner values or properties.
A screen binds data to a query nothing in scope declares.
PLAY0197
Warning
A screen navigates to a screen nothing in scope declares.
PLAY0198
Warning
A bare name matches more than one declaration at the same depth, or a qualified name matches more than one trailing container path, so which one it means is undecided. See declared dependency targets.
An arrangement line is not arrangement flow or arrangement freeform.
PLAY0234
Error
A layout, screen template or dialog template declares arrangement more than once.
PLAY0235
Error
A row, column or grid line in an arrangement is malformed.
PLAY0236
Error
A slot leaf within an arrangement tree has malformed sizing attributes.
PLAY0237
Error
A when override line in an arrangement is not a valid width/height size-class condition.
PLAY0238
Error
An arrangement declares more than one when override for the same width/height size-class combination.
PLAY0239
Error
An arrangement block’s body does not match its mode - a flow arrangement declares a variant, or a freeform arrangement declares anything other than one.
PLAY0240
Error
A variant line is not variant width <compact|regular>, height <compact|regular>.
PLAY0241
Error
An arrangement declares more than one variant for the same width/height size-class combination.
PLAY0242
Error
A place line is not place <Slot> hidden or place <Slot> at x,y size w,h.
PLAY0243
Error
A variant places (or hides) the same slot more than once.
PLAY0244
Warning
A freeform arrangement’s variant does not mention (place or hide) a slot another variant of the same arrangement places.
These whole-model C# checks run after file assembly and also on programmatic syntax passed to the semantic binder.
Public metadata and explicit direction select ESM v9 once these checks pass; a model that fails them never binds.
Unknown and ambiguous references retain PLAY0166 and PLAY0198, rather than being guessed private/local.
Private origins continue to use the existing invalid event/import declaration diagnostics.
Code
Severity
Reported when
PLAY0607
Error
A command produces a public event. Move publication to an outbound Translate slice.
PLAY0608
Error
A local public event is produced outside an explicitly outbound Translate slice.
PLAY0609
Error
An outbound Translate slice produces zero or multiple distinct local public event types. Repeated productions of the same type count once.
PLAY0610
Error
A foreign public event is consumed outside an explicitly inbound Translate slice.
PLAY0611
Error
An outbound translation consumes a public or foreign event rather than a private local event.
PLAY0612
Error
An inbound translation produces a public or foreign event rather than a private local event.
PLAY0613
Error
A foreign public event is produced locally. Translate it to a private event instead.
PLAY0614
Error
A Translate slice declares or uses public event metadata without explicit direction. Legacy translations without public metadata remain historically inbound. C# and the editors repair it when exactly one direction fits.
PLAY0615
Error
An outbound translation contains an external-data capture instead of consuming private local events.
PLAY0616
Error
An explicitly inbound translation consumes a private or local event instead of a foreign public event.
PLAY0617
Error
An outbound translation produces a private event instead of its one local public event.
PLAY0618
Error
A projection or reducer targets an event (projection X => SomeEvent) outside an explicitly outbound Translate slice.
PLAY0619
Error
A capture reads source events outside an explicitly inbound Translate slice.
PLAY0620
Error
A source events block has no from <Event> line, a line that is not from <Event>, an invalid event name or a repeated event.
PLAY0687
Error
A capture’s source events originate from several event stores; split it into one capture per origin.
The operational edges checked are seed appends, command and reaction productions (including refusal branches), capture appends,
projection event sources and joins/removals, reducers and constraints. Projection all includes every declared
contract; every only maps the projection’s existing inputs. Specification fixtures are not operational edges.
A projection or reducer whose => target resolves to an event (and not to a declared read model) is an event-target
projection: its target counts as an output of the slice and its from/on events as inputs, so PLAY0609, PLAY0611,
PLAY0613 and PLAY0617 apply to it, and PLAY0618 reports one outside an explicit outbound translation. Each
from <Event> under source events counts as an input of the capture, so PLAY0610, PLAY0614 and PLAY0616 apply,
and PLAY0619 reports source events outside an explicit inbound translation. Both forms bind and select ESM v9.
Existing syntax restrictions remain: qualified reaction triggers do not parse, and qualified event productions
still report PLAY0497. Programmatic qualified references are resolved and checked, not treated as private.
The TypeScript compiler and both editors report the same codes (see editor diagnostics).
Repairs: only PLAY0614 has one. It declares direction inbound or direction outbound on the slice, and is offered
only when exactly one direction is consistent with the slice’s events and constructs (C# propose-repair and
read-workspace view repairs over MCP; the TypeScript quick fix in Monaco and VS Code). Every other code in this
section has no automatic repair because each one is a contract decision for the author, not a spelling:
PLAY0607, PLAY0608, PLAY0613 and PLAY0617 would change which events a slice publishes or produces;
PLAY0609, PLAY0611, PLAY0612 and PLAY0616 would change which events a translation consumes or produces, or its
direction; PLAY0610, PLAY0615, PLAY0618 and PLAY0619 would move a construct between slices or change its direction;
PLAY0620 is malformed source events input with no single intended correction. PLAY0687 requires splitting a capture by origin, with no single intended correction.
A reaction or refusal-branch production declares a stream route. Only command event productions can override a route.
PLAY0664
Warning
A production repeats its command’s source, stream and stream-id mappings. The typed workspace repair removes the override.
PLAY0665
Error
An observer filter is malformed, duplicated, has children, names an unresolved or ambiguous source/stream, or a filtered reaction has a non-event trigger.
PLAY0666
Warning
A reaction or reducer filter excludes every statically known producer’s effective route. Handlers and foreign origins are unknown and suppress this C#-only warning.
PLAY0667
Error
Enum members mix explicit numbers with unnumbered members. Number all members or none.
PLAY0668
Error
An enum declares the same number more than once; aliases are not supported.
PLAY0669
Error
An enum member number is outside the int32 range.
PLAY0670
Error
An enum member number is malformed: use decimal digits with an optional minus, no leading zero, fraction, exponent or plus.
PLAY0671
Information
Opt-in completeness hint (enum-pinning or PLAY0671; also included in all) for an unnumbered enum used by an event property. Ordinary compilation does not report it. The numbering refactoring pins each member’s current position; this is not a correctness repair.
PLAY0672
Error
Unknown generation strategy; use the closed strategy set.
PLAY0673
Error
Missing or malformed generation argument or modifier value.
PLAY0674
Error
Generation modifier not allowed for this strategy or primitive.
PLAY0675
Error
Generation modifier repeated; write each at most once.
PLAY0676
Error
Concept declares generation more than once.
PLAY0677
Error
Generation strategy incompatible with the concept primitive.
PLAY0678
Error
Prefix modifier is not printable ASCII or exceeds 32 characters.
PLAY0679
Error
NanoID alphabet must be distinct printable ASCII of size 2..256.
PLAY0680
Error
TypeID prefix is not empty or 1..63 lowercase letters/underscores starting and ending with a letter.
PLAY0681
Error
NanoID size outside 1..256 or bytes count outside 1..512.
PLAY0682
Error
Binding refuses reserved sequence generation until #619.
PLAY0683
Warning
Generated property has fewer than 64 random bits; names the approximate 1% collision draw count. Suppressed when a unique constraint covers its mapped event property.
PLAY0684
Error
Generated identifier has fewer than 64 random bits.
PLAY0685
Error
A returned name is used under the returning command’s on failure. Use it in on success instead; form fields and behavior parameters keep their existing meaning, and an outer successful response remains available.
PLAY0688
Error
A generated concept’s strategy can violate a rule. The diagnostic is on the rule and names the strategy and a quoted witness, regardless of the rule’s severity. Review the strategy-derived matches replacement repair; it also changes validation of input and stored values.
PLAY0689
Warning
Consistency is Unproven for a generated concept rule; names the opaque/outside-fragment/budget/timeout reason. Passing samples are not proof.
Overrides reuse PLAY0504 for route shape, mapping, destination type and duplicate-route errors. Protected sources reuse PLAY0515. Property paths remain refused at binding with PLAY0268 (#574), and generated route inputs with PLAY0273.
These checks run on the assembled model. The source stays in the syntax tree, so an authoring tool can still show and repair it.
Code
Severity
Reported when
PLAY0621
Error
An exposure for <Owner> header or one of its property lines is malformed, or names an unknown collection operation.
PLAY0622
Error
An exposure’s owner is not a layout, screen template or dialog template.
PLAY0623
Error
Re-exposures of one component property form a cycle.
PLAY0624
Error
A reexposes <Owner> names an owner that does not expose the same component property.
PLAY0625
Error
An instance header or one of its set, items, item or item value lines is malformed.
PLAY0626
Error
An instance is not a screen, screen template or dialog template.
PLAY0627
Error
An instance stores a value for a component property no exposure exposes.
PLAY0628
Error
An instance uses set on a collection exposure, or items on a single-value exposure.
PLAY0629
Error
A template’s content <slot> names a slot the template does not declare.
PLAY0630
Error
A navigation’s outlet <name> names an outlet no layout, template or component declares.
PLAY0631
Error
A screen or scoped template assignment uses a template whose scopes exclude that scope.
PLAY0632
Error
A component comes from a package no ui profile declares. Only checked when at least one profile declares packages.
PLAY0654
Error
A navigation contribution’s destination outlet or destination dialog names an outlet or dialog template nothing declares.
PLAY0655
Error
A screen’s contribute to <Point> names a contribution point no layout or template slot declares. Unlike a module or feature contribute to (PLAY0224, a warning), screen contributions belong to the screen-composition checks.
PLAY0656
Error
Template content nests templates in a cycle: a template’s content uses itself, directly or through other templates.
key is marked outside a top-level read-model property, combined with another modifier, or has an optional or collection type. A part of a multipart key cannot have a composite type.
PLAY0661
Error
A single-instance lookup omits key parts. The message names the missing parts. Command reads have a typed repair when every missing part has one same-named compatible source. Queries and trigger reads are not repaired. Scalar screen, form and navigation lookups cannot supply composite keys.
PLAY0662
Error
A by block has fewer than two distinct parts, names an unknown part, uses the wrong key shape or supplies an incompatible, optional, collection or literal source. A single-instance query must agree with the declared key. No automatic repair is offered.
An explicit single key binds byte-identically to an inferred identifier. Composite keys and by-block queries are authoring-only: binding reports PLAY0268 citing #599.
A file directive names an absolute path, and a file reference is relative to the repository root.
A path that does not resolve is not a diagnostic, at any severity. A document is read in a designer, in a
build and on a machine where the tree is not present, so the compiler never holds a path against a file system -
a stale path must not be what makes a valid document invalid. A consumer that can resolve paths decides for
itself what an unresolvable one means.
Source syntax carries behavior the supported ESM profile cannot represent, including query filters with from, single-result filters, invalid same-name/scalar/type filter shapes, explicit query scopes and performers, compliance on identity or enum concepts, events combining personal or explicitly subject-scoped secret values with an explicit subject mark, generated properties whose concepts declare validation rules, and unsupported scalar $context produces paths (tenant is not event namespace; claims and roles are not portable scalar values), an unsupported validation rule, concept require, command require or production conditions over read-model paths (#129), date/today conditions, non-deterministic $env conditions, $context tag values, and a bare named rule with no implementation body (see Commands). Bodied named rules, command/concept code validation, and inline/file policy predicates bind as opaque ESM v3 attachments rather than reporting this diagnostic.
PLAY0269
Information
Source syntax is explicitly deferred from the current backend semantic profile.
PLAY0270
Information
Source syntax, including a valid persona, compliance reasons and event subject marks, is realization or authoring/operational metadata rather than portable behavior. Event id pins are executable stored names from ESM v16.
PLAY0271
Information or error
Source syntax keeps its legacy meaning and cannot be strengthened into ESM v1 implicitly.
PLAY0272
Error
Source syntax requires an explicit reviewed semantic migration before binding.
PLAY0273
Error
Syntax and identity information cannot produce a coherent semantic compilation, including reserved stored source Default or stream All names (also through id pins), stored-name collisions, an event-source for assertion without one unambiguous required scalar command destination type or a produces mapping, then event expectation, projection mapping, or constraint naming a property absent from the current event revision, or an authorization policy, property rule or requirement referencing a generated value before generation.
PLAY0274
Error
A syntax location cannot be mapped to a supplied semantic source document.
These structural warnings run only when selected, after error-free whole-application source compilation. See Completeness checks for selection and exemptions and editor diagnostic support for the TypeScript/C# boundary.
Code
Severity
Reported when
PLAY0530
Warning (opt-in: --check data-bindings)
Visible screen bindings share a name but disagree on cardinality, resolved query or by parameter. Identical rebinding and sibling sections are allowed.
PLAY0531
Warning (opt-in: --check data-bindings)
A screen binding’s resolved read model or cardinality differs from its query’s return. Optional and observable qualifiers are ignored; unresolved or ambiguous names are skipped.
PLAY0532
Warning (opt-in: --check input-surfaces)
An action has no module-level command-bound form or issuing screen in the command’s own slice. Post-action navigation does not supply input; a title-only screen does not issue a command. Commands with only generated properties (including no properties) require no typed input.
PLAY0533
Warning (opt-in: --check input-surfaces)
A StateChange command has no used screen action or attached behavior execute, and no reaction invokes it. A form alone is not an issuer; attached navigation or open dialog may reach an issuing screen. Automation and Translate commands are exempt.
PLAY0534
Warning (opt-in: --check field-origins)
A declared read model has no builder or performer, or a top-level field lacks an identity, mapping, compatible AutoMap source, child or nested target. Variants are checked independently, including entering-event AutoMap; the owning slice’s keyed-query property counts as identity. Opaque builders and unknown coverage are skipped.
PLAY0535
Warning (opt-in: --check query-keys)
A query parameter cannot be held by its view’s known identity or fields. Identity comes from the owning slice’s unambiguous keyed-query property or structurally resolved projection keys. Performer-served views, tenant-context parameters and unknown identity types are skipped.
PLAY0536
Warning (opt-in: --check event-consumers)
The newest generation of a local event has no declared projection, reducer, reaction, constraint or interaction consumer. Specifications and production do not count. Imported external contracts are exempt; legitimate terminal facts may still be reported.
PLAY0537
Warning (opt-in: --check navigation)
A screen is unreachable from contributions or attached shell-level behaviors, including through screen actions, row clicks, behaviors, discovered forms or opened dialog templates. Unattached named behaviors and unreachable cycles do not establish entry points. With no entry points, one application finding reports that no screen is reachable.
These errors are reported by ordinary compilation, including compilation of a folder as one application; semantic binding is not required. References resolve from the innermost scope outward. Unknown or ambiguous declarations and imported shapes are not guessed.
Code
Severity
Reported when
PLAY0282
Error
A declarative validate rule targets a field absent from the command’s declared shape, including named rules with implementation blocks. A dotted path is followed through declared composite types; continuing past a primitive, concept or enum field is reported, while a path through an undeclared or imported type is left undecided.
PLAY0283
Error
The type supplied by reads <View> by <field> is incompatible with every declared query by parameter of that view. Filter parameters do not substitute for a key. Parameter names may differ; distinct concepts remain distinct types.
PLAY0284
Error
A children or nested block never populates a declared element field through its identity, explicit mappings, inherited every mappings, nested blocks, joins, or compatible AutoMap. Coverage is across the block’s events, not a requirement that every update event fill every field.
PLAY0285
Error
A specification’s expected event contradicts every possible declared producer of its when command, using decidable literals, property copies and equality conditions.
PLAY0286
Error
A specification value is not a member of the enum declared by that specific command, event, read-model field or query parameter. Bare members, qualified members and quoted member names are accepted.
PLAY0287
Error
A command or reaction producer, a capture append mapping, or a specification’s given/then event step, assigns a field absent from the referenced event’s declaration. Dotted paths follow the same rule as PLAY0282: title.missing is reported when title is a primitive, concept or enum, detail.missing when Detail is a declared type without that field. A collection or optional composite field is addressed element-wise.
PLAY0290
Warning
An import names an event, command, read model, concept or type the application declares itself. The declaration is what every reference resolves to and what these checks see, so the import has no effect - remove it.
PLAY0291
Error
A mapping value starts with { or [ but is not a valid single-line JSON object or list (keys must be quoted).
PLAY0292
Error
An object key does not name a property of the target’s declared composite type. Unknown or imported types remain undecided.
PLAY0293
Error
A statically known value has the wrong shape for its target: a collection expects a list, a declared composite expects an object, and a scalar cannot accept a list or object.
PLAY0294
Error
An inline JSON object repeats a key (including inside a nested object or list); each property may be stated once.
An import never changes what these checks see: a name the application declares resolves to that declaration whether or not it is also imported, and an imported name nothing here declares keeps an unknown shape.
These checks do not execute handlers, custom predicates or opaque expressions. An undeclared query signature does not establish a read-key mismatch. An unknown event shape under AutoMap, or an open all subscription with AutoMap, leaves projection coverage undecidable. Outcome checks compare explicit producer mappings only; they do not invent mappings for omitted fields.
Concept compliance markers, qualifiers and secret scopes are admitted by ESM v13. PLAY0268 refuses compliance on enum or event-source/stream identity concepts and refuses an event containing personal or explicitly subject-scoped secret values together with an explicit subject mark until lineage is admitted. The latter check is source/binder-only: subject marks have no ESM bytes. PLAY0515 still rejects protected identities during source validation. The strict reader and programmatic validator refuse compliance below v13, unknown special categories or scopes, secret scope next to personal, and compliance on enum or identity concepts. Reasons remain report-only (PLAY0270).
Caller-supplied equality filters on collection queries are admitted by ESM v14. PLAY0268 names the query, filter and reason for a refused filter: it has a from source, returns a single result, lacks a same-named scalar primitive/concept/enum property, differs in nominal type (ignoring optionality), repeats a name or duplicates by. Explicit scope, performer and context-sourced by each have their own refusal. The strict reader and evaluator reject unknown/repeated filter values, missing required filters, null and type mismatches. PLAY0468 applies to unknown/repeated/missing required specification arguments in both query spellings. See Queries.
An accepted AST authoring operation canonically prints a touched document. The message states how many comments could not be retained and on which lines; attached comments follow their syntax owners, whitespace is normalized, and untouched documents retain their exact bytes.
PLAY0289
Error
An empty authoring workspace has no source documents to compile to an executable model. You can still propose its first typed document.
Source-authoring acceptance and executable readiness are separate verdicts. An authoring proposal validates the complete .play application and identity continuity without claiming that every language construct is supported by the executable backend profile. Executable-only workspace transactions remain strict.
Every $eventContext.<path> - in a projection expression or in a dynamic dictionary key such as countByType.$eventContext.eventType.id - is checked against the event context catalog. Chronicle resolves the path by reflection when it builds the projection and fails on one it cannot resolve, so this is the only place the mistake can be caught early. An unlisted member is a warning because a runtime may resolve more than the catalog lists; a path that can never resolve is an error.
Code
Severity
Reported when
PLAY0295
Warning
An $eventContext.<path> opens with a member the event context does not have, such as $eventContext.causationId. A member resolves written camelCase or with only its first letter uppercased.
PLAY0296
Warning
An $eventContext.<path> continues into something the member before it does not have, such as $eventContext.eventType.name. The derived function Week is case-sensitive: occurred.Week resolves and occurred.week does not.
PLAY0297
Error
An $eventContext.<path> continues below causation or tags. They are collections with no addressing grammar, so a path below them never resolves.
PLAY0298
Error
An $eventContext reference names no member, as in $eventContext. or a dynamic key ending in .$eventContext, or has an empty segment.
PLAY0299
Warning
A dynamic dictionary key names a $ source other than $eventContext, such as byUser.$causedBy.subject. Only $eventContext.<path> is resolved; any other source becomes the literal key. Write byUser.$eventContext.causedBy.subject.
A command or event specification value is null; in Chronicle an optional fact is a separate event. Optional read-model values may be null.
PLAY0351
Error
A given readmodel or then readmodel block does not state every declared key part, or its inferred identifier when no key is declared. A scalar then query … result block may derive its identifier from the argument.
PLAY0352
Error
A specification without an action asserts an event or error, or has no read-state/query outcome. One actionless query with one error and no other outcome is admitted as a Validation rejection from ESM v18; an error without a query remains invalid.
PLAY0353
Error
A specification value is null for a required property, or a nested command/event property is null; only optional read-model properties admit null.
PLAY0354
Error
A structured specification object omits a required property of its declared composite type.
PLAY0355
Error
The composite type declared for a structured specification value cannot be resolved.
PLAY0356
Error
A typed structured specification object repeats a member; inline JSON duplicates are caught earlier by PLAY0294.
PLAY0357
Error
An ESM message beginning with $strings. has no valid dotted key. Keys follow .strings assignments: an ASCII letter or underscore first, then word characters; subsequent segments contain one or more word characters.
PLAY0358
Error
A specification declares more than one when action (command or appended event).
PLAY0359
Error
then events in any order is malformed or repeated.
The interaction model - behaviors, the on clauses that start them, the actions they run and the continuations those actions branch into. The fifty codes from PLAY0300 upwards are reserved for this band as a whole, so a later addition lands beside its siblings rather than wherever there happened to be room.
A behavior is deferred from the backend ESM v1 profile in the same way every other UI construct is - see PLAY0269. Deferred does not mean droppable: the syntax tree, the printer and the semantic model carry every interaction construct in full, and a target that cannot realize one reports it rather than dropping it.
Code
Severity
Reported when
PLAY0300
Error
A behavior declaration is not of the form behavior <Name>.
PLAY0301
Error
A behavior name is declared more than once.
PLAY0302
Error
A line in a behavior body is neither description, parameter, order nor an on binding.
PLAY0303
Error
A behavior parameter declaration is not of the form parameter <name> [<Type>].
PLAY0304
Error
A behavior declares the same parameter name more than once.
PLAY0305
Error
A behavior order is not an integer.
PLAY0306
Warning
A behavior declares no bindings, so nothing it is attached to can run anything.
PLAY0307
Error
An on clause names neither a built-in interaction kind, an event, an interval, nor a declared application trigger.
PLAY0308
Error
An interaction binding declares no actions.
PLAY0309
Error
An interaction binding declares where more than once.
PLAY0310
Error
A line where an action was expected does not name one of the action kinds.
PLAY0311
Error
An execute action is not of the form execute <Command>.
PLAY0312
Error
A navigate action is neither navigate to <Screen> nor navigate back.
PLAY0313
Error
An open dialog action does not name a dialog template, or a close action is not close dialog.
PLAY0314
Error
A refresh action does not name a query.
PLAY0315
Error
A set action is not of the form set <target> to <value>.
PLAY0316
Error
A notify action is not of the form notify <info|warning|error> "<text>".
PLAY0317
Error
A confirm action carries no message.
PLAY0318
Error
A raise action does not name an application trigger.
PLAY0319
Error
An action argument is not of the form with <name> from <binding>.
PLAY0320
Error
A continuation is attached to an action that cannot fail, so it could never run. navigate, notify, set and close dialog have no outcome to branch on.
PLAY0321
Error
An on result continuation is attached to something other than open dialog.
PLAY0322
Error
A uses clause is not of the form uses <Behavior>.
PLAY0323
Error
An argument at a uses site is not of the form <parameter> <value>.
PLAY0324
Error
Interaction nesting went deeper than the compiler admits. Extract the inner actions into a named behavior.
PLAY0325
Warning
An interval trigger is below the floor a client can usefully honour.
PLAY0326
Error
An application trigger is declared with a name reserved as a built-in interaction kind. on <Name> would mean the interaction and never the trigger, so the declaration would be unreachable.
PLAY0330
Warning
An action names a command the document does not declare.
PLAY0331
Warning
A navigate to action names a screen the document does not declare.
PLAY0332
Warning
A refresh action names a query the document does not declare.
PLAY0333
Warning
An open dialog action names a dialog template the document does not declare.
PLAY0334
Warning
A raise action or an on clause names an application trigger the document does not declare.
PLAY0335
Warning
An on event clause names an event the document does not declare.
PLAY0336
Warning
A uses clause names a behavior the document does not declare.
PLAY0337
Error
A uses site supplies an argument the behavior declares no parameter for.
PLAY0338
Error
A uses site leaves a behavior parameter without an argument.
PLAY0339
Warning
Actions follow an unconditional navigation, so they could never run.
PLAY0340
Warning
Another file of a folder repeats an attachment of the same module or feature - a uses of the same behavior with the same arguments, or an inline on block identical to one already attached. Only the first, in file-path order, is kept; the repeat is ignored and the warning names the file that attached it first. Folders written by earlier versions restate a module’s or feature’s attachments in every descendant file, and report this once per copy.
PLAY0341
Error
A guarded action child is not when <condition> execute <Command>, otherwise hidden, otherwise execute <Command> or navigate to …; navigation is repeated, or otherwise hidden has command arguments.
PLAY0342
Error
A label-headed guarded action declares no when alternatives.
PLAY0343
Error
A guarded action repeats otherwise, or declares a when alternative after it.
PLAY0344
Error
A guarded action condition does not compare an item.<field> path with a literal. Ordering operators require a number; contains and starts with require a string.
PLAY0345
Warning
An item path in a guarded action condition or input binding names no subject field, continues past a scalar, or crosses a collection-valued field.
PLAY0346
Warning
A guarded action has no nearest data subject, or multiple data directives tie in its nearest container. Field checks are skipped until the subject resolves.
PLAY0347
Warning
Earlier alternatives provably shadow an alternative. Guards use first-match order; proof uses DNF comparison-set inclusion with a 64-disjunct expansion cap. Overlap alone is not reported.
PLAY0348
Warning
A guarded alternative or otherwise execute supplies a with argument the chosen command does not declare, or binds a subject field whose collection cardinality differs from the command input.
Guarded-action checks PLAY0341–PLAY0348 are shared by the TypeScript compiler, Monaco and VS Code. Subject and command shapes that are imported but undeclared, or ambiguous, remain unknown rather than guessed. See Editor diagnostic support for the remaining C#-only checks.
An inline on block is an anonymous behavior, so it has no name to report against. Diagnostics inside one cite the position and the trigger instead.
A projection construct binds, but Chronicle’s projection lowering drops part of it: all inside a children or nested block loses its subscription to every event type and behaves as every, and an automap or no automap on a joined event is replaced by the auto-map of the level the join sits in.
PLAY0381
Warning
A projection-level key is parsed but does not route events in Chronicle or the executable semantic model. Declare keys on each from (or its events).
PLAY0382
Error
A variant declares no enters on event.
PLAY0383
Error
A projection-level shared handler maps a property absent from a variant’s known read-model shape. Unknown shapes remain undecided.
PLAY0384
Error
Two variants in one projection have the same name.
PLAY0385
Error
An entering event is claimed more than once in one projection.
PLAY0386
Error
A given caller line is not authenticated, role "<name>", or claim "<type>" = "<value>".
PLAY0387
Error
A specification declares more than one given caller block or then denied outcome.
PLAY0388
Error
then denied contains extra text or is mixed with another outcome.
PLAY0389
Error
A specification exercises an authorized command or query without a given caller fixture or given caller as <Persona>.
These diagnostics cover constraint binding and the parser warning for file-backed constraints.
Code
Severity
Reported when
PLAY0390
Error
A unique constraint names an event the application does not declare.
PLAY0391
Error
A unique <property> on <Event> constraint names a property the event does not declare.
PLAY0392
Error
Two constraints in the application share a name. The name is a constraint’s identity in the event store - it keys the constraint’s index and its violations - so it is unique across the whole application, not just its slice.
PLAY0393
Error
ignore casing is declared on a unique event constraint; it applies only to unique property values.
PLAY0394
Warning
Another file declares an identical authorize gate on the same module or feature. The first is kept and the repeated gate is ignored; distinct gates accumulate with AND.
PLAY0396
Warning
A file <Path> constraint names a Chronicle IConstraint class, which can only declare uniqueness. Use unique ... for portable uniqueness; put other rules in command validation or a require condition.
Use an opening fence with an info string, such as ```csharp (without the spaces), for every inline implementation. Use ```text for multiline descriptions. The old language-line form, validate csharp, and bare description fences still parse during the deprecation window; printing a document converts them to the new form.
Code
Severity
Reported when
PLAY0397
Warning
An inline code block uses a separate language line, validate csharp, or a multiline description uses a bare fence. The message names the tagged-fence replacement.
A compiler-authored typed repair is offered only when PLAY0397 identifies a
validate csharp header. It uses an identity replacement and canonical printing
to produce a tagged ```csharp fence. The entire file is reprinted; other
legacy forms and whitespace may change, but a repair that would drop any comment
is refused. Preview it through the revision-checked AST authoring contract (or
MCP read-workspace repairs / propose-repair); review the bytes before applying.
Other legacy forms are not individually offered as repairs.
A v1–v3 flat executable-model projection transition carries deprecated ZeroOrOne or Many affected-instance cardinality. Chronicle routes one key per transition; use a join for structural many. Returned by ExecutableSemanticModel.DeprecationDiagnostics for constructed or deserialized ESM, with a model-level location because ESM does not retain source positions. The source binder produces only One; query cardinality is unaffected.
PLAY0449
Error
A given fact needs a historical event shape (message names the event and revision), which Screenplay does not consume yet; or an event’s source revision disagrees with its persisted catalog revision and requires explicit forward advancement. There is no fallback from current to historical properties.
An import inside a module or feature does not name files as import "<path or glob>".
PLAY0455
Warning
A file import pattern with wildcards matches no .play file.
PLAY0456
Error
A file import names one file, without wildcards, and that file does not exist.
PLAY0457
Error
Two imports place the same file in a module or feature where neither lies inside the other. A file belongs in one place.
PLAY0458
Error
Imports keep placing a file deeper than 32 levels - they form a cycle.
PLAY0459
Error
A file imported into a module or feature declares a module other than the one it is placed in. Restating the module it is placed in is allowed.
PLAY0460
Error
The top level of a file imported into a module or feature holds something that scope cannot hold, such as a screen template in a file placed in a feature.
Refusal branches, redelivery and no-event assertions
Refusal branches and $refusal values bind and execute from ESM v19. Redelivery and then no events bind and execute from ESM v17; earlier strict readers reject their respective canonical members.
Code
Severity
Meaning
PLAY0538
Error
An on refused header is malformed, uses an unsupported selector, or appears outside an invokes block. Use on refused [by validation | by constraint [<Name>] | by authorization].
PLAY0539
Error
A refusal branch is empty, repeats or adds children to acknowledge, combines acknowledgement with productions, or contains another kind of effect. Use acknowledge alone or one or more produces <Event> blocks.
PLAY0540
Warning
A refusal branch is shadowed by an earlier selector, or its declared constraint targets none of the invoked command’s events. Bare refusal covers validation and constraints, not authorization.
PLAY0541
Error
A $refusal value is outside a branch’s event mapping, has an unknown member, uses constraint outside a constraint selector, or targets an incompatible property type. The values reason, constraint and message are String values.
PLAY0542
Error
A named constraint in a refusal selector does not resolve to a declared constraint.
PLAY0557
Warning
An on refused by authorization branch invokes a command gated by its own, feature or module authorization without a declared invoking identity. With no caller the reference runner always refuses the command. Arc runs commands as the system only for a reactor carrying [ExecuteCommandsAsSystem]. Declare runs as system role "<Role>" to state the intended identity; it suppresses this warning and selects released ESM v10. Refusal branches select ESM v19.
PLAY0543
Error
when redelivered <Event> to <Reaction> is malformed, or its values, optional for and route locator do not identify exactly one definitely matching given event occurrence with no undecidable candidates. Use for, values, stream or no stream to narrow the locator.
PLAY0544
Error
The redelivery reaction is unknown or ambiguous, or has no event trigger on the stated event.
PLAY0545
Error
then no events is malformed, repeated, has child mappings, or accompanies event, event-order, error or denial expectations. Use one leaf assertion after an action, including when append; read-model, query and response assertions may accompany it.
runs as is admitted by released ESM v10; PLAY0268 no longer refuses reaction command identity. Omitting it preserves existing executable bytes. System claim conditions evaluate to unknown and a final unknown denies.
Code
Severity
Meaning
PLAY0647
Error
runs as is malformed, repeated or misplaced, or contains an empty or duplicate role. Use one reaction-level runs as system [role "<Role>" and role "<Role>"] line. Roles are quoted literals; zero roles is allowed.
PLAY0648
Warning
A reaction invokes a command with its own or inherited authorization gate without declaring runs as. Both compilers report at most one finding per invocation; an authorization refusal branch receives PLAY0557 instead.
PLAY0649
Warning
The reaction declares identity but has neither invocations nor an inline or file implementation body. Both compilers check this.
PLAY0650
Warning
C# binder only: a declared role is referenced by no invoked command’s effective gate. Opaque gates and inline or file reaction bodies suppress this least-privilege finding.
PLAY0651
Warning
C# binder only: the declared system identity definitely cannot satisfy an invoked command’s effective gate. Claim conditions and other unknown results are not treated as definite denial.
PLAY0652
Warning / Information
Opt-in privilege completeness: each producer of an elevated reaction’s trigger event must require every declared system role. Ungated commands, captures and reaction productions produce Warning; opaque gates produce Information because they cannot be compared. Clock and application triggers have no producer and are silent.
A given clock or when clock does not state one ISO 8601 instant with an offset or Z, or given clock is repeated.
PLAY0462
Error
A when trigger line is not when trigger <Trigger>.
PLAY0463
Error
A given capture or when capture line is not <given|when> capture <Capture>.
PLAY0464
Error
A when query line is not when query <Query>, a then result line is not then result [exactly], or then no result is malformed or repeated.
PLAY0465
Error
A query result is asserted without when query, a performed query asserts no outcome, results conflict with no result, or a query error is combined with an action, multiple calls/errors, a result, then no result, denial or another outcome. Both compilers share the query-error shape checks; executable v18 admission and Validation comparison remain C# checks.
PLAY0466
Warning
A when trigger names a trigger nothing declares or registers, or a value its declaration does not carry.
PLAY0467
Warning
A given capture or when capture names a capture the application does not declare.
PLAY0468
Error
A when query or then query … arguments argument is unknown or repeated, or a required by or filter argument is missing.
A production copies the command identifier into payload while targeting that same identifier. The inline-only repair removes the property and mapping, explicitly changes the event contract, retires its property address, and is excluded from fix-all. Consumers, opaque implementation impact or comment loss refuse the repair. Plain/standalone contracts receive guidance only: review persistence and generation evolution before changing their shape.
PLAY0470
Error
A command targets another event source but one or more productions omit for, or both an inline and a plain production omit for and therefore have different defaults. The diagnostic names the production. State every destination explicitly; cross-source execution is still unsupported.
PLAY0471
Information
An event’s id equals its current name. The typed removal repair covers inline and standalone declarations, preserves the executable model and catalog, and refuses comment loss. Monaco and VS Code also offer an editor quick fix to remove the complete line unless it has a trailing comment.
PLAY0472
Error
Event id is missing its nonempty quoted value or is repeated.
PLAY0686
Warning (retired)
No longer reported: ESM v16 carries event id pins as stored type names under decision 0075. Retained for compatibility with earlier compiler warnings. See event rename pins.
PLAY0473
Error
An inline event name collides with a standalone declaration, import, or another inline declaration.
PLAY0474
Error
produces event occurs outside a command, such as in a reaction.
PLAY0475
Error
An inline event declares generation in its header or body. Extract it before evolving generations.
PLAY0476
Error
A production supplies unescaped system-assigned namespace, sequence, correlation, causation, causedBy, or occurred, or an inline event supplies origin.
PLAY0477
Error
Event documentation is not one nonempty fenced Markdown block, or is repeated.
PLAY0558
Error
Module, feature, slice, command, read-model or reaction documentation is not one nonempty fenced Markdown block, or is repeated.
PLAY0559
Warning
Files give different documentation for one module or feature. The first documentation is kept.
PLAY0572
Error
A given caller as <Persona> reference is malformed, has body lines, or names an unknown top-level persona. Unknown references list declared personas.
PLAY0573
Error
A persona caller cannot be synthesized or verified against its policies. Binding names the persona, policy and refusal (negation, nonLiteralClaim, roleClaim, opaqueImplementation, unresolvedPolicy, noPolicies); use an explicit given caller.
PLAY0574
Warning
Opt-in personas check: none of a persona’s policies gates a command, query or inherited screen scope.
PLAY0575
Warning
Opt-in personas check: an effective command or query gate definitely denies every declared persona’s synthesized caller; unsynthesizable or undecidable callers are unknown.
PLAY0576
Information
Opt-in personas check: required atoms do not pin an or with multiple buildable alternatives. Names an unchosen alternative and suggests adding a policy that pins it.
Malformed typed mappings and duplicate destinations retain PLAY0044 and PLAY0193. Descriptions retain their existing diagnostics. Event descriptions and documentation retain their information diagnostic (PLAY0270). Event rename pins that differ from the event name select ESM v16 and carry storedName; equal-name pins keep the earlier version and bytes, and PLAY0686 is retired. Invalid pins, generation disagreements and stored-name collisions use PLAY0472.
A plain produces <Event> omits for and its command has one required scalar identifier. Conditional productions and optional or collection identifiers are not reported.
PLAY0478 does not change routing or executable-model bytes. Its typed repair
replaces the production with one that explicitly states for <identifier>.
Accept it only when that event should address the command’s identifier: a plain
omission can intentionally use an allocated identity, or inherit another
production’s explicit destination. The repair is not offered for an optional or
collection identifier. It is also refused when the original or candidate has no executable model,
when the repair would change the language or semantic version, or when any other production’s
effective destination would change (including through a command default).
Discovery verifies these conditions and comment preservation once per subject on an
immutable workspace snapshot; a new snapshot cannot reuse those verification results.
The verified PLAY0478 repair is available through the
MCP repair workflow.
Monaco and VS Code do not offer a quick fix for PLAY0478 or PLAY0470.
For PLAY0166 on a command production, a typed repair can add an event
declaration to the producing slice. Properties follow mapping order; command
property paths retain their types and concepts (including compliance markings),
and $context.occurred becomes DateTime. No generation, tags, subject or origin
is inferred. Unknown sources, literals, computations, reads, conflicting producer
shapes, imported or already-declared events, and cross-file producers have no
repair. Any workspace document with parser errors also blocks inference, because its partial
syntax may hide a contract or another producer. Reaction and capture producers are not inferred.
Both repairs require canonical formatting consent and refuse any dropped comment.
Discovery verifies authoring acceptance for PLAY0166 too: an inferred event whose
fields conflict with a specification is not offered. Discovery reuses cached acceptance
and conflicts on the same immutable workspace snapshot; diagnostics are never cached.
Every proposal runs one fresh transaction, even after discovery. A matched repair
that fails returns that transaction’s typed conflicts and full diagnostics; UnknownRepair
means no recipe matches the code and original subject, not a verification failure.
Discovery and preview never write source. Review the write plan and explicitly
accept it through the workspace authoring contract or
MCP repair workflow. Stale workspace or catalog
revisions are rejected. Source authoring and executable readiness remain separate;
for example, compliance attributes and nested mapping paths can require capabilities
the executable model does not yet admit.
A type uses the legacy optional suffix. Write optional after the type. This does not fail --warnaserror.
PLAY0480
Error
optional follows identifier. Write the modifiers in the order Type optional identifier; command identifiers must still be required and scalar.
PLAY0481
Error
A read uses optional. Optional reads are not yet supported; their absence behavior is reserved for #308.
query Q => observable? is the sole exception: its ? is the only spelling that preserves a one-shot query returning an optional scalar type named observable. It produces no PLAY0479 and is excluded from occurrence repairs and document migrations. See Queries.
PLAY0479 points at the complete type reference. VS Code marks it deprecated.
Its workspace repair replaces only the spelling at that occurrence; a document
repair combines all such replacements in one verified transaction. Both reparse
the result, require unchanged syntax structure, and check that the selected
information diagnostics disappear. Use PreserveTrivia to keep comments, alignment,
line endings and encoding. Canonical reprinting is a separate explicit choice.
Discovery and preview never write files; acceptance still requires current workspace
and catalog revisions. Monaco and VS Code also offer verified TypeScript quick fixes
for one occurrence or the entire document, without requiring .NET.
Generated properties, command responses, generated fixtures and return expectations are admitted as ESM v7. A pre-generation reference from authorization (including inherited/composed policies or a generated identifier’s implicit subject), a property rule or a requirement reports PLAY0273: reference an input property or remove generated. Rules on a generated concept select ESM V20: Proven rules are silent, Refuted rules report PLAY0688 with a witness and Unproven rules report PLAY0689 with a reason. Earlier ESM readers refuse these rules rather than drop them; fixtures are checked after shape validation, with failures rejected as Contract and opaque predicates remaining Unsupported. Missing generation fixtures bind, but reached generation returns Unsupported(IdentityAllocation) and cannot pass a specification. Other unadmitted constructs still block executable binding. See commands and fixtures.
For response and generated-fixture compatibility checks only, Date values must be quoted yyyy-MM-dd calendar dates. DateTime values must be quoted yyyy-MM-ddTHH:mm:ss, optionally followed by a decimal fraction of 1–7 digits, and always end in uppercase Z or an explicit +HH:mm / -HH:mm offset. Years range from 0001 to 9999; calendar days must exist, hours range from 00 to 23, and minutes and seconds from 00 to 59. Offsets range from -14:00 to +14:00; at 14 hours the minutes must be 00. These checks do not change general literal parsing. Imported or unresolved value shapes remain unknown rather than being inferred from their names.
Code
Severity
Reported when
PLAY0482
Error
A generated property is declared outside a command.
PLAY0483
Error
A generated property is not a required, noncollection generatable concept (implicit Uuid uuid or an explicit generation declaration).
PLAY0484
Error
Property modifiers repeat or are out of order. Write Type optional generated identifier.
PLAY0485
Error
A generated property is supplied as request or form input.
PLAY0486
Error
A command response is malformed, empty, repeated or conditional.
PLAY0487
Error
A response source does not reference one direct command property.
PLAY0488
Error
A response block repeats a field name.
PLAY0489
Error
A response uses a collection or whole read model, or an explicit field type differs from its source’s type, collection shape or optionality.
PLAY0490
Error
A generated fixture repeats a target, names an unknown, nongenerated or identifier property, or supplies an incompatible or nonconcrete value.
PLAY0491
Error
A return expectation is malformed, repeated, incompatible with the response contract, lacks a command action, or accompanies an error or denial.
An external system declaration is malformed or repeated.
PLAY0496
Error
An operation declaration or phase is malformed, or supplies event-only metadata.
PLAY0497
Error
A production reference is ambiguous, or a qualified production does not resolve to an explicit operation.
PLAY0498
Error
An operation name collides with an event or another operation in its owning slice.
PLAY0499
Error
An operation is produced outside a command.
PLAY0500
Error
An operation must reference exactly one uniquely declared external system.
PLAY0501
Error
An operation input mapping is missing, repeated, unknown or incompatible with its declared type.
PLAY0502
Error
An operation specification step is malformed, unresolved, duplicated, incompatible with its command action or asserts undeclared compensation.
PLAY0508
Error
A numeric preamble has an unknown or malformed spelling, or a numbers exact document nests another numbers directive inside a declaration; only a top-level numbers exact is recognized.
PLAY0509
Error
A physical document repeats its numeric preamble.
PLAY0510
Error
A numeric preamble follows domain, imports or declarations.
PLAY0511
Error
A complete number cannot be represented exactly in the bounded Decimal domain.
PLAY0512
Error
Declaration-bearing physical documents or marked import barrels disagree on numeric mode.
PLAY0513
Error
Source options or inserted numeric values disagree with their owning mode.
The numeric rows are syntax diagnostics. A valid numbers exact document still cannot bind: PLAY0268 reports that exact numeric mode is not admitted by any supported executable model (ESM) version yet, and unmarked documents keep their existing numeric behavior.
These are syntax diagnostics. A valid system, operation or operation specification still cannot bind: PLAY0268 reports that these constructs are not admitted by any supported executable model (ESM) version yet. Operations do not trigger event destination or payload-identity diagnostics. A valid pending or attached handler remains unsupported independently. Diagnostic repairs for PLAY0471 and PLAY0479 are unchanged.
A projection, reducer rule or named reaction trigger uses an event from a later slice, or a command/reaction reads a read model built by a later slice (builder preferred over declaring slice). Reported once per consumer slice and event or read model at its first reference. Reads whose builder’s projections or reducers for the read model being read consume any event produced inside the reader’s child at the reader/builder’s lowest common container are excluded, including from cycle grouping. Projections with a matching variant count, including their shared blocks and variant transitions; unrelated projections and reducers in the same slice do not. Produced events include declarations and command/reaction produces targets, including imported events. A producer in the consumer’s own sub-feature cannot be fixed by reordering. This does not fail --warnaserror.
PLAY0517
Information
A sibling group depends on each other’s events or non-feedback read models, so reordering cannot make every dependency flow left to right. Reported once per mutually dependent group, at its earliest backward reference, instead of individual PLAY0516 findings within that group. This does not fail --warnaserror.
See Timeline diagnostics for the ordering root, grouping rules, checked references and C#/MCP repair conditions. PLAY0516 offers verified typed moves or explicit pins before a retained glob where safe; PLAY0517 and own-sub-feature findings have no repair. These findings and repairs do not change executable behavior.
An opted-in container has uncovered counted references into a producer module. One finding per container and producer module, at the container header, with source evidence. If the producers’ shared container is an invalid ancestor target, the finding lists their outermost covering-eligible features instead.
PLAY0553
Information
A valid declaration has no counted explicit reference, including provisional ambiguous coverage. Reported at the declaration.
PLAY0556
Information
Two containers declare each other. Reported on each declaring line.
PLAY0554
Warning
A depends on target is self, an ancestor, a descendant, or does not resolve to a module or feature.
PLAY0555
Warning
The same target is declared again on a container, in one file or across files. Resolved aliases count as repeats; unresolved targets compare by text. The first is kept.
An ambiguous target uses PLAY0198, naming the equally near candidates. See Declared dependencies for the sibling and qualified-name rules. Malformed statements are parse errors (PLAY0022 in a module, PLAY0024 in a feature).
Invalid or duplicate source/stream declaration, including non-scalar types or invalid composite part declarations
PLAY0504
Missing or ambiguous source-owned stream, invalid scalar/composite key mapping or literal formatting, or known incompatible command identifier, production destination or key type
PLAY0505
Both the route and qualified value-property interpretations are viable; neither is selected
PLAY0506
Known scalar or composite part type needs an unsupported portable formatter; bare Int is not supported
PLAY0507
Redundant rename-only stored-name pin
PLAY0547
Invalid, empty, duplicated, conflicting or misplaced specification route/part block
Unresolved specification route or missing, unknown, duplicated, mismatched-shape, nonliteral, incompatible or unformattable stream id/part
PLAY0550
Missing or incompatible routed source identity, or ambiguous producer fallback without a source identifier
PLAY0551
Expected route contradicts its sole producer, the command under test
Valid source/stream authoring selects ESM v8. Executable mappings use direct required, non-collection, non-generated command properties or literals; property paths and handler commands still fail with PLAY0268. Editors and MCP preserve original source evidence; unknown imported type shapes are not guessed. There is no new routing or source-pin quick fix. Existing PLAY0470/PLAY0478 repairs still refuse when executable before/after routing proof is unavailable.
Semantic binding applies a policy with a claim under not, directly or through grouping, whose target is an optional path, a command’s subject without an identifier, or a non-string type. An undecidable target evaluates to unknown even under negation; a final unknown policy result denies. Reported at the authorization reference against that command’s properties or query argument. The TypeScript syntax compiler does not perform this semantic check.
See Policies for three-valued evaluation and the distinction between a missing caller claim and a missing comparison target.
Alternatives occur on a trigger other than click, double click or select. Submit and non-item triggers have no structured subject in this version.
PLAY0561
Error
A binding mixes alternatives with plain actions or an opaque where guard.
PLAY0562
Error
A when or otherwise branch has no actions.
PLAY0563
Error
An interaction uses the labeled-action one-line when … execute … spelling. C# offers a typed block-form repair.
PLAY0564
Warning / Information
Opaque where on click, double click or select is deprecated. A strict item condition warns and has a C# typed repair; other text is Information without a repair. Other triggers are unchanged.
Both compilers check these forms. Repairs require individual review (CanFixAll: false) and refuse trailing-comment relocation or comment loss. Conditions reuse PLAY0344–PLAY0348; fallback ordering uses PLAY0343 and missing alternatives uses PLAY0342. See Interactions. Interactions still report PLAY0269 at ESM binding; syntax support is not runtime admission.