OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-social commits / 9274def

docs/observed-interactions: the writer is ap-bridge, and what atproto actually does
Writer placement CLOSED by the operator: ap-bridge, favela-web is deprecated. It already has the socket that stays up, the swarm membership and the admitted-peer registration the ingest needs; the code moves rather than gets rewritten because link-drain is already pure + injected. Prior art, measured rather than recalled: there is no PDS to ask. A like lives in the LIKERS repo on the LIKERS PDS, so the post authors PDS never sees it. atproto answers with an AppView that indexes the entire firehose — and our own pds.7rnx.net returns a byte-identical 688-byte body to public.api.bsky.app for getLikes, because it proxies. Even our own infrastructure cannot answer locally. Same necessity as this design, three orders of magnitude of scope apart. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
9274defc153551ef43e37c0ce48fcb6044ba431a
by plankatron <fleeky@gmail.com> · 2026-09-16T00:16:12.000Z

Changed files (1) +37 -3

docs/OBSERVED-INTERACTIONS.md +37 -3
……@@ -160,6 +160,37 @@ side, tuples instead of per-record pointers.
160160- **Retention of foreign RECORDS** (replies, quotes). That is Tier B2 and already specified; this is
161161 only the count-bearing half §7.6 excluded.
162162
163## 7.5 Prior art — what atproto actually does, measured
164
165⛔ **THERE IS NO PDS TO ASK.** A like is a record in the **liker's** repo on the **liker's** PDS. The
166post author's PDS has no idea it happened, so "ask the PDS on every view" was never an option — the
167data is scattered across every PDS in the network.
168
169atproto's answer is the **AppView**: a service that drinks the entire firehose from a relay and builds
170a global index. Both the count and the actor list come from there, not from any repo. Measured
1712026-09-15 against the live network:
172
173```
174app.bsky.feed.getPosts → likeCount 0 · repostCount 1 · replyCount 1 served by public.api.bsky.app
175app.bsky.feed.getLikes → a hydrated list of actors served by public.api.bsky.app
176```
177
178★ **And our own PDS proves the point by failing to be one.** `getLikes` against `pds.7rnx.net`
179returns **200 with a byte-identical body** to the AppView's — 688 bytes both — because
180atproto-bridge proxies unknown `app.bsky.*` methods upstream. Even our own infrastructure cannot
181answer the question locally. (What our repo DOES hold is the likes we *made*: `listRecords` on
182`app.bsky.feed.like` returns them, because those are ours to author.)
183
184⇒ So the answer to "store, or ask every view?" is **store — enormously.** atproto pushes the whole
185aggregation problem into one index that must hold the entire network, which is why an independent
186backlink index (Constellation) had to be built at all: the only other option is running an AppView.
187
188⚠ **That is the same necessity at a different scope, and the scope is the whole difference.** This
189design indexes one hop from our own records rather than the world, which is why it fits in 0.50 MB
190instead of a datacentre. It also names the dependency we are currently paying:
191`hyper-proto-peer/lib/notifications.js` proxies `listNotifications` to bsky's AppView — a favela user
192learns somebody interacted with them by asking Bluesky's servers.
193
163194## 8. Open
164195
1651961. **Segment size N.** Tail-rewrite cost against pointer size. Wants a measurement of real inbound
……@@ -170,6 +201,9 @@ side, tuples instead of per-record pointers.
170201 currently interns per-subject.
1712023. **Un-like.** A tombstone tuple, or rewrite the tail segment? Sealed segments say tombstone; §4.3 of
172203 `interaction.md` already says reversal is a tombstone everywhere else.
1734. **Who writes it.** The ingest runs where a socket can stay up. That is not the phone, and it is
174 currently favela-web, which the android boundary test forbids the handset from importing. The
175 writer's home is an open placement question and should be settled before this is built.
2044. ~~**Who writes it.**~~ **CLOSED 2026-09-15 (operator): the writer is `ap-bridge`. favela-web is
205 deprecated.** It already holds the properties the ingest needs — a socket that stays up, a swarm
206 membership, N admitted peers, and a registration that binds a peer's identity root to a feed key.
207 The ingest code currently lives in favela-web (`spacedust.js`, `link-drain.js`, `retention.js`) and
208 MOVES rather than gets rewritten; `link-drain.js` is already pure + injected, so the sink and the
209 store are parameters at the new home.