Four primitives: source, node, version, act
Everything stored is a source, a node, a version or an act. The last three borrow Git’s model as concepts: fixed snapshots, a moving pointer, an append-only chain.
Source
An input captured from outside — a paper, a page, a chat, a dataset.
- Identified by
- sha256 of its bytes
- Changes
- never
- In Git
- none — it stays outside
Evidence must stay citable byte for byte, whatever we later write about it.
Node
A thing's permanent identity. One permanent kind, one current version.
- Identified by
- a minted, time-ordered identity
- Changes
- only its pointer — and only by an act
- In Git
- a branch
Everyone refers to the node, so a new version never breaks a reference.
Version
A node's content at one moment, together with its card.
- Identified by
- sha256 of content and card together
- Changes
- never
- In Git
- a blob
A pinned reference means exactly the bytes it meant, forever.
Act
The record of a change: what moved, from which version to which, who, when, why, on what grounds.
- Identified by
- a minted identity, chained to its parents by digest
- Changes
- never — append-only
- In Git
- a commit
History is a chain anyone can verify, not a log anyone can edit.
Sources stand apart because outside evidence must stay citable byte for byte, whatever anyone later writes about it. The other three are Git’s ideas, separated: content that never changes, a name that points at the current content, and a causal history of every move.
Concurrent changes never overwrite each other. Two acts that move one node from the same version leave it with two causal heads: the node is contested, readers get one deterministic value plus a contested flag, and a merge act resolves it. Versions and acts append without coordination; only a node’s pointer is coordinated, per node or per namespace — never globally.
Git, mapped onto the scheme
The scheme borrows Git’s model, not Git’s commands. Every Git idea has a counterpart, and a few Git operations deliberately have none.
| Git | The scheme |
|---|---|
| blob | a version |
| tree | a view’s result — computed and pinned, never authored |
| commit and its parents | an act and its parent acts |
| branch / main | a node’s pointer / its accepted line |
| other branches | drafts and competing versions |
| merge | acceptance |
| tag | approved, accepted, released |
| fork / pull request | an agent’s isolated workspace / review before merge |
| log, blame | a node’s history; the provenance of its parts |
| revert | a correction, as a new act |
| unreachable objects | the archive — never collected |
| squash, rebase, force-push | nothing. History is never rewritten. |