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),
AnamneseePerfilDinâmicopró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.
| Evento | O que registra |
|---|---|
SessaoAberta / SessaoEncerrada | Liga/desliga regras temporais |
AtletaChegou | Presença detectada na arena |
AtletaEntrouNaFila | Adicionado à fila X com timestamp e perfil |
EquipeFormada | 1+ atletas formaram grupo |
PartidaIniciada | Equipes ocuparam quadra Y |
PartidaEncerrada | Marca fim do tempo de jogo (sem resultado ainda) |
ResultadoReportado | Alguém disse "ganhamos 6-2" |
ResultadoContestado | Outro lado discordou |
ResultadoConfirmado | Evento central — tudo deriva dele |
EquipeSaiuDaQuadra | Liberou recurso físico |
EquipeRetornouAFila | Voltou pro fim/meio/prioridade |
AtletaMudouDePool | Migração entre pools dentro da sessão |
OperadorIntervino | Override manual (com motivo) |
AnamneseRespondida | Atleta preencheu questionário inicial pela 1ª vez |
AnamneseAtualizada | Atleta editou suas respostas (ex: sobe nível auto-declarado) |
PerfilRecalculado | Sistema atualizou PerfilDinâmico após um ResultadoConfirmado (com delta) |
OperadorRecalibrouPerfil | Override 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ério | Pergunta que responde | Variantes plausíveis |
|---|---|---|
| Formação de Equipe | Como atletas viram dupla/time? | Aleatório · Escolhido · Por nível · Chegou junto fica junto |
| Distribuição em Quadras | Qual quadra recebe a próxima partida? | Primeira livre · Por modalidade · Por nível · Manual do dono |
| Fim de Partida | Quando 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 à Fila | Quanto tempo até poder jogar de novo? | Imediato · Após X min · Após Y partidas dos outros · Prioridade decrescente |
| Prioridade na Fila | Quem é o próximo? | FIFO puro · Mensalista primeiro · Sorteio · Tempo de espera |
| Resolução de Conflito | Reportes contraditórios? | Otimista (1º vence + janela) · Pessimista (precisa concordância) · Operador decide |
| Elegibilidade | Atleta 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 Filas | Pool 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:
| Pergunta | Por 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 esportivo | Ex-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 plataforma | Lazer / 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:
| Faceta | Por que continua estática |
|---|---|
| Modalidade(s) que joga | Declaração — atleta diz se joga BT, vôlei, etc. |
| Faixa etária | Fato (data de nascimento) |
| Gênero | Auto-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ção | Pools | Quadras por pool | Filas por pool | Quando faz sentido |
|---|---|---|---|---|
| Tudo junto | 1 | N | 1 | Arena pequena/casual, todo mundo joga junto |
| Por quadra | N | 1 cada | 1 cada | Cada quadra tem identidade forte |
| Por nível/perfil | M | K agrupadas | 1 por pool | "2 quadras intermediário + 1 avançado + 1 iniciante" |
| Híbrido | Misto | Misto | Pool com 2+ filas (mensalista + avulso) | Arenas sofisticadas, dias movimentados |
Perguntas em aberto
Capturadas durante a modelagem, ainda sem decisão:
- 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?
- Migração entre pools dentro da mesma sessão — Quem decide e quais regras se aplicam?
- 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)?
- Quadra "neutra" — exceção do modelo (quadra sem pool fixo) ou é um pool especial chamado "Reserva"?
- Múltiplas filas dentro do mesmo pool — exemplo: fila prioridade vs fila normal. Critério de despacho fica como?
- Atributos abertos personalizáveis pela arena — quando habilitar? Custos de UI/onboarding.
- Identidade do atleta em múltiplas arenas — Google login resolve o auth, mas o perfil (nível, histórico) é por arena ou global?
- 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?
- Cold start do PerfilDinâmico — visitante (Ana) sem histórico na arena. Anamnese é o único sinal — qual margem de incerteza usar até acumular partidas?
- 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?
- 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?
- 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?
- 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)?
- 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
AnamneseePerfilDinâ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+.