Implement the delivery pipeline as the single path all messages take: (1) validate sender + membership, (2) persist ciphertext + envelopes, (3) resolve conversation members, (4) resolve their active devices, (5) resolve active sockets via Redis, (6) push each device its envelope via the event bus. Enforce persist-before-deliver.
Acceptance criteria:
- Storage always precedes delivery
- Each active recipient device receives exactly its envelope
- Membership re-validated against
conversation_members even when rooms are used
Implement the delivery pipeline as the single path all messages take: (1) validate sender + membership, (2) persist ciphertext + envelopes, (3) resolve conversation members, (4) resolve their active devices, (5) resolve active sockets via Redis, (6) push each device its envelope via the event bus. Enforce persist-before-deliver.
Acceptance criteria:
conversation_memberseven when rooms are used