Documentation / @etherfold/core / SLOT_NAMES
Variable: SLOT_NAMES ​
constSLOT_NAMES: readonly ["canonical","successor","predecessor"]
Defined in: packages/core/src/generation/registry.ts:131
THE THREE DURABLE NAMED SLOTS a generation can be held by (ADR-0084).
A slot is an ASSIGNMENT: a durable name POINTING AT a generation, exactly as canonical already was before there were three of them. It is deliberately NOT part of GenerationId: identity is content-addressed (ADR-0053, ADR-0036), so a slot inside the identity would make the same content under two slots into TWO generations, two state namespaces and two folds of one stream.
canonical-- what answers every read. Unchanged by slots existing: it is simply the first slot, and the one a registry takes for the first generation registered.successor-- the generation being built beside the incumbent. It holds AT MOST ONE, so registering into an occupiedsuccessorREPLACES its occupant, whatever stream either sits on. That is the whole of "a second save replaces the first pending successor", and because the fact is a ROW it survives a restart, which no in-memory rule can.predecessor-- what a revert moves back to: the generation the pointer was last moved OFF. It is ASSIGNED by the move that creates one and is never INFERRED, because it cannot be: with the pointer at C and a newer generation N, "N was never canonical" and "N was canonical and the pointer was reverted away from it" are indistinguishable from the rows (ADR-0084). It is assigned by the RECEIVING runtime ONLY (ADR-0089): a move on the chain-facing container assigns none, because in a browser the code that generation's fold needs is absent from the build, so the slot would name something that runtime cannot instantiate. The NAME stays in the vocabulary either way -- what differs is which runtime assigns it, never what it means. SeemoveCanonicalTo. An ARRIVAL of it (an upload, a configured start) RE-ARMS it: it MOVES intosuccessorand this slot is emptied (create, ADR-0094).
There are EXACTLY three and arbitrary named slots are deliberately not built: with three fixed names each word means one thing, and a generation is a successor exactly when the successor slot names it. A generation no slot names, and that is not canonical, is GARBAGE -- which is a refcount, and far easier to prove safe than the three-way in-memory predicate it replaced.