Naming & handles
A conversation that hops runtimes needs a name that belongs to no runtime. Constant gives every conversation three layers: a handle (the stable address), a title (the glance layer), and chapters (the position).
The handle
One color word plus a two-digit tail:
cobalt-37 ash-52 viridian-08The handle is suggested by a hash of the conversation id, but decided by the ledger registry: if a handle is already taken, the tail deterministically extends until it is unique. Collisions are impossible by construction — the registry, not probability, guarantees it. The shape (color + digits) is also deliberately distinct from opencode's adjective-noun session slugs, so the two can never be confused.
Handles work as addresses everywhere:
constant resume cobalt-37
constant pack cobalt-37
constant rename --of cobalt-37 auth bugThe title
The human layer on top, with strict precedence:
- An explicit rename locks it.
constant rename auth bug, or:rename auth buginside a hosted session. Once you name it, nothing overwrites it. - Otherwise, a harvested runtime title. If the runtime generated a title
(opencode does; a
/renameinside Claude Code counts), Constant adopts it. - Otherwise, a birth slug from your first message, with leading filler words stripped.
Renames re-stamp the native resume pickers immediately, so the name you chose
is what codex and claude show in their own /resume lists.
Chapters
Every carry is a chapter: ch01, ch02, … You'll see them in the status bar,
the trail, the snapshots listing, and the record volume filenames
(ch04-from-codex.json). The full stamp a native picker shows:
auth bug · ch04 ← codex · cobalt-37Name first, then where the thread stands, then the address.
Seeing it
constant trail # chapters and projections for this directory
constant resume --list # addressable conversationsInside a hosted session, Ctrl-B t opens the trail graph — every chapter as a
colored rail, with the "you are here" head. See
Hosting a runtime.
Next: Runtime vs model.