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.
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 |
| 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. |
| 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:
LOCALE) se ele for
oferecido; senão, no primeiro. O competidor troca com os chips
PT · EN · ES e o MOJ lembra a escolha dele.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.
moj-contest -c <cid> problems titles
mostra os títulos de cada problema, e problems apply-titles
faz o mesmo que o botão da Central.| 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. |
| 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). |
| 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¼. |
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.
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.
USERS_FROM)converter em contas próprias desliga o móduloinscricoesesqueletosvirtualsedesmaquinasrodadasdocumentosbaloescoortestelaoclassificacaoesqueletos)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.
FUNCTION_LANGS) abre vazio nas linguagens do driver: o
main do esqueleto daria Compilation Error.solution.<extensão>. Em Java, não declare a classe
como public (o javac exige que uma classe
pública tenha o nome do arquivo). A Central avisa.moj-contest -c <cid> esqueletos ls|show|set|off|reset.Identidade e janela
👁 O que o time vê durante a prova
.mon, .animeitor) vê o placar completo.
Ligado, o relatório não pode ser publicado, o site da rodada arquivada
fica fechado, a classificação não aparece e a participação virtual não
abre.⚖️ Julgamento (linguagens, pool, veredicto manual)
SUBMIT_MAX_INFLIGHT=<n>
(0 desliga).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).
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
.adminde quem criou o contest e os superadmins do treino. Juiz, staff e co-organizador = conta criada neste contest (seção 8¾).
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):
.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:
5 - NO - Wrong answer.Wrong Answer.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.
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
Preencha os dados (⚙️ Dados dos
documentos): versão do caderno (v1.0), nota da capa e
errata. Salve.
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.
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.
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.
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.
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ê:
.admin, .cjudge e .judge
baixam. A sede (.staff, .cstaff), o
.mon e os times só a partir do início — o caderno
na mão de alguém antes da prova é a prova vazada, não importa o papel. A
sede imprime a partir do início (o + notícia desses dois é
recusado antes do início, porque a notícia anexa o PDF).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.mdde cada problema (ou o HTML/PDF em inglês que você enviou no painel de Problemas), e o editorial em inglês usa osolucao.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 (
{width=50%}) vale também no PDF.
🔒 O caderno é conteúdo de prova. Antes de publicar, só
.admine.cjudgeo 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.
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)
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.rounds/<rodada>/, mais um relatório
navegável da rodada;freeze_locked com a hora. A
opção "ignorar os bloqueadores" não passa por cima desta regra. Você
digita o id do contest para confirmar. Tudo é auditado.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):
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ê).aquecimento, tipo aquecimento, janela do
aquecimento (sem freeze) e troque os problemas pelos do aquecimento — na
rodada no ar, salvar aplica na hora..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 nousers/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.
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:
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;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:
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:
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:
/treino/virtual/?c=<contest>);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.
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:
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).
--mode off desliga sem
apagar a configuração.curl --resolve moj…:443:<IP>
da máquina de prova ao site base (treino, backups que o aluno subiu
antes, outro contest). Com a trava, cada login de competidor
prende o IP de origem (a saída da sede) a esta prova
até o fim + folga (com rodadas, até o fim da última rodada planejada: o
IP preso no aquecimento segue preso na oficial); daquele IP qualquer
outro alvo responde 403 site_locked,
inclusive sessão do treino aberta antes. Contas de papel são isentas.
Toda reivindicação e todo bloqueio vão ao audit
(site-lock-claim, site-lock-block) e aparecem
em Máquinas › Gate & trava (trava de sede), com "soltar" por IP e
"prender IPs já vistos" (útil na manhã da prova). Efeito colateral
aceito: durante a janela, todo mundo atrás daquele IP público perde o
treino.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:
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ê.
region:), o gate de navegador da sede e a sede do telão.
Ao salvar, a tela avisa se algo ainda aponta para uma sede que não
existe mais. Por IP da máquina da prova: Máquinas › Gate.view e regex livre.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.
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.
login_disabled; a organização entra),
deslogar competidores, staff e chefes de
sede ou os dois (nunca admin, juízes, chefe, monitor nem
telão), promover a rodada em Evento › Rodadas, e reabrir o
login quando os times puderem entrar. Cada sessão derrubada
vira evento na linha do tempo; a ação vai ao audit
(logout-all).moj-comp) e de pacotes
offline. Vale mesmo sem gate. A CLI se identifica no User-Agent
(moj-comp/<build>) e, na máquina de prova, manda na
frente o mesmo User-Agent do navegador da imagem (lido
de /etc/moj/user-agent, gravado pela imagem): é assim que
ela passa no gate por sede e fica com a mesma chave de máquina do
browser — usar as duas na mesma máquina não derruba a sessão. Fora da
máquina de prova a CLI é barrada pelo gate (403), de propósito.var/submit-origin.log; os
logins em var/access.log; as quedas de sessão em
var/session-events.log — os três atravessam as rodadas e
entram no arquivo.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
/contest/teams, que é
público e listava todo login);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.
– no lugar da posição. Com a
opção ligada, ele mostra a posição entre os convidados, em itálico, no
placar, na revelação e no relatório. A numeração oficial não muda.build.sh mantém (uma por coorte que vê um conjunto
diferente, mais a pública).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:
SHOWCODE) foi
removida em 2026-09-18;ℹ️ 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ê).
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.
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:
.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).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):
O que a conversão faz:
time-…) com senha única, e os membros deixam de entrar com
as contas deles; membro que já submeteu vira conta desabilitada, e a
linha dele no placar fica;.admin do treino vira .admin próprio
do contest com senha nova (a tela mostra);Na CLI: moj-contest -c <id> users convert (prévia)
e users convert --apply --csv creds.csv.
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.
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.
.admin listada em
SUPERADMINS no arquivo contests/treino/conf
(logins separados por espaço). Só quem tem acesso ao servidor edita essa
lista. Não há tela para isso.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: