Skip to content

Commit b3da139

Browse files
alex-poorclaude
andcommitted
Say exactly which half of p2panda's topic model is being adopted
Its model is two separable things: a 32-byte identifier for a set of data, and an assumption that the identifier is secret. The fix takes the first and not the second — public ciphertext wants public rendezvous. What is there today is neither: a sharding scheme layered over the identifier, and the layer is where the guessed depth enters. And records the better reason to split subject-topic from bucket-topic. Today both roles ride the bucket, so a depth disagreement stops a granted reader finding its OWN subject — a hard failure. Split, depth governs only stranger discovery, which degrades gracefully and self-heals as views converge. `replicate.rs` already describes that division and does not implement it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent cc25ef2 commit b3da139

1 file changed

Lines changed: 22 additions & 0 deletions

File tree

‎docs/decisions.md‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -874,6 +874,28 @@ direction the standing preference points at:
874874
subject is exactly p2panda's idiomatic model — an identifier for a set of
875875
data — and has no pool-size parameter to disagree about. It deletes the depth
876876
bug rather than working around it.
877+
878+
**To be exact about what is being adopted:** p2panda's topic model is two
879+
separable things — a 32-byte identifier for a set of data, and an assumption
880+
that the identifier is secret. This takes the first and not the second. What
881+
is there today is neither: `f(depth, bucket(subject))` is a sharding scheme
882+
layered over the identifier, and the layer is where the guessed parameter
883+
enters.
884+
885+
* **AND SPLITTING THE TWO ROLES TURNS A HARD FAILURE INTO A SOFT ONE**, which is
886+
the better reason to do it. `replicate.rs` already describes the division —
887+
*"gossip answers who is in this bucket; log sync answers give me their
888+
operations"* — and then runs both over the bucket topic.
889+
890+
| | role | topic | when depth is wrong |
891+
|---|---|---|---|
892+
| bucket | *which* strangers exist in my slice | `f(depth, bucket)` | fewer strangers heard — **degrades** |
893+
| subject | give me *this* subject's operations | `f(subject key)` | nothing to get wrong |
894+
895+
Today both ride the bucket topic, so a depth disagreement stops a granted
896+
reader finding **its own subject** — a hard failure of the thing the project
897+
is for. Split, depth governs only stranger discovery, which self-heals as
898+
each peer's view of the pool converges.
877899
* **And it stays public, deliberately.** An earlier draft suggested deriving it
878900
from the subject/reader shared secret the way [D13](#d13--the-grant-log-names-nobody)
879901
derives grant tags. That would be a mistake here: a topic only the granted can

0 commit comments

Comments
 (0)