agents agents/B-studbook.md
Owns: studbook/ Must not touch: TRVM/forge/ (substrate — consume it, never reimplement it), RRABBIT/m2/, root *.md.

Lane B — build studbook

Owns: studbook/ Must not touch: TRVM/forge/ (substrate — consume it, never reimplement it), RRABBIT/m2/, root *.md.

## ❌ BLOCKED. Do not write schema until two things are ruled 1. studbook §10.5 — does the identity ladder admit a new prefix? A studbook record is not a sem-, scen- or replay-. If the answer is no, studbook is keyed by something else and the schema changes shape. 2. The index question (CONFIDENTIALITY.md §4) — accept, minimise, or encrypt the operator-visible graph. This decides what columns exist. Both are [TRAVIS]. Reading, and the prolly-tree finding below, can proceed meanwhile.

Read first, in this order

  1. studbook/docs/spec/README.md — the whole spec. Its header says *"draft spec. No

implementation. Nothing in §7 or §10 has been ruled. Do not build from this yet."* That still holds for §7 and §10.

  1. PUBLISH_PATH.md — studbook's first named consumer.

  2. CONFIDENTIALITY.md — §4 is the tension that decides the schema.

  3. STACK_HUB.md §0.8 — why Postgres is right for the index and catastrophic for the bytes.

What studbook is, in one line

"A record in studbook carries where it came from, and a record that cannot show its provenance is refused rather than stored."

What is decided

  • Supabase is abandoned (2026-07-30). studbook replaces it. Nothing migrates until studbook

holds the same data with the same guarantees — fleet.* serves KILN and FleetPrompt today.

  • Postgres is the index, R2 holds the bytes. Measured: bytes in Postgres is 18.7× R2 and

puts every tier underwater — a 10 TB customer would cost $2,867/month. The same customer's index is ~250 MB, or seven cents.

  • This does not reverse §2. §2 rejected Postgres as the data model — a row does not say why it

is that row. As an index over content-addressed blobs, the refusal still comes from content addressing and Postgres only makes it queryable. Never describe this as "studbook moved back to Postgres."

  • Postgres lives on the Hetzner VM (lane C), managed by Pigsty, shared with nothing that has a

user's bytes in it.

  • Enterprise clients get their own VM and their own database. Single-tenant, which sidesteps

§10.2 for them entirely.

Substrate you must consume rather than rebuild

studbook §4: "If studbook reimplements something substrate already proves, that is a finding, not a shortcut." TRVM/forge/ already ships, with batteries:

CapabilityWhereGuarantee
Content-addressed storewrl_store.py _ContentStorekey is sha(bytes); WRL_STORE_ID_MISMATCH
Verified read_get_bytesre-hashes every read; WRL_STORE_CORRUPT
Durable atomic write_atomic_writetemp → fsync → os.replace → dir fsync
Optimistic concurrencywrl_project.pyper-document exact-CAS, WRL_PROJECT_STALE, no auto-merge
Verified export/importwrl_bundle.pyclosure, identity re-derivation, corruption
Crash recoveryRecoveryJournalV1atomic, non-authoritative, never auto-applied

The work, once unblocked

  1. The index schema. Records, ancestry edges, chunk manifests. Per CONFIDENTIALITY.md §4

option 2 (recommended): opaque ids, sizes and edges — no names, no paths. A manifest does not need to know a file is called taxes-2026.pdf to say which chunks compose it, and the human-readable fields are exactly the leaky ones.

  1. The three queries that justify the whole thing (studbook §4): given a record, its ancestry;

given two states, what changed; given a claim, the evidence chain, every link re-derivable.

  1. The R2 adapter. RRABBIT/m2/trackstore.js is the shape to follow — *the store is never

trusted, every read re-derives the hash.* Do not weaken that.

  1. The parity gate before anything migrates: same reads, same refusals, side by side with

Supabase still up.

The prolly-tree finding — do this while blocked

§7.3 proposes a prolly tree for §6.1's index gap and calls itself "a reading task before it is a build task." But STACK_HUB.md §0.8 argues Postgres may simply be the answer — ordered access and range scans today, at the cost of history-independence and cheap subtree diff.

Produce a written finding on which trade is right. That is a real deliverable and it needs no ruling. Do not start building a prolly tree.

Traps

  • **A track records a live OS world, not a sealed sem- world.** Conflating them is the plan's

R9 and it fails quietly — WRLM's passing test counts would appear to back OS-world claims they do not touch.

  • Convergent encryption is refused by name. Deriving the key from the plaintext restores

cross-user dedup and looks like free money; it also restores the confirmation-of-a-file attack §6.2 identified. Per-user dedup has none of this and is where the saving is.

  • studbook §9's non-goals are load-bearing. Not a general database, not a SQLite competitor, not

a new identity rung without §10.5. A hub asking for joins is not a reason to relax them.

  • `studbook/` is a local-only git repo with no remote. Commits survive; pushes have nowhere to

go. Do not assume it is backed up.

  • Travis said on 2026-08-15 that studbook runs on Fly with a site at studbook.computedriven.com.

Five checks found neither — no DNS record, no HTTP response, no Fly app, no source in tree. Recorded in PUBLISH_PATH.md §6 and still unresolved. Do not assume a deployment exists.

Open in the interactive atlas