| … | … | @@ -129,7 +129,7 @@ maintain. Ours are *derived* (§3.1); foreign ones are *asserted* when observed |
| 129 | 129 | **A DID rotation therefore adds an edge; it never rewrites a record.** This is the same mechanism |
| 130 | 130 | that fixes the mention problem in `record-vocabulary.md:166,208`, rather than a special case for it. |
| 131 | 131 | |
| 132 | | ### 3.4 The native URI — `favela://<roomKey>/<collection>/<rkey>` |
| 132 | ### 3.4 The native URI — `favela://<roomKey>/<collection>/<position>` |
| 133 | 133 | |
| 134 | 134 | **Decision (user, 2026-09-05).** `at://` is atproto's and `identity.md` §5 has just removed the DID |
| 135 | 135 | from the author position so it can rotate, so a native scheme is required — one favela peer could |
| … | … | @@ -146,9 +146,25 @@ under the SLIP-48 `accountIndex` model each user is a distinct derived key |
| 146 | 146 | (`keet-identity-key/index.js:227`). So `favela://<identity-root>/…` survives as the **personal-room |
| 147 | 147 | case**, resolving to that room, while a community record names the community's room key. |
| 148 | 148 | |
| 149 | | ⚠ **Revised 2026-09-05.** An earlier version of this section made the identity root the authority |
| 150 | | segment in general. That was written while the per-identity repo was still assumed to be the |
| 151 | | container; it is now one case of one. |
| 149 | ⚠ **Revised 2026-09-05 (authority).** An earlier version made the identity root the authority segment |
| 150 | in general. That was written while the per-identity repo was still assumed to be the container; it is |
| 151 | now one case of one. |
| 152 | |
| 153 | ⚠ **Revised 2026-09-05 (path).** The path was `<collection>/<rkey>` — both atproto's words, inherited |
| 154 | along with its shape. Audited against keet (`SOCIAL-MODEL.md` §3.5): |
| 155 | |
| 156 | - **`collection` survives.** It is *not* atproto-specific — hyperdb uses it too (`@keet/chat`), with |
| 157 | `@keet/chat-by-message-id` as the index convention. |
| 158 | - **`rkey` does not.** It is replaced by **position**, assigned **inside `apply()`** the way keet |
| 159 | assigns `index: p.count` from a counter during deterministic replay. That is collision-free by |
| 160 | linearisation, where a client-minted TID is collision-*prone* and, worse, caller-choosable (§10). |
| 161 | - **`oplog`** — `{key, seq}`, the append that created a record — is **provenance, not address.** A |
| 162 | record keeps its position across an edit; its oplog changes, because an edit is a new append. So |
| 163 | the address must be the position, and `oplog` answers "which writer wrote this version". |
| 164 | |
| 165 | ⚠ **A permalink is not available at compose time**, because the position is not known until the op |
| 166 | linearises. keet absorbs this by rendering optimistically from the tip; we must design for it rather |
| 167 | than discover it. `SOCIAL-MODEL.md` §3.5.2. |
| 152 | 168 | |
| 153 | 169 | **A key in the bytes; a name only on screen.** pgh's `NameRegistry` |
| 154 | 170 | (`pgh/lib/name-registry.js:74`) is the resolver for display and discovery — it already anchors |
| … | … | @@ -469,9 +485,10 @@ content one shape, and an inbound edge is the same idea applied to relationships |
| 469 | 485 | 1. ~~**Edge as empty-body record vs. pointer-valued log entry**~~ **DECIDED 2026-09-05** — bodiless |
| 470 | 486 | edges are log entries, `reply` is a record (§2.1). No measurement needed: the room model makes edge |
| 471 | 487 | volume unbounded in a popular room, which settles it. |
| 472 | | 2. ~~**The native URI scheme**~~ **CLOSED 2026-09-05** — `favela://<roomKey>/<collection>/<rkey>`, |
| 473 | | with the identity root as the personal-room case (§3.4). Remaining work is the fail-closed minting |
| 474 | | rule (§3.4.1), not a decision. |
| 488 | 2. ~~**The native URI scheme**~~ **CLOSED 2026-09-05** — `favela://<roomKey>/<collection>/<position>`, |
| 489 | with the identity root as the personal-room case (§3.4) and `position` assigned in `apply()`. |
| 490 | Remaining: the fail-closed minting rule (§3.4.1), and whether `collection` belongs in the URI at |
| 491 | all now that bodiless edges are log entries rather than files (§2.1). |
| 475 | 492 | 3. ~~**Inbox admission**~~ **LARGELY DISSOLVED 2026-09-05** (§6) — admission is room membership, and |
| 476 | 493 | cold contact is `dm.fromContact` + request/accept. What remains is the open public room (§6.2), and |
| 477 | 494 | the levers there are all existing. |