refactor: v0.8 Iteration B — cruft purge + ALPN bump to itsgoin/4
Zero-users ruling removes all wire-compat obligations. Net -1,443 LOC of Rust. Protocol break: - ALPN_V2 b"itsgoin/3" -> ALPN b"itsgoin/4" (renamed: the versioned name was what rotted). Old nodes are now refused at the QUIC handshake instead of half-interoperating with the v0.8 manifest/digest formats. Deploy gate from Iteration A is discharged. Dead wire surface removed (MessageType 46 -> 40): - DeleteRecord 0x51 (deletes ride ControlOp::DeletePost + InitialExchange) - VisibilityUpdate 0x52 + its two dead senders (ControlOp::UpdateVisibility) - SocialDisconnectNotice 0x71 (zero senders; checkin timeouts carry the signal) - MeshPrefer 0xB3 + request_prefer + handler (preferred peers are gone) - Legacy dual pull-matching half (have_post_ids) — behavior-identical - PullSyncResponse.visibility_updates + counters (control posts cover it) - serde(default) stripped from wire-only payloads (kept where skip_serializing_if makes it load-bearing; persisted-row defaults untouched) Preferred-peer subsystem eliminated (design ruling: CDN file_holders replaced the N+10 direct push/pull it served): slot tier, preferred_peers table (dropped), preferred_tree semantics, rebalance Priority 0, find_relays_for preferred tiers, 7-day prune + 30-day watcher, dead FromStr impl. Slots are now Local/Wide only (91 desktop / 12 mobile) pending Iteration C's single ~20-slot pool. Other dead code: hostlist encoder + base64url helper, always-empty downstream_addrs parameter chain, start_upnp_renewal_cycle no-op + 4 callers, RELAY_TARGET_RATE_LIMIT, GetSecretSeed, stale comments swept. Preserved deliberately: EDM scanner corpse (awaiting raw-UDP refactor), PortScanHeartbeat, Iteration A startup migrations, session-relay opt-in gating. Docs: design.html + tech.html synced (message counts, ALPN, purge status, Rework asides flipped past-tense). 190 core tests pass; CLI + desktop build; A3 integration 9/9 (independently re-run post-purge). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LGiPD2cF75mnvneSCjdDC5
This commit is contained in:
parent
17dbf076cb
commit
36e3871c4b
15 changed files with 152 additions and 1476 deletions
|
|
@ -121,7 +121,7 @@
|
|||
<h3>Mesh target <span class="badge badge-rework">Rework</span></h3>
|
||||
<p>The mesh target is <strong>~20 peers</strong> (plus +4–10 temporary referral slots that carry no knowledge exchange — see <a href="#connections">connections</a>). Knowledge reach comes from depth (uniques known to 4 bounces, <a href="#layers">N1–N4</a>), not from connection count.</p>
|
||||
<div class="note">
|
||||
<strong>v0.8 change</strong>: Replaces the 101-peer mesh (10 preferred / 71 local / 20 wide on desktop). That width was designed for the pre-CDN push-event world; per-client overhead was too high, and the CDN now carries depth. Current code still runs the 101-slot model.
|
||||
<strong>v0.8 change</strong>: Replaces the 101-peer mesh (10 preferred / 71 local / 20 wide on desktop). That width was designed for the pre-CDN push-event world; per-client overhead was too high, and the CDN now carries depth. The preferred tier was deleted in Iteration B; current code runs 71 local + 20 wide (91 slots desktop, 12 mobile). Narrowing to the single ~20-slot pool remains target (Roadmap item 4).
|
||||
</div>
|
||||
|
||||
<h3>Startup cycles</h3>
|
||||
|
|
@ -130,7 +130,7 @@
|
|||
<tr><th>Cycle</th><th>Interval</th><th>Purpose</th><th>Status</th></tr>
|
||||
<tr><td>Update cadence scheduler</td><td>Descending scale (minutes → days) per author, keyed on freshness × relationship tier, jittered</td><td>CDN update checks + uniques-list refresh; timing shaped to look like uniform network overhead. See <a href="#keep-alive">update cadence</a>.</td><td><span class="badge badge-rework">Rework</span> — today: 60s pull tick with a 4h stale-author threshold</td></tr>
|
||||
<tr><td>Routing diff</td><td>120s (2 min)</td><td>Announce network-knowledge changes to mesh peers (target: uniques-list diffs; today: N1/N2 share-list diffs)</td><td><span class="badge badge-rework">Rework</span></td></tr>
|
||||
<tr><td>Rebalance</td><td>600s (10 min)</td><td>Clean dead connections, signal growth</td><td><span class="badge badge-rework">Rework</span> — today's cycle still runs the preferred-peer Priority 0</td></tr>
|
||||
<tr><td>Rebalance</td><td>600s (10 min)</td><td>Clean dead connections, signal growth</td><td><span class="badge badge-rework">Rework</span> — preferred-peer Priority 0 deleted (Iteration B); remaining priorities still target the wide model</td></tr>
|
||||
<tr><td>Growth loop</td><td>Reactive (signal-driven on knowledge receipt)</td><td>Fill mesh slots toward 20 with the most diverse candidates; secondary peer-finding path alongside convection</td><td><span class="badge badge-rework">Rework</span> — mechanism is live; targets 101 today and only counts local slots</td></tr>
|
||||
<tr><td>Convection trigger</td><td>Stochastic, per-disconnect</td><td>On each mesh disconnect, random choice: do nothing / ask a random known anchor for an introduction / ask a mesh peer. See <a href="#anchors">anchors</a>.</td><td><span class="badge badge-planned">Planned</span></td></tr>
|
||||
<tr><td>Recovery loop</td><td>Reactive (mesh drops below 2)</td><td>Emergency reconnect: mine retained uniques pools for anchor addresses, then <code>known_anchors</code> cache, then any connected anchor peers</td><td><span class="badge badge-rework">Rework</span> — today's loop still sends <code>AnchorRegister</code></td></tr>
|
||||
|
|
@ -477,7 +477,7 @@
|
|||
<table>
|
||||
<tr><th>Code</th><th>Name</th><th>Stream</th><th>Purpose</th></tr>
|
||||
<tr><td><code>0x70</code></td><td>SocialAddressUpdate</td><td>Uni</td><td>Sent when a social contact's address changes or they reconnect</td></tr>
|
||||
<tr><td><code>0x71</code></td><td>SocialDisconnectNotice</td><td>Uni</td><td>Sent when a social contact disconnects</td></tr>
|
||||
<tr><td><code>0x71</code></td><td>SocialDisconnectNotice</td><td>Uni</td><td>Removed in v0.8 — zero senders existed; social-route staleness is inferred from checkin timeouts</td></tr>
|
||||
<tr><td><code>0x72</code></td><td>SocialCheckin</td><td>Bi</td><td>Keepalive with address + known-peer referral updates</td></tr>
|
||||
</table>
|
||||
|
||||
|
|
@ -508,7 +508,7 @@
|
|||
<li><strong>Deep uniques reporters</strong>: With N1–N4 knowledge (see <a href="#layers">Network Knowledge</a>), the uniques index names which mesh peer "can help reach" the target even when the target sits three or four bounces out. The introduction chains along the announce path, decrementing TTL at each hop (max TTL=2).</li>
|
||||
</ol>
|
||||
<div class="note">
|
||||
<strong>v0.8 change</strong>: the two <em>preferred-tree</em> candidate tiers (intersecting the target's ~100-node <code>preferred_tree</code> with our connections) are removed along with preferred peers. Current code still runs them first (<code>connection.rs</code> <code>find_relays_for</code>); the target keeps only knowledge-layer reporters.
|
||||
<strong>v0.8 change</strong>: the two <em>preferred-tree</em> candidate tiers (intersecting the target's ~100-node <code>preferred_tree</code> with our connections) are removed along with preferred peers. <strong>Done (Iteration B)</strong>: the tiers were deleted from <code>find_relays_for</code> (<code>connection.rs</code>); code now keeps only knowledge-layer reporters.
|
||||
</div>
|
||||
|
||||
<h3>RelayIntroduce flow (<code>0xB0</code>/<code>0xB1</code>)</h3>
|
||||
|
|
@ -1002,12 +1002,12 @@
|
|||
|
||||
<h3>Wire format <span class="badge badge-complete">Implemented</span></h3>
|
||||
<pre><code>[1 byte: MessageType] [4 bytes: length (big-endian)] [length bytes: JSON payload]</code></pre>
|
||||
<p>Max payload: <strong>64 MB</strong>. ALPN: <code>itsgoin/3</code>. Every message travels on its own QUIC stream — uni-directional for fire-and-forget pushes, bi-directional for request/response pairs. Unknown message-type bytes fail the stream; unknown <em>fields</em> inside known payloads are ignored by serde.</p>
|
||||
<p>Max payload: <strong>64 MB</strong>. ALPN: <code>itsgoin/4</code>. Every message travels on its own QUIC stream — uni-directional for fire-and-forget pushes, bi-directional for request/response pairs. Unknown message-type bytes fail the stream; unknown <em>fields</em> inside known payloads are ignored by serde.</p>
|
||||
<div class="note">
|
||||
<strong>Decided</strong>: the v0.8 break bumps the ALPN to <code>itsgoin/4</code>, so pre-v0.8 nodes are refused cleanly at the QUIC handshake rather than failing mid-conversation. (The constant also gets renamed — it is currently named <code>ALPN_V2</code> while holding <code>itsgoin/3</code>.)
|
||||
<strong>Done (Iteration B)</strong>: the v0.8 break bumped the ALPN to <code>itsgoin/4</code>, so pre-v0.8 nodes are refused cleanly at the QUIC handshake rather than failing mid-conversation. The constant is now named plain <code>ALPN</code> (the versioned name <code>ALPN_V2</code> had rotted against its value).
|
||||
</div>
|
||||
|
||||
<h3>Message types (46 total) <span class="badge badge-complete">Implemented</span></h3>
|
||||
<h3>Message types (40 total; rows marked “Removed in v0.8” are kept for history) <span class="badge badge-complete">Implemented</span></h3>
|
||||
<table>
|
||||
<tr><th>Hex</th><th>Name</th><th>Stream</th><th>Purpose</th></tr>
|
||||
<tr><td><code>0x01</code></td><td>NodeListUpdate</td><td>Uni</td><td>Incremental knowledge-layer diff broadcast</td></tr>
|
||||
|
|
@ -1023,7 +1023,7 @@
|
|||
<tr><td><code>0x60</code></td><td>WormQuery</td><td>Bi</td><td>Point query for nodes, posts, or blobs beyond local knowledge (<a href="#worm">worm search</a>)</td></tr>
|
||||
<tr><td><code>0x61</code></td><td>WormResponse</td><td>Bi</td><td>Worm search reply (node + post_holder + blob_holder)</td></tr>
|
||||
<tr><td><code>0x70</code></td><td>SocialAddressUpdate</td><td>Uni</td><td>Social contact address changed</td></tr>
|
||||
<tr><td><code>0x71</code></td><td>SocialDisconnectNotice</td><td>Uni</td><td>Social contact disconnected</td></tr>
|
||||
<tr><td><code>0x71</code></td><td>SocialDisconnectNotice</td><td>Uni</td><td>Social contact disconnected. Removed in v0.8 — zero senders existed; checkin timeouts carry the signal.</td></tr>
|
||||
<tr><td><code>0x72</code></td><td>SocialCheckin</td><td>Bi</td><td>Keepalive + address + peer-address update</td></tr>
|
||||
<tr><td><code>0x90</code></td><td>BlobRequest</td><td>Bi</td><td>Fetch blob by CID</td></tr>
|
||||
<tr><td><code>0x91</code></td><td>BlobResponse</td><td>Bi</td><td>Blob data + CDN manifest + file header</td></tr>
|
||||
|
|
@ -1037,7 +1037,7 @@
|
|||
<tr><td><code>0xB2</code></td><td>SessionRelay</td><td>Bi</td><td>Splice bi-streams (opt-in; <code>relay.session_relay_enabled</code> OFF by default on every role, including anchors — see <a href="#relay">Relay & NAT Traversal</a>)</td></tr>
|
||||
<tr><td><code>0xB3</code></td><td>MeshPrefer</td><td>Bi</td><td>Preferred-peer negotiation. Removed in v0.8 — the preferred tier is eliminated.</td></tr>
|
||||
<tr><td><code>0xB4</code></td><td>CircleProfileUpdate</td><td>Uni</td><td>Encrypted circle profile variant</td></tr>
|
||||
<tr><td><code>0xC0</code></td><td>AnchorRegister</td><td>Uni</td><td>Register with anchor. Removed in v0.8 — connection convection replaces the register loop (<a href="#anchors">Anchors</a>).</td></tr>
|
||||
<tr><td><code>0xC0</code></td><td>AnchorRegister</td><td>Uni</td><td>Register with anchor. Still live; retires when anchor convection replaces the register loop (Roadmap item 5, <a href="#anchors">Anchors</a>).</td></tr>
|
||||
<tr><td><code>0xC1</code></td><td>AnchorReferralRequest</td><td>Bi</td><td>Request peer referrals (v0.8: the convection call)</td></tr>
|
||||
<tr><td><code>0xC2</code></td><td>AnchorReferralResponse</td><td>Bi</td><td>Referral list reply</td></tr>
|
||||
<tr><td><code>0xC3</code></td><td>AnchorProbeRequest</td><td>Bi</td><td>A → B → C: test cold reachability of address</td></tr>
|
||||
|
|
@ -1689,7 +1689,7 @@
|
|||
<li><strong>Self-cleaning</strong>: registration comments carry a <strong>fixed 30-day TTL</strong> (unlike ordinary comments' randomized TTL — that randomness serves anonymity, which a deliberately-public registration doesn't want). Staying listed means re-signing a fresh entry; holders keep <strong>one active entry per persona ID</strong> (newest wins). The chain self-cleans and is never more than 30 days stale.</li>
|
||||
<li><strong>Delete / modify</strong>: a delete request signed by the same persona key is honored by every holder (verifiable from the entry itself — the network agreement is checkable, not honor-system). Modify = delete + re-register; no separate primitive needed.</li>
|
||||
<li><strong>Moderation hook</strong>: the registry post's author retains the standard per-post <code>RevocationEntry</code> power — manual spam removal for the alpha era, at the acknowledged cost that the author <em>could</em> censor entries. Acceptable while the author is the project's own anchor; the trust layer (see <a href="#directory">Directory Trust Layer</a>) is the eventual replacement.</li>
|
||||
<li><strong>Anti-bot pricing</strong>: registrations carry the slot-declared PoW stamp (a few CPU-seconds), fit a single small size bucket, and are rate-capped per holder. This prices flooding without preventing it — a bot willing to mint personas and burn CPU can still pollute the chain.</li>
|
||||
<li><strong>Flood limits</strong>: registrations fit a single small size bucket and are rate-capped per holder. <em>Proof-of-work was considered and rejected</em>: its cost lands inverted (a phone registrant pays seconds of battery; a botnet rig pays effectively nothing), so it taxes the users we want while barely inconveniencing the adversary we fear. The registry's real defenses are the bounded blast radius and vouch gating below.</li>
|
||||
</ul>
|
||||
<div class="note">
|
||||
<strong>Honest threat model</strong>: personas are deliberately near-free in this system (throwaway IDs are a feature), so no per-key or proof-of-work measure changes the spam economics against a <em>motivated</em> adversary — and this network must expect motivated adversaries with an interest in making decentralized social feel broken. The alpha registry survives casual spam only. Two things make that acceptable: (1) <strong>bounded blast radius</strong> — searches are local and the registry is an opt-in convenience layer, so a fully-flooded registry blocks only <em>new stranger discovery</em> while every existing relationship, follow, vouch, and sync continues untouched; griefing spends real resources to inconvenience only people who haven't met anyone yet. (2) <strong>Vouch-gated registration</strong> (see <a href="#directory">Directory Trust Layer</a>) is the durable fix once utilization supports vouch introductions — the registry post's <em>format</em> survives that transition, only the acceptance rule tightens. Sharding is deliberately deferred to the same moment: by the time volume demands shards, registration demands vouches.
|
||||
|
|
@ -1707,10 +1707,10 @@
|
|||
<h3>Spam controls</h3>
|
||||
<table>
|
||||
<tr><th>Control</th><th>Mechanism</th></tr>
|
||||
<tr><td>Opt-in</td><td>No greeting slot in the bio → no greetings possible. Default is off.</td></tr>
|
||||
<tr><td>Active choice</td><td>No greeting slot in the bio → no greetings possible. The choice is made visibly at first profile publish — pre-checked YES with opt-out before publishing (alpha default; revisit for public release). Revocable per persona at any time.</td></tr>
|
||||
<tr><td>Size bucket</td><td>Greetings fit a single small padded bucket — no attachments, no long-form spam payloads.</td></tr>
|
||||
<tr><td>Holder-side count caps</td><td>Nodes holding a bio cap how many unexpired greetings they store and forward per bio.</td></tr>
|
||||
<tr><td>PoW stamp (optional)</td><td>The greeting slot may declare a proof-of-work difficulty a valid greeting must carry — the BitMessage lesson: make bulk greeting-spam computationally expensive.</td></tr>
|
||||
<tr><td>Rate caps</td><td>Holder-side per-bio limits on unexpired greetings stored and forwarded. (Proof-of-work stamps were considered and rejected — inverted cost: phones pay, botnets don't.)</td></tr>
|
||||
</table>
|
||||
<div class="note">
|
||||
<strong>Known limit</strong>: the greeting slot's <code>pub_x_index</code> is observable, so greetings are identifiable <em>as a class</em> (never by sender). Mitigation: friends can route innocuous chatter through the open greeting key as padding, so greeting traffic on a bio is not automatically stranger traffic.
|
||||
|
|
@ -1718,7 +1718,10 @@
|
|||
|
||||
<h3>The composed flow</h3>
|
||||
<div class="card">
|
||||
<p><strong>Find</strong> a persona via registry search (or encounter their author ID through the graph) → <strong>greet</strong> with a sealed greeting comment on their bio post, real identity and return path inside → the author unseals it, decides, and <strong>vouches back</strong> via the normal bio-post HPKE wrapper batch → the relationship moves onto standard FoF rails (readable posts, gated comments, DMs). The throwaway greeting ID expires with its comment; nothing permanent links the approach to the relationship that followed.</p>
|
||||
<p><strong>Find</strong> a persona via registry search (or encounter their author ID through the graph) → <strong>greet</strong> with a sealed greeting comment on their bio post — real identity and a <em>return path</em> ("where I'll watch for a response") inside → the author unseals it and <strong>replies</strong> with a sealed message to that return path, from their own fresh temp ID. The conversation continues over <strong>rotating temporary IDs</strong> — each message names the next rendezvous, no two messages share an outer identity, and observers see only never-before-seen IDs dropping ciphertext on unrelated open-slot posts. No vouch is ever required to talk. <strong>Vouching is fully disconnected from messaging</strong>: it is a relationship act that lives in the People tab — granting FoF readership via the normal bio-post wrapper batch — and deliberately has no control on any messaging surface, so vouching someone is always a considered decision, never a reflex mid-conversation. Inbox actions: <em>Reply</em> (primary), <em>Dismiss</em>. People you message surface in People for relationship management. Every temp ID expires with its comment's TTL; nothing permanent links the approach, the conversation, or the relationship that followed.</p>
|
||||
</div>
|
||||
<div class="note">
|
||||
<strong>v1 scope</strong>: return paths start as the participants' bio posts; full rendezvous-hopping across arbitrary open-slot posts follows once an open-slot post index exists. The anonymity set for hopping is exactly the set of posts accepting open-slot comments — made large by the default-checked greeting choice at first publish.
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
|
@ -1983,8 +1986,8 @@
|
|||
<tr><th>Area</th><th>Status</th></tr>
|
||||
|
||||
<tr><td colspan="2" style="background: var(--bg-muted); font-weight: 600;">Mesh & knowledge</td></tr>
|
||||
<tr><td>Single ~20-slot mesh pool (tiers eliminated)</td><td><span class="badge badge-rework">Rework</span> — code runs Preferred/Local/Wide, 101 desktop / 15 mobile</td></tr>
|
||||
<tr><td>Preferred-peer elimination (slots, MeshPrefer, prunes, watchers)</td><td><span class="badge badge-rework">Rework</span> — deletion pending (Roadmap item 2)</td></tr>
|
||||
<tr><td>Single ~20-slot mesh pool (tiers eliminated)</td><td><span class="badge badge-rework">Rework</span> — code runs Local/Wide, 91 desktop / 12 mobile (preferred tier deleted, Iteration B)</td></tr>
|
||||
<tr><td>Preferred-peer elimination (slots, MeshPrefer, prunes, watchers)</td><td><span class="badge badge-complete">Implemented</span> — Done (Iteration B, Roadmap item 3)</td></tr>
|
||||
<tr><td>Temp referral slots (+4..+10, no knowledge exchange)</td><td><span class="badge badge-planned">Planned</span></td></tr>
|
||||
<tr><td>Uniques announce, payload N1–N3 (N4 stored but terminates, dedup at store + announce)</td><td><span class="badge badge-rework">Rework</span> — code exchanges N1–N3 share lists</td></tr>
|
||||
<tr><td>Pull as uniques-index exchange (distributed search index)</td><td><span class="badge badge-rework">Rework</span> — code pulls posts via <code>since_ms</code></td></tr>
|
||||
|
|
@ -2024,7 +2027,7 @@
|
|||
<tr><td>FoF visibility Layers 1–5 (vouch, gated comments, FoFClosed, rotation/burn, unlock cache)</td><td><span class="badge badge-complete">Implemented</span></td></tr>
|
||||
|
||||
<tr><td colspan="2" style="background: var(--bg-muted); font-weight: 600;">Sync & content</td></tr>
|
||||
<tr><td>Wire protocol (length-prefixed JSON, 64 MB payload)</td><td><span class="badge badge-rework">Rework</span> — 46 types today; six (0x51/0x52/0xA1/0xA2/0xB3/0xC0) deleted in the clean-break purge (Roadmap item 2)</td></tr>
|
||||
<tr><td>Wire protocol (length-prefixed JSON, 64 MB payload)</td><td><span class="badge badge-rework">Rework</span> — 40 types today; six (0x51/0x52/0x71/0xA1/0xA2/0xB3) deleted in the clean-break purge (Roadmap item 3); 0xC0 AnchorRegister stays live until anchor convection (Roadmap item 5)</td></tr>
|
||||
<tr><td>Merged pull with recipient matching (all posting identities)</td><td><span class="badge badge-complete">Implemented</span> — payload semantics change with the uniques redefinition</td></tr>
|
||||
<tr><td>Manifest machinery (push, refresh, header diffs)</td><td><span class="badge badge-complete">Implemented</span></td></tr>
|
||||
<tr><td>AuthorManifest privacy (no device addresses, 2–5 neighborhood)</td><td><span class="badge badge-rework">Rework</span> — code ships addresses + 10+10 neighborhood</td></tr>
|
||||
|
|
@ -2065,11 +2068,11 @@
|
|||
</div>
|
||||
<div class="card">
|
||||
<h3>2. Registry + greeting comments — tester-critical</h3>
|
||||
<p><strong>The app is eminently useful only if people can find each other</strong> — this is what makes it usable for testers, so it jumps the queue. Ship the “registrations here” post (open-slot signed registration comments, fixed 30-day TTL, one entry per persona, self-certifying signed deletes, PoW stamp) and greeting comments (HPKE-sealed first contact via the published greeting-slot key) — one open-slot comment implementation serves both. <strong>Prerequisite folded in</strong>: remove device addresses from AuthorManifest first (registered author IDs must be location-anonymous). Known-bounded: survives until deliberate bot-flooding; the trust layer (item 10) is the durable fix.</p>
|
||||
<p><strong>The app is eminently useful only if people can find each other</strong> — this is what makes it usable for testers, so it jumps the queue. Ship the “registrations here” post (open-slot signed registration comments, fixed 30-day TTL, one entry per persona, self-certifying signed deletes, holder-side rate/size caps — no PoW) and greeting comments (HPKE-sealed first contact via the published greeting-slot key, messaging-first with Reply/Vouch/Dismiss) — one open-slot comment implementation serves both. <strong>Prerequisite folded in</strong>: remove device addresses from AuthorManifest first (registered author IDs must be location-anonymous). Known-bounded: survives until deliberate bot-flooding; the trust layer (item 10) is the durable fix.</p>
|
||||
</div>
|
||||
<div class="card">
|
||||
<h3>3. Cruft purge</h3>
|
||||
<p>The zero-users ruling removes all wire-compat obligations. Delete: v0.6.x receive-only compat handlers (0x51/0x52) and the dual pull-matching path; the preferred-peer subsystem (slots, MeshPrefer negotiation, 7-day prune, 30-day watcher plumbing); dead senders and constants (hostlist encoder, no-op renewal cycle, orphaned GroupKeyRequest/Response); and legacy tree fields in wire structs. Clean protocol break — bump ALPN to <code>itsgoin/4</code> here.</p>
|
||||
<p><strong>Done (Iteration B)</strong> — landed with the <code>itsgoin/4</code> ALPN bump; 0xC0 AnchorRegister deliberately kept until anchor convection (item 5). The zero-users ruling removes all wire-compat obligations. Delete: v0.6.x receive-only compat handlers (0x51/0x52), the sender-less 0x71 SocialDisconnectNotice, and the dual pull-matching path; the preferred-peer subsystem (slots, MeshPrefer negotiation, 7-day prune, 30-day watcher plumbing); dead senders and constants (hostlist encoder, no-op renewal cycle, orphaned GroupKeyRequest/Response); and legacy tree fields in wire structs. Clean protocol break — bump ALPN to <code>itsgoin/4</code> here.</p>
|
||||
</div>
|
||||
<div class="card">
|
||||
<h3>4. N1–N4 uniques knowledge layer</h3>
|
||||
|
|
@ -2141,12 +2144,12 @@
|
|||
seen_engagement/seen_messages, group_keys/group_member_keys/
|
||||
group_seeds, known_anchors, ignored_peers, relay_cooldowns,
|
||||
worm_cooldowns, settings, post_recipients, posting_identities,
|
||||
preferred_peers (retires in v0.8), + 10 vouch/FoF tables
|
||||
preferred_peers (dropped in v0.8 Iteration B), + 10 vouch/FoF tables
|
||||
(vouch_keys_own/received, vouch_bio_scan_cache, own_vouch_targets,
|
||||
fof_revocations, own_post_slot_provenance, vouch_unlock_cache,
|
||||
vouch_unreadable_posts, own_fof_post_ceks, fof_key_burns).
|
||||
post/blob_upstream+downstream tables dropped in v0.6.1-beta.
|
||||
protocol.rs — MessageType enum (46 types), ALPN (itsgoin/3; bumps to itsgoin/4 in v0.8),
|
||||
protocol.rs — MessageType enum, ALPN (itsgoin/4),
|
||||
length-prefixed JSON framing, InitialExchangePayload
|
||||
connection.rs — ConnectionManager + ConnHandle/ConnectionActor (actor pattern):
|
||||
mesh + session slots, initial exchange, N1/N2 diff broadcast,
|
||||
|
|
|
|||
|
|
@ -124,8 +124,8 @@ wrapped_key[i] = X25519_DH(author_ed25519, recipient_ed25519[i]) XOR CEK</code><
|
|||
|
||||
<!-- Sync -->
|
||||
<section>
|
||||
<h2>Sync protocol (v3)</h2>
|
||||
<p>The protocol uses a single ALPN (<code>itsgoin/3</code>) with 37+ message types multiplexed over QUIC bi-streams and uni-streams.</p>
|
||||
<h2>Sync protocol (v4)</h2>
|
||||
<p>The protocol uses a single ALPN (<code>itsgoin/4</code>) with 40 message types multiplexed over QUIC bi-streams and uni-streams.</p>
|
||||
|
||||
<div class="card">
|
||||
<h3>Pull-based sync</h3>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue