Ticket snapshots e histórico

Este projeto agora preserva o “lastro” de dados sensíveis em tickets através de snapshots gravados no momento da criação e atualizações chave:

- requesterSnapshot: nome, e‑mail, avatar e equipes do solicitante no momento da abertura.
- assigneeSnapshot: nome, e‑mail, avatar e equipes do responsável atribuído.
- companySnapshot: nome, slug e flag isAvulso da empresa associada ao ticket.

Benefícios

- Tickets continuam exibindo nome do solicitante/empresa mesmo após exclusões ou renomeações.
- Comentários já utilizavam authorSnapshot; a lógica foi mantida e ampliada para tickets.

Fluxos atualizados

- Criação de ticket: snapshots do solicitante, responsável inicial (se houver) e da empresa são persistidos.
- Reatribuição e início de atendimento: atualizam o assigneeSnapshot.
- Exclusão de usuário: preenche requesterSnapshot de todos os tickets onde a pessoa é solicitante, antes da remoção.
- Exclusão de empresa: preenche companySnapshot de tickets vinculados, antes da remoção.

Consultas e hidratação

- Resolvers de lista e detalhes de tickets passaram a usar os snapshots como fallback quando o documento relacionado não existe mais (sem “Solicitante não encontrado”, salvo ausência total de dados).

Índices novos

- tickets.by_tenant_requester: otimiza buscas por histórico de um solicitante.

Backfill

- Há uma mutation de migração para preenchimento retroativo de snapshots: convex.migrations.backfillTicketSnapshots.
- Execute com um tenant por vez (e opcionalmente um limite) se necessário.

