| … | … | @@ -191,19 +191,31 @@ instead of a datacentre. It also names the dependency we are currently paying: |
| 191 | 191 | `hyper-proto-peer/lib/notifications.js` proxies `listNotifications` to bsky's AppView — a favela user |
| 192 | 192 | learns somebody interacted with them by asking Bluesky's servers. |
| 193 | 193 | |
| 194 | | ## 8. Open |
| 195 | | |
| 196 | | 1. **Segment size N.** Tail-rewrite cost against pointer size. Wants a measurement of real inbound |
| 197 | | rates, which at current volume is single digits — so any N is fine and the honest answer is to pick |
| 198 | | one and revisit if it ever matters. |
| 199 | | 2. **One actor table, or one per subject?** Shared is ~3x smaller (the same people like many of your |
| 200 | | posts) and makes one archive file depend on another, which an archive has to answer for. The codec |
| 201 | | currently interns per-subject. |
| 202 | | 3. **Un-like.** A tombstone tuple, or rewrite the tail segment? Sealed segments say tombstone; §4.3 of |
| 203 | | `interaction.md` already says reversal is a tombstone everywhere else. |
| 204 | | 4. ~~**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. |
| 194 | ## 8. Settled |
| 195 | |
| 196 | 1. ~~**Segment size N.**~~ **1,000 tuples.** Inbound volume is single digits, so any N works and the |
| 197 | honest choice is the one that makes a sealed segment ~6 KB and one log entry per thousand |
| 198 | observations. Revisit only on a measurement. |
| 199 | 2. ~~**One actor table, or per subject?**~~ **Per subject.** It already delivers the measured 5.6x. A |
| 200 | shared table is worth roughly another 3x and makes one archive file depend on another, which an |
| 201 | archive has to answer for — not a commitment to make before the win is measured. |
| 202 | 3. ~~**Un-like.**~~ **A tombstone tuple.** Sealed segments cannot be rewritten by construction, and |
| 203 | `interaction.md` §4.3 already makes reversal a tombstone everywhere else: absence is ambiguous in a |
| 204 | replicated log, so a retraction has to be positive evidence. |
| 205 | |
| 206 | ## 9. The split — who accumulates, who stores |
| 207 | |
| 208 | ⛔ **ap-bridge ACCUMULATES AND SERVES. The peer ASKS AND STORES.** ap-bridge holds a registered peer's |
| 209 | feed but is **not a writer on it**, and authoring into somebody's feed is what the model forbids |
| 210 | (#61 §4). So it never writes a peer's pointer or segments. |
| 211 | |
| 212 | ⇒ Two different shapes for two different jobs, and conflating them would be the mistake: |
| 213 | |
| 214 | | | ap-bridge | the peer | |
| 215 | |---|---|---| |
| 216 | | role | a serving buffer until peers collect | the archive | |
| 217 | | lifetime | bounded; prunable | durable | |
| 218 | | format | append-only rows + a cursor | sealed segments, interned, delta-encoded (§4.2) | |
| 219 | |
| 220 | ⚠ **The codec is for the PEER side.** Compression earns its place where data is kept for ever, not in |
| 221 | a buffer that is drained and pruned. Using it in both would be symmetry for its own sake. |