The crate has seven atoms now, and Maya notices it's a strange kind of quiet in there.
Kerala is an atom. Bonobo is an atom. Downtempo is an atom. And nothing in the crate knows they have anything to do with each other. The single most important fact in Maya's musical life — Bonobo made Kerala — exists in exactly one place: her head. Which is, she reflects, the exact storage medium that fifteen years of platforms failed to back up.
Subject, verb, object#
In the graph, a relationship is a triple: subject — predicate → object. Three atoms, one claim.
And here's the move that makes this bigger than a database row. The verb is not a string Maya types. It comes from a shared registry — 133 verbs, curated, categorized, argued over in the open — and every verb in the registry is itself an atom with a deterministic ID:
import { getPredicateRecord } from "@0xintuition/predicates";
getPredicateRecord("createdBy");
// { key: "createdBy", name: "created by", status: "enshrined",
// category: "Authorship/Contribution", ... }
// its atom ID: 0x3df2eaf3b9bdaf2018bc5d45fa770c470ab5067b5afdc9e3097151f9c87d92a4
When Maya says createdBy and a stranger's app in another hemisphere says createdBy, they are not using similar words. They are referencing the same record, down to the byte. That's what makes a claim written in Crate legible to every app that has never heard of Crate.
A verb earns its place#
The registry is curated in two tiers, and the difference matters:
- Enshrined — 25 verbs. The settled core: semantics frozen, safe to build on.
createdByis one. So aresameAs,hasCategory,recommend. - Proposed — 108 verbs. Each already has a stable definition and a deterministic ID, but its meaning is still being refined in public before promotion.
schema.org defines thousands of properties that could relate two things. Adopting all of them would make the vocabulary meaningless. So verbs earn their way in — deliberately, in the open, one decided meaning at a time. Keep this in your pocket; it becomes personal for Maya three chapters from now.
First claims#
import { buildTriple } from "@0xintuition/primitives";
const kerala = "0x6fa0de44d28a6d36067ea5e1db51d143d831c859357b35deab4b5c0f24305b08";
const bonobo = "0x6eef2298f1fa180827e8b3becfe9b96c764370b0816161fc59105f613f2aef9c";
const claim = buildTriple(kerala, "createdBy", bonobo);
// claim.value.id → 0xa81fc2816344c7d06e177c2a10e09dc1cc5a639422b0e7831c8d46c96b47cb2c
The claim itself gets a deterministic ID, derived from its three parts. Anyone who asserts Kerala, created by Bonobo — in any app, forever — lands on 0xa81f…cb2c. Claims converge exactly the way atoms do.
She files Kerala under its genre while she's here:
buildTriple(kerala, "hasCategory", downtempo);
// → 0x4a2ecb74958b93f08af45ada558def9c9826cc46cddd75ab98b7083ec1127eb0
And then, because she is Maya, she tries to cheat:
buildTriple(kerala, "wroteTheSongIGuess", bonobo);
// { success: false, errors: [ 'Unknown predicate key "wroteTheSongIGuess".' ] }
The registry declines. Politely, deterministically, and in a way Maya finds she doesn't resent: the refusal is the feature. A graph where anyone can invent verbs is a graph where nothing means anything twice.
Where this is going#
Maya's taste is finally data. Not rows locked in a schema she'll regret — claims, each one portable, each one legible to apps that don't exist yet.
But Maya didn't grieve songs in 2015. Rdio didn't lose her tracks; it lost her playlists — the order, the curation, the Tuesday-night-rain sequencing. A collection was never a pile of things. It's things, arranged. Next chapter: the "Heard Live" list comes back from the dead, and it turns out a playlist was a graph the whole time.