MOJ: Manual do organizador (o painel .admin do contest) — MOJ docs

MOJ: Manual do organizador (o painel .admin do contest)

Este manual é para quem opera um contest: o dono da conta .admin. Ele explica cada aba do painel de administração, cada opção de configuração, como habilitar os papéis especiais (.judge, .cjudge, .staff, .cstaff, .mon), e como ligar a correção validada por juízes — incluindo quantas pessoas você precisa.

Criar o contest (wizard, problemas, contas) é o outro guia: o tutorial do organizador. Aqui é a OPERAÇÃO, do dia da prova.

Você chega ao painel logando com a conta .admin do contest e clicando em Administração na barra do topo.

1. O painel: a Central, os grupos e os MÓDULOS

O painel abre na 🏁 Central. A barra de cima tem os quatro grupos comuns, que todo contest tem, e — depois de um separador — os grupos de evento, que só aparecem quando o contest liga o módulo correspondente (seção 1½). Cada grupo tem seus painéis na segunda linha. O endereço guarda o painel (#grupo/painel), então dá para salvar o link — os links antigos (#settings, #users, #machines, #prova/rodadas…) continuam funcionando, redirecionados. Um link para um painel de módulo desligado cai em Central › Módulos com um aviso dizendo qual módulo ligar.

[🏁 Central] [🧩 Prova] [👥 Pessoas] [🎛️ Operação] │ [🏟️ Evento] [🖥️ Máquinas]        📖 Manual
                                                    └── só com módulo ligado ──┘
Grupo Painéis Aparece
🏁 Central Central · Módulos · Regras sempre
🧩 Prova Problemas · Esqueletos (esqueletos) · Relatório sempre (Esqueletos só com o módulo)
👥 Pessoas Contas · Inscrições (inscricoes) · Sessões sempre (Inscrições só com o módulo)
🎛️ Operação Situação · Staff · Juízes · Auditoria sempre
🏟️ Evento Rodadas (rodadas) · Documentos (documentos) · Balões (baloes) · Classificação (classificacao) · Times (sedes ou telao) · Coortes (coortes) · Sedes & escolas (sedes) com o módulo entre parênteses
🖥️ Máquinas Gate & trava · Anomalias · mlinux com o módulo maquinas

🏁 Central — o que falta e o que gerar

Bloco O que faz
🚦 Falta para começar O checklist pré-prova (verde/amarelo/vermelho) com botão que abre o painel exato de cada pendência. Vermelho é crítico: confira antes de começar. O checklist é um aviso — o MOJ não impede login nem submissão por causa dele; os itens já conferidos ficam recolhidos. Confere janela, log de julgamento, freeze, juízes, linguagens, TL calibrado, pool, contas, staff e o daemon, se algum problema de prova ICPC segue julgando depois do 1º erro (Julgamento para no 1º erro: o TLE de um problema com centenas de testes leva minutos — marque "parar no primeiro" TLE/WA na aba Limites do editor do problema), e se cada juiz já calibrou cada problema (Juízes aquecidos): o tempo-limite é medido por máquina, e o juiz que ainda não calibrou um problema faz isso na 1ª submissão dele — que espera minutos. Quando há juiz frio, o item traz o botão 🔥 Aquecer juízes, que manda só os juízes frios calibrarem; faça isso antes do início (cada calibração ocupa um lugar do juiz por alguns minutos) e rode o checklist de novo (↻) para ver "aquecendo" virar "aquecidos". O mesmo botão fica fixo em Operação › Situação, e, em contest de prioridade Prova (ou Super), o aquecimento também roda sozinho: ao promover uma rodada e uns 15 minutos antes do início de cada rodada (fica no audit como warm-judges). Lista de aula fica só com o botão. E, só com o módulo ligado, coortes, gate de navegador, trava de sede, rodada seguinte, documentos, balões e prorrogação. A checagem módulos avisa quando um módulo está desligado mas tem dados no contest. Sem freeze e contas compartilhadas só viram aviso em contest de prioridade Prova (numa lista são o normal).
🧰 Gerar Um cartão por artefato, com o estado atual: etiquetas de credenciais, relatório da prova e jplag sempre (o jplag também abre para o juiz-chefe, que pode rodar, e para o juiz, que só vê); documentos (documentos), promover rodada (rodadas), cerimônia de revelação e telão (telao) com o módulo.
📡 Ao vivo Resumo curto (pendentes, submissões, juízes online, resposta p95, correção manual). Atualiza sozinho; o painel completo é Operação › Situação.
⏱️ Regras da prova Início, fim e freeze editáveis ali mesmo, o modo e as linguagens em leitura, e os módulos ligados (com atalho para ligar/desligar). O resto está em Central › Regras.
Painel O que faz
Central › Módulos Liga e desliga os módulos do contest (seção 1½): um cartão por módulo com o que ele abre e se já há dados dele no contest; presets (prova de disciplina · disciplina com Maratona Linux · seletiva · Maratona).
Central › Regras Todas as opções do contest, em cinco seções dobráveis (identidade e janela · o que o time vê · julgamento · placar/freeze/penalidade · acesso). A seção 2 explica opção por opção. A ⏱ prorrogação por sede mora em Evento › Sedes & escolas.

🧩 Prova — o conteúdo

Painel O que faz
Problemas A prova em si: renomear/reordenar/remover, editar o identificador (a "letra" — pode ser W1, Q…; reordenar preserva identificador customizado e a cor do balão migra junto; com as letras automáticas A, B, C…, reordenar troca as letras, e a cor do balão e as clarifications acompanham cada problema — com a prova no ar, o painel pede confirmação), restringir linguagens ou o pool de juízes POR problema, atualizar o enunciado a partir do banco (o MOJ reindexa o problema e troca o enunciado em alguns segundos; o atual fica até lá), enviar ou remover HTML/PDF por idioma, o painel 🌐 Idiomas do enunciado (abaixo) e 🏦 Adicionar do banco (busca e sorteio).
Relatório O relatório estático da prova num lugar só: baixar o tar.gz navegável, publicar como histórico em /relatorio/<contest>/ (republicar, despublicar) e publicar o relatório de cada rodada arquivada. A seção 6½ explica.

🌐 Idiomas do enunciado. Um problema do banco pode ter o enunciado em português, inglês e espanhol (o autor escreve docs/enunciado.en.md e docs/enunciado.es.md no pacote). O painel 🌐 Idiomas do enunciado (Prova › Problemas; o juiz-chefe tem o mesmo na aba 🌐 Idiomas do painel dele) tem dois modos:

Nome do problema no contest. O nome que aparece na lista de problemas, nas clarifications, nas submissões e no relatório é UM nome por problema. Ao inserir um problema sem digitar o nome, o MOJ usa o título do banco no idioma em que a sanfona abre (o LOCALE, se for oferecido). Se o problema não tem título nesse idioma, o MOJ usa o título em português.

👥 Pessoas — quem entra, quem é quem

Painel O que faz
Contas Criar/resetar/desabilitar/remover contas (individual e em lote por .txt/.csv), trocar a senha de todos e o atalho das Etiquetas de credenciais. É AQUI que você cria as contas de papel (seção 3). Em contest com usuários compartilhados do Treino Livre, o cartão 🔗 Contas compartilhadas converte tudo em contas próprias (seção 8¾). No lote, Processar mostra como cada linha foi lida (login, senha, nome, email) e o resultado diz por que cada linha ficou de fora. Linha com : sem cabeçalho é sempre login:senha:nome:email — localhost:6767 sozinho vira login + senha; nome com : ou , vai no CSV com cabeçalho. Um : no nome do time (ou da escola) é gravado como ∶ (parece igual): o placar usa : como separador. Vale em todo lugar que grava nome (aqui, Times, criação do contest e a inscrição dos alunos).
Inscrições (módulo inscricoes) O roster do contest (só inscrito entra) e a janela: quando abre, quando fecha (default: o início da prova) e quantos minutos de entrada atrasada. Lista times e individuais, dissolve time, inscreve à mão, cutuca convite pendente por DM (🔔) e exporta CSV. A seção 8½ explica.
Sessões Quem está logado agora, com deslogar; 🚪 sair em massa e trava de login (fechar o login, derrubar todo mundo, reabrir — é o fim de uma prova de sala e a troca de rodada); e o log de acessos por dia. Vale para qualquer contest.

🎛️ Operação — o dia da prova

Painel O que faz
Situação O dashboard ao vivo (atualiza em lugar a cada ~12s): logados, juízes online/ocupados, fila, pendentes, latência, timeline, avaliação manual, as ações sugeridas quando algo está fora do lugar e o botão 🔥 Aquecer juízes. Balões pendentes/retidos só com o módulo baloes.
Staff Panorama e ação sobre a fila de impressão (+ balões com o módulo), desempenho por staff e o escopo de cada staff/chefe de sede (regex ou region:<sede>). region:<nome> cobre tudo o que está naquele nó de Evento › Sedes & escolas: a sede e, se for um nó pai, todas as sedes abaixo dele (region:Nordeste vê as sedes do Nordeste), e também um recorte (view) pelo nome. Vale a sede gravada no time ou, sem ela, a regex. A regex no escopo é testada no login.
Juízes A fila da correção manual: quem pegou cada submissão, votos, idade; decidir/resolver na hora; e a configuração do veredicto manual (opções de rótulo + 🔎 o que vai para revisão: uma tabela problema × veredicto — o marcado vai para os juízes, o resto sai automático; sem nada marcado, tudo sai automático — com exceções por linguagem e o botão de liberar retidos que a tabela nova solta).
Auditoria Feed unificado de tudo que aconteceu (ações de admin, logins, submissões, veredictos) com filtros e CSV, mais os backups que os usuários subiram (por usuário, com ZIP).

🏟️ Evento — o que uma prova de várias sedes tem a mais

Painel (módulo) O que faz
Rodadas (rodadas) Aquecimento e prova oficial no MESMO contest: planeja cada rodada (janela + problemas), mostra o checklist e promove — arquivando tudo o que aconteceu. A seção 6 explica.
Documentos (documentos) Gera, em PDF e HTML nos três idiomas (pt/en/es), os documentos da prova: ambiente de julgamento (info sheet), caderno da prova (capa + enunciados), folha de time limits e o editorial (só publica depois do FIM da prova). A seção 5 explica.
Balões (baloes) A cor de cada letra — é o que sai desenhado na folha do balão. O default cobre A–O; com mais de 15 problemas, defina as demais (senão saem cinza). São as cores da rodada no ar. Para dar cores próprias a outra rodada, use Evento › Rodadas. Trocar uma cor passa as tarefas de balão ainda não impressas à cor nova; a tela avisa quantas folhas já foram impressas na cor antiga.
Classificação (classificacao) Quem se classifica para as próximas fases. Cada etapa (Final Brasileira, PDA, Mundial) tem o seu motor, escolhido no painel: prévia, rascunho, publicação (um chip 🎓 por etapa no placar) e o override manual — excluir do cálculo, retirar sem recalcular, promover à mão, sempre com motivo. Para contests menores (uma seletiva), o motor Manual: você diz quantos times sobem e qual é a próxima fase, e clica no placar em quem promover (motivo opcional). docs/CLASSIFICACAO.md explica.
Times (sedes ou telao) Identidade de cada conta no placar: nome do time, país/bandeira, sede, universidade, brasão e foto. Carga por CSV e "materializar matches". Um : no nome ou na escola vira ∶ (parece igual; a tela avisa).
Coortes (coortes) Times convidados (extra-oficiais, "CCL") separados dos oficiais: quem aparece no placar público, quem vê quem, e o 🔓 Liberar resultados do pós-cerimônia. A seção 8 explica.
Sedes & escolas (sedes) As sedes (nome + regex no login) — que alimentam o filtro do placar, o escopo do staff, as etiquetas, as fotos/músicas que cada chefe de sede gere no telão e o gate por sede —, as regras de país/escola por regex e a ⏱ prorrogação por sede/grupo (regex → novo fim; só estende, nunca encurta). Em três modos (Simples, Intermediário, Avançado) com prévia — seção 7¼.

🖥️ Máquinas — quando a prova roda em Maratona Linux (módulo maquinas)

Painel O que faz
Gate & trava De onde cada time logou (IP e navegador) em cada rodada, com CSV; a configuração do gate de navegador por sede (esperado × visto por time) e a trava de sede por IP (IPs presos, bloqueios, prender/soltar). A seção 7 explica. O mapa conta os logins desde a abertura do login da rodada (sem pegar os da rodada anterior), não só os de depois do início.
Anomalias O que está fora do lugar no uso das máquinas durante a prova (com o navegador do MLinux identificando a máquina — com ou sem gate; o "UA fora da sede" precisa do gate em Barrar ou Observar): time com 2 sessões vivas, máquina compartilhada por 2 times, submissão vinda de outra máquina, UA fora da sede, sede com menos máquinas que times, trocas de máquina, a trilha da sessão única e os bloqueios da trava. Linha do tempo, tabela por time, CSV, deslogar, deslogar UA divergente e explicar um caso. A seção 7½ explica. Quem logou antes do início (o login abre antes da prova) aparece com a máquina do último login antes de começar, marcada "antes do início": é com essa sessão que o time começa; trocar de máquina antes de começar não é anomalia.
mlinux O panorama das máquinas por sede que o nutellaboot coleta (hardware e modelo do equipamento, RAM, editores, pressão de memória com PSI, saúde na prova: reinícios, processos mortos por falta de memória, relógio fora, ociosidade), com a coleta e os comandos remotos. Os dados de saúde e PSI só aparecem para máquinas com o agente novo do mlinux; a tela diz quantas são. O cartão Vínculo máquina-time mostra quantas máquinas o MOJ já vinculou a um time no nutellaboot (acontece sozinho no login do time, com o agente novo do mlinux), e tem os botões enviar roster e republicar vínculos: use os dois, nesta ordem, quando o cartão disser "time fora do roster da imagem". Gravar a chave (ou religar o vínculo) com times já logados republica sozinho os vínculos desses logins. O cartão Alertas das máquinas em tempo real instala o aviso do nutellaboot: quando uma máquina levanta um alerta (pendrive, celular, rede por USB, identidade repetida), ele aparece em Máquinas › Anomalias e, durante a prova, o dono do contest recebe no Telegram. Para instalar ou remover, a chave gravada tem de ser a de administração do nutellaboot. docs/NUTELLABOOT.md explica.

Balão e o freeze. Por padrão, acerto feito com o placar congelado não gera tarefa de balão — e esses balões não são entregues depois: a tarefa não existe. É a regra de competição (o balão andando pela sala revela o que o freeze esconde), e vale só para o balão: pedido de impressão continua livre. Se você quiser o clássico do ICPC — balão circulando durante o freeze, plateia adivinhando — marque Entregar balão durante o freeze em Central › Regras; marcar também libera os que já ficaram retidos. O checklist pré-prova mostra qual política está valendo, e Operação › Situação mostra quantos balões estão retidos.

Como o placar marca quem resolveu. Por padrão a célula de quem resolveu é sempre igual (verde) e a cor do balão vai numa bolinha ao lado. É de propósito: a paleta ICPC dá o problema A branco, e branco sobre o fundo branco do placar é o mesmo pixel — quem resolvia o A parecia não ter resolvido (a queixa que originou a mudança veio de um estudante). Se você preferir o clássico — a célula inteira pintada com a cor do balão — marque em Central › Regras › Célula "resolveu" no placar; as cores claras ganham contorno para não sumirem. Vale para o placar, a cerimônia de revelação e o relatório.

Fora do painel, mas linkadas da Central: etiquetas de credenciais, cerimônia de revelação, jplag, fila do staff e placar.

1½. Módulos do contest — ligue só o que a sua prova usa

Um módulo é um grupo de recursos que o contest usa. Uma prova de disciplina não liga nenhum: o painel mostra só o comum (problemas, contas, sessões, placar, staff, juízes). Uma prova de disciplina em laboratório com Maratona Linux liga maquinas (gate de máquina, sessão única, anomalias). A Maratona liga todos. Ligar mostra os painéis, as checagens da Central e os cartões correspondentes; desligar esconde, sem apagar nada — religar restaura tudo.

Desligado, a regra do módulo NÃO vale, mesmo com a configuração gravada: Máquinas desliga o gate de navegador, a sessão única e a trava de sede (os IPs presos são soltos na hora); Sedes desliga a prorrogação por sede; Inscrições deixa entrar quem não se inscreveu (o membro de time continua entrando como o time), tira o botão Inscreva-se da página inicial e ninguém consegue se inscrever; Coortes põe todo mundo no placar público; Balões para de criar tarefas de balão (religar cria as que faltaram). Antes de desligar um módulo de uma prova em andamento, confira se é isso mesmo que você quer.

Módulo O que liga Detectado por
sedes Evento › Sedes & escolas, Evento › Times (identidade), prorrogação por sede, escopo do staff por sede regions.json, teams-meta.json, prorrogações
maquinas Máquinas › Gate & trava, Anomalias, mlinux; checagens de gate/trava/sessão única gate de UA ligado, SITE_LOCK=1, chave do nutellaboot
rodadas Evento › Rodadas; cartão Promover; relatórios de rodada rounds.json
documentos Evento › Documentos; cartão Documentos; aba do juiz-chefe docs/config.json
baloes Evento › Balões; balões na fila do staff e na Situação; balões no freeze balloons.json
coortes Evento › Coortes cohorts.json
inscricoes Pessoas › Inscrições registrations.json
telao cartões Revelação e Telão; Evento › Times (fotos) animeitor.json, webcast.json, fotos de time
classificacao Evento › Classificação (seletor de etapa e de motor) classification.json
virtual Evento › Virtual; botão Virtual no card do contest encerrado; link no placar (ver §6¾) virtual/runs/
esqueletos Prova › Esqueletos: o editor de código do time abre com o esqueleto da linguagem (abaixo) esqueletos.json

Onde se liga: Central › Módulos (presets que só pré-marcam), o passo 7 · Módulos do criar contest, moj-contest -c <cid> modules on|off ou a seção modules{} do spec de criação. E sozinho, ao usar o recurso: criar uma rodada, uma coorte, ligar o gate, gerar um documento, ligar a inscrição, definir uma cor de balão, uma sede ou uma chave de webcast — pela web ou pela CLI — liga o módulo correspondente na hora (o audit registra modules-auto). Só desligar é manual. Também vale para o spec de criação — um só JSON levanta o contest inteiro, com os dados de cada módulo (sedes, cores, coortes, gate, rodadas, documentos, janela de inscrição, telão, classificação); o export devolve a mesma seção, sem segredos. Contests criados antes dos módulos são detectados uma vez pelos arquivos que já têm (server/bin/contest-modules-detect.sh).

Pré-requisitos. Dois módulos só funcionam com outra configuração do contest, e por isso só ligam com ela (a participação virtual tem as condições dela, na §6¾; a cola abaixo junta tudo): inscricoes precisa das contas do Treino Livre (contest criado com usuários compartilhados): o aluno se inscreve com a conta dele no treino. Num contest de contas próprias, a inscrição barraria todo aluno, então ela não liga (nem pelo painel, nem ao gravar a janela de inscrição, nem na criação, ao duplicar ou por template). Com contas próprias, distribua as credenciais em Pessoas › Contas. esqueletos precisa do editor de código no browser (Regras). O cartão do módulo mostra o cadeado e o que falta. Se um contest já estava com o módulo ligado sem o pré-requisito, a Central avisa (e, sem as contas do treino, a regra "só inscrito entra" não vale). Converter as contas compartilhadas em próprias (seção 8¾) desliga a inscrição junto.

Cola: o que cada módulo precisa. À esquerda, o que o MOJ exige para ligar o módulo (↔︎ = vale nos dois sentidos); à direita, o que ele precisa, já ligado, para fazer alguma coisa.

Para ligar, precisa de
Módulo
Ligado, age quando tem
contas do Treino Livre (USERS_FROM)converter em contas próprias desliga o módulo
→
inscricoes
→
a inscrição ligada (Pessoas › Inscrições)
editor de código no browser (Regras)com o módulo ligado, o editor não desliga
↔
esqueletos
→
nada: vem o esqueleto padrão de cada linguagem
modo ICPCnão secretoplacar não anônimoinício e fimtodos os problemas públicos no treinoao criar, nasce desligado e a tela diz por quê (§6¾)
→
virtual
→
prova encerrada para todas as sedesplacar descongelado (Encerrar evento)
—
sedes
→
a árvore de sedes (Evento › Sedes & escolas)
—
maquinas
→
gate: uma regramlinux: a chave do NutellaBoot
—
rodadas
→
o plano de rodadas (Evento › Rodadas)
—
documentos
→
nada: gera do que o contest já tem
—
baloes
→
nada: cores do ICPC por padrão
—
coortes
→
as coortes (Evento › Coortes)
—
telao
→
telão: o evento publicado no Animeitor
—
classificacao
→
o motor de cada etapa (Evento › Classificação)

Esqueletos de código (módulo esqueletos)

No contest, o editor de código do time abre vazio: o time escreve o código dele por completo. Com o módulo esqueletos, o editor abre com o esqueleto da linguagem (o main e as leituras de costume). Use em lista ou prova de disciplina, quando o esqueleto ajuda o aluno.

2. Regras (Central › Regras) — opção por opção

Identidade e janela

👁 O que o time vê durante a prova

⚖️ Julgamento (linguagens, pool, veredicto manual)

Salvar grava só o que mudou (a Auditoria registra só isso). Se uma opção estiver errada (por exemplo, um fuso que não existe), nada é gravado e a mensagem diz qual opção corrigir.

Pela CLI, tudo isso é moj contest -c <cid> settings set chave=valor (ex.: settings set manual_verdict=true review_judges=3).

3. Papéis especiais — o que são e como habilitar

Habilitar um papel é só criar a conta com o sufixo certo no login — no painel Pessoas › Contas (ou moj contest -c <cid> users add fulano.judge). Não há caixinha de permissão: o sufixo É o papel. O auto-cadastro público nunca cria conta com esses sufixos (reservados), e operações em massa (reset de senha, desabilitar) pulam contas privilegiadas de propósito.

Papel Sufixo Pode Não pode
Administrador .admin Tudo: painel ⚙, submeter a qualquer hora, ver problemas antes da largada, placar sem freeze, votar como juiz, resolver conflitos, responder clarifications. Aparecer no placar (nenhum papel aparece).
Juiz (humano) .judge Aba Avaliar (correção manual), submeter/ver problemas a qualquer hora (testar a prova!), placar sem freeze, responder clarifications, Estatísticas. Resolver conflitos; painel admin.
Juiz-chefe .cjudge Tudo do .judge + painel Juiz-chefe: resolver conflitos de votos, editar respostas de clarification já dadas, ver o login e o nome de quem perguntou, liberar a reserva de outro juiz (botão próprio, com confirmação), opções e o que vai para revisão. Painel admin (Central › Regras etc.). Reservar uma clarification que outro juiz já reservou.
Staff .staff Fila de 🖨️ impressão e balões (pegar/imprimir/entregar, modo automático de quiosque). Ver problemas ou submeter (nunca); etiquetas; placar sem freeze.
Chefe de sede .cstaff Observar a fila do staff da sua sede (somente leitura), Etiquetas de credenciais dos competidores e do .staff da sua sede (com senha — exceto em contest que usa contas do treino, onde a senha é pessoal e não sai na etiqueta; a credencial do próprio chefe também não sai em etiqueta), o 🎥 telão da sede e a 🏆 revelação por sede depois do fim. Agir na fila de impressão; ver problemas/submeter; não herda .staff.
Monitor .mon Submeter DURANTE a prova (sem aparecer no placar), responder clarifications, Todas as Submissões e Estatísticas. Ver problemas antes da largada; correção manual.

Regra de ouro: nenhuma conta com sufixo de papel entra no placar ou nas estatísticas — crie quantas precisar sem medo de sujar o resultado.

Aviso da organização em qualquer página. Admin, juiz-chefe, juiz e .mon recebem, em qualquer página do contest, uma faixa no topo com som: 💬 clarification sem resposta (todos esses papéis), ⚖ veredicto esperando o seu voto (admin, chefe e juiz, com a correção manual ligada) e ⚠ conflito (admin e chefe). A contagem aparece também no título da aba. O som se repete a cada 2 minutos enquanto houver pendência; a faixa tem os botões para ativar ou silenciar o som e para pedir a notificação do sistema. A revelação do placar, o telão do Animeitor e a janela de editor não mostram a faixa. Detalhes em MANUAL-JUIZ.md.

Contest com usuários compartilhados do Treino Livre: uma conta de papel do treino não entra com o papel aqui. Só entram o .admin de quem criou o contest e os superadmins do treino. Juiz, staff e co-organizador = conta criada neste contest (seção 8¾).

4. Correção validada por juízes (veredicto manual)

Com Veredicto manual ligado, o julgamento automático continua rodando, mas o veredicto fica retido: o aluno vê a submissão pendente até juízes humanos validarem.

O fluxo, na aba Avaliar (página do .judge):

  1. O juiz pega uma submissão da fila (reserva com prazo; máx. N juízes na mesma).
  2. Vê o veredicto computado, o log e o código, e vota (confirmar ou trocar o rótulo).
  3. Quando N votos unânimes se acumulam (N = Nº de juízes que validam, padrão 2), o veredicto é liberado: entra no histórico do aluno e no placar na hora.
  4. Votos divergentes viram conflito: o juiz-chefe (.cjudge) decide no painel dele (um alerta global avisa).

Opções de veredicto. O juiz-chefe ou o admin edita a lista em 🏷️ Opções (painel do juiz-chefe ou Operação › Juízes). Cada opção tem três campos:

  1. O texto que o juiz vê e escolhe. Exemplo: 5 - NO - Wrong answer.
  2. A classe: uma das seis classes canônicas. A classe define a pontuação, a penalidade e a cor no placar. Exemplo: Wrong Answer.
  3. O texto que o time vê. Exemplo: Formato de saída errado. Deixe vazio para mostrar a classe. A classe Accepted não tem texto próprio.

Assim cada contest personaliza o que o time lê sem mudar como o placar pontua.

Quantas pessoas você precisa? No mínimo N contas .judge (o quórum) + 1 .cjudge para conflitos — e recomendo N+1 juízes para a fila não travar quando alguém pausa. O .admin também vota (conta como juiz), mas em prova grande deixe o admin livre p/ operar. Com N=1 um único juiz revisa tudo (bom p/ prova pequena); N=2 é o padrão equilibrado; N≥3 é para finais onde o veredicto precisa de banca.

5. Documentos da prova (Evento › Documentos — módulo documentos)

A aba existe para o .admin e para o juiz-chefe (.cjudge), e produz os documentos da prova — cada um em PDF e HTML, em português, inglês e espanhol:

Documento O que sai De onde vêm os dados
Ambiente de julgamento (info sheet; era "Informações do ambiente") No padrão da folha da Maratona SBC: sistema operacional e versões dos compiladores, linguagens aceitas com as extensões, limites de memória, tempo, tamanho de fonte, saída e compilação, as linhas de compilação e execução de cada linguagem (as mesmas do juiz), os veredictos, as notas de julgamento, a penalidade e os tempos de resposta. Texto editável (Markdown) + dados vivos: run/registry (o que os juízes reportam), o conf do contest e o TL calibrado.
Caderno da prova Capa + um enunciado por problema, na ordem das letras. Onde o problema tem PDF próprio no contest, é esse PDF que entra (diagramação preservada); senão o enunciado é renderizado no molde dos cadernos da Maratona SBC: Computer Modern com entrelinha e hifenização de LaTeX, título do problema centralizado, exemplos em caixas empilhadas (como no site) — ou, marcando "exemplos do caderno em tabela" no painel Documentos, numa tabela "Exemplo de entrada · Exemplo de saída" como a da SBC (exemplo com linhas longas fica melhor empilhado) — e rodapé "evento – Problema X – título" com o número da página. PROBS do contest, enunciados/<chave>.{pdf,html} e, se faltar, o enunciado do banco.
Folha de time limits Tabela letra · nome · tempo limite por teste. Se o limite é o mesmo em todas as linguagens, sai uma coluna e a nota "não depende da linguagem". Se difere, sai uma coluna por linguagem. Mais a errata que você escrever. O TL calibrado e servido aos juízes (run/tl).
Editorial Uma capa (título, data, nota introdutória e índice dos problemas) e a solução de cada problema, na ordem das letras, cada problema em uma página nova. Gere e revise quando quiser; o servidor só deixa PUBLICAR depois do fim da prova (contando prorrogações por sede) — e o time só o baixa com a prova encerrada. O docs/solucao.md do pacote de cada problema (o texto que o autor escreveu e que nunca vai ao aluno).

Fluxo, do começo ao fim

  1. Preencha os dados (⚙️ Dados dos documentos): versão do caderno (v1.0), nota da capa e errata. Salve.

  2. Ajuste a capa, se quiser (🎨 Capa do caderno). São dois modos, nesta ordem de precedência: PDF enviado › texto. O texto já abre com a capa padrão do MOJ — é ela, escrita em Markdown —, então você edita só o que quiser mudar. Os marcadores são substituídos na geração: {{CONTEST_NAME}}, {{DATE}}, {{N_PROBLEMS}}, {{N_PAGES}}, {{SITES}}, {{VERSION}} e {{NOTE}} (a nota da capa). {{N_PAGES}}, {{SITES}} e {{NOTE}} são opcionais: o bloco em que um deles fica vazio some. Envie um PDF quando a capa for arte pronta do evento — ela entra como está e o resto do caderno é anexado depois dela.

    Logo (🏷️ Logo do cabeçalho, opcional): uma faixa com os logos do evento (PNG, JPEG, WebP ou SVG, até 5 MB) que sai no topo de cada página do caderno e do editorial e na capa gerada, como nos cadernos da Maratona SBC. Vale para os três idiomas; remover tira.

  3. Ajuste o texto do info sheet, se quiser (📝): também Markdown, com os marcadores {{TOOLCHAIN}}, {{TL_TABLE}}, {{LANGS_TABLE}}, {{MEMLIMIT}}, {{STACK}}, {{CONTEST_NAME}} e {{DATE}}.

    Os dois textos usam o editor do MOJ (cores do Markdown e números de linha) com uma aba por idioma (PT · EN · ES), como na gestão de problemas. Salvar grava todos os idiomas alterados; voltar ao padrão devolve o idioma da aba ao texto do MOJ.

  4. Gere (botão de cada linha, ou Gerar todos (pt+en+es)), ou envie um PDF pronto (botão subir PDF da linha). O PDF enviado é um documento completo: ele vence o gerado em tudo que o MOJ serve e pode ser publicado sem gerar. Voltar ao gerado apaga só o enviado (num documento publicado sem PDF gerado, o MOJ recusa: gere antes ou despublique). Converter os PDFs leva alguns segundos — o caderno é o mais demorado, porque junta um PDF por problema. Se a conversão para PDF falhar, a mensagem diz qual documento falhou e o PDF anterior (se havia) continua o que todos baixam.

  5. Confira: cada linha tem PDF, HTML e abrir. Reveja antes de publicar. Algo torto no PDF gerado — espaço demais ou de menos entre os elementos, uma imagem grande — que o Markdown do enunciado causou? Cada documento gerado tem também o ✎ .odt, o arquivo editável que deu origem ao PDF. Baixe, ajuste no LibreOffice (ou Word), exporte em PDF e suba em subir PDF: o enviado vence o gerado e é ele que todo mundo baixa. O .odt do caderno traz a capa como página editável seguida dos enunciados; se a capa é um PDF enviado, ou um problema tem enunciado em PDF próprio, o .odt marca o lugar e você junta o PDF ao exportar. Só o admin e o juiz-chefe baixam o .odt.

  6. Publique (só documento com PDF — gerado ou enviado). Publicar faz duas coisas: o documento passa a aparecer na seção Prova da página do contest e em Documentos. Quem vê o quê:

Regenerou? Publique de novo não é preciso — o link publicado aponta para o documento atual, então gerar de novo já entrega a versão nova a quem baixar. Mas avise a sede: quem já imprimiu ficou com a versão velha (é para isso que serve o campo versão do caderno na capa).

🌐 O caderno e o editorial saem no idioma do documento. O caderno em inglês usa o enunciado.en.md de cada problema (ou o HTML/PDF em inglês que você enviou no painel de Problemas), e o editorial em inglês usa o solucao.en.md. Um problema sem tradução sai em português no meio do caderno — o documento nunca fica só com a capa traduzida. O título do problema sai traduzido quando o pacote tem o título naquele idioma. Prova bilíngue com enunciado pronto por fora continua entrando pelo PDF enviado.

∑ As fórmulas saem no PDF como no enunciado da página, inclusive a barra vertical (|x|, a | b) — o autor não precisa escapar nada. Se algum símbolo de fórmula sair com um ¿ vermelho no PDF, é defeito do gerador, não do enunciado: reporte (com o problema) e, enquanto isso, envie o PDF pronto daquele caderno. Um caderno gerado antes de um conserto não se refaz sozinho — gere de novo.

🖼 Imagens do enunciado cabem na página. No PDF, cada imagem sai no máximo do tamanho que tem na página web e nunca maior que a área útil (imagem grande é reduzida, mantendo a proporção). A largura que o autor pediu no enunciado (![](figura.png){width=50%}) vale também no PDF.

🔒 O caderno é conteúdo de prova. Antes de publicar, só .admin e .cjudge o baixam. Publicado, antes do início só os juízes (.judge) somam-se a eles. Para a sede e os times a API responde 404 até o início — não é uma trava de interface.

6. Rodadas: aquecimento e prova oficial (Evento › Rodadas — módulo rodadas)

Toda maratona roda um aquecimento (dress rehearsal) antes da prova: dois ou três problemas fáceis, no dia anterior ou na manhã do dia, para o time ligar a máquina, testar o login, o editor, a impressão e o balão — e para a sua equipe de juízes e staff ensaiar. Depois disso a prova começa no mesmo contest, porque é a configuração dele (contas, senhas, sedes, cores de balão, time limits, linguagens, pool de juízes) que você quer garantir.

No MOJ isso são rodadas. A rodada no ar é a que aparece em Central › Regras e em Prova › Problemas; as demais ficam planejadas até você promover.

O roteiro (repare na ordem: o aquecimento vem PRIMEIRO)

  1. Monte o contest normalmente, com os problemas do aquecimento e a janela do aquecimento.
  2. Em Evento › Rodadas, dê o nome certo à rodada no ar (aquecimento, tipo aquecimento) e crie a próxima (oficial): janela, freeze e a lista de problemas da prova de verdade. A lista fica guardada e só entra no ar na promoção — ninguém vê os problemas da prova antes. Você pode usar qualquer problema que o dono do contest pode ver: público, seu, de colaborador ou da sua org. A regra é a mesma de Prova › Problemas, na rodada no ar e na planejada. Cada rodada pode ter as suas cores de balão. Abra a rodada, vá em "🎈 Cores dos balões desta rodada" e salve. As cores entram no ar quando a rodada for promovida. Uma rodada sem cores próprias herda as cores em vigor. Na rodada no ar, esta seção e Evento › Balões editam a mesma coisa.
  3. Rode o aquecimento. O time vê uma faixa fixa dizendo que é aquecimento e que aquele placar não é o da prova. Trate-o como ensaio geral da operação inteira: se o login abre no minuto do início (modelo ICPC), esse é o único momento em que cada papel toca as telas de verdade sem nada em jogo. Entregue antes a cada pessoa o tutorial do papel dela (/contest/ajuda/) e peça que rode a própria lista: o time (entrar, abrir problema, enviar de propósito, clarification, impressão, backup, placar), a equipe de sala (impressora, o pop-up liberado, kiosk, o trajeto), o chefe de sede (todo time da sede entrou pelo menos uma vez), os juízes (opções de veredicto, log/código, a dupla lendo igual), o chefe (nº de juízes, o que vai para revisão, alarme de conflito) e o telão (projetor, conexão com o Animeitor — publicar os placares e ligar o alimentador —, fotos e músicas).
  4. Quando terminar, clique 🚀 Promover agora. O MOJ confere o checklist e, se estiver tudo pronto:

Registrei a PROVA primeiro — e agora? Aconteceu de montar o contest já com a prova e só depois criar a rodada de aquecimento? Não promova — promover arquiva a rodada no ar (a sua prova, vazia), e arquivo é imutável. O certo é inverter editando as duas rodadas ali mesmo (o painel avisa quando detecta uma planejada começando antes da que está no ar):

  1. Edite a rodada planejada: renomeie para prova, tipo prova oficial, e dê a ela a janela + freeze da prova; em Problemas da rodada, coloque a lista da prova (fica guardada, ninguém vê).
  2. Edite a rodada no ar: renomeie para aquecimento, tipo aquecimento, janela do aquecimento (sem freeze) e troque os problemas pelos do aquecimento — na rodada no ar, salvar aplica na hora.
  3. Confira em Central › Regras que a janela vigente é a do aquecimento — e siga o roteiro normal a partir do passo 3.
  4. Depois: o placar e as submissões do aquecimento continuam legíveis em Rodadas (e você pode publicar a rodada para os times verem). O arquivo bruto em .tar.gz — com código-fonte — sai por um clique, para a auditoria posterior.

O checklist é sério. A promoção RECUSA enquanto houver:

Bloqueador Por quê
round_running a rodada no ar não terminou (contando prorrogação por sede)
jobs_in_flight tem submissão no spool/fila do juiz. Se ela fosse julgada depois da troca, o tempo seria calculado contra o início da prova e a submissão do aquecimento reapareceria no histórico da prova
pending_verdicts ainda há submissão sem veredicto no histórico
review_pending tem submissão na correção manual sem veredicto liberado — o voto do juiz cairia no placar da prova
judged_down o daemon de julgamento não está vivo, então a fila não drena
no_next_round não há rodada planejada
official_over a rodada no ar é a prova oficial e já terminou: promover arquiva o resultado dela e o placar visível volta a zero. Para mostrar o resultado, não promova: desligue o segredo em Regras e publique o relatório

Há um --force (checkbox "ignorar os bloqueadores"), para emergência: ele não desfaz o risco, só assume que você sabe o que está fazendo. O único que o --force não ignora é o no_next_round (sem rodada planejada não há para onde promover).

Promoveu sem querer? Desfaça. Em Evento › Rodadas, o cartão ↩︎ Desfazer a última promoção (ou moj-contest rounds undo) volta a rodada arquivada para o ar com tudo o que ela tinha — submissões, veredictos, clarifications, impressões, placar — e a rodada que entrou volta a planejada. Só funciona enquanto a rodada que entrou não teve nenhuma atividade (nenhuma submissão, clarification, impressão ou aviso); senão o cartão diz o que aconteceu nela. Você digita o id do contest para confirmar, e fica no audit. Foi o caso do TCP 2026: depois da prova, o organizador criou uma rodada extra e a promoveu, e o placar zerou.

Contest que usa as contas de outro (USERS_FROM) promove normalmente — o arquivamento só mexe no users/ local. Já foi bloqueador; deixou de ser, porque é justamente o caso de uso real (aquecimento + prova com as contas do treino).

O que NÃO muda na promoção: contas e senhas, times/sedes/bandeiras, escopo do staff, cores de balão, regiões, time limits calibrados, linguagens, pool de juízes, a tabela do que vai para revisão e os textos/capa dos documentos. O que zera: placar, histórico e submissões dos times (arquivados, não perdidos), balões, numeração de impressão, prorrogações, e a lista de documentos publicados.

⚠️ Cores de balão são por LETRA. Se o problema A do aquecimento e o A da prova são diferentes, a cor do balão A é a mesma nas duas rodadas. Confira em Evento › Balões antes da prova.

Na CLI: moj contest -c <cid> rounds ls | add | set | problems | promote | publish | archive.

6½. Depois da prova: encerrar o evento

Quando a prova acaba, o placar continua congelado e os documentos seguem não publicados até alguém mandar liberar — nada disso vira automático com o relógio. A Central passa a mostrar o bloco "Depois da prova" com o checklist do que ainda está fechado e o botão 🏁 Encerrar evento, que faz de uma vez as duas coisas que todo mundo esquece:

  1. abre o placar — tira o congelamento (FREEZE_TIME=0), então o resultado final fica público (é o mesmo efeito do botão "🔓 Descongelar tudo (público)" da cerimônia de revelação). O MOJ só aceita descongelar a partir do fim da prova para todas as sedes + 1 minuto. A prorrogação de uma sede conta. A regra vale para todos os caminhos: este botão, a cerimônia, o campo de freeze na Central e a promoção de rodada. A tela mostra a hora a partir da qual o botão fica disponível;
  2. publica os documentos já gerados que ainda não estavam publicados — caderno, folha de limites de tempo, info sheet e editorial passam a aparecer em "Arquivos & Recursos" para os times. (O editorial só pode ser publicado depois do fim; por isso ele entra aqui.)

O botão não mexe no resto: liberar o relatório de correção para os times (SHOWLOG), mostrar os limites de tempo e liberar as coortes (convidados) continuam sendo escolha sua — cada um aparece no checklist com o atalho "resolver →" para a tela certa. Só roda depois que a prova terminou para todas as sedes (prorrogação por sede conta) e pode ser repetido à vontade: na segunda vez ele não faz nada.

Fecha o ciclo com o relatório final (Prova › Relatório): o tar.gz navegável leva o placar aberto, as submissões, as estatísticas completas, os enunciados e os documentos publicados — é o pacote que se manda para os participantes e para o arquivo do evento. Ao lado do download há 📢 Publicar como histórico: o mesmo site passa a existir em https://moj…/relatorio/<contest>/ e o card do contest na página inicial e no /contests/ ganha o botão 📑 Relatório — é o histórico do evento. A geração roda em segundo plano (~1–2 min numa prova grande; o painel mostra "publicando…" e troca sozinho quando termina). É público: o relatório não carrega código-fonte, log de juiz nem senha, e as clarifications saem anônimas, mas mostra nomes de times, runs e estatísticas — publique quando tudo já foi divulgado. 🔄 Republicar gera de novo e troca o site inteiro de uma vez (quem estiver lendo não vê meio-caminho); Despublicar apaga o endereço e o botão dos cards. As rodadas arquivadas (aquecimento, por exemplo) têm o próprio botão em Prova › Relatório: 🌐 publicar coloca o relatório gerado na promoção em /relatorio/<contest>/rodada/<slug>/ — e a página inicial do relatório principal, ao ser (re)publicada, passa a linkar as rodadas públicas em "Rodadas anteriores deste evento".

O MOJ recusa publicar o relatório quando ele mostraria o que ainda não é público:

6¾. Participação virtual (Evento › Virtual — módulo virtual)

Com a prova encerrada, qualquer conta do Treino Livre pode refazer o contest uma vez, no próprio tempo, contra o placar oficial. O placar oficial não muda. Referência completa: docs/VIRTUAL.md.

Para ligar: Central › Módulos › Participação virtual. O módulo só liga quando:

  1. o contest não é secreto;
  2. o modo é ICPC;
  3. o placar não é anônimo;
  4. o contest tem início e fim;
  5. todos os problemas já são públicos no treino. Se algum não for, a resposta é um erro que diz quantos faltam. Publique os problemas primeiro (gestão de problemas) e ligue de novo.

O cartão do módulo mostra o cadeado e o que falta, e a Central avisa quem já está ligado sem isso. Na criação (spec, template ou cópia), um contest que não cumpre essas condições nasce com o módulo desligado, e a tela do resultado (ou a CLI) diz por quê: ligue depois, em Central › Módulos.

Você pode ligar o módulo antes do fim da prova (com os problemas já públicos). Ele fica inerte e abre sozinho quando a prova termina para todas as sedes e o placar é descongelado (botão Encerrar evento). O botão Virtual no card do contest e o aviso no placar só aparecem quando a participação virtual pode ser feita.

Atenção: ligar este módulo torna o placar final e a lista de problemas visíveis para contas do treino. Um contest que não pode ser visto por fora não deve ligar o módulo.

O painel Evento › Virtual mostra:

Regra do participante (ele a lê antes de largar): uma participação por conta; pode desistir sem gravar nos primeiros 15 minutos ou enquanto não tiver nenhum aceito, no máximo 2 vezes; a 3ª largada é definitiva.

7. Máquinas dos times (Máquinas › Gate & trava — módulo maquinas)

É no aquecimento que os times ligam de fato os computadores — e é dali que o MOJ tira o mapa time × IP × navegador da sala (do log de acessos do contest, recortado pela janela da rodada: nada novo é capturado). A aba mostra, por rodada:

Duas ações saem daqui e escrevem no lugar de sempre:

O gate POR SEDE (o caso da maratona)

Quando cada sede roda a sua imagem, o UA de cada máquina carrega um pedaço do próprio login do time: teambrspso001 (Brasil/BR, São Paulo/SP, Sorocaba/SO) roda numa imagem cujo UA contém brspso. Uma substring única não serve — então o MOJ deriva o esperado do login.

Na web (seção 🔒 de Máquinas › Gate & trava): o modo — Desligado, Observar (mostra o esperado × visto e o "UA fora da sede" nas Anomalias, sem barrar ninguém nem derrubar sessão: dá para ligar no meio da prova e conferir a sala) ou Barrar (o login devolve 403); abaixo vão a regex do login com captura e o UA esperado (\1), com um testador ao vivo ("testar com o login" → UA precisa conter brspso · sede Sorocaba), e três listas dobráveis — overrides por sede, regras por regex de login e isentos. Salvar já vale para o próximo login. Sem nenhuma regra o gate não faz nada: o painel diz "nenhuma regra: ninguém é barrado nem observado", salvar Barrar ou Observar sem regra é recusado, e a 🏁 Central avisa quando o módulo maquinas está ligado sem nenhum gate gravado (grave Desligado se for de propósito). Foi o que aconteceu no TCP 2026: o painel antigo marcava "ativo" sem regra nenhuma.

Na CLI, o mesmo:

moj contest -c <cid> ua-gate set --from-login '^team([a-z]{6})[0-9]{3}$' --expect '\1'
moj contest -c <cid> ua-gate set --region 'Sorocaba=brspso-v2'     # sede fora do padrão
moj contest -c <cid> ua-gate set --exempt '^ccl' --exempt time-reserva-07
moj contest -c <cid> ua-gate set --mode observe                     # olhar sem barrar (enforce = barrar, off = desligar)
moj contest -c <cid> ua-gate check teambrspso001                   # o que se espera dele
moj contest -c <cid> ua-gate show

Uma regra cobre todas as sedes de uma vez. A ordem de resolução é: isentos › conta de papel (sempre entra) › regra por regex › override da sede › captura no login › substring única (o login_ua_substring de sempre, que continua valendo como último recurso).

7¼. Sedes (Evento › Sedes & escolas — módulo sedes)

A sede de cada time alimenta o filtro do placar, o escopo do staff (region:<nome>), as etiquetas, o gate de navegador por sede, a estatística, a classificação e o telão. Todos usam a mesma regra:

  1. a sede gravada no time vence (o nome, sem diferenciar maiúsculas);
  2. senão, a regex mais funda que casa o login (sem diferenciar maiúsculas);
  3. um grupo/país soma as sedes abaixo dele; um nó com o mesmo nome da sede também a conta;
  4. uma sede gravada que não existe na árvore aparece como "fora da árvore" e conta no nó que a regex daria;
  5. um recorte (view: supersede, times femininos) agrupa times que já estão nas sedes e nunca é a sede de ninguém.

O painel tem três modos. Escolha o que der conta do seu contest; dá para subir de modo a qualquer momento. Um modo que não cabe na árvore atual fica desabilitado e diz por quê.

A prévia embaixo mostra o que o placar, as etiquetas e o escopo do staff vão ver: quantos times cada sede tem, quem ficou sem sede, quem parou num grupo/país (a regex casou o grupo e nenhuma sede dele), quem casa em duas sedes e as sedes gravadas fora da árvore. "A salvar" resume a mudança. Se outra aba ou a CLI mudou as sedes depois que você abriu a tela, o salvar recusa: recarregue e refaça.

Time inscrito guarda a sede na inscrição: ela não some quando o time muda. A Central mostra o item Sedes quando há algo a conferir.

A regex segue um subconjunto que casa igual no navegador e no servidor: \d \w \s e (?: servem; \b, (?=, [[:classe:]], quantificador preguiçoso, hífen ambíguo dentro de [ ] e acento não servem (o login não tem acento). O salvar diz qual sede e por quê.

Na CLI: moj-contest -c <id> regions show|who|assign|set|map.

7½. Anomalias de máquina (Máquinas › Anomalias) e Sessões (Pessoas › Sessões)

Na Maratona 2026 só deu para responder "algum time usou duas máquinas?" depois da prova, cruzando logs à mão. O painel Máquinas › Anomalias responde durante a prova (as sessões ativas, o sair em massa e o log de acessos, que valem para QUALQUER contest, ficam em Pessoas › Sessões). Quem identifica a máquina é o navegador da imagem do mlinux (machine_id/boot_id) — com ou sem gate. Login de navegador comum só tem o IP, e atrás de NAT o IP é a sede inteira: esses logins ficam fora das anomalias de máquina (aparecem só em "UA fora da sede" e na lista de sessões). O "UA fora da sede" precisa do esperado de cada time, isto é, do gate em Barrar ou Observar. Sem nenhuma máquina identificada o painel avisa e mostra só as sessões e o log de acessos.

8. Times convidados (coortes de placar — Evento › Coortes, módulo coortes)

Maratona convida times que competem sem entrar na disputa oficial — o pessoal chama de convidado, extra-oficial, "CCL". O MOJ trata isso como coorte: um grupo de times com política de visibilidade própria.

O que uma coorte privada garante

Como configurar (Evento › Coortes)

Uma linha por coorte, com o que decide o comportamento: id, nome, regex do login, pública (aparece no placar público), extra-oficial (entra sem consumir posição), padrão (quem não casa nada cai nela) e vê — as caixas que dizem quais coortes aquela visão enxerga (a coorte sempre vê a si mesma). A coluna times conta quantos estão em cada uma.

Para mudar a coorte padrão, marque o rádio da outra linha e salve aquela linha. Remover uma coorte exige que ela esteja vazia (e a padrão nunca é removível).

A mesma coisa na CLI:

moj contest -c <cid> cohorts ls
moj contest -c <cid> cohorts add ccl --name "Café com Leite" --regex ccl --private --unranked
moj contest -c <cid> cohorts assign timeconvidado07 ccl     # convidado sem 'ccl' no login
moj contest -c <cid> cohorts materialize                    # carimba a regra em campo por time
moj contest -c <cid> cohorts release                        # o "liberamos tudo" (pede o id)

A coorte casa por regex no login e/ou pelo campo .team.cohort de cada time (o campo vence). materialize transforma a regra em dado: depois disso, mudar o regex não remaneja ninguém. Quem não casa nada cai na coorte default (a dos oficiais).

O que continua completo, de propósito — são papéis privilegiados, e você precisa deles: Todas as Submissões, Estatísticas (inclusive quem resolveu primeiro), a fila do staff (o balão do convidado tem de ser entregue) e o relatório final. Duas consequências práticas:

ℹ️ Sobram dois canais numéricos que não escondem identidade mas existem: a página de status pública conta as submissões pendentes de todos os times, e a numeração de tarefas de impressão é única por contest (saltos indicam atividade que o time não vê).

8½. Inscrição prévia e times de 3 contas do treino

Vale para contest criado com "usuários compartilhados do Treino Livre". Ligando a inscrição (Pessoas › Inscrições → Ligar inscrição), o contest passa a ter uma porta: quem não se inscreveu não entra (a API recusa o login, não é só a tela).

Como a pessoa se inscreve: no site principal, logada no treino, em /contests/inscricao/?c=<id> (o cartão do contest na home ganha o botão 📝 Inscreva-se). Ela escolhe individual ou criar um time: dá um nome e convida até 2 logins do treino; cada convidado precisa aceitar. Enquanto a janela estiver aberta dá para sair, renomear e desfazer. Participação é exclusiva — aceitar convite desfaz a inscrição individual.

O convite avisa sozinho. No instante em que o capitão convida, o mojinho manda uma DM ao convidado com o link de aceitar/recusar; e na véspera do fechamento (24 h antes) manda um único último aviso para quem ainda não respondeu (a mensagem sai em português; se o contest estiver com LOCALE=en, vai em inglês e português no mesmo texto — DM não tem seletor de idioma). Só alcança quem tem Telegram vinculado (perfil do treino → 📨 Telegram) — por isso a lista de convites mostra 📨 (alcançável) ou ⚠️ (sem canal), e o resumo conta quantos ficaram sem. Na tabela de times, cada convite pendente tem o botão 🔔 para cutucar na hora, e o cabeçalho tem 🔔 Lembrar todos; cutucar à mão não cancela o aviso automático da véspera. Para desligar o automático neste contest, desmarque lembrete automático na caixa da janela (grava REG_REMIND=n). Isso importa porque quem não aceita o convite não entra no time — e às vezes nem está inscrito.

Na prova, cada membro entra com o PRÓPRIO login e senha do treino e a sessão vira a do time: o placar, os balões e a impressão veem uma linha só. Quem estava no teclado fica registrado (var/actor-log e a 5ª coluna do var/access.log) — útil para conferir depois.

A janela (Pessoas › Inscrições → Janela de inscrição): abre (vazio = já aberta), fecha (vazio = o início da prova) e atraso (min) — minutos após o início em que ainda dá para entrar, mas na coorte …-atrasado, que aparece no placar sem ocupar posição (é a extra registration do Codeforces). Passou disso, a porta fecha.

Em que relógio estão esses campos: no do seu navegador — a caixa mostra qual é, logo abaixo. Já as horas que o MOJ escreve para as pessoas (a DM do mojinho, o checklist pré-prova, a data do caderno, o relatório final) saem no fuso da prova, que você define em Central › Regras → 🕒 Identidade e janela → Fuso horário da prova (vazio = America/Sao_Paulo). Quando os dois relógios diferem, a caixa da janela mostra também o horário no fuso da prova, para não haver dúvida. Digite o nome de qualquer fuso (America/Santiago, America/Mexico_City…). A lista sugere todos, começando pelo do seu navegador. Use o fuso da sua cidade, e não outro que tenha a mesma hora hoje: o horário de verão muda em datas diferentes em cada país, e os textos sairiam com 1 h de diferença depois da troca. O fuso também pode ser escolhido no assistente de criação, e vai junto ao exportar, duplicar ou salvar um template. Pela CLI: moj-contest -c <cid> settings set tz=America/Santiago.

Placar: a inscrição semeia as coortes individual e times, cada uma com placar próprio — o seletor "Placar: Geral | Times | Individual" aparece sozinho na página do placar. Se o contest já tinha coortes configuradas, o checklist pré-prova avisa que faltam essas duas.

Com AQUECIMENTO (o esquenta que fica dias no ar): planeje as duas rodadas em Evento › Rodadas (aquecimento agora, prova oficial na data real). Por padrão o aquecimento também exige inscrição — é nele que o competidor resolve login, submissão e placar; deixar entrar sem inscrição só empurra o problema para o dia da prova. A inscrição fecha sozinha no início da prova oficial (é essa data que o "fecha" herda, não a do aquecimento). Se você preferir o aquecimento de porta aberta (qualquer conta da fonte entra sem inscrição), ligue REG_WARMUP_OPEN=y no conf — nesse caso a promoção derruba a sessão de quem não se inscreveu e o placar da prova nasce só com os inscritos; o painel mostra o selo 🔥 aquecimento: entrada livre enquanto isso vale.

O modo de participação é definitivo: depois de inscrito (individual ou em time), o competidor não cancela nem troca de modo sozinho — a página de inscrição deixa isso claro antes da escolha, e qualquer mudança passa por você (Pessoas › Inscrições: remover, dissolver, inscrever à mão).

O time também declara na inscrição: a universidade (vira o prefixo [SIGLA] Nome do Time no placar e a coluna/filtro de escola), o uso de IA (aparece como 🤖 ao lado do nome — é transparência, não julgamento), a bandeira (país ou estado do Brasil — a bandeirinha do placar) e uma foto do time (a que vai ao telão; reprocessada no servidor, sem metadados). Tudo editável pelo capitão enquanto a janela estiver aberta, e visível no seu painel e no CSV. O inscrito INDIVIDUAL declara as mesmas coisas (menos a foto): universidade, IA e bandeira, na inscrição ou depois, pela mesma página. A organização ajusta qualquer um pelas ações team-meta/individual-meta do painel — sem regra regex no teams-meta.json (o mecanismo legado continua valendo só como sobreposição visual).

Dica de dia de prova: o checklist da Central mostra quantos se inscreveram e quantos convites ficaram pendentes — convite não aceito significa gente achando que está no time e que, na hora, não entra.

8¾. Contas compartilhadas com o Treino Livre: escolher e desfazer

Na criação (passo 3 do wizard) você escolhe entre contas próprias do contest e usuários compartilhados do Treino Livre. No compartilhado, cada pessoa entra com a conta e a senha do treino. É prático para lista de exercícios. Numa prova, saiba o que isso implica:

  1. Login e senha são os do Treino Livre. Você não os vê nem os redefine, e as etiquetas saem sem senha.
  2. Qualquer conta do Treino Livre entra. Para limitar, ligue o módulo Inscrições (seção 8½).
  3. Só o seu .admin (o de quem criou o contest) e os superadmins do treino entram com papel. Juiz, staff e co-organizador precisam de conta própria do contest (Pessoas › Contas, seção 3).
  4. Não existe troca de senha geral da prova: quem sabe a senha do treino de alguém entra como essa pessoa aqui também.
  5. Dá para desfazer, convertendo em contas próprias (abaixo). A conversão não tem volta.

O wizard só cria o contest compartilhado depois do ☐ Entendi. A Central mostra o item Contas compartilhadas enquanto o contest estiver assim.

Agir num participante compartilhado. Em Pessoas › Contas, quem entra pela conta do treino aparece com 🔗 treino. Desabilitar barra a pessoa neste contest (a conta do treino continua valendo lá) e reabilitar desfaz. Desclassificar tira do placar. Remover barra de vez: a pessoa não volta pela conta do treino. Uma conta que você criou ou resetou aqui passa a valer com a senha daqui: a do treino deixa de abrir essa conta neste contest.

Converter em contas próprias (Pessoas › Contas › cartão 🔗 Contas compartilhadas):

  1. Ver prévia da conversão. Nada é gravado. A prévia conta quem ganha conta (quem tem pasta no contest, sessão aberta, registro no log de acessos ou inscrição), os times, os membros de time que perdem o login e os avisos.
  2. Confirme. Antes da prova, marque ☐ Entendi. Com a prova já começada, digite o id do contest. Se a lista mudou entre a prévia e a confirmação (alguém entrou), a tela mostra a prévia nova e pede a confirmação de novo.
  3. Baixe o CSV das credenciais na hora. As senhas novas só aparecem ali e nas Etiquetas.

O que a conversão faz:

Na CLI: moj-contest -c <id> users convert (prévia) e users convert --apply --csv creds.csv.

9. Template de usuários (habilita todas as funções)

Cole na carga em lote de Pessoas › Contas (uma linha por conta: login nome), ou crie um a um com moj contest -c <cid> users add <login> --name "<nome>":

juiz1.judge      Juiz Um
juiz2.judge      Juiz Dois
juiz3.judge      Juiz Três (reserva do quórum de 2)
chefe.cjudge     Juiz Chefe
apoio1.staff     Staff de impressão e balões
sede1.cstaff     Chefe da Sede 1 (etiquetas + revelação)
monitor1.mon     Monitor (responde clarifications)

Depois: ligue Veredicto manual (e ajuste o Nº de juízes) em Central › Regras; distribua as senhas geradas; cada pessoa loga na MESMA tela do contest e vê os botões do seu papel.

9½. Painel do treino › Contests e quem pode criar

O painel administrativo do Treino Livre (/treino/admin/, conta .admin) tem a aba 🏆 Contests. Ela lista os contests criados pela interface e controla quem pode criar contests e problemas.

Quem vê o quê. A regra vale na API, não só na tela.

Filtros da lista. Busque por nome, id ou dono. Filtre por dono, modo e situação (por vir, em andamento, encerrado). Ordene por data de criação, início, nome ou dono. Marque só os meus para ver apenas o que você criou. O dono aparece com foto, nome e link para o perfil.

Id reservado. Um id que começa por icpc é da organização da Maratona. Só um super-admin cria um contest com esse id. O assistente avisa antes e a API recusa.

Prioridade (coluna Prioridade). O super-admin muda a prioridade de qualquer contest direto na tabela, inclusive Super, que passa na frente de toda fila. Este é o único lugar para dar ou tirar Super. O assistente só oferece Super ao super-admin, e uma cópia (duplicar) de um contest Super feita por outra conta nasce como Prova. Os demais administradores só veem a coluna: o admin de cada contest muda as outras prioridades em Central › Regras. Toda mudança fica na Auditoria do contest e na trilha do treino (feed 📜 Atividade, ação contest-priority). Pela CLI: moj contest priority <cid> <prioridade>.

Quem pode criar contests e problemas. A mesma permissão vale para criar contests e para criar problemas e coleções na Gestão de Problemas. Contas .admin sempre podem. Para as demais:

10. Referências