OverviewFilesCommitsIssuesDocsReleasesPeers

favela-markdown commits / 96d9850

spec/record-vocabulary 3.5: the POINTER carries the levels — no manifest file
Corrects an error introduced an hour ago. I specified a separate content-addressed level manifest file; that is a third artifact for a job the blob pointer already does, and it contradicts the stated design - pointers in the shared autobase, bytes in the overlay, so co-owners converge on which blobs exist and the oid to fetch each by. A record never contains media, it contains a key into the autobase. Deduplication is the reason and it survives: identical bytes hash to one oid and are stored once, across levels and across authors. The manifest file would have been the only per-asset duplicate in the design. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
96d9850b83e87f39d76d469d4846da4e3e4222ea
by plankatron <fleeky@gmail.com> · 2026-09-05T23:37:26.000Z

Changed files (1) +26 -6

spec/record-vocabulary.md +26 -6
……@@ -233,13 +233,33 @@ addressed by position (§3.1); a blob is not, so it is addressed by its bytes
233233![a cat](favela://blob/<oid>)
234234```
235235
236- **The reference names the POINTER, not bytes.** A record never contains media; it contains a key
237 into the shared autobase, and the pointer there says which `oid`s to fetch from the overlay.
236238- **`<oid>`** is the **hyper-overlay** hash, ours. The atproto blob **CID** is a *different hash*
237 (raw codec vs blake2b) and is resolved at **projection** time through the `__blob__/<cid>` pointer,
238 exactly as a mention's DID is resolved at projection time (§3.4). Canonical names ours; the
239 projection resolves theirs.
240- **The oid names the LEVEL MANIFEST, always** — not a level (`SOCIAL-MODEL.md` §6.6.1). A
241 single-level image gets a one-entry manifest of ~100 bytes. Uniform beats conditional: a shape that
242 is *sometimes* a manifest costs every consumer a branch, forever, to save one small file once.
239 (raw codec vs blake2b) and is resolved at **projection** time, exactly as a mention's DID is
240 (§3.4). Canonical names ours; the projection resolves theirs.
241
242 ⚠ **Cost, stated rather than hidden:** `BlobPointerStore` keys pointers by the atproto **cid**
243 (`__blob__/<cid>`), so referencing by `oid` means re-keying that store or adding an oid index.
244 Keying canonical records by the cid instead would be cheaper today and is the **same defect C7
245 just removed** — a foreign network's identifier baked into our bytes. Pay the re-key.
246- ⛔ **There is no manifest FILE. The POINTER carries the levels.**
247
248 ```
249 __blob__/<key> → { mimeType, size, levels: [ { oid, w, h }, … ] }
250 ```
251
252 ⚠ **Corrected 2026-09-05.** An earlier version of this section specified a separate content-addressed
253 "level manifest" file. That is a **third artifact for a job the pointer already does**, and it
254 violates the design `blob-pointer-store.js` states outright: *"put a tiny pointer in the SHARED
255 autobase so every co-owner converges on which blobs exist and the oid to fetch each one by, while
256 the bytes stay out of the append-only log."* Levels are exactly that kind of metadata. One pointer,
257 N oids, zero extra files.
258
259- **Deduplication is the reason, and it survives.** Identical bytes hash to one `oid` and are stored
260 **once** in the overlay, however many records or levels reference them — including across authors.
261 A manifest file would have been the only per-asset duplicate in the design.
262
243263- **Alt text is already in the markdown** and maps directly: atproto `embed.images[].alt`, AS2
244264 `attachment[].name`.
245265