Versioning
Every write produces a new immutable manifest pointing at the previous one. Snapshots, branches, and time travel are all just names for reading a particular manifest — none of them copies data.
Snapshots
Keep that dict — it is how you get back:
A snapshot is a label on a manifest, so it costs one small object and is instant regardless of dataset size. Reproducible training runs pin one.
Branches
A branch starts from the current manifest and advances independently. Both refs exist side by side:
Sharded ingest
The reason branches exist. Split a large ingest across processes or machines, each on its own branch, then merge:
Verified against 0.0.10 with a trunk of 10 records and two workers adding 5 each:
Workers never coordinate. They write to disjoint refs, and the merge is a manifest operation over content-addressed objects — no data moves.
Merging refuses when two branches bound the same modality to divergent index lineages, rather than mixing vectors quantized under incompatible codebooks:
In practice this is what stops a text index and sharded ingest from combining today — build the index after the merge.
History
Each entry names its parent, so the list is the ref's ancestry. Any manifest hash in it can be reopened with Dataset.open_by_manifest.
Deletion
A tombstone suppresses records on read. History stays intact — that is what makes time travel and merges sound — so the bytes are still on disk until a future compaction step reclaims them. If your obligation is that the bytes are gone, this is not yet that; see Tombstones.
Comparing two refs
Useful before a merge, or to see what a branch actually changed.