Skip to content

Modelo de Domínio — Dinâmica de Quadras

Status: rascunho em construção. Evolui a cada conversa.

Visão em 3 camadas

O modelo se organiza em três camadas que separam o que existe (entidades), o que acontece (eventos) e como se decide (critérios). A flexibilidade do sistema vive na separação.


Camada 1 — Entidades (o que existe)

Coisas que têm identidade própria e duram. Mudam raramente.

Recursos físicos

  • Arena — espaço físico operado por um dono. Contém uma ou mais quadras.
  • Quadra — recurso físico onde partidas acontecem. Existe permanentemente (não muda com o dia).

Agrupamentos lógicos

  • Sessão — recorte temporal com regras próprias. Ex: "Sábado Manhã Open Play 9-12h", "Aula Coletiva 14-15h", "Torneio Interno Domingo 16-19h".

  • Pool — agrupamento lógico dentro de uma sessão que combina:

    • 1 ou mais quadras físicas
    • 1 ou mais filas
    • Um perfil (facetas como nível, modalidade, gênero, etc.)
    • Os critérios de rotação que valem ali dentro

    A mesma quadra física pode estar em pools diferentes ao longo do dia. Q1 de manhã pode estar no "Pool Avançado", à tarde no "Pool Aula", à noite no "Pool Aberto".

  • Fila — ordem de espera dos atletas (ou equipes) em um pool. Pode ter critérios de prioridade.

Atores

  • Atleta — pessoa que joga. Tem identidade (Google), Anamnese e PerfilDinâmico próprios.
  • Equipe — agrupamento de 1 ou mais atletas que joga uma partida juntos.
  • Operador — dono ou pessoa autorizada (ex: instrutor) que tem autoridade de operar (override, banir, configurar regras, recalibrar perfil).

Acontecimentos materializados

  • Partida — evento de jogo entre duas equipes em uma quadra, com início e fim.
  • Resultado — fato encerrado de uma partida (placar, vencedor, status: confirmado/contestado/abandonado).

Perfil do atleta (a partir de v0.2)

Substitui a ideia de "faceta estática de nível". Detalhado na seção Perfil do Atleta abaixo.

  • Anamnese — questionário inicial preenchido 1× no onboarding (atualizável). Captura sinais que o sistema não conseguiria adivinhar nas primeiras semanas.
  • PerfilDinâmico — derivado, recalculado a cada ResultadoConfirmado. Score numérico com intervalo de confiança, por modalidade. É a fonte da verdade para o critério de Elegibilidade.

Camada 2 — Eventos (o que acontece)

Fatos imutáveis registrados quando algo muda. Append-only — nunca apagados, só somados. Permitem auditoria, undo e replay.

EventoO que registra
SessaoAberta / SessaoEncerradaLiga/desliga regras temporais
AtletaChegouPresença detectada na arena
AtletaEntrouNaFilaAdicionado à fila X com timestamp e perfil
EquipeFormada1+ atletas formaram grupo
PartidaIniciadaEquipes ocuparam quadra Y
PartidaEncerradaMarca fim do tempo de jogo (sem resultado ainda)
ResultadoReportadoAlguém disse "ganhamos 6-2"
ResultadoContestadoOutro lado discordou
ResultadoConfirmadoEvento central — tudo deriva dele
EquipeSaiuDaQuadraLiberou recurso físico
EquipeRetornouAFilaVoltou pro fim/meio/prioridade
AtletaMudouDePoolMigração entre pools dentro da sessão
OperadorIntervinoOverride manual (com motivo)
AnamneseRespondidaAtleta preencheu questionário inicial pela 1ª vez
AnamneseAtualizadaAtleta editou suas respostas (ex: sobe nível auto-declarado)
PerfilRecalculadoSistema atualizou PerfilDinâmico após um ResultadoConfirmado (com delta)
OperadorRecalibrouPerfilOverride manual do perfil dinâmico (com motivo, ex: "joga claramente acima")

Camada 3 — Critérios (como se decide)

Funções pluggáveis que recebem (estado atual + evento) e respondem "o que fazer agora". A maior parte da criatividade das arenas vive aqui. Mudam com frequência, devem ser fáceis de configurar.

CritérioPergunta que respondeVariantes plausíveis
Formação de EquipeComo atletas viram dupla/time?Aleatório · Escolhido · Por nível · Chegou junto fica junto
Distribuição em QuadrasQual quadra recebe a próxima partida?Primeira livre · Por modalidade · Por nível · Manual do dono
Fim de PartidaQuando termina?X minutos · Y pontos · Melhor de N sets · Evento manual
Permanência (Vencedor)Vencedor fica? Sai? Por quanto tempo?Sai sempre · Fica até perder · Fica até N vitórias · Fica se quiser
Saída (Perdedor)Perdedor vai pra onde?Fim da fila · Meio da fila · Penalidade de espera · Sai da sessão
Retorno à FilaQuanto tempo até poder jogar de novo?Imediato · Após X min · Após Y partidas dos outros · Prioridade decrescente
Prioridade na FilaQuem é o próximo?FIFO puro · Mensalista primeiro · Sorteio · Tempo de espera
Resolução de ConflitoReportes contraditórios?Otimista (1º vence + janela) · Pessimista (precisa concordância) · Operador decide
ElegibilidadeAtleta X pode entrar no pool Y?Probabilística (compara PerfilDinâmico do atleta vs perfil-alvo do pool, com tolerância configurável) · Estrita (corte duro, sem entrada) · Aberta com aviso (entra mas sistema avisa "fora da faixa, segue?") · Operador valida (caso de borda)
Despacho entre FilasPool com 2+ filas, qual chama agora?Round-robin · Prioridade absoluta · Ratio configurável

No v0, o sistema não vai suportar todas as combinações livres. Vai oferecer 3-5 perfis pré-configurados ("Open Play Aberto", "Rei da Quadra", "Aula Coletiva", "Torneio Express") onde cada perfil é uma combinação dessas dimensões. Configuração livre vira tarefa do v1+.


Perfil do Atleta (Anamnese + Dinâmico)

A partir de v0.2, nível deixa de ser rótulo estático e vira distribuição de probabilidade. Um perfil tem 3 origens combinadas:

1. Anamnese (one-time, no onboarding)

Captura sinais que o sistema não conseguiria adivinhar nas primeiras semanas:

PerguntaPor quê importa
Há quanto tempo você joga (esta modalidade)?Calibração inicial — 6 meses ≠ 6 anos
Onde mais você joga?Cross-arena: experiência fora da nossa rede conta
Frequência típica (por semana)Atleta de 4×/semana evolui mais rápido
Background esportivoEx-jogador de futebol pega rápido; sedentário é outra curva
Auto-percepção de nível (com âncoras concretas, não rótulos vagos)"Iniciante = ainda erra saque consistente" / "Intermediário = controla rebatida com efeito" / "Avançado = joga torneios estaduais"
Objetivo na plataformaLazer / aprender / competir → afeta sugestões de pool

Atualizável — atleta pode revisitar e atualizar. Cada edição vira AnamneseAtualizada.

2. Perfil Dinâmico (contínuo, derivado dos eventos)

Atualiza a cada ResultadoConfirmado. Score numérico por modalidade com intervalo de confiança.

Sinais que entram no cálculo:

  • Vitórias / derrotas e contra quem (não basta ganhar — ganhar de avançado vale mais)
  • Frequência (3×/semana ≠ 1×/mês)
  • Quem o atleta convida pra jogar (sinal social tácito)
  • Quem aceita jogar com ele (validação social)
  • Padrões de saída (abandona muito? joga até o fim?)

Algoritmo concreto (TrueSkill, ELO Bayesian, ou heurística simples) é decisão de implementação v0/v1+, não de modelagem. No v0 sugerido: score numérico simples (delta fixo por vitória/derrota ponderado pelo perfil do oponente), com intervalo de confiança crescendo com nº de partidas.

3. Override do Operador

Sempre disponível. Dono/instrutor pode recalibrar manualmente (OperadorRecalibrouPerfil) — registra motivo. Útil para:

  • Atletas em edge case (Bruno sub-18 jogando avançado)
  • Bug/desvio percebido socialmente ("esse atleta tá manipulando resultados")
  • Ajuste após avaliação presencial (Cenário 40)

Facetas que continuam estáticas

Algumas facetas não derivam de uso — continuam estáticas no perfil do atleta:

FacetaPor que continua estática
Modalidade(s) que jogaDeclaração — atleta diz se joga BT, vôlei, etc.
Faixa etáriaFato (data de nascimento)
GêneroAuto-declarado
Status comercial (mensalista, avulso, VIP)Decisão da arena, não do uso

Essas facetas complementam o PerfilDinâmico — podem ser usadas em filtros (ex: "Pool Master 50+") sem depender de score derivado.

Facetas customizadas pela arena

Cada arena pode adicionar facetas próprias para usar em filtros de elegibilidade ou prioridade:

  • mensalista (sim/não)
  • vip (sim/não)
  • time-do-campeonato (Time A · Time B)

Decisão futura: até onde permitir customização no v0? Custo de UI/onboarding cresce rápido.


Cardinalidades-chave (Pool)

A flexibilidade real vem da combinação Pool × Fila × Quadra:

ConfiguraçãoPoolsQuadras por poolFilas por poolQuando faz sentido
Tudo junto1N1Arena pequena/casual, todo mundo joga junto
Por quadraN1 cada1 cadaCada quadra tem identidade forte
Por nível/perfilMK agrupadas1 por pool"2 quadras intermediário + 1 avançado + 1 iniciante"
HíbridoMistoMistoPool com 2+ filas (mensalista + avulso)Arenas sofisticadas, dias movimentados

Perguntas em aberto

Capturadas durante a modelagem, ainda sem decisão:

  1. Atleta multi-perfil — Fabricio joga BT (intermediário) e vôlei (iniciante). Ele tem um perfil por modalidade? Como o sistema sabe qual aplicar quando entra em arena com ambas?
  2. Migração entre pools dentro da mesma sessão — Quem decide e quais regras se aplicam?
  3. Pools sobrepostos no tempo — Como o sistema lida com conflitos de uso da mesma quadra em sessões sobrepostas (ex: aula reserva Q1 enquanto Open Play está rodando)?
  4. Quadra "neutra" — exceção do modelo (quadra sem pool fixo) ou é um pool especial chamado "Reserva"?
  5. Múltiplas filas dentro do mesmo pool — exemplo: fila prioridade vs fila normal. Critério de despacho fica como?
  6. Atributos abertos personalizáveis pela arena — quando habilitar? Custos de UI/onboarding.
  7. Identidade do atleta em múltiplas arenas — Google login resolve o auth, mas o perfil (nível, histórico) é por arena ou global?
  8. Solo vs Dupla na fila — atleta sozinho entra na fila e o sistema pareia, ou tem que ter parceiro definido antes? Ou os dois modos coexistem?
  9. Cold start do PerfilDinâmico — visitante (Ana) sem histórico na arena. Anamnese é o único sinal — qual margem de incerteza usar até acumular partidas?
  10. Anti-gaming do PerfilDinâmico — atleta auto-reporta resultados, pode mentir pra "subir". Resolução de Conflito ajuda mas não basta. Operador precisa de ferramenta de "reset/recalibração" + sistema deve detectar padrões suspeitos automaticamente?
  11. Cross-arena do PerfilDinâmico — atleta com perfil maduro em SP visita arena no Rio. Score viaja junto integralmente, parcialmente (calibração local), ou começa zerado?
  12. Transparência do PerfilDinâmico para o atleta — Carla vê seu próprio score? E o de outros? Sem ver, sente que o sistema "decide pelas costas". Vendo, vira ranking competitivo (não queremos no v0). Equilíbrio?
  13. Anamnese vs fricção de onboarding — adicionar 5 perguntas no primeiro acesso aumenta atrito. Cenário 1 (Fabricio em 30s) fica mais lento. Anamnese opcional? Acelerada (3 perguntas)? Só pra atleta que vai entrar em pool restrito (lazy-load)?
  14. Inflação por contexto — atleta que sempre joga pra cima (e perde). Sistema vê derrotas mas é porque está tentando subir. Como o algoritmo distingue "ruim" de "ambicioso"?

Histórico de evolução

Marcos de mudança neste documento:

  • mai/2026 — v0.1 — Esqueleto inicial com 3 camadas, conceito de Pool, 10 critérios.
  • mai/2026 — v0.2 — Substituição da faceta estática "nível" por Anamnese + PerfilDinâmico. Adicionadas entidades Anamnese e PerfilDinâmico, 4 novos eventos (AnamneseRespondida, AnamneseAtualizada, PerfilRecalculado, OperadorRecalibrouPerfil), critério de Elegibilidade reformulado para probabilístico. 6 novas perguntas em aberto (cold start, anti-gaming, cross-arena, transparência, fricção, inflação por contexto).
    • Implicação no v0: anamnese rápida no onboarding + score numérico simples com intervalo de confiança. Algoritmo bayesiano completo fica para v1+.