# 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](/docs/command-line-errors.md). Some rows belong to commands that other
commands replace (`schema`, `artifacts`, `watch`).

| Rule | Raised by | What it means |
|---|---|---|
| `acceptance.base_missing` | `check`, `build`, `acceptance new` | Base commit the change is compared with isn't in this clone |
| `acceptance.edited` | `check`, `build` | Acceptance already on the before side was edited |
| `acceptance.invalid` | `check`, `build` | Acceptance file isn't written as an acceptance |
| `acceptance.missing` | `check`, `build` | 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` | `check`, `build` | An acceptance this change adds has no `///` line above `acceptance` saying why a person accepted the changes it lists |
| `acceptance.unmatched` | `check`, `build` | Acceptance lists a change this change doesn't make |
| `conform.failed` | `package conform` | A package's answers to `jadpo package conform` don't fit the capability it fills, or the suite couldn't run |
| `conform.refused` | `package conform` | 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 |
| `protocol.mismatch` | `package protocol` | A registry's OpenAPI document differs from the registry protocol |
| `protocol.unreadable` | `package protocol` | The document given to `jadpo package protocol` couldn't be read as OpenAPI's JSON |
| `recording.failed` | `package record`, `ai record` | 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` | `package record`, `ai record` | 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 |
| `configuration.local_changed` | `config` | Something else saved `.env.local` while `jadpo config set` was saving a value in it |
| `configuration.local_invalid_encoding` | `config` | The `.env.local` file holds bytes that aren't UTF-8 text |
| `configuration.local_read_failed` | `config` | 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` | `config` | 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` | `config` | The `.env.local` file that `jadpo config set` would save a value in is a link, not an ordinary file |
| `configuration.local_write_failed` | `config` | Saving a value in `.env.local` failed, usually because the project's folder can't be written |
| `configuration.move_name_taken` | `config move`, the editor | A constant `jadpo config move` was asked to make a setting has the name of a setting `config { }` already declares |
| `configuration.move_read_unsupported` | `config move`, the editor | 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` | `config move`, the editor | 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` | `config`, `dev` | 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` | `config`, `dev` | A setting `config.jadpo` declares without a `default:` has no value on this machine, in the environment or `.env.local` |
| `email.browser_failed` | `email open` | A `jadpo email open` command couldn't start the browser to open a mail's link |
| `format.changes_required` | `fmt` | A file `jadpo fmt --check` read isn't laid out as `jadpo fmt` would write it |
| `format.unsafe` | `fmt` | 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` | `fmt` | A file `jadpo fmt` formatted couldn't be written, usually because it is read-only |
| `index.accept_check_failed` | `schema index-accept` | Index edit did not pass project checks |
| `index.accept_identity_count` | `schema index-accept` | Index acceptance changed an unexpected number of schema identities |
| `index.accept_range_invalid` | `schema index-accept` | Recommended index insertion point is no longer valid |
| `index.accept_registry_missing` | `schema index-accept` | Schema identity registry is required before accepting an index |
| `index.accept_rollback_failed` | `schema index-accept` | Failed index edit could not be rolled back |
| `index.accept_source_read_failed` | `schema index-accept` | Source file for the recommended index could not be read |
| `index.accept_source_write_failed` | `schema index-accept` | Recommended index could not be written to source |
| `index.recommendation_field_missing` | `schema index-accept` | Recommended field no longer exists |
| `index.recommendation_unknown` | `schema index-accept` | Index recommendation is not current |
| `install.fetch_failed` | `package add`, `update` | Installing a package couldn't read its git repository, or found no release there at the tag you gave ([Installing errors](/docs/external-services.md)) |
| `install.in_use` | `package remove` | Package to remove is still used by the app ([Installing errors](/docs/external-services.md)) |
| `install.link_refused` | `check`, `test` in CI | Linked package in a CI or production build ([Installing errors](/docs/external-services.md)) |
| `install.surface_mismatch` | `package add`, `update` | The package you are installing has code that offers something different from its committed `surface.jadpo_record` ([Installing errors](/docs/external-services.md)) |
| `lsp.content_length_missing` | `lsp` | Language-server message has no Content-Length header |
| `lsp.json_invalid` | `lsp` | Language-server message is not valid JSON |
| `lsp.json_write_failed` | `lsp` | Language-server response could not be encoded |
| `lsp.read_failed` | `lsp` | Language-server input could not be read |
| `lsp.root_missing` | `lsp` | Language server has no workspace root |
| `lsp.write_failed` | `lsp` | Language-server response could not be written |
| `migration.decision_artifact_exists` | `schema` | Migration decision file already exists |
| `migration.decision_artifact_invalid` | `schema` | Migration decision file is invalid |
| `migration.decision_artifact_read_failed` | `schema` | Migration decision file could not be read |
| `migration.decision_artifact_write_failed` | `schema` | Migration decision template could not be written |
| `migration.decision_change_set_stale` | `schema` | Migration decisions refer to a different change set |
| `migration.decision_duplicate` | `schema` | Schema change has more than one migration decision |
| `migration.decision_evidence_duplicate` | `schema` | Migration decision repeats an evidence kind |
| `migration.decision_evidence_empty` | `schema` | Migration decision contains empty evidence |
| `migration.decision_evidence_missing` | `schema` | Migration decision is missing required evidence |
| `migration.decision_evidence_unexpected` | `schema` | Migration decision contains unsupported evidence |
| `migration.decision_missing` | `schema` | Schema change has no migration decision |
| `migration.decision_strategy_invalid` | `schema` | Migration strategy is not valid for this change |
| `migration.decision_unexpected` | `schema` | Decision file contains an unrelated schema change |
| `migration.decision_unresolved` | `schema` | Migration decision still needs a strategy |
| `migration.identity_additions_have_removal` | `schema` | Schema additions cannot be registered while identities are missing |
| `migration.identity_registry_exists` | `schema` | Schema identity registry already exists |
| `migration.identity_registry_missing` | `schema` | Schema identity registry is missing |
| `migration.identity_registry_read_failed` | `schema` | Schema identity file could not be read |
| `migration.identity_registry_write_failed` | `schema` | Schema identity registry could not be written |
| `migration.identity_rename_kind` | `schema` | Schema rename kind is not supported |
| `migration.identity_rename_source_unknown` | `schema` | Schema rename source identity does not exist |
| `migration.identity_rename_target_exists` | `schema` | Schema rename target already has an identity |
| `migration.identity_rename_target_unknown` | `schema` | Schema rename target is absent from checked source |
| `migration.identity_snapshot_exists` | `schema` | Schema snapshot output already exists |
| `migration.identity_snapshot_invalid` | `schema` | Schema snapshot is invalid |
| `migration.identity_snapshot_missing` | `schema` | Previous schema snapshot is missing |
| `migration.identity_snapshot_not_canonical` | `schema` | Previous schema snapshot is not canonical |
| `migration.identity_snapshot_shape_missing` | `schema` | Snapshot entry is missing its saved definition |
| `migration.identity_snapshot_write_failed` | `schema` | Schema snapshot could not be written |
| `migration.plan_adapter_invalid` | `schema` | Migration adapter is not supported |
| `migration.plan_decision_rejects_change` | `schema` | Reviewed decision rejects this schema change |
| `migration.plan_exists` | `schema` | Migration plan output already exists |
| `migration.plan_write_failed` | `schema` | Migration plan could not be written |
| `migration.sql_change_unsupported` | `schema` | Schema change has no SQL review generator |
| `migration.sql_expression_unsupported` | `schema` | Backfill expression cannot be compiled to SQL |
| `migration.sql_field_owner_missing` | `schema` | Migration field has no resolvable owning table |
| `migration.sql_field_shape_invalid` | `schema` | Saved field definition is incomplete |
| `migration.sql_literal_invalid` | `schema` | Backfill literal is invalid for the field type |
| `migration.sql_predicate_unsupported` | `schema` | Validation check cannot be compiled to SQL |
| `migration.sql_review_exists` | `schema` | Migration SQL review output already exists |
| `migration.sql_review_write_failed` | `schema` | Migration SQL review could not be written |
| `migration.sql_sqlite_constraint_missing` | `schema` | SQLite rebuild cannot resolve a constraint identity |
| `migration.sql_sqlite_entity_missing` | `schema` | SQLite rebuild cannot find the current entity |
| `migration.sql_sqlite_field_identity_missing` | `schema` | SQLite rebuild cannot resolve a field identity |
| `migration.sql_sqlite_field_missing` | `schema` | SQLite rebuild cannot find the current field |
| `migration.sql_sqlite_index_missing` | `schema` | SQLite rebuild cannot resolve an index identity |
| `migration.sql_sqlite_rebuild_required` | `schema` | SQLite change requires a table rebuild |
| `migration.sql_sqlite_rebuild_unsupported` | `schema` | This combination of SQLite table changes is not supported |
| `migration.sql_sqlite_reference_missing` | `schema` | SQLite rebuild cannot resolve a reference target |
| `migration.sql_sqlite_renamed_table_unsupported` | `schema` | SQLite rebuild cannot target a logically renamed table |
| `migration.sql_strategy_unsupported` | `schema` | Reviewed migration strategy has no SQL implementation |
| `migration.sql_type_unsupported` | `schema` | Field type has no migration SQL mapping |
| `publish.behaviour_changed` | `package check`, `package verify` | An example or test of a package's last release fails against its new version, and the change isn't marked a fix ([Publishing errors](/docs/external-services.md)) |
| `publish.breaking_change` | `package check` | A package's new version changes or removes something its last release offered, within the same major version ([Publishing errors](/docs/external-services.md)) |
| `publish.changelog_missing` | `package check` | Package's changelog doesn't say why its new version is released ([Publishing errors](/docs/external-services.md)) |
| `publish.description_missing` | `package check` | Package's public declaration has no description ([Publishing errors](/docs/external-services.md)) |
| `publish.example_failed` | `package check` | Example in a package's description doesn't compile or doesn't hold ([Publishing errors](/docs/external-services.md)) |
| `publish.example_missing` | `package check` | Package's function has no example, or a failure it raises is shown by none ([Publishing errors](/docs/external-services.md)) |
| `publish.file_not_allowed` | `package verify` | A commit holds a file a release can't: anything but Jadpo source and the package's text files ([Publishing errors](/docs/external-services.md)) |
| `publish.licence_proprietary` | `package verify`, `package publish` | A package's licence is `Licence.proprietary`, which the public registry refuses ([Publishing errors](/docs/external-services.md)) |
| `publish.publisher_mismatch` | `package verify`, `package publish` | A release names another publisher than the one asked to publish it ([Publishing errors](/docs/external-services.md)) |
| `publish.publisher_missing` | `package verify`, `package publish` | A package's index names no publisher, and it has to for the registry ([Publishing errors](/docs/external-services.md)) |
| `publish.sample_missing` | `package check` | Package's recipes have no sample app with one domain to compile in ([Publishing errors](/docs/external-services.md)) |
| `publish.stale_files` | `package verify` | A commit's `surface.jadpo_record` or changelog list isn't what the package's code gives ([Publishing errors](/docs/external-services.md)) |
| `publish.too_large` | `package verify` | A commit's release is past the size limit ([Publishing errors](/docs/external-services.md)) |
| `runtime.outcome_unknown` | the running app | Generated runtime could not confirm whether an effect committed |
| `runtime.startup_failed` | the running app | Generated runtime failed during startup; a deployable's log event, with every problem that stopped it ([A native deployable](/docs/a-native-deployable.md)) |
| `runtime.unhandled_fault` | the running app | Generated runtime contained an unexpected fault |
| `suggest.record_invalid` | `suggest` | A suggestions record `jadpo suggest` reads, `ignored_suggestions.jadpo_record` or `taught_suggestions.jadpo_record`, isn't as Jadpo writes it |
| `suggest.share_failed` | `suggest share` | Jadpo HQ couldn't be reached, or refused what `jadpo suggest share` sent, so the entries wait to be shared again |
| `test.failed` | `test`, `package check` | A test failed under `jadpo test`, or among a package's own tests under `jadpo package check` |
| `test.no_tests` | `test` | 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` | `test` | 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_cleanup_failed` | `artifacts`, `build` | Previous build backup could not be removed |
| `toolchain.artifact_promote_failed` | `artifacts`, `build` | Staged build artifacts could not be promoted |
| `toolchain.artifact_stage_failed` | `artifacts`, `build` | Build staging directory could not be created |
| `toolchain.artifact_write_failed` | `check`, `build` | 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` | `build` | 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` | `build` | 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` | any command | 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.project_read_failed` | any command | Project directory could not be read |
| `toolchain.scaffold_destination_exists` | `new`, `package new` | You ran `jadpo new` or `jadpo package new` with the name of a file that already exists |
| `toolchain.scaffold_destination_not_empty` | `new`, `package new` | You ran `jadpo new` or `jadpo package new` on a folder that already has files in it, hidden files included |
| `toolchain.scaffold_name_invalid` | `new` | You ran `jadpo new` with a path that doesn't end in a folder's name, such as `..` or `/` |
| `toolchain.scaffold_read_failed` | `new`, `package new` | 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` | `new`, `package new` | 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` | any command | 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 |
| `toolchain.target_auth_not_implemented` | `build` | Protected route `{route}` cannot be generated yet |
| `toolchain.target_durable_workflow_not_implemented` | `build` | Durable workflow target execution is not implemented |
| `toolchain.target_job_not_implemented` | `build` | Scheduled job `{name}` cannot execute yet |
| `toolchain.target_liveness_not_local` | `build` | Authored liveness route is not dependency-free |
| `toolchain.target_store_not_implemented` | `build` | Authority store target adapter is not implemented |
| `translation.exchange_file_invalid` | `translations export`, `translations import` | 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` | `translations import` | A file given to `jadpo translations import` holds a unit of wording the project doesn't have |

Three errors can't be reached at all: `type.job_delivery_selector_invalid`
(Delivery selector does not match its entity types),
`type.job_delivery_service_invalid` (Delivery service does not match its
closed payload types) and `type.job_delivery_sealed_use` (Compiler-owned
delivery value cannot be authored or exposed). They belong to a job
delivery descriptor, which the language doesn't have.
