Ruleset diagnostics, grouped by family.
Errors
Generated from the language definition for ruleset 1.7.
Compiler diagnostics are listed on the compiler index.
fsm
fsm/cancelled-state— a state namedCancelledis declared or targetedfsm/non-pascal-state— a state name is not PascalCasefsm/initial-state-count— a board declares no initial state, or more than onefsm/unknown-state— a transition'sfromortonames no declared statefsm/orphan-state— a declared state is neither initial nor named by any transitionfsm/unreachable-state— forward edges from the initial state never reach this statefsm/duplicate-transition— two transitions share(from, event); first-match-wins would shadow the later onefsm/terminal-has-exit— a declared terminal state has an outgoing transitionfsm/dead-end-state— a non-terminal, non-initial state has no outgoing transitionfsm/no-terminal— the board declares no terminal statefsm/malformed-guard— a guard is not an object, or uses an operator outside the JSONLogic allowlistfsm/unbounded-self-loop— a self-loop has no guard; auto-firing may flood event_logfsm/guarantee-unknown— a guarantee name is not a declared statefsm/guarantee-initial— a guarantee does not start at the initial statefsm/guarantee-terminal— a guarantee does not end on a terminal statefsm/guarantee-gap— a consecutive pair on the guarantee has no transitionfsm/guarantee-skip— a transition jumps forward along the guaranteefsm/guarantee-back— a transition moves backward along the guaranteefsm/guarantee-aside— a transition leaves the guarantee or returns to it without asidefsm/no-path-to-terminal— a non-terminal state cannot reach a terminal while a guarantee is presentfsm/unbounded-cycle— unguarded edges form a cycle that can avoid every terminal while a guarantee is presentfsm/idempotency-unstable— an idempotency atom changes on every retryfsm/idempotency-omitted— a workflow names no retry keyfsm/too-many-states— a board declares more than 50 statesfsm/sla-malformed— anslablock has a zero threshold, sits on a terminal state, or names an action type the engine cannot enqueuefsm/missing-ui-aliases— the board has no display labels though its entity is not a jobfsm/event-not-verb— an event name is not snake_casefsm/dialect-mismatch— the schema keys transitions asevent/onor the initial state asinitial, where the engine readsevent_typeandinitial_statefsm/infer-fail— an infer fail state is missing, unknown, or leaves the guarantee without aside
entity
entity/name-keyed-relationship— a related list or reference joins on a field that is not a relationshipentity/raw-id-column— a list column ends in_idwith no relationship declared, so the cell shows a bare identity/money-as-number— a field keyed like money is typednumberwithout a currencyentity/pii-unmarked— a field keyed like personal data is not markedpiientity/pii-unmasked— a pii field names no mask
sync
sync/replicated-conflict— a replicated copy names a conflict other than lwwsync/edge-conflict— an edge copy names a conflict the device cannot applysync/fsm-needs-workflow— conflict fsm is declared on an entity with no workflow
page
page/custom-page-extension— acustompage lacks its extension binding, or another kind carries onepage/detail-template-in-nav— a detail template (a page bound to an entity) appears in the navigationpage/one-template-per-entity— two detail templates are bound to one entitypage/block-placement— a block type is used on a page kind that cannot render itpage/unknown-block-type— a block type is in neither renderer's vocabularypage/title-block-in-layout— a page opens with a heading and paragraph that repeat the app's name and taglinepage/empty-page— a page has no blockspage/entity-without-page— no page renders this entitypage/job-list-unresolved— a job list names neither a schema id nor a schema namepage/spa-entry— an spa page's inlined directory has no<dir>index.tsxpage/spa-unsupported-file— an spa page's directory holds a file that is not a .ts/.tsx source, or one outside the directorypage/spa-without-grant— an spa page declares nousing sdk …grant, so it gets no SDK client
seed
seed/empty-lane— a non-terminal state has no seeded job on its boardseed/dangling-ref— a seed job or row references a record the seed does not declareseed/foreign-prefix— a seed value embeds another listing's seed prefix without a declared dependency
meta
meta/spec-version-unsupported— the document's spec major is newer than this ruleset supportsmeta/engine-in-tenant-mode— anenginemanifest is present under the tenant profilemeta/slug-shape— the slug is not bare kebab-case (nofastyoke.prefix)meta/engine-manifest— the engine manifest fails its validator
docs
docs/phase-number-in-customer-docs— the emitted customer page names an internal phase or a private path
query
query/unknown-entity— a query or write names an entity the app does not declarequery/unknown-field— a projection, predicate, assignment, grouping or order names a field the entity does not declarequery/type-mismatch— a literal is compared or assigned against a field of another typequery/write-to-builtin— an effect writes tojobs,event_logorfsm_schemasquery/ledger-mutation— an update or delete targets aledger-kind entityquery/unbounded-write— an update or delete has nowherequery/unbounded-select— a query in a list or related position has nolimitquery/param-unbound— a query parameter has no binding at its use site, or a binding names no declared parameterquery/builtin-in-page-position— a built-in source is read from a page positionquery/prefer-select— adal { … }literal could be written asselect …
view
view/unknown-view— ausenames no declared viewview/arity— ausepasses arguments that do not match the view's parametersview/recursive-use— a view mounts itself through a chain ofusesview/each-depth— aneachis nested more than two deepview/unused-param— a view parameter is never read by an elementview/never-used— a view is declared but nothing mounts it
script
script/grant-kind— a component carriesusing db, or another kind carriesusing sdkscript/duplicate-name— a component and a view share a name;useresolves one namespacescript/missing-sidecar— a component names a sidecar but carries no source, so the install cannot build it
style
style/prefer-view— a component with no grant and no state hooks is a projection aviewexpresses without codestyle/untyped-prop— a component prop isjson, so nothing checks what ausepasses
effect
effect/script-grant-missing— a script's source usesdb.but its declaration has nousing db …granteffect/script-grant-unused— a declared grant names a capability the script's source never useseffect/script-grant-tier— awriteorfsmgrant needs the Team tier;readneeds Proeffect/set-expression-in-browser-position— a set-level construct sits invisible_when,enabled_whenorvisible_if, which the browser evaluateseffect/fire-with-payload— ado transitioncarries a payload; the engine takes noneeffect/transition-in-guard— an effect is placed where only a predicate may runeffect/unknown-verb— an action type has no row in the effect tableeffect/infer-schema-type— an infer schema field is ref, computed, or fileeffect/infer-into— an infer from or into name is not a field, or the field's type does not accept the schemaeffect/infer-timeout— an infer action has no timeouteffect/infer-over-pii— an infer from list names a pii fieldeffect/infer-requires-ee— an infer action calls a hosted model and the tenant is not entitled
binding
binding/rollup-missing-delete— a rollup recomputes when a child row is created but not when one is deletedbinding/rollup-missing-field-change— a rollup reads a child field (its aggregated field or awherefield) that no on_field_change trigger watchesbinding/rollup-config-mismatch— bindings named as one rollup (rollup:<entity>.<field>:…) carry different configsbinding/unknown-field— a binding's trigger or config names a field its entity does not declare (payloads are schemaless, so a deliberately hidden counter is legitimate; a typo is not)