Error codes

Every diagnostic pw check prints carries a code, such as [PW0606], and says in one sentence what the program must hold to. These are all 220 of them, from the compiler's registry. A number is never reused.

Find one by its address: pleris.dev/e/PW0606. Errors and diagnostics explains how to read a diagnostic.

Check is build

CodeSymbolWhat the program must hold to
PW6601executable_programa semantically valid program is supported by the compiler's executable backends

Syntax

CodeSymbolWhat the program must hold to
PW0001expectedthe parser expected a different token here
PW0002unclosed_type_argsa type argument list must be closed
PW0003unclosed_effect_rowan effect row must be closed
PW0004effect_row_needs_bracean effect row opens with {
PW0005unclosed_paramsa parameter list must be closed
PW0006unclosed_blocka block must be closed
PW0007unknown_declarationthis does not begin a declaration
PW0008unclosed_parena parenthesis must be closed
PW0009expected_expressionan expression was expected here
PW0010unclosed_argsan argument list must be closed
PW0011unclosed_lista list literal must be closed
PW0012unclosed_matcha match must be closed
PW0013keyword_as_namea word that begins a statement or an expression in a body names no binding, parameter or declaration
PW0014string_escapea string's escapes and holes must be ones the language defines
PW0015unreadevery expression and pattern in a file that parses is one the compiler reads
PW0016read_wholea clause's value, a string's hole and a block marker's expression are read whole, and nothing follows what their grammar reads
PW0017optimistic_clausean optimistic clause names an entry, binds its value with as, and gives its transition after =>
PW0018for_needs_ina for loop names what it iterates after in
PW0019each_headan {#each} names its list, and after as the name each row binds
PW0030statements_separateda block's statements are separated by ; or a line
PW0031logical_mixed| and & mixed in one chain are parenthesized: neither binds tighter
PW0099no_progressthe parser made no progress

Names and imports

CodeSymbolWhat the program must hold to
PW0020unresolved_modulean imported module must exist in the workspace
PW0021unresolved_namean imported name must be declared by the module it comes from
PW0022ambiguous_namea name must resolve to exactly one declaration
PW0023private_accessa private declaration is not visible outside its module
PW0029private_dataa declaration that holds data says whose with user, session or public, not private
PW0024duplicate_declarationa module may declare each name once per namespace
PW0025import_cyclemodules must not import each other in a cycle
PW0026unresolved_typea written type must name a type visible here, applied to exactly its parameters
PW0028declared_twicea parameter, a field, a case, a policy or an attribute is written once
PW0027not_a_terma call names a function, a data operation, or a type it builds

Declarations and their clauses

CodeSymbolWhat the program must hold to
PW0101read_your_writes_needs_a_sessionread-your-writes requires a session-scoped read
PW0102session_state_is_freshsession-owned state may not be served stale
PW0312retry_not_idempotenta command that retries must be idempotent
PW0338sent_without_idempotencya command a page's handler calls declares idempotent_by
PW0339command_outside_a_handlera command is called only by a page's handler
PW0340route_names_its_parametersa route is / and segments, a word or a {parameter} each, and names each of its page's parameters once
PW0341route_declared_twiceone route is one page's: an address names the page it is for
PW0342not_found_names_a_casea page's not_found_on names a case of an error a query it reads can answer
PW0343last_known_good_is_publica last-known-good fallback serves only public data
PW0344reads_more_than_givena query asks no more consistency of a source than its reads give
PW0345writes_two_sourcesa command's writes are one transaction, in one source
PW0346isolation_more_than_givena command asks no more isolation of a source than its transactions give
PW0347events_without_commita command's events are sent if and only if its writes commit
PW0348idempotent_without_commita command's record of an interaction commits with its writes
PW0349source_malformeda source holds what the program's effects name, and each is held by one
PW0350redirect_names_a_casea page's redirect_on names a case a query it reads can answer, which carries the one parameter of the page's route, and says whether the move is permanent
PW0351predicate_declareda predicate a program declares says, in one string with no hole, what a reader is told when it refuses, is declared once, and is given its parameters by type wherever a requires names it
PW0313retry_unboundeda retry policy must be bounded
PW0352layout_names_a_layouta page's layout clause names a layout, once
PW0353layout_takes_nothinga layout is given nothing by the page it shows: it declares no parameters
PW0361table_malformeda table's row is a record declared beside it, in the module of its name, and its key, order, indexes and references name the row's fields, each of a type every adapter keys a row by
PW0362data_not_declareda table's rows are reached only through the functions its declaration gives
PW0364all_unboundeda table is read whole, by all(), only where it states bounded
PW0365refers_across_sourcesa reference to a table another source holds is held by no database: the referred row may be missing, which get answers as None
PW0366migration_unstateda change from the schema released that loses or reinterprets data is stated by a migrate, and each migrate states one
PW0325stale_key_policya keyed query must say what happens when its key changes
PW0327written_rollbackan optimistic transition's reversal is derived, not written
PW0330optimistic_not_purean optimistic transition must be a pure function of the resource's value
PW0334derived_not_purea derived value, and a value a template computes, is computed from other values, and performs no effect
PW0335policy_valuea policy's value is one its domain has
PW0331optimistic_target_mismatchan optimistic transition must produce the value type of the resource it targets
PW0336key_omits_a_reada cache key names each parameter its entry depends on
PW0332effect_names_an_operationan effect is not a callable, so it does not name a host operation
PW0200cache_no_invalidationa shared cache should declare how it is invalidated
PW5010unsafe_audit_incompletean unsafe escape hatch must carry a complete audit record
PW5015unsafe_attribution_invalidan escape hatch's attribution target must name a real owner

Effects

CodeSymbolWhat the program must hold to
PW0408member_receiver_untypeda member is read through a value whose type the program states, so what it performs is read
PW0400undeclared_effectan effect row must name every effect the body performs
PW0401forbidden_effectsome effects are not permitted where a declaration runs, whatever it declares
PW0402wrong_frame_phaseeach frame phase permits only the work it exists to do
PW0405read_per_elementa read in a loop over data is not keyed by the loop's element: the list's reads are one set read, before the loop
PW0406set_read_per_keya page's or a command's calls do not grow with its data: a set read is on a source that batches
PW0407set_pair_shapea keyed read's set form is a function of the same source, given a list of its key and answering a list of its results, each with its key

Layout and frame phases

CodeSymbolWhat the program must hold to
PW0403observation_feedback_cyclean observation must not cause the change it observes
PW0404false_independencea subtree declared independent must not depend on anything outside it

Matching

CodeSymbolWhat the program must hold to
PW0305non_exhaustive_matcha match must cover every value its scrutinee can take
PW0333unreachable_armevery arm of a match must be reached by some value
PW0337case_tested_by_ifa template tests a value's case with {#match}, which names every case

Types

CodeSymbolWhat the program must hold to
PW0600option_used_as_valuea value that may be absent must be matched before it is used
PW0601unchecked_external_castan external value must be decoded, not cast
PW0602handler_signature_mismatcha handler must accept the event its attribute delivers
PW0603constructor_aritya constructor pattern must bind exactly the fields its constructor declares
PW0604call_aritya call must supply exactly the arguments its callee declares
PW0605argument_typea value given for a declared parameter or field must have its declared type
PW0606return_typea body must produce the result type its signature declares
PW0607binding_typean annotated binding must be initialised with a value of its declared type
PW0609operand_typean operator's operands, and a condition, must have the types they take
PW0608pattern_constructora constructor must name a case of the type it builds or matches
PW0610unknown_membera read or a call through a value must name a member its type has
PW0611assign_immutablean assignment's target must be a binding declared let mut
PW0612record_fieldsa record must be built with each field its type declares, once, and no other
PW0613branch_typesthe branches of an if or a match whose value is used must produce one type
PW0614not_callablea value called must be a function
PW0615list_itemsa list's items must share one type
PW0616int_literal_rangean Int literal must fit in 64 bits
PW0617named_argumenta named argument is given to the parameter of its name, once, after the positional ones
PW0619view_propsa view is given each of its parameters, and nothing else
PW0629names_no_valuea name a template reads is a value: a binding, a parameter, a signal, a constant, or a predicate the page asks of its reader
PW0618result_droppeda failure is handled: a Result is taken apart, returned with ?, or discarded by name
PW0621route_parameter_is_texta route's parameter is text: a String, or an opaque type over one
PW0630query_parameter_is_optional_texta query parameter is an Option of text: an address may leave it out
PW0620answer_read_for_a_valuewhat a command answers carries no value: a handler matches Ok(_), and reads the value from a query
PW0622invariant_not_showna value is built of an opaque type only where the build shows it holds the type's invariant
PW0623invariant_unreadan opaque type's invariant is bounds on its Int value, value >= 1, or on its String's length, String.length(value) <= 280, joined by &, that some value holds
PW0624no_finite_valuea declared type has a finite value: one that contains itself has a way to be built without itself
PW0625case_name_capitalizeda sum type's case is named with a capital letter, so a pattern tells it from a binding
PW0626representation_shadowedan opaque type's own module reads its representation as .value, so it declares no member of that name
PW0627map_keya map's key and a set's element are an Int, a String, a Bool, or an opaque type over one
PW0628ambiguous_membera member names one declaration: its type's, or the one its module declares or imports

Scopes, tasks and resources

CodeSymbolWhat the program must hold to
PW2001handle_escapesa handle cannot outlive the scope that owns it
PW2005affine_not_consumed_oncean affine value must be consumed exactly once, in the scope that acquired it
PW2002task_detachedan ordinary task cannot be detached from its scope
PW2003handle_used_latea handle cannot be used after its owning scope has exited
PW2004scope_outlives_ownera subscription cannot declare a scope that outlives its owner

Privacy

CodeSymbolWhat the program must hold to
PW5001private_in_shared_cachea value that is not public cannot live in a shared cache
PW5003secret_to_browsera secret cannot be rendered to the browser
PW5004cache_key_omits_partitiona shared cache key must carry every partition its value depends on
PW5006value_exceeds_sink_levela sink accepts only values its declared privacy level admits
PW5007private_in_resume_manifestthe resume manifest ships with the public shell and may hold only public values
PW5008unserializable_capturea resumable handler may capture only what can be written to its manifest
PW5016resume_capture_schema_unnameablea resumable capture must have a type this build can derive a schema from
PW5017resume_artifact_contract_mismatcha resume manifest and its handler artifact must describe the same contract
PW5018resume_destination_unknowna private resumable region must say which principal it is private to
PW5025handler_reads_uncaptureda resumable handler reads what it captures, and what it binds itself
PW5037handle_madea session's, a user's or an organization's handle is the platform's to make: a program constructs none
PW5038handle_answereda data layer answers ids, never a handle: only the platform's operations answer a session's, a user's or an organization's
PW5039handle_from_browsernothing the browser supplies holds a handle: no command's or page's parameter, and no signal, holds a session's, a user's or an organization's
PW5040handle_to_browsera session's handle never reaches the browser: no query's, subscription's or command's answer, and nothing markup prints, holds one
PW5046layout_audiencea page declares at least its layout's audience: its document holds what its layout shows and its resume manifest what the layout's handlers capture
PW5049reader_predicate_shareda page that asks a predicate of its reader is its reader's: a page served to everyone asks none

Placement

CodeSymbolWhat the program must hold to
PW5002no_feasible_placementevery declaration must have somewhere it can run
PW5005declared_placement_cannot_granta declared placement must be able to grant every effect it requires
PW5026built_before_its_parameterswhat is built before any request reads no request's value

Markup

CodeSymbolWhat the program must hold to
PW5009dead_internal_linkan internal link must name a route the program declares
PW5011unkeyed_lista list over a mutable collection needs a stable key
PW5012invalid_nestingan element may only contain the children HTML permits
PW5013handler_on_inertinteractive behaviour belongs on an element that can receive it
PW5014control_without_labela form control must have something that names it
PW5019malformed_template_blocka template block closes with its own name and holds only the markers it takes
PW5020view_elementan element named with a capital letter is a view the compiler composes
PW5021loop_keya loop's key is its element, or a field read from it
PW5023code_in_markupa template writes no code, and no value into a stylesheet
PW5024moves_a_urla template moves no URL: no <base>, and no animation of a link or a handler
PW5022unknown_eventan element handles an event the platform declares
PW5027unknown_modifieran event's modifier is one the runtime applies
PW5028comment_as_texta comment in markup is <!-- -->: text that reads as one would be shown
PW5029title_missinga page served at a route states its title
PW5030title_misplaceda title is the page's: once, at the top of its view, written as text and values
PW5031duplicate_idan id names one element of its page
PW5032reference_names_nothingan id reference names an element its page shows whenever the referrer is shown
PW5033aria_unknownan ARIA attribute, its value and a role are ones WAI-ARIA defines
PW5034metadata_misplaceda page's metadata is the page's, at the top of its view: named once as text, its content text and values, and a name HTML allows once stated once
PW5035link_not_in_bodya <link> in markup is one HTML allows in the body, each relation body-ok or an item's property, or a page's canonical address, once at the top of its view
PW5051canonical_addressa page's canonical address is a page's, href={Page(args)}, served at a route without a query part, each argument a value the page reads or text
PW5052load_from_another_origina page loads from its own origin: an address its markup fetches, written as text, is a path, and a <link>'s address is written as text
PW5036form_control_valuea form control's value is written where HTML reads it: a <textarea>'s as its text, a signal or text, once; a <select>'s by the option it marks selected
PW5041form_answered_by_nothinga form's action is a route that answers its method: a page's, the relying party's, or an upload's
PW5050address_names_no_query_parametera link's query and a GET form's fields name only the query parameters of the route they reach
PW5042navigate_names_no_pagea navigate names a page by its declaration
PW5043navigate_before_a_commita navigate is a handler's, last in the Ok arm of the command's answer nearest it: a page is left only once a command has committed
PW5044slot_misplaceda <slot /> is its layout's: once, at the top of the layout's own view, outside any block, loop, match or stream, with nothing in it
PW5045layout_without_slota layout shows the page that names it in a <slot />
PW5047markup_as_an_operandmarkup is shown where it is written, and is no operand of an arithmetic, comparison or logical operator
PW5048control_where_refuseda control whose command requires a predicate is shown where the page asks that predicate of its reader and it holds

Caches, keys and invalidation

CodeSymbolWhat the program must hold to
PW5100graph_edge_unresolveda dependency, event or invalidation target must name something the program declares
PW5101private_in_shared_materializationa shared materialization may only depend on data every reader of its cache entry may see
PW5105clause_out_of_placea clause belongs to a declaration that reads it
PW5104listener_keya listener's argument is one of its declaration's parameters, or _
PW5103clause_names_another_kinda clause names a declaration of its kind: a resource or a materialization to read, a resource to invalidate, an event to emit or listen for
PW5106write_not_invalidateda command invalidates what it writes: each cached reader of the data it changes, by name or through an event the reader listens for
PW5107optimistic_not_reconcileda command invalidates the entry it speculates on, so what it committed replaces the speculation
PW5108read_names_another_kinda query reads a query or a resource, or in a materialization's body one that derives its value; and a subscription a subscription
PW5109materialization_cyclea materialization depends on nothing that depends on it
PW5110dependency_stated_twicea materialization that derives its value states what it depends on by reading it, and nowhere else

Capabilities

CodeSymbolWhat the program must hold to
PW5200unresolved_capability_argumenta capability's type argument must name a type the program declares
PW5201unknown_effect_familyan effect must name a family some package declares
PW5202unknown_effect_operationan effect must name an operation its family declares
PW5203effect_arity_mismatchan effect must be given exactly the type arguments its declaration binds
PW5204unresolved_impact_markeran effect's impact condition must name a type the declaring module can see

Signals and UI state

CodeSymbolWhat the program must hold to
PW5300signal_written_outside_handlera signal changes only in a handler
PW5301signal_read_where_it_cannot_changea signal is read only where the browser reads it again when it changes: a template part, a handler, or a page query's key
PW5302ui_state_not_a_signala handler changes a signal, not a binding of the body it is written in
PW5303modal_dialoga modal dialog is shown by a signal's block, and says what closing it does
PW5304bound_valuean input binds its value to a signal of String, by its name
PW5305signal_not_provideda provided signal is read only where a page or view around it provides it
PW5306providea body provides a signal declared in a module, once
PW5307signal_in_a_rowa view that holds a signal is not used in a loop's row yet
PW5308signal_key_typea signal that keys a query is a String, an Int or a Bool
PW5309signal_key_stale_worka query a signal keys says what its stale work does

Streamed regions

CodeSymbolWhat the program must hold to
PW5400streamed_read_outside_streama query declared delivery streamed is read only by a <stream>
PW5401stream_statesa <stream> shows each state its query can be in, and no other
PW5402streamed_without_timeouta query declared delivery streamed declares how long it may take

Uploads

CodeSymbolWhat the program must hold to
PW5601upload_malformedan upload states its route, where it is served, and each of its limits, once and as literals
PW5602upload_route_takenan upload's paths are its own: no page's, and no other upload's
PW5603file_form_posts_to_no_uploada form that sends a file posts it, as multipart/form-data, to an upload the program declares

Todomvc

CodeSymbolWhat the program must hold to
PW6101fragment_names_no_signala page's fragment clause names a signal the page declares
PW6102fragment_signal_not_texta signal bound to the address's fragment is a String: a fragment is text
PW6103fragment_formsa fragment's forms are written "form" => "value", each form once, in characters a fragment holds
PW6104fragment_defaulta signal bound to the fragment starts at a value one of the forms gives
PW6105fragment_signal_assigneda signal bound to the fragment is written by the address alone, and no handler assigns it
PW6106link_names_no_forma link to a fragment of a page that binds its fragment names a form the page takes

Payments

CodeSymbolWhat the program must hold to
PW6401invoked_command_requiresa command the platform invokes holds no reader to a predicate: it declares no requires
PW6402invoked_command_parametersa command invoked_by Payments is given one payments.Settled, and nothing else
PW6403invoked_twiceone command answers a payment's outcome: a second would leave the host two answers
PW6404invoked_command_pressedno page presses a command the platform invokes
PW6405invoked_command_not_idempotenta command the platform invokes is idempotent: its word, a provider's or the clock's, may come more than once

Scheduled commands

CodeSymbolWhat the program must hold to
PW6501schedule_names_no_clocked_commanda schedule names a command invoked_by Clock, written as a call
PW6502scheduled_outside_a_commanda schedule or an unschedule is a command's statement: what a page shows schedules nothing
PW6503schedule_timea scheduled run's time is at an Instant or after a Duration

Device store

CodeSymbolWhat the program must hold to
PW6801device_value_to_a_commanda value the device keeps is no command's argument, and decides no command's call: a command runs on the server
PW6802device_value_keys_a_querya value the device keeps keys no page's query: the key is sent to the server to read it again
PW6803device_value_senta value the device keeps is written nowhere the browser sends: a navigation, an address, a form
PW6804device_keeps_its_owna signal the device keeps is assigned no session's, user's, organization's or secret's value
PW6805device_signal_clausesa signal the device keeps says where it rests, storage device "name" (one name a program), whose it is, privacy Device, and what two tabs' writes do, conflict last_write_wins
PW6806device_signal_versionsa signal the device keeps has a pure migration for each version before its own, each taking the one before it to the next
PW6807device_signal_forma signal the device keeps is of a type the device can hold: data, no function, no type that contains itself, no opaque type with a where
PW6808device_signal_provideda signal the device keeps is provided by the device: no provide gives it a value

Retired codes

No longer printed, and never reused.

CodeWhy
PW5102a shared materialization's cache key must separate the build that produced it. Retired 2026-08-06: the compatibility generation is now injected by the compiler for every materialized entry, so the key cannot omit it. If a generated storage key ever lacks its compatibility namespace that is an internal compiler invariant, not an error an application author can repair.

Old numbers

Numbers the corpus's fixtures wrote before one invariant got one code. The compiler never prints them.

Old numberNowSymbol
PW0326PW2004scope_outlives_owner
PW0311PW2002task_detached
PW0309PW2005affine_not_consumed_once
PW0310PW2005affine_not_consumed_once
PW0301PW5002no_feasible_placement
PW0324PW5002no_feasible_placement
PW0323PW5005declared_placement_cannot_grant
PW0302PW5003secret_to_browser
PW0308PW5008unserializable_capture
PW3011PW5007private_in_resume_manifest
PW0328PW5007private_in_resume_manifest
PW0304PW5006value_exceeds_sink_level
PW0303PW5004cache_key_omits_partition
PW0100PW5001private_in_shared_cache
PW3001PW0401forbidden_effect
PW3002PW0401forbidden_effect
PW3004PW0402wrong_frame_phase
PW3008PW0402wrong_frame_phase
PW3003PW0402wrong_frame_phase
PW3006PW0401forbidden_effect
PW3007PW0401forbidden_effect
PW3005PW0403observation_feedback_cycle
PW3009PW0404false_independence
PW0300PW0401forbidden_effect
PW0314PW0401forbidden_effect
PW0315PW0401forbidden_effect
PW0306PW0600option_used_as_value
PW0307PW0601unchecked_external_cast
PW0320PW0602handler_signature_mismatch
PW0316PW5011unkeyed_list
PW0321PW5009dead_internal_link
PW0317PW5012invalid_nesting
PW0318PW5013handler_on_inert
PW0319PW5014control_without_label
PW0329PW5010unsafe_audit_incomplete
PW0322PW5010unsafe_audit_incomplete
PW3010PW5010unsafe_audit_incomplete