# 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. One mistake gives one error: the compiler doesn't report
the errors that follow from it. An error reads:

```text
error: `titel` isn't defined in this scope
 --> domains/planning/libraries/titles.jadpo:6:12
  |
6 |     return titel
  |            ^^^^^
  reason: Jadpo could not find this name. Did you mean `title`?
  next: Use `title` instead of `titel` (agent)
  rule: type.unknown_value
  help: https://jadpo.dev/docs/errors/type.unknown_value
```

`(human)` at the end of an error's `next:` line tells your coding agent to
stop and ask you which fix you want, because the choice is yours to make
(who can see data, what a setting holds). `(agent)` means your agent can
make the fix itself.

- Paths are relative to the project.
- The two impact lines appear only when they say something.
- An obvious repair carries its edit, so the editor and agents can apply
  it.
- The help link is the address of the error's own page on the site,
  `https://jadpo.dev/docs/errors/<rule>`, which has an example of the
  rule.
- JSON gives line and column as well as byte offsets, and uses one naming
  style for its keys.

## When Jadpo itself fails

Sometimes the fault is Jadpo's. If `jadpo` panics, including inside the
interpreter that `jadpo dev` and `jadpo test` run, it says so first, so
you don't hunt for a mistake in your own code. This is the screen:

```text
✗ failed  This is a bug in Jadpo, not in your code
  ran       jadpo check
  version   jadpo 0.1.0 · aarch64-macos
  in        crates/jadpo-check/src/lib.rs:12

What to do next
  1. Read the crash file. It can quote your project.
     /Users/ada/.cache/jadpo/crashes/2026-10-30T14-02-31Z.txt
  2. Report it with this link, attaching the file.
     https://github.com/jadpo-dev/jadpo/issues/new?template=bug.yml&title=Internal%20error%20in%20jadpo%20check&version=0.1.0%20aarch64-macos
```

The screen names only the command word, never an argument, and never the
panic message. The crash file holds those, so it can quote your project:
read it before you attach it. Jadpo writes it under `$XDG_CACHE_HOME/jadpo/
crashes/`, or `~/.cache/jadpo/crashes/`, and keeps the newest 20. It holds
the version, the platform, the arguments (`jadpo config` keeps only its
subcommand), the panic message and a backtrace. Jadpo sends nothing
anywhere.

A deployed app is different: the client sees only `500 internal_fault`, and
the log says more ([What it logs](a-native-deployable.md#what-it-logs); [Failures](faults.md#a-bug-in-jadpo)).
