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
| Code | Symbol | What the program must hold to |
|---|---|---|
PW6601 | executable_program | a semantically valid program is supported by the compiler's executable backends |
Syntax
| Code | Symbol | What the program must hold to |
|---|---|---|
PW0001 | expected | the parser expected a different token here |
PW0002 | unclosed_type_args | a type argument list must be closed |
PW0003 | unclosed_effect_row | an effect row must be closed |
PW0004 | effect_row_needs_brace | an effect row opens with { |
PW0005 | unclosed_params | a parameter list must be closed |
PW0006 | unclosed_block | a block must be closed |
PW0007 | unknown_declaration | this does not begin a declaration |
PW0008 | unclosed_paren | a parenthesis must be closed |
PW0009 | expected_expression | an expression was expected here |
PW0010 | unclosed_args | an argument list must be closed |
PW0011 | unclosed_list | a list literal must be closed |
PW0012 | unclosed_match | a match must be closed |
PW0013 | keyword_as_name | a word that begins a statement or an expression in a body names no binding, parameter or declaration |
PW0014 | string_escape | a string's escapes and holes must be ones the language defines |
PW0015 | unread | every expression and pattern in a file that parses is one the compiler reads |
PW0016 | read_whole | a clause's value, a string's hole and a block marker's expression are read whole, and nothing follows what their grammar reads |
PW0017 | optimistic_clause | an optimistic clause names an entry, binds its value with as, and gives its transition after => |
PW0018 | for_needs_in | a for loop names what it iterates after in |
PW0019 | each_head | an {#each} names its list, and after as the name each row binds |
PW0030 | statements_separated | a block's statements are separated by ; or a line |
PW0031 | logical_mixed | | and & mixed in one chain are parenthesized: neither binds tighter |
PW0099 | no_progress | the parser made no progress |
Names and imports
| Code | Symbol | What the program must hold to |
|---|---|---|
PW0020 | unresolved_module | an imported module must exist in the workspace |
PW0021 | unresolved_name | an imported name must be declared by the module it comes from |
PW0022 | ambiguous_name | a name must resolve to exactly one declaration |
PW0023 | private_access | a private declaration is not visible outside its module |
PW0029 | private_data | a declaration that holds data says whose with user, session or public, not private |
PW0024 | duplicate_declaration | a module may declare each name once per namespace |
PW0025 | import_cycle | modules must not import each other in a cycle |
PW0026 | unresolved_type | a written type must name a type visible here, applied to exactly its parameters |
PW0028 | declared_twice | a parameter, a field, a case, a policy or an attribute is written once |
PW0027 | not_a_term | a call names a function, a data operation, or a type it builds |
Declarations and their clauses
| Code | Symbol | What the program must hold to |
|---|---|---|
PW0101 | read_your_writes_needs_a_session | read-your-writes requires a session-scoped read |
PW0102 | session_state_is_fresh | session-owned state may not be served stale |
PW0312 | retry_not_idempotent | a command that retries must be idempotent |
PW0338 | sent_without_idempotency | a command a page's handler calls declares idempotent_by |
PW0339 | command_outside_a_handler | a command is called only by a page's handler |
PW0340 | route_names_its_parameters | a route is / and segments, a word or a {parameter} each, and names each of its page's parameters once |
PW0341 | route_declared_twice | one route is one page's: an address names the page it is for |
PW0342 | not_found_names_a_case | a page's not_found_on names a case of an error a query it reads can answer |
PW0343 | last_known_good_is_public | a last-known-good fallback serves only public data |
PW0344 | reads_more_than_given | a query asks no more consistency of a source than its reads give |
PW0345 | writes_two_sources | a command's writes are one transaction, in one source |
PW0346 | isolation_more_than_given | a command asks no more isolation of a source than its transactions give |
PW0347 | events_without_commit | a command's events are sent if and only if its writes commit |
PW0348 | idempotent_without_commit | a command's record of an interaction commits with its writes |
PW0349 | source_malformed | a source holds what the program's effects name, and each is held by one |
PW0350 | redirect_names_a_case | a 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 |
PW0351 | predicate_declared | a 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 |
PW0313 | retry_unbounded | a retry policy must be bounded |
PW0352 | layout_names_a_layout | a page's layout clause names a layout, once |
PW0353 | layout_takes_nothing | a layout is given nothing by the page it shows: it declares no parameters |
PW0361 | table_malformed | a 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 |
PW0362 | data_not_declared | a table's rows are reached only through the functions its declaration gives |
PW0364 | all_unbounded | a table is read whole, by all(), only where it states bounded |
PW0365 | refers_across_sources | a reference to a table another source holds is held by no database: the referred row may be missing, which get answers as None |
PW0366 | migration_unstated | a change from the schema released that loses or reinterprets data is stated by a migrate, and each migrate states one |
PW0325 | stale_key_policy | a keyed query must say what happens when its key changes |
PW0327 | written_rollback | an optimistic transition's reversal is derived, not written |
PW0330 | optimistic_not_pure | an optimistic transition must be a pure function of the resource's value |
PW0334 | derived_not_pure | a derived value, and a value a template computes, is computed from other values, and performs no effect |
PW0335 | policy_value | a policy's value is one its domain has |
PW0331 | optimistic_target_mismatch | an optimistic transition must produce the value type of the resource it targets |
PW0336 | key_omits_a_read | a cache key names each parameter its entry depends on |
PW0332 | effect_names_an_operation | an effect is not a callable, so it does not name a host operation |
PW0200 | cache_no_invalidation | a shared cache should declare how it is invalidated |
PW5010 | unsafe_audit_incomplete | an unsafe escape hatch must carry a complete audit record |
PW5015 | unsafe_attribution_invalid | an escape hatch's attribution target must name a real owner |
Effects
| Code | Symbol | What the program must hold to |
|---|---|---|
PW0408 | member_receiver_untyped | a member is read through a value whose type the program states, so what it performs is read |
PW0400 | undeclared_effect | an effect row must name every effect the body performs |
PW0401 | forbidden_effect | some effects are not permitted where a declaration runs, whatever it declares |
PW0402 | wrong_frame_phase | each frame phase permits only the work it exists to do |
PW0405 | read_per_element | a 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 |
PW0406 | set_read_per_key | a page's or a command's calls do not grow with its data: a set read is on a source that batches |
PW0407 | set_pair_shape | a 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
| Code | Symbol | What the program must hold to |
|---|---|---|
PW0403 | observation_feedback_cycle | an observation must not cause the change it observes |
PW0404 | false_independence | a subtree declared independent must not depend on anything outside it |
Matching
| Code | Symbol | What the program must hold to |
|---|---|---|
PW0305 | non_exhaustive_match | a match must cover every value its scrutinee can take |
PW0333 | unreachable_arm | every arm of a match must be reached by some value |
PW0337 | case_tested_by_if | a template tests a value's case with {#match}, which names every case |
Types
| Code | Symbol | What the program must hold to |
|---|---|---|
PW0600 | option_used_as_value | a value that may be absent must be matched before it is used |
PW0601 | unchecked_external_cast | an external value must be decoded, not cast |
PW0602 | handler_signature_mismatch | a handler must accept the event its attribute delivers |
PW0603 | constructor_arity | a constructor pattern must bind exactly the fields its constructor declares |
PW0604 | call_arity | a call must supply exactly the arguments its callee declares |
PW0605 | argument_type | a value given for a declared parameter or field must have its declared type |
PW0606 | return_type | a body must produce the result type its signature declares |
PW0607 | binding_type | an annotated binding must be initialised with a value of its declared type |
PW0609 | operand_type | an operator's operands, and a condition, must have the types they take |
PW0608 | pattern_constructor | a constructor must name a case of the type it builds or matches |
PW0610 | unknown_member | a read or a call through a value must name a member its type has |
PW0611 | assign_immutable | an assignment's target must be a binding declared let mut |
PW0612 | record_fields | a record must be built with each field its type declares, once, and no other |
PW0613 | branch_types | the branches of an if or a match whose value is used must produce one type |
PW0614 | not_callable | a value called must be a function |
PW0615 | list_items | a list's items must share one type |
PW0616 | int_literal_range | an Int literal must fit in 64 bits |
PW0617 | named_argument | a named argument is given to the parameter of its name, once, after the positional ones |
PW0619 | view_props | a view is given each of its parameters, and nothing else |
PW0629 | names_no_value | a name a template reads is a value: a binding, a parameter, a signal, a constant, or a predicate the page asks of its reader |
PW0618 | result_dropped | a failure is handled: a Result is taken apart, returned with ?, or discarded by name |
PW0621 | route_parameter_is_text | a route's parameter is text: a String, or an opaque type over one |
PW0630 | query_parameter_is_optional_text | a query parameter is an Option of text: an address may leave it out |
PW0620 | answer_read_for_a_value | what a command answers carries no value: a handler matches Ok(_), and reads the value from a query |
PW0622 | invariant_not_shown | a value is built of an opaque type only where the build shows it holds the type's invariant |
PW0623 | invariant_unread | an 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 |
PW0624 | no_finite_value | a declared type has a finite value: one that contains itself has a way to be built without itself |
PW0625 | case_name_capitalized | a sum type's case is named with a capital letter, so a pattern tells it from a binding |
PW0626 | representation_shadowed | an opaque type's own module reads its representation as .value, so it declares no member of that name |
PW0627 | map_key | a map's key and a set's element are an Int, a String, a Bool, or an opaque type over one |
PW0628 | ambiguous_member | a member names one declaration: its type's, or the one its module declares or imports |
Scopes, tasks and resources
| Code | Symbol | What the program must hold to |
|---|---|---|
PW2001 | handle_escapes | a handle cannot outlive the scope that owns it |
PW2005 | affine_not_consumed_once | an affine value must be consumed exactly once, in the scope that acquired it |
PW2002 | task_detached | an ordinary task cannot be detached from its scope |
PW2003 | handle_used_late | a handle cannot be used after its owning scope has exited |
PW2004 | scope_outlives_owner | a subscription cannot declare a scope that outlives its owner |
Privacy
| Code | Symbol | What the program must hold to |
|---|---|---|
PW5001 | private_in_shared_cache | a value that is not public cannot live in a shared cache |
PW5003 | secret_to_browser | a secret cannot be rendered to the browser |
PW5004 | cache_key_omits_partition | a shared cache key must carry every partition its value depends on |
PW5006 | value_exceeds_sink_level | a sink accepts only values its declared privacy level admits |
PW5007 | private_in_resume_manifest | the resume manifest ships with the public shell and may hold only public values |
PW5008 | unserializable_capture | a resumable handler may capture only what can be written to its manifest |
PW5016 | resume_capture_schema_unnameable | a resumable capture must have a type this build can derive a schema from |
PW5017 | resume_artifact_contract_mismatch | a resume manifest and its handler artifact must describe the same contract |
PW5018 | resume_destination_unknown | a private resumable region must say which principal it is private to |
PW5025 | handler_reads_uncaptured | a resumable handler reads what it captures, and what it binds itself |
PW5037 | handle_made | a session's, a user's or an organization's handle is the platform's to make: a program constructs none |
PW5038 | handle_answered | a data layer answers ids, never a handle: only the platform's operations answer a session's, a user's or an organization's |
PW5039 | handle_from_browser | nothing 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 |
PW5040 | handle_to_browser | a session's handle never reaches the browser: no query's, subscription's or command's answer, and nothing markup prints, holds one |
PW5046 | layout_audience | a 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 |
PW5049 | reader_predicate_shared | a page that asks a predicate of its reader is its reader's: a page served to everyone asks none |
Placement
| Code | Symbol | What the program must hold to |
|---|---|---|
PW5002 | no_feasible_placement | every declaration must have somewhere it can run |
PW5005 | declared_placement_cannot_grant | a declared placement must be able to grant every effect it requires |
PW5026 | built_before_its_parameters | what is built before any request reads no request's value |
Markup
| Code | Symbol | What the program must hold to |
|---|---|---|
PW5009 | dead_internal_link | an internal link must name a route the program declares |
PW5011 | unkeyed_list | a list over a mutable collection needs a stable key |
PW5012 | invalid_nesting | an element may only contain the children HTML permits |
PW5013 | handler_on_inert | interactive behaviour belongs on an element that can receive it |
PW5014 | control_without_label | a form control must have something that names it |
PW5019 | malformed_template_block | a template block closes with its own name and holds only the markers it takes |
PW5020 | view_element | an element named with a capital letter is a view the compiler composes |
PW5021 | loop_key | a loop's key is its element, or a field read from it |
PW5023 | code_in_markup | a template writes no code, and no value into a stylesheet |
PW5024 | moves_a_url | a template moves no URL: no <base>, and no animation of a link or a handler |
PW5022 | unknown_event | an element handles an event the platform declares |
PW5027 | unknown_modifier | an event's modifier is one the runtime applies |
PW5028 | comment_as_text | a comment in markup is <!-- -->: text that reads as one would be shown |
PW5029 | title_missing | a page served at a route states its title |
PW5030 | title_misplaced | a title is the page's: once, at the top of its view, written as text and values |
PW5031 | duplicate_id | an id names one element of its page |
PW5032 | reference_names_nothing | an id reference names an element its page shows whenever the referrer is shown |
PW5033 | aria_unknown | an ARIA attribute, its value and a role are ones WAI-ARIA defines |
PW5034 | metadata_misplaced | a 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 |
PW5035 | link_not_in_body | a <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 |
PW5051 | canonical_address | a 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 |
PW5052 | load_from_another_origin | a 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 |
PW5036 | form_control_value | a 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 |
PW5041 | form_answered_by_nothing | a form's action is a route that answers its method: a page's, the relying party's, or an upload's |
PW5050 | address_names_no_query_parameter | a link's query and a GET form's fields name only the query parameters of the route they reach |
PW5042 | navigate_names_no_page | a navigate names a page by its declaration |
PW5043 | navigate_before_a_commit | a 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 |
PW5044 | slot_misplaced | a <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 |
PW5045 | layout_without_slot | a layout shows the page that names it in a <slot /> |
PW5047 | markup_as_an_operand | markup is shown where it is written, and is no operand of an arithmetic, comparison or logical operator |
PW5048 | control_where_refused | a control whose command requires a predicate is shown where the page asks that predicate of its reader and it holds |
Caches, keys and invalidation
| Code | Symbol | What the program must hold to |
|---|---|---|
PW5100 | graph_edge_unresolved | a dependency, event or invalidation target must name something the program declares |
PW5101 | private_in_shared_materialization | a shared materialization may only depend on data every reader of its cache entry may see |
PW5105 | clause_out_of_place | a clause belongs to a declaration that reads it |
PW5104 | listener_key | a listener's argument is one of its declaration's parameters, or _ |
PW5103 | clause_names_another_kind | a 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 |
PW5106 | write_not_invalidated | a command invalidates what it writes: each cached reader of the data it changes, by name or through an event the reader listens for |
PW5107 | optimistic_not_reconciled | a command invalidates the entry it speculates on, so what it committed replaces the speculation |
PW5108 | read_names_another_kind | a query reads a query or a resource, or in a materialization's body one that derives its value; and a subscription a subscription |
PW5109 | materialization_cycle | a materialization depends on nothing that depends on it |
PW5110 | dependency_stated_twice | a materialization that derives its value states what it depends on by reading it, and nowhere else |
Capabilities
| Code | Symbol | What the program must hold to |
|---|---|---|
PW5200 | unresolved_capability_argument | a capability's type argument must name a type the program declares |
PW5201 | unknown_effect_family | an effect must name a family some package declares |
PW5202 | unknown_effect_operation | an effect must name an operation its family declares |
PW5203 | effect_arity_mismatch | an effect must be given exactly the type arguments its declaration binds |
PW5204 | unresolved_impact_marker | an effect's impact condition must name a type the declaring module can see |
Signals and UI state
| Code | Symbol | What the program must hold to |
|---|---|---|
PW5300 | signal_written_outside_handler | a signal changes only in a handler |
PW5301 | signal_read_where_it_cannot_change | a signal is read only where the browser reads it again when it changes: a template part, a handler, or a page query's key |
PW5302 | ui_state_not_a_signal | a handler changes a signal, not a binding of the body it is written in |
PW5303 | modal_dialog | a modal dialog is shown by a signal's block, and says what closing it does |
PW5304 | bound_value | an input binds its value to a signal of String, by its name |
PW5305 | signal_not_provided | a provided signal is read only where a page or view around it provides it |
PW5306 | provide | a body provides a signal declared in a module, once |
PW5307 | signal_in_a_row | a view that holds a signal is not used in a loop's row yet |
PW5308 | signal_key_type | a signal that keys a query is a String, an Int or a Bool |
PW5309 | signal_key_stale_work | a query a signal keys says what its stale work does |
Streamed regions
| Code | Symbol | What the program must hold to |
|---|---|---|
PW5400 | streamed_read_outside_stream | a query declared delivery streamed is read only by a <stream> |
PW5401 | stream_states | a <stream> shows each state its query can be in, and no other |
PW5402 | streamed_without_timeout | a query declared delivery streamed declares how long it may take |
Uploads
| Code | Symbol | What the program must hold to |
|---|---|---|
PW5601 | upload_malformed | an upload states its route, where it is served, and each of its limits, once and as literals |
PW5602 | upload_route_taken | an upload's paths are its own: no page's, and no other upload's |
PW5603 | file_form_posts_to_no_upload | a form that sends a file posts it, as multipart/form-data, to an upload the program declares |
Todomvc
| Code | Symbol | What the program must hold to |
|---|---|---|
PW6101 | fragment_names_no_signal | a page's fragment clause names a signal the page declares |
PW6102 | fragment_signal_not_text | a signal bound to the address's fragment is a String: a fragment is text |
PW6103 | fragment_forms | a fragment's forms are written "form" => "value", each form once, in characters a fragment holds |
PW6104 | fragment_default | a signal bound to the fragment starts at a value one of the forms gives |
PW6105 | fragment_signal_assigned | a signal bound to the fragment is written by the address alone, and no handler assigns it |
PW6106 | link_names_no_form | a link to a fragment of a page that binds its fragment names a form the page takes |
Payments
| Code | Symbol | What the program must hold to |
|---|---|---|
PW6401 | invoked_command_requires | a command the platform invokes holds no reader to a predicate: it declares no requires |
PW6402 | invoked_command_parameters | a command invoked_by Payments is given one payments.Settled, and nothing else |
PW6403 | invoked_twice | one command answers a payment's outcome: a second would leave the host two answers |
PW6404 | invoked_command_pressed | no page presses a command the platform invokes |
PW6405 | invoked_command_not_idempotent | a command the platform invokes is idempotent: its word, a provider's or the clock's, may come more than once |
Scheduled commands
| Code | Symbol | What the program must hold to |
|---|---|---|
PW6501 | schedule_names_no_clocked_command | a schedule names a command invoked_by Clock, written as a call |
PW6502 | scheduled_outside_a_command | a schedule or an unschedule is a command's statement: what a page shows schedules nothing |
PW6503 | schedule_time | a scheduled run's time is at an Instant or after a Duration |
Device store
| Code | Symbol | What the program must hold to |
|---|---|---|
PW6801 | device_value_to_a_command | a value the device keeps is no command's argument, and decides no command's call: a command runs on the server |
PW6802 | device_value_keys_a_query | a value the device keeps keys no page's query: the key is sent to the server to read it again |
PW6803 | device_value_sent | a value the device keeps is written nowhere the browser sends: a navigation, an address, a form |
PW6804 | device_keeps_its_own | a signal the device keeps is assigned no session's, user's, organization's or secret's value |
PW6805 | device_signal_clauses | a 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 |
PW6806 | device_signal_versions | a signal the device keeps has a pure migration for each version before its own, each taking the one before it to the next |
PW6807 | device_signal_form | a 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 |
PW6808 | device_signal_provided | a signal the device keeps is provided by the device: no provide gives it a value |
Retired codes
No longer printed, and never reused.
| Code | Why |
|---|---|
PW5102 | a 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 number | Now | Symbol |
|---|---|---|
PW0326 | PW2004 | scope_outlives_owner |
PW0311 | PW2002 | task_detached |
PW0309 | PW2005 | affine_not_consumed_once |
PW0310 | PW2005 | affine_not_consumed_once |
PW0301 | PW5002 | no_feasible_placement |
PW0324 | PW5002 | no_feasible_placement |
PW0323 | PW5005 | declared_placement_cannot_grant |
PW0302 | PW5003 | secret_to_browser |
PW0308 | PW5008 | unserializable_capture |
PW3011 | PW5007 | private_in_resume_manifest |
PW0328 | PW5007 | private_in_resume_manifest |
PW0304 | PW5006 | value_exceeds_sink_level |
PW0303 | PW5004 | cache_key_omits_partition |
PW0100 | PW5001 | private_in_shared_cache |
PW3001 | PW0401 | forbidden_effect |
PW3002 | PW0401 | forbidden_effect |
PW3004 | PW0402 | wrong_frame_phase |
PW3008 | PW0402 | wrong_frame_phase |
PW3003 | PW0402 | wrong_frame_phase |
PW3006 | PW0401 | forbidden_effect |
PW3007 | PW0401 | forbidden_effect |
PW3005 | PW0403 | observation_feedback_cycle |
PW3009 | PW0404 | false_independence |
PW0300 | PW0401 | forbidden_effect |
PW0314 | PW0401 | forbidden_effect |
PW0315 | PW0401 | forbidden_effect |
PW0306 | PW0600 | option_used_as_value |
PW0307 | PW0601 | unchecked_external_cast |
PW0320 | PW0602 | handler_signature_mismatch |
PW0316 | PW5011 | unkeyed_list |
PW0321 | PW5009 | dead_internal_link |
PW0317 | PW5012 | invalid_nesting |
PW0318 | PW5013 | handler_on_inert |
PW0319 | PW5014 | control_without_label |
PW0329 | PW5010 | unsafe_audit_incomplete |
PW0322 | PW5010 | unsafe_audit_incomplete |
PW3010 | PW5010 | unsafe_audit_incomplete |