OverviewFilesCommitsIssuesDocsReleasesPeers

favela-markdown commits / 1056821

spec/interaction: the URI path is <collection>/<position>, not <collection>/<rkey>
position is assigned inside apply() as keet does, so it cannot collide; oplog is provenance, not address, because an edit is a new append. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1056821820b06003878d79a456ca5d4e708b1d30
by plankatron <fleeky@gmail.com> · 2026-09-05T22:29:38.000Z

Changed files (1) +24 -7

spec/interaction.md +24 -7
……@@ -129,7 +129,7 @@ maintain. Ours are *derived* (§3.1); foreign ones are *asserted* when observed
129129**A DID rotation therefore adds an edge; it never rewrites a record.** This is the same mechanism
130130that fixes the mention problem in `record-vocabulary.md:166,208`, rather than a special case for it.
131131
132### 3.4 The native URI — `favela://<roomKey>/<collection>/<rkey>`
132### 3.4 The native URI — `favela://<roomKey>/<collection>/<position>`
133133
134134**Decision (user, 2026-09-05).** `at://` is atproto's and `identity.md` §5 has just removed the DID
135135from 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
146146(`keet-identity-key/index.js:227`). So `favela://<identity-root>/…` survives as the **personal-room
147147case**, resolving to that room, while a community record names the community's room key.
148148
149⚠ **Revised 2026-09-05.** An earlier version of this section made the identity root the authority
150segment in general. That was written while the per-identity repo was still assumed to be the
151container; it is now one case of one.
149⚠ **Revised 2026-09-05 (authority).** An earlier version made the identity root the authority segment
150in general. That was written while the per-identity repo was still assumed to be the container; it is
151now one case of one.
152
153⚠ **Revised 2026-09-05 (path).** The path was `<collection>/<rkey>` — both atproto's words, inherited
154along 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
166linearises. keet absorbs this by rendering optimistically from the tip; we must design for it rather
167than discover it. `SOCIAL-MODEL.md` §3.5.2.
152168
153169**A key in the bytes; a name only on screen.** pgh's `NameRegistry`
154170(`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
4694851. ~~**Edge as empty-body record vs. pointer-valued log entry**~~ **DECIDED 2026-09-05** — bodiless
470486 edges are log entries, `reply` is a record (§2.1). No measurement needed: the room model makes edge
471487 volume unbounded in a popular room, which settles it.
4722. ~~**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.
4882. ~~**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).
4754923. ~~**Inbox admission**~~ **LARGELY DISSOLVED 2026-09-05** (§6) — admission is room membership, and
476493 cold contact is `dm.fromContact` + request/accept. What remains is the open public room (§6.2), and
477494 the levers there are all existing.