| … | … | @@ -233,13 +233,33 @@ addressed by position (§3.1); a blob is not, so it is addressed by its bytes |
| 233 | 233 |  |
| 234 | 234 | ``` |
| 235 | 235 | |
| 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. |
| 236 | 238 | - **`<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 | |
| 243 | 263 | - **Alt text is already in the markdown** and maps directly: atproto `embed.images[].alt`, AS2 |
| 244 | 264 | `attachment[].name`. |
| 245 | 265 | |