Reference
Errors
SQLSTATE codes and HTTP statuses, what causes each, and what to do.
SoonThese pages describe Chronos Cloud, which opens from the waitlist. Running Chronos yourself? Self-host docs
Where errors show
| Client | Gets |
|---|---|
| Postgres (your app, psql) | an error with its SQLSTATE (C), message, and where it has them detail, hint, position, and the schema, table, column and constraint a violation names. A constraint error’s hint names the row: Row bookings/7 already has this key. |
| MCP (agents) | a normal result with isError: true and the message, which says how to fix the call |
| Platform API | an HTTP status and {"error": "<code>", "message"}: see Platform API |
| App auth | an HTTP status and {"error", "message"}: see Auth |
Merges and worlds
| Code | Means | Do |
|---|---|---|
40001 | rows changed on both sides since the fork; or both changed one table’s columns | read the dry run, then settle (BY COLUMNS, RESOLVE, USING) or redo the work on a fresh fork. See Conflicts |
23505 | both sides added rows with the same unique value | drop or change one side’s row |
23503 | the merged result has a row pointing at one the other side deleted | merge the deletion’s world after fixing the reference |
23514 | a CHECK, or a merge check found rows in the result (they’re in the message) | change the world until the check finds nothing |
55000 | the world isn’t at the AT VERSION given; a missing or wrong CONFIRM DELETES; a world open when the server stopped | read the diff again; give the count the message names; check DIFF then CONFIRM |
3D000 | no such world (also a Postgres connection to a database name that isn’t one) | SHOW WORLDS |
42710 | a world with that name exists | pick another name, or drop it |
2BP01 | dropping a world that has forks | merge or drop them, or DROP WORLD … CASCADE |
25001 | a world statement inside BEGIN … COMMIT | run it outside the transaction |
25006 | a write to a world as it was (name@when) | write to the world itself |
42601 | a world name with a dash, unquoted (task-1) | quote it: "task-1" |
42602, 42939 | a world name that’s empty, has @, starts _tx_, or is a MERGE keyword | pick another name |
0A000 | merging or dropping main | main has no parent |
Agents and rules
| Code | Means | Do |
|---|---|---|
42501 | an agent may not do this: it lacks the right (the message names it), the world isn’t its own, or it’s disabled | do it as a person, or change the agent’s rights |
42501 | merging w needs a person’s review (merge policy p: …): its policy holds the merge; it’s queued | nothing is wrong: approve or discard it in Reviews |
42501 | a direct write to main by an agent keeping to a policy | write in a world and merge it |
42501 | outside the world’s declared scope | widen the scope (a person), or redo the work within it |
40001 | … read rows that changed since it forked: a stale read | redo the work in a new world forked from now |
Limits
| Code | Means | Do |
|---|---|---|
53400 | past the plan’s open worlds, or an agent writing too fast | drop worlds you’re done with; slow down |
53300 | too many connections or statements at once | use a pool; lower its size |
53200 | a query past its memory | narrow it, or add a LIMIT |
53100 | disk full: past the plan’s storage | delete data or worlds you don’t need |
57014 | statement_timeout passed, or canceled | index the filter, or raise the timeout for that session |
54001 | a regular expression that backtracks too long; recursion too deep | simplify the pattern; add a stop condition |
History
| Code | Means | Do |
|---|---|---|
22023 | a moment outside the history window (older than the plan keeps, or in the future) | pick a moment within it; restore a backup for older |
22P02 | AS OF given something that isn’t a time | '-15 minutes', '2026-10-20 09:00', a timestamp, or a parameter |
55000 | RESTORE to before the world’s last rebase | fork the past and merge what you need instead |
Postgres errors
Everything else is Postgres’s own code, with Postgres’s message:
| Code | Means |
|---|---|
23502, 23503, 23505, 23514 | not null, foreign key, unique, check |
42P01, 42703, 42883, 42704 | no such table, column, function, object (the message lists what there is) |
42601 | syntax error, with its position |
42804, 22P02 | a value of the wrong type, or text that isn’t one |
22003, 22012 | out of range, division by zero |
25P02 | a statement after an error in the same transaction: roll back |
0A000 | a feature Chronos doesn’t have yet: see Known gaps |
28000, 28P01 | TLS required (sslmode=require), or a wrong password |
Reading an error
A merge refused
- The message always ends with what happened to the data:
nothing was merged. - It names up to 10 rows (
orders/7, orders/9), and a dry run lists them all. - A held merge names every broken rule:
it changes 40 rows (at most 3); it deletes 2 rows (at most 0).