# language: pt
Funcionalidade: Pivot de membros e trilha de eventos
Cenário: Recorder registra uma transição
Dado um squad e um usuário
Quando ocorre uma mutação de membership (ex.: join)
Então um squad_membership_event é gravado com action, papéis from/to, ator e occurred_at
Cenário: A trilha é imutável
Dado um evento de membership já gravado
Quando qualquer fluxo do módulo é executado
Então o evento existente nunca é atualizado nem removido
Parent
#342
O que construir
O pivot de membros, os papéis e o recorder da trilha de eventos (módulo profundo reusado por todas as mutações).
squad_members(pivot com id próprio):tenant_id,squad_id,user_id,role,joined_at,left_at;UNIQUE (squad_id, user_id). ModelSquadMember(Pivot) + PHPDoc; enumSquadRole(captain/sub_captain/member/ex_member).squad_membership_events(append-only):tenant_id,squad_id,user_id,actor_id(nullable),action,from_role/to_role(nullable),reason(text, nullable),metadata(jsonb, nullable),occurred_at; índices(squad_id, occurred_at)e(user_id, occurred_at). Model + enumMembershipAction.Critérios de aceite
Tz, jsonb)SquadRoleeMembershipActionaction,from_role/to_role,actor_id,occurred_atBDD
Bloqueada por