Pular para o conteúdo principal

Status: Approved · v2 · SPEC-DOMAIN-MATCH-001

depends_on: SPEC-DOMAIN-TEAM-001, SPEC-DOMAIN-PLAYER-001

used_by: IS-MVP-01.3, IS-MVP-06.1, IS-MVP-06.3, IS-MVP-06.5

Partidas e súmulas

Registro público de confrontos, escalações, eventos, resultado, validação, contestação e estatísticas.

Objetivo e limites

Esta especificação define o comportamento canônico do domínio Partidas e súmulas no RaizFC. Ela deve ser consultada antes de alterar contratos, mocks, endpoints, telas, permissões ou Increment Specifications relacionados.

Incluído no MVP

  • Partidas com ou sem campeonato.
  • Data definida ou pendente.
  • Campo cadastrado ou local livre.
  • Resultado informado, validado, contestado e retificado.
  • Súmula com titulares, banco, entradas, tempo, gols, assistências, cartões e substituições.
  • Convidados cadastrados ou não.
  • Auto-validação em amistosos após prazo.

Fora do MVP

  • Tempo real confiável.
  • Streaming.
  • Arbitragem digital avançada.
  • VAR comunitário.

Atores e responsabilidades

AtorResponsabilidade
VisitanteConsulta partida, placar, escalações públicas e histórico.
Gestor de timeCria partidas, informa resultado, escala elenco e valida/contesta.
Gestor de campeonatoCria e governa partidas da competição.
JogadorAparece em escalações e histórico conforme confirmação/privacidade.
OperaçãoModera disputas fora de campeonato quando necessário.

Conceitos canônicos

Match

Confronto esportivo entre pelo menos dois times.

Match Report

Súmula estruturada.

Validation

Confirmação do resultado pela contraparte ou autoridade do campeonato.

Retification

Correção auditada após validação.

Match Event

Gol, assistência, cartão, substituição ou evento administrativo.

Invariantes

  • Partida possui ao menos dois participantes distintos.
  • Partida não pode terminar antes de começar.
  • Resultado validado só muda por retificação auditada.
  • Partida contestada não consolida ranking ou stats definitivas.
  • Partida de campeonato respeita autoridade e regras da edição.
  • Convidado não confirmado pode constar na partida sem criar histórico público pessoal.
  • Eventos que afetam stats devem estar associados a participante elegível.
  • Campo cadastrado e local livre são alternativas; ao menos um contexto de local deve existir quando a data for confirmada.

Estados

EstadoSignificadoVisibilidade/efeito
draftRascunhoSomente gestão.
date_pendingConfronto sem dataPúblico opcional conforme campeonato.
scheduledAgendadaPágina pública completa.
in_progressEm andamentoAtualizações controladas.
waiting_resultEncerrada sem placar informadoGestores acionados.
result_reportedPlacar informadoAguardando validação.
waiting_validationAguardando contraparte/autoridadePrazo ativo.
contestedResultado contestadoStats/ranking pendentes.
validatedResultado confirmadoStats e ranking consolidados.
finishedEncerrada administrativamenteHistórico final.
cancelledCanceladaSem stats esportivas.

Transições permitidas

OrigemAçãoDestinoAutoridadeEfeitos
draft/date_pendingschedulescheduledGestor autorizadoDefine data/local e notifica.
scheduledstartin_progressGestor/autoridadeRegistra início.
scheduled/in_progressfinish_without_resultwaiting_resultGestor/autoridadeSolicita placar.
waiting_result/in_progressreport_resultwaiting_validationGestor/autoridadeSalva placar e súmula.
waiting_validationvalidatevalidatedOponente/autoridadeConsolida stats/ranking.
waiting_validationcontestcontestedOponente/timeAbre disputa com motivo/evidência.
waiting_validationauto_validatevalidatedJobSomente tipos elegíveis após prazo.
contestedresolvevalidated/cancelledAutoridade/operaçãoDecide e consolida ou anula.
validatedrequest_retificationcontestedAutoridadeReabre de forma auditada.
any non-finalcancelcancelledAutoridadeRegistra motivo.

Permissões

Permission keyQuem recebe por padrãoAção protegidaAuditoria
match.createSports/Admin/Championship managerCriar partidaSim
match.editScheduleSports/Admin/Championship managerData/localSim
match.manageLineupSquad/SportsEscalaçãoSim
match.reportResultSports/Admin/Championship managerResultado/súmulaSim
match.validateResultGestor autorizado da contraparteValidarSim
match.contestResultGestor autorizadoContestarSim
match.retifyResultChampionship authority/operaçãoRetificar validadoSim

Fluxos funcionais

Criação de amistoso

  1. Gestor escolhe dois times e tipo de partida.
  2. Informa categoria, data opcional, campo ou local livre.
  3. Contraparte recebe convite/aviso conforme política.
  4. Partida fica scheduled ou date_pending.

Informação de resultado

  1. Gestor autorizado informa placar e súmula.
  2. Sistema valida participantes, gols e cartões.
  3. Status vira waiting_validation.
  4. Oponente recebe notificação e prazo.

Validação e auto-validação

  1. Oponente revisa placar e súmula.
  2. Pode validar ou contestar com motivo/evidências.
  3. Se não agir e a partida for elegível, job valida após 72h.
  4. Stats e rankings são recalculados somente após validated.

Contestação

  1. Contestante descreve divergência e anexa evidências.
  2. Autoridade recebe caso.
  3. Outra parte pode responder.
  4. Autoridade corrige, mantém ou anula.
  5. Todas as alterações ficam auditadas.

Súmula e convidados

  1. Gestor relaciona jogadores ativos e convidados.
  2. Define titulares/banco e eventos.
  3. Convidados cadastrados recebem confirmação se necessário.
  4. Participação não confirmada conta para o time e a partida, não para histórico pessoal público.

Casos-limite e erros

CenárioComportamento esperadoCódigo/estado
Mesmo time nos dois ladosRejeitarMATCH_TEAMS_MUST_DIFFER
Placar incompatível com eventosBloquear ou exigir justificativa administrativaMATCH_REPORT_INCONSISTENT
Resultado informado duas vezesUsar idempotência ou conflitoMATCH_RESULT_ALREADY_REPORTED
Validação por gestor do mesmo time que informouBloquear quando exigida contraparteMATCH_VALIDATOR_NOT_ALLOWED
Prazo de auto-validação durante contestaçãoNão validarMATCH_CONTESTED
Jogador suspenso em campeonatoBloquear ou exigir override auditado conforme regrasPLAYER_INELIGIBLE
Partida cancelada recebe eventoRejeitarMATCH_CANCELLED

Privacidade e exposição pública

  • Página pública exibe participantes, contexto, placar e eventos permitidos.
  • Escalação pode ocultar convidado não confirmado conforme política.
  • Evidências de contestação são privadas para partes e operação.
  • Dados pessoais de convidado nunca aparecem.

Notificações e auditoria

  • Criação/alteração/cancelamento.
  • Prazo de resultado e validação.
  • Contestação, resposta e resolução.
  • Convite de convidado para confirmar participação.
  • Retificação que altera stats.
  • Todas as mudanças sensíveis entram em audit log.

API relacionada

MétodoRotaAcessoFinalidade
POST/api/v1/matchesGestãoCriar
GET/api/v1/matches/:idPúblicoPágina pública
PATCH/api/v1/matches/:idGestãoEditar agenda/contexto
POST/api/v1/matches/:id/resultmatch.reportResultInformar resultado
POST/api/v1/matches/:id/validatematch.validateResultValidar
POST/api/v1/matches/:id/contestmatch.contestResultContestar
POST/api/v1/matches/:id/retificationmatch.retifyResultRetificar
PUT/api/v1/matches/:id/reportmatch.manageLineupSalvar súmula
POST/api/v1/matches/:id/eventsmatch.manageLineupAdicionar evento
POST/api/v1/matches/:id/guest-playersmatch.manageLineupAdicionar convidado

Contratos compartilhados

  • MatchEntity
  • PublicMatchDto
  • MatchManagementDto
  • MatchStatus
  • MatchType
  • MatchParticipantDto
  • MatchReportDto
  • MatchPlayerDto
  • MatchEventDto
  • ReportMatchResultRequest
  • ContestMatchRequest
  • RetificationRequest

Requisitos de UX

  • Página pública com escudos, placar/status, data, campo, competição, escalações, timeline, histórico do confronto e galeria.
  • Gestão usa etapas claras: contexto, elenco, eventos, placar, revisão e envio.
  • Status waiting_validation e contested explicam o que falta.
  • Ações de compartilhar e gerar card ficam próximas ao placar.
  • Tela não simula tempo real no MVP.

Comportamento dos mocks

  • Partidas em todos os estados.
  • Relatórios consistentes e inconsistentes.
  • Auto-validação simulável por relógio controlado.
  • Mutations alteram stats apenas após validate.
  • Contestação com evidências fake e resolução.

Critérios de aceite

  • Resultado não consolida antes de validação.
  • Auto-validação só ocorre em partidas elegíveis e sem contestação.
  • Retificação de validado é auditada.
  • Súmula suporta titulares, banco, eventos e convidados.
  • Página pública funciona sem login.

Testes obrigatórios

  • State machine completa.
  • Permissões por parte.
  • Consistência placar/eventos.
  • Auto-validação 72h.
  • Contestação e resolução.
  • Retificação e recálculo.
  • Convidados e privacidade.
  • Idempotência de resultado.

Pós-MVP

  • Atualização ao vivo.
  • Arbitragem digital.
  • Streaming e placar externo.
  • Integração com wearables.

Decisões registradas

  • Partida pública é entidade central de registro.
  • Amistosos possuem auto-validação sugerida de 72h.
  • Campeonato define autoridade de suas partidas.
  • Sem evidência suficiente, disputa pode anular o resultado.

Machine summary

spec: SPEC-DOMAIN-MATCH-001
domain: Partidas e súmulas
must_preserve:
- Partida possui ao menos dois participantes distintos.
- Partida não pode terminar antes de começar.
- Resultado validado só muda por retificação auditada.
- Partida contestada não consolida ranking ou stats definitivas.
- Partida de campeonato respeita autoridade e regras da edição.
- Convidado não confirmado pode constar na partida sem criar histórico público pessoal.
- Eventos que afetam stats devem estar associados a participante elegível.
- Campo cadastrado e local livre são alternativas; ao menos um contexto de local deve existir quando a data for confirmada.
touches:
- contracts
- mocks
- api
- frontend
- backend
- tests
- documentation