C.W.K.
Stream
Lesson 02 of 04 · published

One Crumb, One Journal

~9 min · partition, single-membership, tags, cardinality

Level 0Cold Hearth
0 XP0/34 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"A crumb belongs to exactly one journal — partition semantics, like Day One, not a tag-like overlay."

Two Ways to Group, Two Cardinalities

There are two honest ways to group things, and they have different cardinalities. A partition puts each item in exactly one bucket — every crumb in one journal, no overlaps, no gaps. A tag overlay lets an item carry many labels at once — a crumb tagged 'garden', 'family', and 'spring' all together. Both are useful, and the design mistake is using the wrong one for a given axis. Vesta makes journals a partition and keeps tags as the overlay, and that split is deliberate.

Journals are single-membership: a crumb belongs to exactly one, the way a physical entry lives in exactly one notebook on Dad's Day One shelf. Tags are multi-membership: a crumb can wear as many as you like. So the two axes carry different weights — the journal is the heavy categorical home, tags are the light overlapping threads — and each gets the cardinality that fits its job.

Match cardinality to the operation you need. Ask what operations the grouping has to support. If you need 'move it from here to there' and 'export this as a self-contained whole', you need single membership — a partition. If you need 'find everything touching this theme' across boundaries, you need overlap — tags. Picking the wrong cardinality makes the operations you actually need either impossible or ambiguous.

Why the Journal Has to Be a Partition

Single membership isn't arbitrary; it's what makes two crucial operations well-defined. First, move: 'move this crumb (or this whole day) to another journal' only means something if the crumb is in exactly one journal to begin with. If crumbs could be in several journals at once, 'move' would be ambiguous — move from which one, to where, leaving what behind? Second, export: a journal is meant to be a self-contained book you could export whole — the daily diary as one volume, Quotes as another. That's only coherent if each crumb has exactly one home; overlapping membership would mean every 'book' shared pages with every other, and none of them would be a book.

Tags Carry the Overlap

None of this means Vesta loses cross-cutting grouping — that's exactly what tags are for. A crumb lives in one journal (its home) and can carry any number of tags (its threads). Want everything about the garden regardless of which journal it's filed in? That's a tag query, and it's supposed to overlap. The lesson is not 'partitions beat tags'; it's that the heavy home-axis wants single membership and the light thematic-axis wants overlap. Give each the cardinality its operations demand, and you get clean moves, clean exports, and rich cross-cutting search — all at once.

Code

One home (partition), many threads (overlay)·typescript
interface Crumb {
  id: string;
  journal_id: string;   // EXACTLY ONE — the partition, the home
  tags: string[];       // ZERO OR MANY — the overlay, the threads
  target_date: string;
}

// move is well-defined because journal_id is single:
move(crumb, toJournal) { crumb.journal_id = toJournal.id } // (via revision)

// cross-cutting search is a tag query, and it's SUPPOSED to overlap:
const gardenCrumbs = all.filter(c => c.tags.includes("garden"));
// these span many journals — that's the point of the overlay axis

External links

Exercise

Find a grouping in a system you use that's implemented as tags but is really trying to be a home — something you'd want to 'move between' or 'export as a whole'. Notice the ambiguity that overlap creates for those operations. Then find the reverse: a single-membership category that's fighting you because you actually need cross-cutting overlap. Swap each to the cardinality its operations demand.
Hint
Home-axes (folders, notebooks, accounts, owners) want single membership so move and export stay unambiguous. Thematic-axes (topics, labels, themes) want overlap so one item can thread through many. Pain usually means an axis is using the wrong one of the two.

Progress

Progress is local-only — sign in to sync across devices.
Spotted a bug or have feedback on this page?Report an Issue

Comments 0

🔔 Reply notifications (sign in)
Sign inPlease sign in to comment.

No comments yet — be the first.