Skip to content

11 — Admin e Especialista: ângulos escaláveis fora do Coordenador

Pergunta: o foco do 05 foi o Coordenador. Admin (multi-escola) e Especialista (cross-escola por olimpíada) escalam diferente — onde estão os hotpaths?

Admin (escopo: TODAS as escolas)

Componentes em src/components/admin-*/ e edge functions admin-*. O multiplicador aqui é número de escolas (centenas previstas), não alunos por escola.

FeatureFunçãoRisco
Dashboardadmin-dashboardAgregação cross-escola — se for drenagem em JS, escala com Σ(alunos)
Financeiroadmin-financeiroLista escola_faturas + escola_assinaturas; precisa paginar
Logsadmin-logslogs_transacoes cresce mais rápido que qualquer outra tabela — ver 13
Comunicaçãoadmin-comunicacaoTemplates + envios — verificar se preview/teste percorre lista grande
Cron Monitoradmin-cron-monitorOK (já 30s staleTime)
Health Checkadmin-healthcheckOK
Feature Flagsadmin-feature-flagsLista pequena; OK

Hipóteses Admin

  • Dashboard usa count() agregado por escola em JS em vez de SQL GROUP BY — validar.
  • admin-logs provavelmente tem o mesmo problema que Resultados: drena para filtrar em JS.

Especialista (escopo: olimpíada cross-escola)

Componentes em src/components/especialista*/ e edge functions especialista-*.

FeatureRisco
Cronograma de inscriçõesinscricoes_olimpiada cross-escola — somatório de todas as escolas inscritas
Detalhes da OlimpíadaStats por escola — risco igual ao Coordenador, multiplicado
Templates de mensagensEditor — OK
Headers/NovidadesPequeno — OK
Premiação por nívelLista de premiados cross-escola — pode estourar

Hipóteses Especialista

  • "Lista de inscritos" da olimpíada (cross-escola) é o equivalente Especialista do problema Resultados — provavelmente sofre os mesmos sintomas que motivaram esta auditoria.
  • Premiação batch (modal) já tem o caso do touched ∪ existentes resolvido (mem://ui/no-synthetic-defaults-in-batch-modals); mas o carregamento dos dados base segue o mesmo hotpath de drenagem.

Padrão recomendado (proposta)

Mesma régua do 99:

  • Paginação servidor + cursor por created_at ou (escola_id, id).
  • Agregados via SQL (GROUP BY escola_id, COUNT FILTER).
  • Para Admin: cache mais agressivo (staleTime: 5min) é OK — admin não precisa de tempo real.

Próximas etapas

  • Sweep do admin-logs (mesmo padrão de 02).
  • Sweep do especialista-cronograma cross-escola.
  • Catalogar em 05_COORDENADOR_FEATURES_SWEEP.md uma seção espelho para Admin/Especialista.