Two Clocks, Three Temporal Meanings, No Invented Dates

Utopia’s time model answers two different questions about the same knowledge: when did a statement hold in the world, and when did Utopia hold it as a belief? This chapter separates those clocks, then follows the consequences of partial dates and predicate-specific meanings. The goal is practical: a reader should be able to tell whether a historical answer is about the world or about the system’s earlier state of knowledge, and recognize when a precise-looking date would be an invention.

World time is not record time

Suppose a document says that a team owned a project during 2024, but the document is imported in 2025. Later, another document says the team handed the project to someone else. There are at least two timelines in that story. The assignment has a place in world time: it held during a period in the organization. Utopia also has a record-time history: the first statement entered the base when one document was recorded, and the correction became part of the base later.

A conventional current-state table tends to keep the latest row and discard the earlier one. Utopia instead treats a correction as a new assertion that supersedes the old one. The old row remains available with its record-time lifetime, so the system can ask what it currently believes and what it believed before the correction. This is the meaning of a bitemporal graph: world validity and the system’s changing belief are related, but they are not the same field with two names.

The world-time question is expressed with at. “Who owned the project in 2024?” asks which facts held in the world at that date. The record-time question is expressed with as_of. “What did the base say before the correction was ingested?” asks which facts Utopia held at an earlier moment, even if those facts were later invalidated or superseded. The default behaviors differ for a reason: absence of a record-time cutoff means the current belief state, while absence of a world-time moment can mean that the reader wants the graph’s historical span rather than one point on it.

The record axis is about the lifetime of a stored belief, not the truth of the statement. A fact recorded after a chosen cutoff cannot appear in an as_of replay, even if its world-time interval reaches back before that cutoff. A fact invalidated later can still appear in an earlier replay, because the base held it then. Conversely, a fact can be valid in the world today but absent from an earlier record state because the source had not arrived. The axes cross, but neither substitutes for the other.

The two parameters must remain separate all the way to the reader. Combining them into one “historical” slider would make two plausible but different answers indistinguishable. A query could accidentally mean “what was true then as we understand it now” or “what we thought then about what was true then.” Both are legitimate questions. Neither should be silently substituted for the other.

sequenceDiagram participant W as World event participant S as Source document participant U as Utopia ledger participant Q as Reader W->>S: Assignment holds during an earlier period S->>U: Statement is recorded later W->>S: Later document states a correction S->>U: New assertion supersedes the earlier one Q->>U: Ask with at = earlier date U-->>Q: Facts valid in world time Q->>U: Ask with as_of = before correction U-->>Q: Facts held by the base then

The distinction is not merely historical decoration. It changes the answer in operational settings.