Jadpo is experimental and not ready for production. These docs follow the compiler's main branch as of 5 Nov 2026. What's built · Install 0.3.0
jadpo

Reference · errors

Compiler errors

Every rule the compiler can report, 744 in all, grouped by part of the language. Each error the compiler prints ends with a rule line naming one, and that rule's page shows an example and the fix.

About errors

  • Error messages

    Every error has one shape, in the terminal, in the editor and as JSON: what is wrong, where, why, the recommended next step, who decides, the rule ID and a help link.

  • Declining a judgement call

    Most rules report plain mistakes, and only a fix answers them.

  • Errors only the running app or a build raises

    The running app reports three events of its own, never compile errors:

  • Command-line errors

    These are the errors about the command line itself: a command, an action or a flag Jadpo doesn't have, or an argument or a value a command can't use.

  • Command errors

    These are the errors only a command raises, so jadpo check can't show them with a source example; the command line's own are under Command-line errors.

  • Database command errors

    These are the errors of the commands that reach a database: applying migrations, seeding, and reading or acting on background work.

Project layout and modules

Values and types

Logic

Failures

Entities, stores and migrations

Reads and writes

HTTP

Sign-in and identity

Policy

Configuration

External services

Background work

  • event.emit_invalid

    Emit is given something that isn't an event, or is used outside an action

  • event.settings_invalid

    Events settings in app.jadpo hold something other than a database's store:

  • event.store_required

    An action emits an event but writes no database, and the app names no database to keep its events in

  • receiving.invalid

    A queue in receiving: doesn't say how its messages are read

  • schedule.every_invalid

    A schedule's every: says how often it runs in something other than a whole number of seconds, minutes, hours or days

  • schedule.item_invalid

    Schedule holds an item it doesn't take, gives one twice or leaves out every: or run:

  • schedule.run_invalid

    Schedule's run: isn't a call of an action in its own domain with no arguments

  • schedule.settings_invalid

    Schedules settings in app.jadpo hold something other than a database's store:

  • schedule.store_required

    An app has a schedule but no database named to keep its state in, because it has several databases or none

  • step.context

    An action makes several changing calls from somewhere a retry can't carry on where it stopped, such as a route whose API doesn't require Idempotency-Key

  • step.encryption_key_required

    An action makes several changing calls, but the app names no key to encrypt the answers it keeps from them

  • step.large_output

    Operation with a large answer among several changing calls

  • step.late_failure

    An action can fail for good after a call that changes something outside the app took effect, leaving that change behind

  • step.settings_invalid

    Steps setting in application { } doesn't read

  • step.store_required

    An action makes several changing calls but writes no database, and the app names no database to keep the record of its calls in

  • step.too_many

    More than 8 changing calls on one way through an action

  • step.unkeyed

    Changing call with no idempotency key beside another changing call

  • subscriber.argument_invalid

    Subscriber passes something other than its event or a field of it

  • subscriber.event_invalid

    A subscriber's on: names something other than an event, such as an entity or a plain type

  • subscriber.item_invalid

    Subscriber holds an item it doesn't take, gives one twice or leaves out on: or run:

  • subscriber.retry_invalid

    A subscriber's retry: holds something other than 1 to 100 tries and up to 30 days to keep trying

  • subscriber.run_invalid

    Subscriber's run: isn't a call of an action in its own domain

  • type.batch_capture_not_storable

    A batch saves a value that can't be stored

  • type.batch_context

    Batch operation called outside an action

  • type.batch_each_invalid

    A batch's each: or finished: is not one call of an action in its domain, or a write's each: no inline function giving the row

  • type.batch_from_invalid

    A batch's from: is something other than a call of a named query that gives a Page, such as a query that gives a List

  • type.batch_input

    An Input or a route placeholder holds a batch type, a File or a FileContents, or what a provider or a queue sends holds a File or a FileContents, which only the runtime builds

  • type.batch_order_updatable

    A batch walks a query ordered by a field an update can change

  • type.batch_row_invalid

    A file helper's rows can't be read as the type its as: names or from where its items_at: says, its max_unpacked_size: isn't a size, or its rows can't be written as the row its each: gives

Testing

Tools

  • acceptance.base_missing

    Base commit the change is compared with isn't in this clone

  • acceptance.edited

    Acceptance already on the before side was edited

  • acceptance.invalid

    Acceptance file isn't written as an acceptance

  • acceptance.missing

    A change could break someone else or widen who can do what, and no acceptance this change adds says a person agreed to it

  • acceptance.no_reason

    An acceptance this change adds has no /// line above acceptance saying why a person accepted the changes it lists

  • acceptance.unmatched

    Acceptance lists a change this change doesn't make

  • ai.usage_unavailable

    The app's AI usage couldn't be read from its database, because it can't be reached or has no table for it yet

  • cli.acceptance_arguments

    A jadpo acceptance command names no action, one it doesn't have, or no purpose for new

  • cli.ai_arguments

    A jadpo ai command names no action, one it doesn't have, or a prompt the project doesn't declare

  • cli.api_arguments

    A jadpo api command names no action, one it doesn't have, or more than update

  • cli.approval_arguments

    A jadpo approval command is given an argument it doesn't take, names a --before git doesn't know, or has nothing to compare with

  • cli.build_arguments

    A jadpo build command names a deployable the app doesn't have, or more than one

  • cli.calls_arguments

    A jadpo calls command names an action it doesn't have, a call the log doesn't hold, or an answer without its operation

  • cli.check_arguments

    A jadpo check command names a path that isn't there or isn't a .jadpo file, or a --before git doesn't know

  • cli.completions_arguments

    A jadpo completions command names no shell, or one Jadpo writes no completions for

  • cli.config_arguments

    A jadpo config command names no action, an action it doesn't have, or a setting config.jadpo doesn't declare

  • cli.config_generate_refused

    A new key would be written where a person could read it, by jadpo config generate, or --generate would replace a key already set

  • cli.config_prompt_failed

    Nothing was typed at the prompt of jadpo config set, or the terminal couldn't hide what you type there

  • cli.config_rotation_unavailable

    The sealed rows jadpo config rotation counts couldn't be counted, because their database can't be reached or has no table for them yet

  • cli.config_tty_required

    You ran jadpo config set where there is no terminal to type the value at, such as from a coding agent or a script

  • cli.declines_arguments

    A jadpo declines command names no action, one it doesn't have, or a rule or path that isn't the project's

  • cli.deliveries_arguments

    A jadpo deliveries command names an action it doesn't have, no id for one that needs it, or a state or page it doesn't list

  • cli.dev_arguments

    A jadpo dev command names an action it doesn't have, token without a user's id, or a --url the project's several stores can't share

  • cli.dev_port_invalid

    A jadpo dev --port flag holds something other than a whole number from 0 to 65535

  • cli.dev_start_failed

    The app couldn't start under jadpo dev, usually because another program is using its port, it has no database to run on, or a connection would call a provider's live API

  • cli.email_arguments

    A jadpo email command names an action it doesn't have, or a mail or link the dev inbox doesn't hold

  • cli.fix_arguments

    A jadpo fix command names a declaration with nothing to fix, or a fix it doesn't have

  • cli.flags_arguments

    A jadpo flags command names an action it doesn't have, a flag the project doesn't declare, or a value, user or share the flag can't take

  • cli.fmt_arguments

    A jadpo fmt command names a path that isn't there or isn't a .jadpo file

  • cli.help_arguments

    A jadpo help command names more than one command or rule

  • cli.lsp_arguments

    A jadpo lsp command is given an argument, which it doesn't take

  • cli.migrate_arguments

    A jadpo migrate command names no action, one it doesn't have, a purpose for an action that takes none, or a --drop of what isn't retired

  • cli.new_arguments

    A jadpo new command names no project, or more than one

  • cli.package_arguments

    A jadpo package command names no action, one it doesn't have, or a package the project doesn't hold

  • cli.package_not_openapi

    A file given to jadpo package import is JSON but not an OpenAPI 3.0 or 3.1 document

  • cli.package_unreadable

    A file given to jadpo package import isn't there, can't be read, or isn't JSON

  • cli.presentation_arguments

    A --color flag holds something other than auto, always or never, or nothing

  • cli.records_arguments

    A jadpo records command names an action other than update

  • cli.routes_arguments

    A jadpo routes command is given an argument, which it doesn't take

  • cli.runs_arguments

    A jadpo runs command names an action other than unfinished, or leaves out its --build

  • cli.schedules_arguments

    A jadpo schedules command names an action it doesn't have, or a schedule the project doesn't declare

  • cli.seed_arguments

    A jadpo seed command names no seed, one the project doesn't have, or more than one

  • cli.sql_arguments

    A jadpo sql command names no query or action, one the project doesn't declare, or an action that writes nothing

  • cli.suggest_arguments

    A jadpo suggest command names an action it doesn't have, or a suggestion the last scan didn't find

  • cli.test_arguments

    A jadpo test command names a path that isn't there, or a seed, a kind or a --name it can't use

  • cli.toolchain_arguments

    A jadpo toolchain command names an action it doesn't have, or a release that isn't kept

  • cli.translations_arguments

    A jadpo translations command names no action, one it doesn't have, or a locale the project doesn't translate into

  • cli.unknown_command

    A jadpo command line starts with a command Jadpo doesn't have, or asks jadpo help about a command or rule it doesn't have

  • cli.unknown_flag

    A jadpo command line has a flag the command doesn't take

  • cli.verifier_start_failed

    The verifier won't start, for want of its credential or a sandbox to run packages in, or because it can't listen

  • cli.version_arguments

    A jadpo version command is given an argument, which it doesn't take

  • cli.why_arguments

    A jadpo why command names no schedule, one the project doesn't declare, or more than one

  • configuration.local_changed

    Something else saved .env.local while jadpo config set was saving a value in it

  • configuration.local_invalid_encoding

    The .env.local file holds bytes that aren't UTF-8 text

  • configuration.local_read_failed

    The .env.local file is there, but it couldn't be read: it is a folder, or you aren't allowed to read it

  • configuration.local_syntax

    A line of .env.local isn't blank, a # comment or NAME=value, or it sets a variable a line above it already sets

  • configuration.local_unsafe_target

    The .env.local file that jadpo config set would save a value in is a link, not an ordinary file

  • configuration.local_write_failed

    Saving a value in .env.local failed, usually because the project's folder can't be written

  • configuration.move_name_taken

    A constant jadpo config move was asked to make a setting has the name of a setting config { } already declares

  • configuration.move_read_unsupported

    A constant jadpo config move was asked to make a setting is read where a setting can't be: in a query, an update by id, a backfill or another constant's value

  • configuration.move_type_unsupported

    A constant jadpo config move was asked to make a setting has a type one environment variable can't hold, such as a list or an object

  • configuration.value_invalid

    A setting's value on this machine, from the environment or .env.local, doesn't fit the type config.jadpo gives it

  • configuration.value_missing

    A setting config.jadpo declares without a default: has no value on this machine, in the environment or .env.local

  • conform.failed

    A package's answers to jadpo package conform don't fit the capability it fills, or the suite couldn't run

  • conform.refused

    The conformance suite wasn't sent to the provider's live API, because the app has no connection to the package, nothing sets the connection's credential or address, or ai: doesn't ask its models through it

  • deliveries.not_found

    The id given to jadpo deliveries matches no delivery or schedule run in the database

  • deliveries.unavailable

    The app's deliveries couldn't be read from their database, because it can't be reached or has no table for them yet

  • deliveries.wrong_state

    A delivery or schedule run was asked to do something its state rules out, such as cancelling one that has already failed

  • deployable.api_unknown

    Deployable serves an API the app doesn't have

  • deployable.empty

    Deployable serves nothing and runs nothing

  • deployable.invalid

    Deployable is written in a form deployables: doesn't take

  • deployable.settle_unrun

    Route waits for follow-on work its deployable doesn't run

  • deployable.target_unknown

    Deployable's target isn't one Jadpo builds for

  • deployable.target_unsupported

    Deployable reaches a connection its target can't run

  • deployable.trigger_unknown

    Deployable runs something that isn't a trigger

  • deployable.unserved

    No deployable serves an API, or runs the background work, the app has

  • email.browser_failed

    A jadpo email open command couldn't start the browser to open a mail's link

  • flags.unavailable

    The flags' state couldn't be read or changed in their database, because it can't be reached, has no table for them yet, or changed while the command ran

  • format.changes_required

    A file jadpo fmt --check read isn't laid out as jadpo fmt would write it

  • format.unsafe

    A file was left as it was, because what the formatter made of it didn't read back as the same code, which is a mistake in Jadpo's formatter

  • format.write_failed

    A file jadpo fmt formatted couldn't be written, usually because it is read-only

  • install.fetch_failed

    Installing a package couldn't read its git repository, or found no release there at the tag you gave

  • install.in_use

    Package to remove is still used by the app

  • install.link_refused

    Linked package in a CI or production build

  • install.not_in_registry

    The registry has no package of the name you gave, or no such release of it

  • install.not_proved

    The registry's answers don't prove the release is the one in its public log

  • install.surface_mismatch

    The package you are installing has code that offers something different from its committed surface.jadpo_record

  • install.yanked

    The release you asked for has been yanked, so it can't be newly installed

  • migration.apply_failed

    Applying the project's migrations to a database stopped at a step that failed

  • migration.drop_not_accepted

    A migration removes data, and no acceptance in the project says a person agreed to it

  • migration.extension_missing

    The project's migrations need a PostgreSQL extension, such as pgvector, that the database server doesn't offer or that the role applying them can't create

  • migration.extension_outdated

    The database server's PostgreSQL extension, such as pgvector, is older than the project's migrations and queries need

  • migration.store_diverged

    The migrations a database has applied don't match the project's: one has changed since it ran, the project doesn't have one, or one comes out of order

  • package.advisory

    An advisory is against a declaration of an installed package that the app reaches

  • protocol.mismatch

    A registry's OpenAPI document differs from the registry protocol

  • protocol.unreadable

    The document given to jadpo package protocol couldn't be read as OpenAPI's JSON

  • publish.behaviour_changed

    An example or test of a package's last release fails against its new version, and the change isn't marked a fix

  • publish.breaking_change

    A package's new version changes or removes something its last release offered, within the same major version

  • publish.changelog_missing

    Package's changelog doesn't say why its new version is released

  • publish.description_missing

    Package's public declaration has no description

  • publish.example_failed

    Example in a package's description doesn't compile or doesn't hold

  • publish.example_missing

    Package's function has no example, or a failure it raises is shown by none

  • publish.failed

    The registry's verifier refused the release

  • publish.file_not_allowed

    A commit holds a file a release can't: anything but Jadpo source and the package's text files

  • publish.licence_proprietary

    A package's licence is Licence.proprietary, which the public registry refuses

  • publish.not_at_tag

    What jadpo package publish would ask for isn't a pushed v<version> tag whose commit is the one checked out

  • publish.publisher_mismatch

    A release names another publisher than the one asked to publish it

  • publish.publisher_missing

    A package's index names no publisher, and it has to for the registry

  • publish.repository_refused

    The package's repository isn't one the registry can fetch: a public git repository reached over HTTPS

  • publish.sample_missing

    Package's recipes have no sample app with one domain to compile in

  • publish.stale_files

    A commit's surface.jadpo_record or changelog list isn't what the package's code gives

  • publish.too_large

    A commit's release is past the size limit

  • recording.failed

    A recording by jadpo package record or jadpo ai record got no answer worth keeping from the sandbox or the model, or its call couldn't be made

  • recording.refused

    A recording was refused before anything was sent, because its connection would call a live API or has nothing set for its sandbox, its package is installed, or there is nothing to ask its prompt with

  • registry.unreachable

    The registry couldn't be reached, or answered in a way that can't be read

  • runs.unavailable

    The app's unfinished runs couldn't be read from their database, because it can't be reached or has no table for them yet

  • schedules.lease_held

    A schedule was run by hand while another run of it still holds its lease, so it wasn't run again

  • schedules.no_tick

    A schedule was run by hand against a deployment, and no tick of the app picked the run up in time, so nothing ran

  • schedules.run_failed

    A schedule run by hand ended in a failure, or its run on the app never ended

  • schedules.unavailable

    The app's schedules couldn't be read from their database, because it can't be reached or has no table for them yet

  • seed.failed

    A seed jadpo seed ran stopped at a call that failed or faulted, and the calls before it stay in the database

  • seed.production_refused

    A seed was run against a database that isn't on this machine, which may be production

  • seed.unavailable

    The database a seed runs against couldn't be reached, so nothing was run

  • semantic.multiple_suggestions

    Suggestions settings are declared more than once

  • suggest.record_invalid

    A suggestions record jadpo suggest reads, ignored_suggestions.jadpo_record or taught_suggestions.jadpo_record, isn't as Jadpo writes it

  • suggest.share_failed

    Jadpo HQ couldn't be reached, or refused what jadpo suggest share sent, so the entries wait to be shared again

  • syntax.suggestions_duplicate_option

    Suggestions setting is given twice

  • syntax.suggestions_unknown_option

    Suggestions settings have no such option

  • test.database_unavailable

    The tests that need a database couldn't run, because PostgreSQL for the tests couldn't be started or reached

  • test.failed

    A test failed under jadpo test, or among a package's own tests under jadpo package check

  • test.no_tests

    A jadpo test command found no test to run: the project has none, or none matches the path, line, name, kind or --failed it gives

  • test.runtime_start_failed

    The tests couldn't start, because the machine couldn't give jadpo test the thread with a large stack they run on, usually for lack of memory

  • toolchain.artifact_write_failed

    A file Jadpo writes for you, such as a record, couldn't be written, usually because it or its folder is read-only

  • toolchain.build_failed

    The Rust jadpo build wrote for a deployable didn't compile, because the machine lacks something the build runs, such as a C compiler, or because of a mistake in Jadpo

  • toolchain.fetch_failed

    The Rust toolchain or the crates jadpo build compiles with couldn't be fetched, usually because the server they come from, or the mirror in its place, can't be reached

  • toolchain.project_not_found

    You ran a command that works on a project in a folder with no app.jadpo, in it or in any folder above it

  • toolchain.scaffold_destination_exists

    You ran jadpo new or jadpo package new with the name of a file that already exists

  • toolchain.scaffold_destination_not_empty

    You ran jadpo new or jadpo package new on a folder that already has files in it, hidden files included

  • toolchain.scaffold_name_invalid

    You ran jadpo new with a path that doesn't end in a folder's name, such as .. or /

  • toolchain.scaffold_read_failed

    You ran jadpo new or jadpo package new on a path Jadpo can't look into, such as a folder you can't read or a path through a file

  • toolchain.scaffold_write_failed

    You ran jadpo new or jadpo package new, and writing its files failed, usually because the folder they go in can't be written

  • toolchain.source_read_failed

    A .jadpo file in the project couldn't be read, because it isn't UTF-8 text or you aren't allowed to read it

  • translation.exchange_file_invalid

    A file given to jadpo translations import isn't XLIFF 2.x or JSON in the shape export writes, or can't be read as one

  • translation.exchange_unit_unknown

    A file given to jadpo translations import holds a unit of wording the project doesn't have

  • type.suggestions_value_invalid

    Suggestions setting has a value it can't take

Personal data

  • data.encrypted_field_invalid

    A field that can't be stored sealed, or that says it isn't sealed when its type always is

  • data.encrypted_field_used

    An encrypted field is used somewhere the database or a log would have to read it

  • data.erase_field_required

    Erasing a person would clear a field that can't be none: a reference whose record erasure keeps, a marked field of a record it anonymises, or a marked field of the person's own record it keeps

  • data.erase_own_field

    A person's own record says something about erasure it can't: erase: on a field with anything but Erasure.retained or with no personal:, a reference that deletes a record that must stay, or a field named as the column erasure keeps

  • data.erase_required

    A restricted reference into records that erasing a person deletes doesn't say what erasure does to the record holding it

  • data.erase_retention_required

    Erasing a person keeps records with Erasure.retained, their own or others', but their entity has no retention: saying when they go

  • data.erase_unreached

    A field's erase: is on a field erasing a person never reaches: one that isn't a reference, or a reference to records erasure never deletes

  • data.field_encryption_key_invalid

    The application's field_encryption_key: reads something other than an EncryptionKey setting

  • data.field_encryption_key_required

    A field is kept sealed, but the application names no key to seal it with

  • data.personal_unreachable

    A field marked as personal data is on an entity erasing a person never reaches, so it could never be found

  • data.retention_field_required

    A field's retention: is on a field that can't be none, so its value could never be cleared

  • data.retention_held

    An entity's retention: would delete records that a restricted reference keeps from being deleted

  • data.retention_lifecycle_field

    A field's retention: would clear a field the entity's lifecycle owns or reads, changing which records are hidden or undoing what a transition set

  • data.retention_period

    A retention's after: isn't a Duration setting in config.jadpo

  • data.retention_since

    A retention's since: isn't one of the record's Instant fields

  • query.include_erased_reads

    A query that finds erased people reads more than their id and the fields erasure keeps of them

  • query.include_erased_unused

    A query says include_erased: true on an entity that keeps nothing of an erased person

Built-in services

Review and records

  • record.edited

    Generated record was edited by hand

  • record.format_newer

    A record file in the project was written by a newer Jadpo, in a format this one can't read

  • record.out_of_date

    A record file that Jadpo writes from your code is missing, or no longer matches the code

Standard library

AI