Chronos/DBWaitlist

Worlds

Worlds

Fork, switch, list, change and drop worlds: instant, isolated copies of the database.

SoonThese pages describe Chronos Cloud, which opens from the waitlist. Running Chronos yourself? Self-host docs

SQL
create world agent_7 with (task = 42);switch world agent_7;update orders set status = 'paid' where id = 7;diff;                       -- what agent_7 changedmerge world agent_7;        -- into main; the session moves back to main

Every statement here also has an MCP tool (fork, branches, set_meta, discard) and works from the dashboard’s SQL editor. BRANCH is accepted wherever WORLD is: CREATE BRANCH, USE BRANCH, MERGE BRANCH.

Names and moments

  • Names: a bare name (agent_7), a double-quoted one ("agent-7"), or a string ('agent-7'). A name with a dash must be quoted: unquoted task-1 fails with 42601.
  • Not allowed: empty, containing @ (42602), starting with _tx_, or one of MERGE’s own words (using, ours, theirs, confirm, by, resolve, dry, into, only) (42939).
  • IDs work too: anywhere a world is named, its ID does (w and 16 hex digits, from SHOW WORLDS).
  • A world as it was: 'name@when', read only. In DIFF … TO, FORK WORLD, CREATE WORLD … FROM, SIMULATE … FROM, and as the Postgres database name.
whenExampleMeans
a time2026-09-20 10:00, 2026-09-20 10:00:00+02UTC unless it gives an offset
nownowthis moment
a time ago-15 minutes, -1 day, -2 hoursa new moment each time it runs

History reaches back as far as the plan keeps it (an hour on the free plan). Earlier than that, or later than now, is 22023.

CREATE WORLD

syntax
CREATE WORLD name [FROM source] [WITH (key = value, ...) | META '<json object>']
  • Source: the session’s world, unless FROM names one: a name, an ID, or 'name@when' (the new world holds that past).
  • Metadata: WITH values are strings, numbers, true, false or null; META takes a JSON object. At most 64 KB; keys starting with _sonos are the database’s own.
  • Which run made it: run_id, prompt_version, model and tool_schema say which run of an agent made the changes, and with what. SHOW AUDIT and Reviews show them, and UNDO AGENT … WHERE run_id puts back one run.
  • Scope: may_change, tenant, max_rows, max_deletes declare what the world is meant to change, held to at its merge. See Stale reads and scope.
  • The session stays on its world: switch with SWITCH WORLD.
SQL
create world agent_7 from main with (owner = 'claude', task = 42);create world run_r42 with (run_id = 'r42', prompt_version = 'triage-v9', model = 'claude-opus-5-5');create world check_it from 'main@-1 hour';
ErrorWhen
42710a world with that name exists
3D000no such source
53400past the database’s limit of open worlds (100 on the free plan)
22P02META isn’t JSON

FORK WORLD

syntax
FORK WORLD source [AS] name [WITH (key = value, ...) | META '<json object>']

The same as CREATE WORLD name FROM source, with the source first.

SQL
fork world agent_7 as agent_7b meta '{"tags": ["retry"]}';fork world 'main@2026-09-20 10:00' as before_the_deploy;

SWITCH WORLD

syntax
SWITCH WORLD name      -- also SWITCH BRANCH, USE WORLD, USE BRANCH, USE name

The session’s statements run on that world from now on. Over Postgres the database name does the same for the whole connection; see Your app.

SHOW WORLDS

One row per open world, main included. SHOW BRANCHES is shorter: name, parent, and changes (rows changed since its fork).

ColumnTypeMeaning
nametext
idtextstable ID; main’s is main
parenttextnull for main
depthintegerforks between it and main
createdtimestamptznull for main
versionbigintthe world’s write version
metajsonbits metadata
ownertextthe agent that forked it, or null
expirestimestamptzwhen it’s discarded (TTL), or null
activetimestamptzlast used
pinnedbooleannever discarded for being idle
scopejsonbwhat it was forked to change, if declared

ALTER WORLD

FormEffect
ALTER WORLD w SET (k = v, …)sets keys in its metadata; null removes one
ALTER WORLD w SET TTL '2 hours'discarded that long from now, unless it has forks then
ALTER WORLD w RESET TTLnever expires
ALTER WORLD w SET PINNEDnever discarded for being idle
ALTER WORLD w RESET PINNEDidle rules apply again
SQL
alter world agent_7 set (task = null, reviewer = 'ada');alter world agent_7 set ttl '1 day';

DROP WORLD

syntax
DROP WORLD [IF EXISTS] name [CASCADE]     -- also DELETE WORLD, DROP BRANCH
  • Without CASCADE, refused while it has open forks (2BP01); with it, it and every world forked from it go, deepest first.
  • A session on the dropped world carries on from its parent.
  • main can’t be dropped (0A000).

Who may do what

StatementAn agent needs
CREATE / FORK WORLDfork
SWITCH, SHOW WORLDS, SHOW BRANCHES, DIFFread
ALTER WORLDthe world to be its own; TTL and pins need admin
DROP WORLDthe world (and with CASCADE, every fork) to be its own
MERGE WORLDmerge_own for its own worlds, merge for any; write_main to reach main

None of these run inside BEGIN … COMMIT (25001). A refused statement fails with 42501, naming the right it needs.

Worlds · Chronos