Part of #131. Depends on Phase 3b.
Scope
On removing a member from an E2e KB: generate fresh k', author a Remove op + one wrap-only op per remaining member (re-wrap k'), persist k' locally, ship via kb/collection_op. The removed member keeps only the old k (no new wrapped op → find_wrapped_content_key returns their old key).
Acceptance tests (adversarial)
- 3 members, remove one ⇒ the two remaining converge on
k' and read new content.
- The removed member's
derive_content_key yields the OLD key and open_new_ops skips post-rotation ciphertext (reads nothing new) — the security oracle.
- Concurrent / mutual removal converges deterministically (strong-removal resolver).
- Out of scope: forward/post-compromise secrecy (D4 ratchet), multi-owner quorum rotation.
Part of #131. Depends on Phase 3b.
Scope
On removing a member from an E2e KB: generate fresh
k', author a Remove op + one wrap-only op per remaining member (re-wrapk'), persistk'locally, ship viakb/collection_op. The removed member keeps only the oldk(no new wrapped op →find_wrapped_content_keyreturns their old key).Acceptance tests (adversarial)
k'and read new content.derive_content_keyyields the OLD key andopen_new_opsskips post-rotation ciphertext (reads nothing new) — the security oracle.