Friendship graph
Social-service owns friend_requests, friendships, user_blocks, close_friends, and groups (groups, group_members, group_invitations, group_qr_codes). user_projection is filled from auth streams so social can render a name without calling auth on every list.
Sending a request writes the row and an outbox event splick.streams.social.friend-request-sent. Accept writes the friendship and friend-request-accepted. ADR 0005 makes that accept event real for two consumers:
- notification-service creates the in-app item (and push, unless the user muted the category).
- feed-service records
feed.feed_activitiesso the friend graph used by the feed stays local.
Group membership events are a second stream. Messaging consumes them to keep chat membership aligned with the social group. Feed and messaging must not query social.group_members over SQL.
Blocks are enforced in social use cases before a request or a nearby result is returned. A block is not an integration event that other services need in order to hide a post; feed visibility uses its own audience rules plus friendship state it has projected.
QR join and public profile GET /v1/public/users/{username} are the unauthenticated edges. They are rate-limited and must not leak phone, email, or payment profile fields.