Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
9cfe137
docs(id): start phase 4, groups, encryption, and history [phase 4 start]
dezren39 Oct 12, 2026
a630a44
feat(rust): DataScheme adapter over the group model [P4.1]
dezren39 Oct 12, 2026
e57c122
feat(rust): vendored p2panda-encryption with the from_join membership…
dezren39 Oct 12, 2026
daa4f20
feat(rust): from_join with immediate update and withholding [P4.3]
dezren39 Oct 12, 2026
205a548
feat(rust): rotation only on removal and update, PCS recovery procedu…
dezren39 Oct 12, 2026
6b2a900
feat(rust): recent:N welcomes and history modes [P4.5]
dezren39 Oct 12, 2026
4b82eff
feat(rust): local warnings at 96, 128 and 1000 and on churn [P4.9]
dezren39 Oct 12, 2026
a95c52a
feat(rust): scheme none notice [P4.10]
dezren39 Oct 12, 2026
2a3de9a
test(rust): DataScheme update cost measurement [P4.11]
dezren39 Oct 12, 2026
d22f698
feat(rust): scheme v1 with the version bound to the signed policy [P4.4]
dezren39 Oct 12, 2026
67207ad
fix(rust): pre-welcome history stays outside the crate [P4.5]
dezren39 Oct 12, 2026
25d7d81
feat(rust): lazy full history from a member [P4.6]
dezren39 Oct 12, 2026
a39cc83
feat(rust): adapter roster follows the group fold [P4.13]
dezren39 Oct 12, 2026
3b671bb
fix(rust): encode the scheme copies as pairs, within the 5 to 12 byte…
dezren39 Oct 12, 2026
6b9235a
Merge branch 'p4-scheme' into phase-4 [P4.4, P4.13]
dezren39 Oct 12, 2026
c38e6a3
feat(rust): chunked welcomes above the frame cap [P4.12]
dezren39 Oct 12, 2026
df90163
Merge branch 'phase-4' into p4-history
dezren39 Oct 12, 2026
8dc0ca6
Merge branch 'p4-history' into phase-4 [P4.5, P4.6, P4.12]
dezren39 Oct 12, 2026
f5dc804
docs(id): record P4.8 to P4.11 and the DataScheme update cost [phase 4]
dezren39 Oct 12, 2026
36f62c5
Merge branch 'phase-4' into p4-warn
dezren39 Oct 12, 2026
b05d0d4
Merge branch 'p4-warn' into phase-4 [P4.8, P4.9, P4.10, P4.11]
dezren39 Oct 12, 2026
29d65e7
docs(id): phase 4 status table after merging the tracks [phase 4]
dezren39 Oct 12, 2026
6001cfd
test(rust): concurrent membership changes converge [P4.7]
dezren39 Oct 12, 2026
e1fee2c
feat(rust): heads rule with a cap of 32 parents [P4.7]
dezren39 Oct 12, 2026
7746630
docs(id): phase 4 heads and concurrency [phase 4]
dezren39 Oct 12, 2026
cd7b863
Merge branch 'p4-heads' into phase-4 [P4.7]
dezren39 Oct 12, 2026
b831748
docs(id): phase 4 full suite result [phase 4]
dezren39 Oct 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 15 additions & 14 deletions doc/2026-10-11T11-08-42Z_design_remaining_work/plan-phases.md
Original file line number Diff line number Diff line change
Expand Up @@ -135,20 +135,21 @@ Goal: range sync and LogSync on the store, blob gating, and relay defaults that

Goal: group encryption on DataScheme, with the history modes, the heads rule, warnings, and the scheme v1.

| Step | What | Blocked by | Parallel with | Tests |
| ----- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| P4.1 | DataScheme adapter around the crate: create, add, remove, update, process | Phase 1, P2.1 | P4.4, P4.8, P4.10 | unit; multi-member integration |
| P4.2 | Our DGM and the from_join membership fix, in our fork (decision 18) | P4.1 | P4.4 | regression: a joiner reads messages after joining; the fork's patch has its own test |
| P4.3 | from_join: immediate update, and the withholding rule for pre-join application messages | P4.1, P4.2 | P4.4, P4.5 | integration: a joiner cannot read pre-join messages but reads post-join ones |
| P4.4 | Scheme v1: `serde_bytes` on the two fields, the version bound to the signed policy and copied in the header and welcome envelope, and welcomes sorted before signing (owner question 2) | P4.1 | P4.3, P4.5 | interop: v0 and v1 do not decode each other (verified); size tests (40.0 B per epoch); determinism test: sorted bytes are stable |
| P4.5 | `recent:N` and `full`: the adapter checks the group secret ID before `receive`, and keeps pre-welcome history outside the crate. The reproduction of the 80-of-120 failure comes first, as a red test | P4.1, P3.1 (transport) | P4.3, P4.4 | integration: a `recent:N` joiner reads the last N epochs, is refused older ones, and the welcome succeeds for every N and K combination |
| P4.6 | Lazy full history: a joiner asks a member for older epoch secrets, sent encrypted to the joiner | P4.5 | P4.7 | integration: the request returns the older keys; a non-member gets nothing |
| P4.7 | Heads rule: cap 32, the author's latest event always named, merge when the heads would exceed the cap | P4.1, P1.3 | P4.8 | the S10 scenarios as tests; adversarial order tests |
| P4.8 | Rotation policy (no periodic rotation, N7). PCS recovery is a CLI procedure: remove and re-add (N8) | P4.1, P6.7 (CLI) | P4.7 | integration: a compromised member is replaced and cannot read new epochs |
| P4.9 | Warnings: 96, 128 and 1,000 members (N11); churn warnings (N34); local emission from the server; surfaces in logs and CLI status | P4.1 (counts) | P4.7, P4.8, P4.10 | unit: thresholds; e2e: the server warns at a threshold |
| P4.10 | "scheme: none" notice in the UI and in group metadata (decision 8) | P4.1 | P4.9 | e2e |
| P4.11 | Measure DataScheme update cost at 100, 1,000 and 5,000 members with our adapter, for the BeeKEM comparison | P4.1 | P4.4 to P4.10 | recorded in the phase document; no pass or fail |
| P4.12 | Welcome size budget: chunking above the frame cap (owner question 4) | P4.5 | P4.6 | a `full` welcome above the cap is chunked and reassembled |
| Step | What | Blocked by | Parallel with | Tests |
| ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| P4.1 | DataScheme adapter around the crate: create, add, remove, update, process | Phase 1, P2.1 | P4.4, P4.8, P4.10 | unit; multi-member integration |
| P4.2 | Our DGM and the from_join membership fix, in our fork (decision 18) | P4.1 | P4.4 | regression: a joiner reads messages after joining; the fork's patch has its own test |
| P4.3 | from_join: immediate update, and the withholding rule for pre-join application messages | P4.1, P4.2 | P4.4, P4.5 | integration: a joiner cannot read pre-join messages but reads post-join ones |
| P4.4 | Scheme v1: `serde_bytes` on the two fields, the version bound to the signed policy and copied in the header and welcome envelope, and welcomes sorted before signing (owner question 2) | P4.1 | P4.3, P4.5 | interop: v0 and v1 do not decode each other (verified); size tests (40.0 B per epoch); determinism test: sorted bytes are stable |
| P4.5 | `recent:N` and `full`: the adapter checks the group secret ID before `receive`, and keeps pre-welcome history outside the crate. The reproduction of the 80-of-120 failure comes first, as a red test | P4.1, P3.1 (transport) | P4.3, P4.4 | integration: a `recent:N` joiner reads the last N epochs, is refused older ones, and the welcome succeeds for every N and K combination |
| P4.6 | Lazy full history: a joiner asks a member for older epoch secrets, sent encrypted to the joiner | P4.5 | P4.7 | integration: the request returns the older keys; a non-member gets nothing |
| P4.7 | Heads rule: cap 32, the author's latest event always named, merge when the heads would exceed the cap | P4.1, P1.3 | P4.8 | the S10 scenarios as tests; adversarial order tests |
| P4.8 | Rotation policy (no periodic rotation, N7). PCS recovery is a CLI procedure: remove and re-add (N8) | P4.1, P6.7 (CLI) | P4.7 | integration: a compromised member is replaced and cannot read new epochs |
| P4.9 | Warnings: 96, 128 and 1,000 members (N11); churn warnings (N34); local emission from the server; surfaces in logs and CLI status | P4.1 (counts) | P4.7, P4.8, P4.10 | unit: thresholds; e2e: the server warns at a threshold |
| P4.10 | "scheme: none" notice in the UI and in group metadata (decision 8) | P4.1 | P4.9 | e2e |
| P4.11 | Measure DataScheme update cost at 100, 1,000 and 5,000 members with our adapter, for the BeeKEM comparison | P4.1 | P4.4 to P4.10 | recorded in the phase document; no pass or fail |
| P4.12 | Welcome size budget: chunking above the frame cap (owner question 4) | P4.5 | P4.6 | a `full` welcome above the cap is chunked and reassembled |
| P4.13 | Membership source: the adapter takes its members from the group fold (`GroupView.members` from `groups::fold`), not from the caller. After each local membership change the crate's roster equals the fold's set. A mismatch is a refusal and poisons the session. Remote control messages are not checked yet | P4.1, P2.4 | P4.5, P4.7 | integration: a membership change through the group path updates the roster; a mismatch is refused; property over random changes: the roster equals the fold after each step |

## 10. Phase 5: tags, documents, search

Expand Down
Loading
Loading