Nota de traducción. Este manual es una traducción del original en portugués. Las herramientas de línea de comandos (
moj,moj-contest,moj-comp) muestran sus mensajes en portugués, y los ejemplos de comandos son idénticos al original.
Este manual es para quien opera una competencia: el
dueño de la cuenta .admin. Explica cada pestaña del panel
de administración, cada opción de configuración, cómo habilitar
los roles especiales (.judge,
.cjudge, .staff, .cstaff,
.mon) y cómo activar la corrección validada por
jueces, incluida la cantidad de personas que necesitas.
Crear la competencia (asistente, problemas, cuentas) es la otra guía: el tutorial del organizador. Aquí se trata la OPERACIÓN, la del día de la competencia.
Llegas al panel al iniciar sesión con la cuenta .admin
de la competencia y hacer clic en Administración en la
barra superior.
El panel abre en 🏁 Central. La barra superior tiene
los cuatro grupos comunes, que toda competencia tiene,
y, después de un separador, los grupos de evento, que
solo aparecen cuando la competencia activa el módulo
correspondiente (sección 1½). Cada grupo tiene sus paneles en la segunda
línea. La dirección guarda el panel (#grupo/painel), así
que puedes guardar el enlace. Los enlaces antiguos
(#settings, #users, #machines,
#prova/rodadas…) siguen funcionando: se redirigen. Un
enlace a un panel de un módulo desactivado lleva a
Central › Módulos, con un aviso que dice qué módulo
activar.
[🏁 Central] [🧩 Competencia] [👥 Personas] [🎛️ Operación] │ [🏟️ Evento] [🖥️ Máquinas] 📖 Manual
└── solo con módulo activado ──┘
| Grupo | Paneles | Aparece |
|---|---|---|
| 🏁 Central | Central · Módulos · Reglas | siempre |
| 🧩 Competencia | Problemas · Esqueletos (esqueletos) ·
Informe |
siempre (Esqueletos solo con el módulo) |
| 👥 Personas | Cuentas · Inscripciones (inscricoes) · Sesiones |
siempre (Inscripciones solo con el módulo) |
| 🎛️ Operación | Situación · Staff · Jueces · Auditoría | siempre |
| 🏟️ Evento | Rondas (rodadas) · Documentos (documentos)
· Globos (baloes) · Clasificación
(classificacao) · Equipos (sedes o
telao) · Cohortes (coortes) · Sedes y escuelas
(sedes) |
con el módulo entre paréntesis |
| 🖥️ Máquinas | Gate y bloqueo · Anomalías · mlinux | con el módulo maquinas |
| Bloque | Qué hace |
|---|---|
| 🚦 Antes de empezar | El checklist previo a la competencia (verde/amarillo/rojo), con un
botón que abre el panel exacto de cada pendiente. El
rojo es crítico: revísalo antes de empezar. El
checklist es un aviso: el MOJ no impide el inicio de sesión ni los
envíos por su causa; los ítems ya revisados quedan plegados. Revisa la
ventana, el registro de evaluación, el congelamiento, los jueces, los
lenguajes, el TL calibrado, el pool, las cuentas, el staff y el daemon,
si algún problema de una competencia ICPC sigue evaluando
después del 1.er error (La evaluación se detiene en el 1.er
error: el TLE de un problema con cientos de pruebas tarda minutos —
marca "detener en el primer" TLE/WA en la pestaña Límites del editor del
problema), y si cada juez ya calibró cada problema
(Jueces calentados): el tiempo límite se mide por máquina, y el
juez que todavía no calibró un problema lo hace en el 1.er envío de ese
problema, que espera minutos. Cuando hay un juez frío, el ítem trae el
botón 🔥 Calentar jueces, que manda calibrar solo a los
jueces fríos. Hazlo antes del inicio (cada calibración
ocupa un lugar del juez por algunos minutos) y vuelve a ejecutar el
checklist (↻) para ver cómo "calentando" pasa a "calentados". El mismo
botón está fijo en Operación › Situación, y, en una
competencia con prioridad Competencia (o Super), el
calentamiento también corre solo: al promover una ronda
y unos 15 minutos antes del inicio de cada ronda (queda en el audit como
warm-judges). Una lista de clase queda solo con el botón.
Además, solo con el módulo activado: cohortes, gate de
navegador, bloqueo de sede, ronda siguiente, documentos, globos y
prórroga. La revisión módulos avisa cuando un módulo
está desactivado pero tiene datos en la competencia. Sin
congelamiento y cuentas compartidas solo son aviso en una
competencia de prioridad Competencia (en una lista son
lo normal). |
| 🧰 Generar | Una tarjeta por artefacto, con el estado actual: etiquetas de
credenciales, informe de la competencia y jplag siempre (el jplag
también abre para el juez principal, que puede ejecutarlo, y para el
juez, que solo lo ve); documentos (documentos), promover
ronda (rodadas), ceremonia de revelación y pantalla
(telao) con el módulo. |
| 📡 En vivo | Resumen corto (pendientes, envíos, jueces en línea, respuesta p95, corrección manual). Se actualiza solo; el panel completo es Operación › Situación. |
| ⏱️ Reglas de la competencia | Inicio, fin y congelamiento, editables ahí mismo; el modo y los lenguajes, en solo lectura; y los módulos activados (con un atajo para activarlos/desactivarlos). El resto está en Central › Reglas. |
| Panel | Qué hace |
|---|---|
| Central › Módulos | Activa y desactiva los módulos de la competencia (sección 1½): una tarjeta por módulo, con lo que abre y si ya hay datos suyos en la competencia; ajustes predefinidos (examen de curso · examen de curso con Maratona Linux · selectiva · Maratona). |
| Central › Reglas | Todas las opciones de la competencia, en cinco secciones plegables (identidad y ventana · lo que el equipo ve · evaluación · marcador/congelamiento/penalización · acceso). La sección 2 explica opción por opción. La ⏱ prórroga por sede está en Evento › Sedes y escuelas. |
| Panel | Qué hace |
|---|---|
| Problemas | La competencia en sí: renombrar/reordenar/quitar, editar el
identificador (la "letra": puede ser W1,
Q…; reordenar conserva el identificador personalizado y el
color del globo se mueve con él; con las letras automáticas A, B, C…,
reordenar cambia las letras, y el color del globo y las aclaraciones
acompañan a cada problema; con la competencia en curso, el panel pide
confirmación), restringir lenguajes o el pool de jueces POR problema,
actualizar el enunciado desde el banco (el MOJ reindexa el problema y
cambia el enunciado en unos segundos; el actual queda hasta entonces),
enviar o quitar HTML/PDF por idioma, el panel
🌐 Idiomas del enunciado (abajo) y 🏦 Agregar
del banco (búsqueda y sorteo). |
| Informe | El informe estático de la competencia en un solo lugar: descargar el
tar.gz navegable, publicar como histórico
en /relatorio/<contest>/ (republicar, despublicar) y
publicar el informe de cada ronda archivada. La sección 6½ lo
explica. |
🌐 Idiomas del enunciado. Un problema del banco
puede tener el enunciado en portugués, inglés y español (el autor
escribe docs/enunciado.en.md y
docs/enunciado.es.md en el paquete). El panel 🌐
Idiomas del enunciado (Competencia › Problemas; el juez
principal tiene el mismo en la pestaña 🌐 Idiomas de su
panel) tiene dos modos:
LOCALE) si se ofrece; si no, en el primero. El competidor
cambia con los chips PT · EN · ES y el MOJ recuerda su
elección.Nombre del problema en la competencia. El nombre que
aparece en la lista de problemas, en las aclaraciones, en los envíos y
en el informe es UN nombre por problema. Al insertar un problema sin
escribir el nombre, MOJ usa el título del banco en el idioma en que se
abre el acordeón (el LOCALE, si se ofrece). Si el problema
no tiene título en ese idioma, MOJ usa el título en portugués.
moj-contest -c <cid> problems titles
muestra los títulos de cada problema, y
problems apply-titles hace lo mismo que el botón de la
Central.| Panel | Qué hace |
|---|---|
| Cuentas | Crear/restablecer/deshabilitar/quitar cuentas (individualmente y en
lote por .txt/.csv), cambiar la contraseña de todos y el atajo a las
Etiquetas de credenciales. AQUÍ creas las cuentas de
rol (sección 3). En una competencia con usuarios compartidos con
Entrenamiento libre, la tarjeta 🔗 Cuentas
compartidas convierte todo en cuentas propias (sección 8¾). En
el lote, Procesar muestra cómo se leyó cada línea
(login, contraseña, nombre, email) y el resultado dice por
qué quedó fuera cada línea. Una línea con : sin
encabezado es siempre login:contraseña:nombre:email —
localhost:6767 solo se vuelve login + contraseña; un nombre
con : o , va en el CSV con
encabezado. Un : en el nombre del equipo (o de la
escuela) se guarda como ∶ (se ve igual): el marcador usa
: como separador. Vale en todo lugar que guarda un nombre
(aquí, Equipos, la creación de la competencia y la inscripción de los
alumnos). |
Inscripciones (módulo inscricoes) |
El roster de la competencia (solo entra quien está inscrito) y la ventana: cuándo abre, cuándo cierra (predeterminado: el inicio de la competencia) y cuántos minutos de entrada tardía. Lista equipos e individuales, disuelve equipos, inscribe a mano, recuerda por DM las invitaciones pendientes (🔔) y exporta CSV. La sección 8½ lo explica. |
| Sesiones | Quién tiene la sesión iniciada ahora, con la opción de cerrarla; 🚪 salir en masa y bloqueo de login (cerrar el login, desconectar a todos, reabrir: es el final de una competencia en sala y el cambio de ronda); y el registro de accesos por día. Vale para cualquier competencia. |
| Panel | Qué hace |
|---|---|
| Situación | El tablero en vivo (se actualiza en su lugar cada ~12 s): sesiones
iniciadas, jueces en línea/ocupados, cola, pendientes, latencia, línea
de tiempo, evaluación manual, las acciones sugeridas
cuando algo no está bien y el botón 🔥 Calentar jueces.
Globos pendientes/retenidos solo con el módulo baloes. |
| Staff | Panorama y acciones sobre la cola de impresión (+ globos con el
módulo), desempeño por miembro del staff y el alcance
de cada staff/jefe de sede (regex o region:<sede>).
region:<nombre> cubre todo lo que está en ese
nodo de Evento › Sedes y escuelas: la sede y, si es un nodo
padre, todas las sedes debajo de él (region:Nordeste ve las
sedes del Nordeste), y también un recorte (view) por su
nombre. Vale la sede grabada en el equipo o, sin ella, la regex. Una
regex en el alcance se prueba en el usuario. |
| Jueces | La cola de la corrección manual: quién reservó cada envío, votos, antigüedad; decidir/resolver en el momento; y la configuración del veredicto manual (opciones de etiqueta + 🔎 Qué va a revisión: una tabla problema × veredicto; lo marcado va a los jueces y el resto sale automático; sin nada marcado, todo sale automático; con excepciones por lenguaje y el botón para liberar los retenidos que la tabla nueva deja salir). |
| Auditoría | Feed unificado de todo lo que pasó (acciones de admin, inicios de sesión, envíos, veredictos) con filtros y CSV, más los respaldos que subieron los usuarios (por usuario, con ZIP). |
| Panel (módulo) | Qué hace |
|---|---|
Rondas (rodadas) |
Calentamiento y competencia oficial en la MISMA competencia: planifica cada ronda (ventana + problemas), muestra el checklist y promueve, archivando todo lo que pasó. La sección 6 lo explica. |
Documentos (documentos) |
Genera, en PDF y HTML en los tres idiomas (pt/en/es), los documentos de la competencia: Entorno de evaluación (info sheet), Cuadernillo de la competencia (portada + enunciados), Hoja de límites de tiempo y el editorial (solo se publica después del FIN de la competencia). La sección 5 lo explica. |
Globos (baloes) |
El color de cada letra: es lo que sale dibujado en la hoja del globo. El predeterminado cubre A–O; con más de 15 problemas, define los demás (si no, salen grises). Son los colores de la ronda en vivo. Para dar colores propios a otra ronda, usa Evento › Rondas. Cambiar un color pasa al color nuevo las tareas de globo todavía no impresas; la pantalla avisa cuántas hojas ya se imprimieron con el color anterior. |
Clasificación (classificacao) |
Quién se clasifica para las próximas etapas. Cada
etapa (Final Brasileña, PDA, Mundial) tiene su motor,
elegido en el panel: vista previa, borrador, publicación (un chip 🎓 por
etapa en el marcador) y el override manual — excluir
del cálculo, retirar sin recalcular, promover a mano, siempre con
motivo. Para competencias menores (una selectiva), el motor
Manual: indicas cuántos equipos avanzan y cuál es la
próxima etapa, y haces clic en el marcador en quién promover (motivo
opcional). docs/CLASSIFICACAO.md lo explica. |
Equipos (sedes o
telao) |
Identidad de cada cuenta en el marcador: nombre del equipo,
país/bandera, sede, universidad, escudo y foto. Carga por CSV y
"materializar coincidencias". Un : en el nombre o la
escuela pasa a ∶ (se ve igual; la pantalla avisa). |
Cohortes (coortes) |
Equipos invitados (extraoficiales, "CCL") separados de los oficiales: quién aparece en el marcador público, quién ve a quién, y el 🔓 Liberar resultados de después de la ceremonia. La sección 8 lo explica. |
Sedes y escuelas (sedes) |
Las sedes (nombre + regex sobre el login), que alimentan el filtro del marcador, el alcance del staff, las etiquetas, las fotos/músicas que cada jefe de sede gestiona en la pantalla y el gate por sede; las reglas de país/escuela por regex; y la ⏱ prórroga por sede/grupo (regex → nuevo fin; solo extiende, nunca acorta). En tres modos (Simple, Intermedio, Avanzado) con vista previa — sección 7¼. |
maquinas)| Panel | Qué hace |
|---|---|
| Gate y bloqueo | Desde dónde inició sesión cada equipo (IP y navegador) en cada ronda, con CSV; la configuración del gate de navegador por sede (esperado × visto por equipo) y el bloqueo de sede por IP (IP fijados, bloqueos, fijar/soltar). La sección 7 lo explica. El mapa cuenta los inicios de sesión desde la apertura del login de la ronda (sin tomar los de la ronda anterior), no solo los posteriores al inicio. |
| Anomalías | Lo que no está bien en el uso de las máquinas durante la competencia (con el navegador del MLinux identificando la máquina, con o sin gate; el "UA fuera de la sede" necesita el gate en Bloquear u Observar): equipo con 2 sesiones activas, máquina compartida por 2 equipos, envío desde otra máquina, UA fuera de la sede, sede con menos máquinas que equipos, cambios de máquina, el rastro de la sesión única y los bloqueos del bloqueo de sede. Línea de tiempo, tabla por equipo, CSV, cerrar sesión, desconectar UA divergente y explicar un caso. La sección 7½ lo explica. Un equipo que inició sesión antes del inicio (el login abre antes de la competencia) aparece con la máquina de su último login antes de empezar, marcada "antes del inicio": es la sesión con la que el equipo empieza; cambiar de máquina antes de empezar no es anomalía. |
| mlinux | El panorama de las máquinas por sede que recoge el nutellaboot
(hardware y modelo del equipo, RAM, editores, presión de memoria con
PSI, salud en la competencia: reinicios, procesos terminados por falta
de memoria, reloj desfasado, inactividad), con la recolección y los
comandos remotos. Los datos de salud y PSI solo aparecen para las
máquinas con el agente nuevo del mlinux; la pantalla dice cuántas son.
La tarjeta Vínculo máquina-equipo muestra cuántas
máquinas el MOJ ya vinculó a un equipo en el nutellaboot (ocurre solo,
en el inicio de sesión del equipo, con el agente nuevo del mlinux), y
tiene los botones enviar roster y republicar
vínculos: usa los dos, en este orden, cuando la tarjeta diga
"equipo fuera del roster de la imagen". Guardar la clave (o reactivar el
vínculo) con equipos que ya iniciaron sesión vuelve a publicar
automáticamente los vínculos de esos logins. La tarjeta Alertas
de máquinas en tiempo real instala el aviso del nutellaboot:
cuando una máquina levanta una alerta (pendrive, celular, red por USB,
identidad repetida), aparece en Máquinas › Anomalías y, durante la
competencia, el dueño de la competencia la recibe en Telegram. Para
instalarlo o quitarlo, la clave guardada tiene que ser la de
administración del nutellaboot. docs/NUTELLABOOT.md lo
explica. |
Globo y congelamiento. Por defecto, un acierto logrado con el marcador congelado no genera tarea de globo, y esos globos no se entregan después: la tarea no existe. Es la regla de competencia (el globo que cruza la sala revela lo que el congelamiento esconde), y vale solo para el globo: la solicitud de impresión sigue libre. Si quieres el clásico del ICPC (globos circulando durante el congelamiento, el público adivinando), marca Entregar globos durante el congelamiento en Central › Reglas; marcarlo también libera los que ya quedaron retenidos. El checklist previo a la competencia muestra qué política está vigente, y Operación › Situación muestra cuántos globos están retenidos.
Cómo marca el marcador a quien resolvió. Por defecto la celda de quien resolvió siempre se ve igual (verde) y el color del globo va en un puntito al lado. Es a propósito: la paleta ICPC le da al problema A el color blanco, y el blanco sobre el fondo blanco del marcador es el mismo píxel: quien resolvía el A parecía no haberlo resuelto (la queja que originó el cambio vino de un estudiante). Si prefieres el clásico (la celda entera pintada con el color del globo), márcalo en Central › Reglas › Celda de "resuelto" en el marcador; los colores claros reciben un contorno para no desaparecer. Vale para el marcador, la ceremonia de revelación y el informe.
Fuera del panel, pero enlazadas desde la Central: etiquetas de credenciales, ceremonia de revelación, jplag, cola del staff y marcador.
Un módulo es un grupo de recursos que la competencia
usa. Un examen de curso no activa ninguno: el panel muestra solo lo
común (problemas, cuentas, sesiones, marcador, staff, jueces). Un examen
de curso en laboratorio con Maratona Linux activa
maquinas (gate de máquina, sesión única, anomalías). La
Maratona activa todos. Activar muestra los paneles, las revisiones de la
Central y las tarjetas correspondientes; desactivar oculta, sin
borrar nada: reactivar restaura todo.
Desactivado, la regla del módulo NO se aplica, aunque la configuración esté guardada: Máquinas desactiva el gate de navegador, la sesión única y el bloqueo de sede (las IP fijadas se sueltan de inmediato); Sedes desactiva la prórroga por sede; Inscripciones deja entrar a quien no se inscribió (el miembro de equipo sigue entrando como el equipo), quita el botón Inscríbete de la página de inicio y nadie puede inscribirse; Cohortes pone a todos en el marcador público; Globos deja de crear tareas de globo (reactivarlo crea las que faltaron). Antes de desactivar un módulo de una competencia en curso, confirma que eso es lo que quieres.
| Módulo | Qué activa | Detectado por |
|---|---|---|
sedes |
Evento › Sedes y escuelas, Evento › Equipos (identidad), prórroga por sede, alcance del staff por sede | regions.json, teams-meta.json,
prórrogas |
maquinas |
Máquinas › Gate y bloqueo, Anomalías, mlinux; revisiones de gate/bloqueo/sesión única | gate de UA activado, SITE_LOCK=1, clave del
nutellaboot |
rodadas |
Evento › Rondas; tarjeta Promover; informes de ronda | rounds.json |
documentos |
Evento › Documentos; tarjeta Documentos; pestaña del juez principal | docs/config.json |
baloes |
Evento › Globos; globos en la cola del staff y en Situación; globos durante el congelamiento | balloons.json |
coortes |
Evento › Cohortes | cohorts.json |
inscricoes |
Personas › Inscripciones | registrations.json |
telao |
tarjetas Revelación y Pantalla; Evento › Equipos (fotos) | animeitor.json, webcast.json, fotos de
equipo |
classificacao |
Evento › Clasificación (selector de etapa y de motor) | classification.json |
virtual |
Evento › Virtual; botón Virtual en la tarjeta de la competencia terminada; enlace en el marcador (ver §6¾) | virtual/runs/ |
esqueletos |
Competencia › Esqueletos: el editor de código del equipo abre con el esqueleto del lenguaje (abajo) | esqueletos.json |
Dónde se activa: Central › Módulos (ajustes
predefinidos que solo marcan de antemano), el paso 7 ·
Módulos de crear
competencia, moj-contest -c <cid> modules on|off
o la sección modules{} del spec de creación. Y
solo, al usar el recurso: crear una ronda, una cohorte, activar
el gate, generar un documento, activar la inscripción, definir un color
de globo, una sede o una clave de webcast (por la web o por la CLI)
activa el módulo correspondiente en el momento (la auditoría registra
modules-auto). Solo desactivar es manual. También vale para
el spec de creación: un solo JSON levanta la competencia entera, con los
datos de cada módulo (sedes, colores, cohortes, gate, rondas,
documentos, ventana de inscripción, pantalla, clasificación); el
export devuelve la misma sección, sin secretos. Las
competencias creadas antes de los módulos se detectan una vez por los
archivos que ya tienen
(server/bin/contest-modules-detect.sh).
Requisitos. Dos módulos solo funcionan con otra
configuración de la competencia, y por eso solo se activan con ella (la
participación virtual tiene sus propias condiciones, en la §6¾; la guía
rápida de abajo las reúne todas):
inscricoes (inscripción) necesita las
cuentas del Entrenamiento Libre (competencia creada con
usuarios compartidos): cada alumno se inscribe con su cuenta del
entrenamiento. En una competencia con cuentas propias, la inscripción
bloquearía a todos los alumnos, así que no se activa (ni desde el panel,
ni al guardar la ventana de inscripción, ni en la creación, al duplicar
o desde una plantilla). Con cuentas propias, entrega las credenciales en
Personas › Cuentas.
esqueletos (esqueletos de código) necesita
el editor de código en el navegador (Reglas). La tarjeta del módulo
muestra un candado y lo que falta. Si una competencia ya tenía el módulo
activado sin el requisito, la Central avisa (y, sin las
cuentas del entrenamiento, la regla "solo inscritos entran" no se
aplica). Convertir las cuentas compartidas en propias (sección 8¾)
también desactiva la inscripción.
Guía rápida: lo que necesita cada módulo. A la izquierda, lo que el MOJ exige para activar el módulo (↔︎ = vale en los dos sentidos); a la derecha, lo que el módulo necesita, ya activado, para hacer algo.
USERS_FROM)convertir a cuentas propias desactiva el móduloinscricoesesqueletosvirtualsedesmaquinasrodadasdocumentosbaloescoortestelaoclassificacaoesqueletos)En la competencia, el editor de código del equipo abre
vacío: el equipo escribe su código completo. Con el
módulo esqueletos, el editor abre con el
esqueleto del lenguaje (el main y las
lecturas habituales). Úsalo en una lista o un examen de curso, cuando el
esqueleto ayuda al estudiante.
FUNCTION_LANGS) abre vacío en los lenguajes del driver: el
main del esqueleto daría Compilation Error.solution.<extensión>. En Java, no declares la clase
como public (javac exige que una clase pública
tenga el nombre del archivo). La Central avisa.moj-contest -c <cid> esqueletos ls|show|set|off|reset.Identidad y ventana
👁 Lo que el equipo ve durante la competencia
.mon, .animeitor) ve el marcador
completo. Activado, el informe no se puede publicar, el sitio de la
ronda archivada queda cerrado, la clasificación no aparece y la
participación virtual no se abre.⚖️ Evaluación (lenguajes, pool, veredicto manual)
SUBMIT_MAX_INFLIGHT=<n> (0 lo
desactiva).Guardar escribe solo lo que cambió (la Auditoría registra solo eso). Si una opción está mal (por ejemplo, una zona horaria que no existe), no se guarda nada y el mensaje dice qué opción corregir.
Por la CLI, todo esto es
moj contest -c <cid> settings set chave=valor (ej.:
settings set manual_verdict=true review_judges=3).
Habilitar un rol es solo crear la cuenta con el sufijo
correcto en el login, en el panel Personas › Cuentas
(o moj contest -c <cid> users add fulano.judge). No
hay casilla de permiso: el sufijo ES el rol. El autorregistro público
nunca crea cuentas con esos sufijos (reservados), y las operaciones en
masa (restablecer contraseña, deshabilitar) se saltan
las cuentas privilegiadas a propósito.
| Rol | Sufijo | Puede | No puede |
|---|---|---|---|
| Administrador | .admin |
Todo: panel ⚙, enviar a cualquier hora, ver los problemas antes del inicio, marcador sin congelamiento, votar como juez, resolver conflictos, responder aclaraciones. | Aparecer en el marcador (ningún rol aparece). |
| Juez (humano) | .judge |
Pestaña Evaluar (corrección manual), enviar/ver problemas a cualquier hora (¡probar la competencia!), marcador sin congelamiento, responder aclaraciones, Estadísticas. | Resolver conflictos; panel de admin. |
| Juez principal | .cjudge |
Todo lo del .judge + panel
Juez principal: resolver conflictos de votos, editar
respuestas de aclaraciones ya dadas, ver el login y el nombre de quien
preguntó, liberar la reserva de otro juez (botón propio, con
confirmación), opciones y qué va a revisión. |
Panel de admin (Central › Reglas, etc.). Reservar una aclaración que otro juez ya reservó. |
| Staff (personal de sala) | .staff |
Cola de 🖨️ impresión y globos (reservar/imprimir/entregar, modo automático de quiosco). | Ver problemas o enviar (nunca); etiquetas; marcador sin congelamiento. |
| Jefe de sede | .cstaff |
Observar la cola del staff de su sede (solo lectura),
Etiquetas de credenciales de los competidores y del
.staff de su sede (con contraseña, excepto
en una competencia que usa cuentas del entrenamiento, donde la
contraseña es personal y no sale en la etiqueta; la credencial del
propio jefe tampoco sale en etiqueta), la 🎥 pantalla
de la sede y la 🏆 revelación por sede después del
fin. |
Actuar en la cola de impresión; ver problemas/enviar; no hereda
.staff. |
| Monitor | .mon |
Enviar DURANTE la competencia (sin aparecer en el marcador), responder aclaraciones, Todos los envíos y Estadísticas. | Ver problemas antes del inicio; corrección manual. |
Regla de oro: ninguna cuenta con sufijo de rol entra en el marcador ni en las estadísticas: crea todas las que necesites sin miedo de ensuciar el resultado.
Aviso de la organización en cualquier página. Admin,
juez principal, juez y .mon reciben, en cualquier página de
la competencia, una franja arriba con sonido: 💬 clarification
sin respuesta (todos esos roles), ⚖ veredicto esperando
tu voto (admin, juez principal y juez, con la corrección manual
activada) y ⚠ conflicto (admin y juez principal). La
cantidad aparece también en el título de la pestaña. El sonido se repite
cada 2 minutos mientras haya pendientes; la franja tiene los botones
para activar o silenciar el sonido y para pedir la notificación del
sistema. La revelación del marcador, la pantalla del Animeitor y la
ventana de editor no muestran la franja. Detalles en
MANUAL-JUIZ.md.
Competencia con usuarios compartidos con Entrenamiento libre: una cuenta de rol del entrenamiento no entra con el rol aquí. Solo entran el
.adminde quien creó la competencia y los superadmins del entrenamiento. Juez, staff y co-organizador = una cuenta creada en esta competencia (sección 8¾).
Con Veredicto manual activado, la evaluación automática sigue funcionando, pero el veredicto queda retenido: el alumno ve el envío pendiente hasta que los jueces humanos lo validen.
El flujo, en la pestaña Evaluar (página del
.judge):
.cjudge) decide en su panel (una alerta global
avisa).Opciones de veredicto. El juez principal o el admin edita la lista en 🏷️ Opciones (panel del juez principal u Operación › Jueces). Cada opción tiene tres campos:
5 - NO - Wrong answer.Wrong Answer.Formato de saída errado. Déjalo vacío para mostrar la
clase. La clase Accepted no tiene texto propio.Así cada competencia personaliza lo que lee el equipo sin cambiar cómo puntúa el marcador.
¿Cuántas personas necesitas? Como mínimo N
cuentas .judge (el quórum) + 1
.cjudge para los conflictos, y recomiendo
N+1 jueces para que la cola no se trabe cuando alguien
hace una pausa. El .admin también vota (cuenta como juez),
pero en una competencia grande deja al admin libre para operar. Con
N=1 un único juez revisa todo (bueno para una
competencia pequeña); N=2 es el predeterminado equilibrado; N≥3 es para
finales donde el veredicto necesita un tribunal.
documentos)La pestaña existe para el .admin y para el juez
principal (.cjudge), y produce los documentos de
la competencia, cada uno en PDF y HTML, en
portugués, inglés y español:
| Documento | Qué sale | De dónde vienen los datos |
|---|---|---|
| Entorno de evaluación (info sheet; antes "Información del ambiente") | En el formato de la hoja de la Maratona SBC: sistema operativo y versiones de los compiladores, lenguajes aceptados con sus extensiones, límites de memoria, tiempo, tamaño del código fuente, salida y compilación, las líneas de compilación y ejecución de cada lenguaje (las mismas del juez), los veredictos, las notas de evaluación, la penalización y los tiempos de respuesta. | Texto editable (Markdown) + datos en vivo: run/registry
(lo que reportan los jueces), el conf de la competencia y
el TL calibrado. |
| Cuadernillo de la competencia | Portada + un enunciado por problema, en el orden de las letras. Donde el problema tiene un PDF propio en la competencia, entra ese PDF (con la diagramación preservada); si no, el enunciado se renderiza con el molde de los cuadernillos de la Maratona SBC: Computer Modern con el interlineado y la separación silábica de LaTeX, título del problema centrado, ejemplos en cajas apiladas (como en el sitio) o, si marcas "ejemplos del cuadernillo en tabla (entrada | salida)" en el panel Documentos, en una tabla "Ejemplo de entrada · Ejemplo de salida" como la de la SBC (un ejemplo con líneas largas queda mejor apilado), y pie de página "evento – Problema X – título" con el número de página. | PROBS de la competencia,
enunciados/<chave>.{pdf,html} y, si falta, el
enunciado del banco. |
| Hoja de límites de tiempo | Tabla letra · nome · tempo limite por teste. Si el
límite es el mismo en todos los lenguajes, sale una columna y la nota
"no depende del lenguaje". Si difiere, sale una columna por lenguaje.
Más la fe de erratas que escribas. |
El TL calibrado y servido a los jueces
(run/tl). |
| Editorial | Una portada (título, fecha, nota introductoria e índice de los problemas) y la solución de cada problema, en el orden de las letras, cada problema en una página nueva. Genera y revisa cuando quieras; el servidor solo deja PUBLICAR después del fin de la competencia (contando las prórrogas por sede), y el equipo solo lo descarga con la competencia terminada. | El docs/solucao.md del paquete de cada
problema (el texto que escribió el autor y que nunca llega al
alumno). |
Flujo, de principio a fin
Completa los datos (⚙️ Datos de los
documentos): versión del cuadernillo (v1.0), nota de
la portada y fe de erratas. Guarda.
Ajusta la portada, si quieres (🎨 Portada
del cuadernillo). Hay dos modos, en este orden de precedencia:
PDF subido › texto. El texto ya abre
con la portada predeterminada del MOJ (es ella, escrita
en Markdown), así que editas solo lo que quieras cambiar. Los marcadores
se sustituyen al generar: {{CONTEST_NAME}},
{{DATE}}, {{N_PROBLEMS}},
{{N_PAGES}}, {{SITES}},
{{VERSION}} y {{NOTE}} (la nota de la
portada). {{N_PAGES}}, {{SITES}} y
{{NOTE}} son opcionales: el bloque en el que uno de ellos
queda vacío desaparece. Sube un PDF cuando la portada sea un arte listo
del evento: entra tal como está y el resto del cuadernillo se anexa
después de ella.
Logo (🏷️ Logo del encabezado, opcional): una franja con los logos del evento (PNG, JPEG, WebP o SVG, hasta 5 MB) que sale en la parte superior de cada página del cuadernillo y del editorial y en la portada generada, como en los cuadernillos de la Maratona SBC. Vale para los tres idiomas; eliminar la quita.
Ajusta el texto del info sheet, si quieres (📝):
también es Markdown, con los marcadores {{TOOLCHAIN}},
{{TL_TABLE}}, {{LANGS_TABLE}},
{{MEMLIMIT}}, {{STACK}},
{{CONTEST_NAME}} y {{DATE}}.
Los dos textos usan el editor del MOJ (colores del Markdown y números de línea) con una pestaña por idioma (PT · EN · ES), como en la gestión de problemas. Guardar graba todos los idiomas modificados; restaurar predeterminado devuelve el idioma de la pestaña al texto del MOJ.
Genera (botón de cada fila, o ⚙️ Generar todo (pt+en+es)), o sube un PDF listo (botón subir PDF de la fila). El PDF subido es un documento completo: gana al generado en todo lo que el MOJ sirve y se puede publicar sin generar. volver al generado borra solo el subido (en un documento publicado sin PDF generado, el MOJ lo rechaza: genera antes o despublica). Convertir los PDF lleva algunos segundos; el cuadernillo es el que más tarda, porque junta un PDF por problema. Si falla la conversión a PDF, el mensaje dice qué documento falló y el PDF anterior (si había) sigue siendo el que todos descargan.
Revisa: cada fila tiene PDF,
HTML y abrir. Revísalo antes de
publicar. ¿Algo torcido en el PDF generado (demasiado
espacio o muy poco entre los elementos, una imagen grande) que causó el
Markdown del enunciado? Cada documento generado tiene también el
✎ .odt, el archivo editable que dio origen al PDF.
Descárgalo, ajústalo en LibreOffice (o Word), expórtalo a PDF y súbelo
con subir PDF: el archivo subido gana al generado y es el que
todos descargan. El .odt del cuadernillo trae la portada
como página editable seguida de los enunciados; si la portada es un PDF
subido, o un problema tiene el enunciado en un PDF propio, el
.odt marca el lugar y tú unes el PDF al exportar. Solo el
admin y el juez principal descargan el .odt.
Publica (solo un documento con PDF, generado o subido). Publicar hace dos cosas: el documento pasa a aparecer en la sección Competencia de la página de la competencia y en Documentos. Quién ve qué:
.admin,
.cjudge y .judge. La sede
(.staff, .cstaff), el .mon y los
equipos, solo a partir del inicio: el cuadernillo en manos de
alguien antes de la competencia es la competencia filtrada, sin importar
el rol. La sede imprime a partir del inicio (el + noticia
de estos dos se rechaza antes del inicio, porque la noticia adjunta el
PDF).¿Lo regeneraste? No hace falta publicar de nuevo: el enlace publicado apunta al documento actual, así que generar de nuevo ya entrega la versión nueva a quien lo descargue. Pero avisa a la sede: quien ya imprimió se quedó con la versión vieja (para eso sirve el campo versión del cuadernillo en la portada).
🌐 El cuadernillo y el editorial salen en el idioma del documento. El cuadernillo en inglés usa el
enunciado.en.mdde cada problema (o el HTML/PDF en inglés que enviaste en el panel de Problemas), y el editorial en inglés usa elsolucao.en.md. Un problema sin traducción sale en portugués en medio del cuadernillo: el documento nunca queda solo con la portada traducida. El título del problema sale traducido cuando el paquete tiene el título en ese idioma. Una competencia bilingüe con el enunciado listo por fuera sigue entrando por el PDF subido.
∑ Las fórmulas salen en el PDF como en el enunciado de la página, incluida la barra vertical (
|x|,a | b): el autor no necesita escapar nada. Si algún símbolo de una fórmula sale con un¿rojo en el PDF, es un defecto del generador, no del enunciado: repórtalo (con el problema) y, mientras tanto, sube el PDF listo de ese cuadernillo. Un cuadernillo generado antes de una corrección no se rehace solo: genéralo de nuevo.🖼 Las imágenes del enunciado caben en la página. En el PDF, cada imagen sale como máximo del tamaño que tiene en la página web y nunca más grande que el área útil (una imagen grande se reduce, manteniendo la proporción). El ancho que pidió el autor en el enunciado (
{width=50%}) también vale en el PDF.
🔒 El cuadernillo es contenido de la competencia. Antes de publicarlo, solo
.adminy.cjudgelo descargan. Publicado, antes del inicio solo se suman a ellos los jueces (.judge). Para la sede y los equipos la API responde 404 hasta el inicio: no es un bloqueo de interfaz.
rodadas)Toda maratón tiene un calentamiento (ensayo general) antes de la competencia: dos o tres problemas fáciles, el día anterior o en la mañana del mismo día, para que el equipo encienda la máquina y pruebe el login, el editor, la impresión y el globo, y para que tus jueces y tu personal de sala ensayen. Después de eso la competencia oficial empieza en la misma competencia del MOJ, porque lo que quieres garantizar es su configuración (cuentas, contraseñas, sedes, colores de globo, límites de tiempo, lenguajes, pool de jueces).
En el MOJ esto son rondas. La ronda en vivo es la que aparece en Central › Reglas y en Competencia › Problemas; las demás quedan planificadas hasta que las promuevas.
El guion (fíjate en el orden: el calentamiento va PRIMERO)
aquecimento, tipo calentamiento) y crea
la siguiente (oficial): ventana, congelamiento y
la lista de problemas de la competencia de verdad. La lista queda
guardada y solo queda en vivo al promover: nadie ve los problemas de la
competencia antes. Puedes usar cualquier problema que el dueño de la
competencia pueda ver: público, suyo, de un colaborador o de su org. La
regla es la misma de Competencia › Problemas, en la ronda en vivo y en
la planificada. Cada ronda puede tener sus propios colores de
globo. Abre la ronda, ve a "🎈 Colores de los globos de esta
ronda" y guarda. Los colores quedan en vivo cuando la ronda se promueve.
Una ronda sin colores propios hereda los colores vigentes. En la ronda
en vivo, esta sección y Evento › Globos editan lo mismo.rounds/<rodada>/, más un informe
navegable de la ronda;freeze_locked con la hora. La opción "ignorar los
bloqueadores" no pasa por encima de esta regla. Escribes el id de la
competencia para confirmar. Todo queda auditado.Registré la COMPETENCIA primero, ¿y ahora? ¿Armaste la competencia ya con los problemas oficiales y solo después creaste la ronda de calentamiento? No promuevas: promover archiva la ronda en vivo (tu competencia, vacía), y el archivo es inmutable. Lo correcto es invertir editando las dos rondas ahí mismo (el panel avisa cuando detecta una planificada que empieza antes de la que está en vivo):
prova, tipo competencia oficial, y dale la ventana
+ congelamiento de la competencia; en Problemas de la
ronda, pon la lista de la competencia (queda guardada, nadie la
ve).aquecimento, tipo calentamiento, ventana del
calentamiento (sin congelamiento) y cambia los problemas por los del
calentamiento; en la ronda en vivo, guardar aplica en el
momento..tar.gz, con código fuente, sale con un clic, para la
auditoría posterior.El checklist es serio. La promoción se RECHAZA mientras haya:
| Bloqueador | Por qué |
|---|---|
round_running |
la ronda en vivo no terminó (contando la prórroga por sede) |
jobs_in_flight |
hay un envío en el spool/cola del juez. Si se evaluara después del cambio, el tiempo se calcularía contra el inicio de la competencia y el envío del calentamiento reaparecería en el historial de la competencia |
pending_verdicts |
todavía hay envíos sin veredicto en el historial |
review_pending |
hay envíos en la corrección manual sin veredicto liberado: el voto del juez caería en el marcador de la competencia |
judged_down |
el daemon de evaluación no está vivo, así que la cola no se vacía |
no_next_round |
no hay ronda planificada |
official_over |
la ronda en vivo es la competencia oficial y ya terminó: promover archiva su resultado y el marcador visible vuelve a cero. Para mostrar el resultado, no promuevas: desactiva el secreto en Reglas y publica el informe |
Hay un --force (casilla "ignorar los bloqueadores"),
para emergencias: no elimina el riesgo, solo asume que
sabes lo que estás haciendo. El único que el --force
no ignora es no_next_round (sin ronda
planificada no hay adónde promover).
¿Promoviste sin querer? Deshazlo. En Evento ›
Rondas, la tarjeta ↩︎ Deshacer la última promoción (o
moj-contest rounds undo) vuelve a poner en vigor la ronda
archivada con todo lo que tenía — envíos, veredictos, clarifications,
impresiones, marcador — y la ronda que entró vuelve a planificada. Solo
funciona mientras la ronda que entró no haya tenido ninguna
actividad (ningún envío, clarification, impresión o aviso); si
no, la tarjeta dice qué pasó en ella. Escribes el id de la competencia
para confirmar, y queda en el audit. Fue el caso del TCP 2026: después
de la competencia, el organizador creó una ronda extra y la promovió, y
el marcador volvió a cero.
Una competencia que usa las cuentas de otra (
USERS_FROM) promueve normalmente: el archivado solo toca elusers/local. Antes era un bloqueador; dejó de serlo porque es justamente el caso de uso real (calentamiento + competencia con las cuentas del entrenamiento).
Lo que NO cambia en la promoción: cuentas y contraseñas, equipos/sedes/banderas, alcance del staff, colores de globo, regiones, límites de tiempo calibrados, lenguajes, pool de jueces, la tabla de qué va a revisión y los textos/portada de los documentos. Lo que se reinicia: marcador, historial y envíos de los equipos (archivados, no perdidos), globos, numeración de impresión, prórrogas y la lista de documentos publicados.
⚠️ Los colores de globo son por LETRA. Si el problema A del calentamiento y el A de la competencia son diferentes, el color del globo A es el mismo en las dos rondas. Revísalo en Evento › Globos antes de la competencia.
En la CLI:
moj contest -c <cid> rounds ls | add | set | problems | promote | publish | archive.
Cuando la competencia termina, el marcador sigue congelado y los documentos siguen sin publicar hasta que alguien mande liberarlos: nada de esto ocurre automáticamente con el reloj. La Central pasa a mostrar el bloque "🏁 Después de la competencia" con el checklist de lo que sigue cerrado y el botón 🏁 Terminar evento, que hace de una vez las dos cosas que todos olvidan:
FREEZE_TIME=0), así el resultado final queda público (es
el mismo efecto del botón "🔓 Descongelar todo (público)" de la
ceremonia de revelación). El MOJ solo acepta descongelar a partir del
fin de la competencia para todas las sedes + 1 minuto.
La prórroga de una sede cuenta. La regla vale para todos los caminos:
este botón, la ceremonia, el campo de congelamiento en la Central y la
promoción de ronda. La pantalla muestra la hora a partir de la cual el
botón queda disponible;El botón no toca el resto: liberar el
registro de evaluación para los equipos
(SHOWLOG), mostrar los límites de tiempo y
liberar las cohortes (invitados) siguen siendo decisión
tuya: cada uno aparece en el checklist con el atajo "resolver →" a la
pantalla correcta. Solo funciona después de que la competencia terminó
para todas las sedes (la prórroga por sede cuenta) y
puede repetirse sin problema: la segunda vez no hace nada.
El ciclo se cierra con el informe final (Competencia
› Informe): el tar.gz navegable lleva el marcador abierto,
los envíos, las estadísticas completas, los enunciados
y los documentos publicados: es el paquete que se envía
a los participantes y al archivo del evento. Al lado de la descarga está
📢 Publicar como histórico: el mismo sitio pasa a
existir en https://moj…/relatorio/<contest>/ y la
tarjeta de la competencia en la página de inicio y en
/contests/ recibe el botón 📑 Informe: es
el histórico del evento. La generación corre en segundo
plano (~1–2 min en una competencia grande; el panel muestra
"publicando…" y cambia solo cuando termina). Es público: el informe no
incluye código fuente, registro del juez ni contraseñas, y las
aclaraciones salen anónimas, pero muestra nombres de equipos, runs y
estadísticas: publícalo cuando todo ya se haya divulgado. 🔄
Republicar lo genera de nuevo y reemplaza el sitio entero de
una vez (quien lo esté leyendo no ve un estado a medias);
Despublicar borra la dirección y el botón de las
tarjetas. Las rondas archivadas (el calentamiento, por
ejemplo) tienen su propio botón en Competencia › Informe: 🌐
publicar pone el informe generado en la promoción en
/relatorio/<contest>/rodada/<slug>/, y la
página de inicio del informe principal, al ser (re)publicada, pasa a
enlazar las rondas públicas en "Rondas anteriores de este evento".
MOJ se niega a publicar el informe cuando mostraría lo que todavía no es público:
virtual)Con la competencia terminada, cualquier cuenta del Entrenamiento
libre puede rehacer la competencia una vez, en su
propio tiempo, contra el marcador oficial. El marcador oficial
no cambia. Referencia completa:
docs/VIRTUAL.md.
Para activarla: Central › Módulos › Participación virtual. El módulo solo se activa cuando:
La tarjeta del módulo muestra el candado y lo que falta, y la Central avisa si ya está activado sin eso. Al crear (spec, plantilla o copia), una competencia que no cumple estas condiciones nace con el módulo desactivado, y la pantalla del resultado (o la CLI) dice por qué: actívalo después en Central › Módulos.
Puedes activar el módulo antes del fin de la competencia (con los problemas ya públicos). Queda inactivo y se abre solo cuando la competencia termina para todas las sedes y el marcador se descongela (botón Terminar evento). El botón Virtual en la tarjeta de la competencia y el aviso en el marcador solo aparecen cuando la participación virtual se puede hacer.
Atención: activar este módulo hace que el marcador final y la lista de problemas sean visibles para las cuentas del entrenamiento. Una competencia que no puede verse desde fuera no debe activar el módulo.
El panel Evento › Virtual muestra:
/treino/virtual/?c=<contest>);Regla del participante (la lee antes de empezar): una participación por cuenta; puede desistir sin registrar en los primeros 15 minutos o mientras no tenga ningún aceptado, como máximo 2 veces; el 3.er inicio es definitivo.
maquinas)Es en el calentamiento cuando los equipos encienden de verdad las computadoras, y de ahí el MOJ saca el mapa equipo × IP × navegador de la sala (del registro de accesos de la competencia, recortado por la ventana de la ronda: no se captura nada nuevo). La pestaña muestra, por ronda:
De aquí salen dos acciones, que escriben en el lugar de siempre:
Cuando cada sede corre su propia imagen, el UA de
cada máquina lleva un pedazo del propio login del equipo:
teambrspso001 (Brasil/BR, São Paulo/SP,
Sorocaba/SO) corre en una imagen cuyo UA contiene brspso.
Una substring única no sirve, así que el MOJ deriva lo esperado
del login.
En la web (sección 🔒 de Máquinas › Gate y bloqueo):
el modo — Desactivado,
Observar (muestra el esperado × visto y el "UA fuera de
la sede" en las Anomalías, sin bloquear a nadie ni cerrar
sesiones: se puede activar en medio de la competencia para
revisar la sala) o Bloquear (el inicio de sesión
devuelve 403); debajo van la regex del login (con
captura) y el UA esperado (\1),
con un probador en vivo ("probar con el login" → UA
debe contener brspso · sede Sorocaba), y tres listas
plegables: overrides por sede, reglas regex de
login y exentos. Guardar ya vale para el
próximo inicio de sesión. Sin ninguna regla el gate no hace
nada: el panel dice "ninguna regla: nadie es bloqueado ni
observado", guardar Bloquear u Observar sin regla se rechaza, y la 🏁
Central avisa cuando el módulo maquinas está activado sin
ningún gate guardado (guarda Desactivado si es a
propósito). Fue lo que pasó en el TCP 2026: el panel antiguo marcaba
"activo" sin ninguna regla.
En la CLI, lo mismo:
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 fuera del patrón
moj contest -c <cid> ua-gate set --exempt '^ccl' --exempt time-reserva-07
moj contest -c <cid> ua-gate set --mode observe # mirar sin bloquear (enforce = bloquear, off = desactivar)
moj contest -c <cid> ua-gate check teambrspso001 # lo que se espera de él
moj contest -c <cid> ua-gate show
Una regla cubre todas las sedes de una vez. El orden
de resolución es: exentos › cuenta de rol (siempre
entra) › regla por regex › override de la sede ›
captura en el login › substring única (el
login_ua_substring de siempre, que sigue valiendo como
último recurso).
--mode off
desactiva el gate sin borrar la configuración.curl --resolve moj…:443:<IP> desde la máquina de
competencia al sitio base (entrenamiento, respaldos que el alumno subió
antes, otra competencia). Con el bloqueo, cada inicio de sesión de un
competidor fija el IP de origen (la salida de la sede)
a esta competencia hasta el fin + margen (con rondas, hasta el fin de la
última ronda planificada: la IP fijada en el calentamiento sigue fijada
en la oficial); desde ese IP cualquier otro destino responde 403
site_locked, incluida una sesión del entrenamiento
abierta antes. Las cuentas de rol están exentas. Toda
reivindicación y todo bloqueo van a la auditoría
(site-lock-claim, site-lock-block) y aparecen
en Máquinas › Gate y bloqueo (bloqueo de sede), con "soltar" por IP y
"🔒 Fijar IPs ya vistos" (útil en la mañana de la competencia). Efecto
secundario aceptado: durante la ventana, todos los que estén detrás de
ese IP público pierden el entrenamiento.sedes)La sede de cada equipo alimenta el filtro del marcador, el alcance
del staff (region:<nombre>), las etiquetas, el gate
de navegador por sede, las estadísticas, la clasificación y la pantalla.
Todos usan la misma regla:
view: supersede, equipos
femeninos) agrupa equipos que ya están en las sedes y nunca es la sede
de nadie.El panel tiene tres modos. Elige el que sirva para tu competencia; se puede subir de modo en cualquier momento. Un modo que no cabe en el árbol actual queda deshabilitado y dice por qué.
region:), el gate de navegador de la
sede y la sede de la pantalla. Al guardar, la pantalla avisa si algo
todavía apunta a una sede que ya no existe. Por la IP de la máquina de
la competencia: Máquinas › Gate.view y regex libre.La vista previa de abajo muestra lo que verán el marcador, las etiquetas y el alcance del staff: cuántos equipos tiene cada sede, quién quedó sin sede, quién se quedó en un grupo/país (la regex coincidió con el grupo y con ninguna de sus sedes), quién coincide con dos sedes y las sedes grabadas fuera del árbol. "Por guardar" resume el cambio. Si otra pestaña o la CLI cambió las sedes después de que abriste la pantalla, el guardado se rechaza: recarga y rehazlo.
Un equipo inscrito guarda la sede en la inscripción: no desaparece cuando el equipo cambia. La Central muestra el ítem Sedes cuando hay algo por revisar.
La regex sigue un subconjunto que coincide igual en el navegador y en
el servidor: \d \w \s y (?: sirven;
\b, (?=, [[:clase:]],
cuantificadores perezosos, un guion ambiguo dentro de [ ] y
las letras con acento no (el usuario no lleva acentos). El guardado dice
qué sede y por qué.
En la CLI:
moj-contest -c <id> regions show|who|assign|set|map.
En la Maratona 2026 solo se pudo responder "¿algún equipo usó dos
máquinas?" después de la competencia, cruzando registros a mano. El
panel Máquinas › Anomalías responde
durante la competencia (las sesiones activas, la salida
en masa y el registro de accesos, que valen para CUALQUIER competencia,
están en Personas › Sesiones). Quien identifica la
máquina es el navegador de la imagen del mlinux
(machine_id/boot_id) — con o sin gate. El
inicio de sesión desde un navegador común solo tiene el IP, y detrás de
un NAT el IP es la sede entera: esos inicios de sesión quedan fuera de
las anomalías de máquina (solo aparecen en "UA fuera de la sede" y en la
lista de sesiones). El "UA fuera de la sede" necesita
el esperado de cada equipo, es decir, el gate en
Bloquear u Observar. Sin ninguna
máquina identificada el panel avisa y muestra solo las sesiones y el
registro de accesos.
login_disabled; la organización entra),
desconectar a los competidores, al staff y
jefes de sede o a los dos (nunca al admin, los jueces, el juez
principal, el monitor ni la pantalla), promover la ronda en Evento ›
Rondas, y reabrir el login cuando los equipos puedan
entrar. Cada sesión cerrada se convierte en un evento en la línea de
tiempo; la acción va a la auditoría (logout-all).moj-comp)
y de paquetes offline. Vale incluso sin gate. La CLI se
identifica en el User-Agent (moj-comp/<build>) y, en
la máquina de competencia, antepone el mismo User-Agent del
navegador de la imagen (leído de
/etc/moj/user-agent, grabado por la imagen): así pasa el
gate por sede y se queda con la misma clave de máquina que el navegador;
usar los dos en la misma máquina no cierra la sesión. Fuera de la
máquina de competencia, el gate bloquea la CLI (403), a propósito.var/submit-origin.log; los inicios de
sesión, en var/access.log; los cierres de sesión, en
var/session-events.log. Los tres atraviesan las rondas y
entran en el archivo.coortes)La Maratona invita equipos que compiten sin entrar en la disputa oficial: la gente los llama invitados, extraoficiales, "CCL". El MOJ trata esto como una cohorte: un grupo de equipos con una política de visibilidad propia.
Lo que garantiza una cohorte privada
/contest/teams,
que es público y listaba todos los logins);Cómo configurarlo (Evento › Cohortes)
Una fila por cohorte, con lo que decide el comportamiento: id, nombre, regex de login, pública (aparece en el marcador público), extraoficial (entra sin ocupar posición), predeterminado (quien no coincide con nada cae en ella) y ve: las casillas que dicen qué cohortes ve esa vista (la cohorte siempre se ve a sí misma). La columna equipos cuenta cuántos hay en cada una.
– en
lugar de la posición. Con la opción activada, muestra la posición entre
los invitados, en cursiva, en el marcador, en la revelación y en el
informe. La numeración oficial no cambia.build.sh (una por cada cohorte que ve un conjunto
diferente, más la pública).Para cambiar la cohorte predeterminada, marca el botón de radio de la otra fila y guarda esa fila. Quitar una cohorte exige que esté vacía (y la predeterminada nunca se puede quitar).
Lo mismo en la 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 # invitado sin 'ccl' en el login
moj contest -c <cid> cohorts materialize # fija la regla en un campo por equipo
moj contest -c <cid> cohorts release # el "liberamos todo" (pide el id)
La cohorte coincide por regex sobre el login y/o por
el campo .team.cohort de cada equipo (el campo gana).
materialize convierte la regla en dato: después de eso,
cambiar la regex no reasigna a nadie. Quien no coincide con nada cae en
la cohorte default (la de los oficiales).
Lo que sigue completo, a propósito (son roles privilegiados, y los necesitas): Todos los envíos, Estadísticas (incluido quién resolvió primero), la cola del staff (el globo del invitado tiene que entregarse) y el informe final. Dos consecuencias prácticas:
SHOWCODE) se eliminó el
2026-09-18;ℹ️ Quedan dos canales numéricos que no revelan identidades, pero existen: la página de estado pública cuenta los envíos pendientes de todos los equipos, y la numeración de tareas de impresión es única por competencia (los saltos indican actividad que el equipo no ve).
Vale para las competencias creadas con "Compartir usuarios de Entrenamiento libre". Al activar la inscripción (Personas › Inscripciones → Activar), la competencia pasa a tener una puerta: quien no se inscribió no entra (la API rechaza el inicio de sesión; no es solo la pantalla).
Cómo se inscribe la persona: en el sitio principal,
con la sesión del entrenamiento iniciada, en
/contests/inscricao/?c=<id> (la tarjeta de la
competencia en la página de inicio recibe el botón 📝
Inscríbete). Elige individual o crear
un equipo: le da un nombre e invita hasta 2 usuarios del
entrenamiento; cada invitado tiene que aceptar.
Mientras la ventana esté abierta se puede salir, renombrar y deshacer.
La participación es exclusiva: aceptar una invitación deshace la
inscripción individual.
La invitación avisa sola. En el instante en que el
capitán invita, el mojinho manda un DM al invitado con
el enlace para aceptar/rechazar; y en la víspera del
cierre (24 h antes) manda un único último
aviso a quien todavía no respondió (el mensaje sale en portugués; si la
competencia tiene LOCALE=en, va en inglés
y en portugués en el mismo texto; el DM no tiene
selector de idioma). Solo llega a quien tiene Telegram
vinculado (perfil del entrenamiento → 📨 Telegram); por eso la
lista de invitaciones muestra 📨 (alcanzable) o
⚠️ (sin canal), y el resumen cuenta cuántos quedaron sin
él. En la tabla de equipos, cada invitación pendiente tiene el botón
🔔 para recordarla en el momento, y el encabezado tiene
🔔 Recordar a todos; recordarlas a mano
no cancela el aviso automático de la víspera. Para
desactivar el automático en esta competencia, desmarca recordatorio
automático en la caja de la ventana (graba
REG_REMIND=n). Esto importa porque quien no acepta
la invitación no entra en el equipo, y a veces ni siquiera está
inscrito.
En la competencia, cada miembro entra con SU PROPIO usuario y
contraseña del entrenamiento y la sesión pasa a ser la del
equipo: el marcador, los globos y la impresión ven una sola
fila. Quién estaba en el teclado queda registrado
(var/actor-log y la 5.ª columna del
var/access.log): útil para revisarlo después.
La ventana (Personas › Inscripciones → Ventana
de inscripción): abre (vacío = ya abierta),
cierra (vacío = el inicio de la competencia) y
retraso (min): minutos después del inicio en los que
todavía se puede entrar, pero en la cohorte …-atrasado, que
aparece en el marcador sin ocupar posición (es la
extra registration de Codeforces). Pasado ese tiempo, la puerta
se cierra.
En qué reloj están estos campos: en el de tu
navegador; la caja muestra cuál es, justo debajo. En cambio,
las horas que el MOJ escribe para las personas (el DM
del mojinho, el checklist previo a la competencia, la fecha del
cuadernillo, el informe final) salen en la zona horaria de la
competencia, que defines en Central › Reglas → 🕒 Identidad
y ventana → 🌎 Zona horaria de la competencia (vacío =
America/Sao_Paulo). Cuando los dos relojes difieren, la
caja de la ventana muestra también la hora en la zona horaria de la
competencia, para que no haya dudas. Escribe el nombre de cualquier zona
horaria (America/Santiago,
America/Mexico_City…). La lista sugiere todas, empezando
por la de tu navegador. Usa la zona de tu ciudad, y no otra que tenga la
misma hora hoy: el horario de verano cambia en fechas distintas en cada
país, y los textos saldrían con 1 h de diferencia después del cambio. La
zona horaria también se puede elegir en el asistente de creación, y va
con la competencia al exportar, duplicar o guardar un template. Por la
CLI:
moj-contest -c <cid> settings set tz=America/Santiago.
Marcador: la inscripción siembra las cohortes
individual y times, cada una con su
propio marcador: el selector "Marcador: General | Equipos |
Individual" aparece solo en la página del marcador. Si la competencia ya
tenía cohortes configuradas, el checklist previo a la competencia avisa
que faltan esas dos.
Con CALENTAMIENTO (el que queda varios días en
vivo): planifica las dos rondas en Evento › Rondas (el
calentamiento ahora, la competencia oficial en la fecha real). Por
defecto el calentamiento también exige inscripción: es
en él donde el competidor resuelve el inicio de sesión, el envío y el
marcador; dejar entrar sin inscripción solo empuja el problema al día de
la competencia. La inscripción se cierra sola al inicio de la
competencia oficial (es esa fecha la que hereda "cierra", no la
del calentamiento). Si prefieres el calentamiento de puerta abierta
(cualquier cuenta de la fuente entra sin inscripción), activa
REG_WARMUP_OPEN=y en el conf; en ese caso la
promoción cierra la sesión de quien no se inscribió y
el marcador de la competencia nace solo con los inscritos; el panel
muestra el sello 🔥 calentamiento: puerta abierta mientras esto
esté vigente.
El modo de participación es definitivo: después de inscribirse (individualmente o en equipo), el competidor no cancela ni cambia de modo por su cuenta: la página de inscripción lo deja claro antes de elegir, y cualquier cambio pasa por ti (Personas › Inscripciones: quitar, disolver, inscribir a mano).
El equipo también declara en la inscripción: la
universidad (se convierte en el prefijo
[SIGLA] Nome do Time en el marcador y en la columna/filtro
de escuela), el uso de IA (aparece como 🤖 al lado del
nombre: es transparencia, no un juicio), la bandera
(país o estado de Brasil: la banderita del marcador) y una foto
del equipo (la que va a la pantalla; se reprocesa en el
servidor, sin metadatos). El capitán puede editar todo mientras la
ventana esté abierta, y es visible en tu panel y en el CSV. El
inscrito INDIVIDUAL declara lo mismo (menos la foto):
universidad, IA y bandera, en la inscripción o después, en la misma
página. La organización ajusta cualquiera de ellos con las acciones
team-meta/individual-meta del panel, sin una
regla regex en el teams-meta.json (el mecanismo heredado
sigue valiendo solo como superposición visual).
Consejo para el día de la competencia: el checklist de la Central muestra cuántos se inscribieron y cuántas invitaciones quedaron pendientes: una invitación no aceptada significa gente que cree que está en el equipo y que, a la hora de la verdad, no entra.
Al crear la competencia (paso 3 del asistente) eliges entre cuentas propias de la competencia y usuarios compartidos con Entrenamiento libre. En el modo compartido, cada persona entra con la cuenta y la contraseña del entrenamiento. Es práctico para una lista de ejercicios. En un examen, ten en cuenta lo que implica:
.admin (el de quien creó la
competencia) y los superadmins del entrenamiento entran con rol. Juez,
staff y co-organizador necesitan una cuenta propia de
la competencia (Personas › Cuentas, sección 3).El asistente solo crea la competencia compartida después de ☐ Entendido. La Central muestra el ítem Cuentas compartidas mientras la competencia siga así.
Actuar sobre un participante compartido. En Personas › Cuentas, quien entra con la cuenta del entrenamiento aparece con 🔗 entrenamiento. Deshabilitar bloquea a la persona en esta competencia (la cuenta del entrenamiento sigue valiendo allá) y reactivar lo deshace. Descalificar la saca del marcador. Quitar la bloquea para siempre: no vuelve con la cuenta del entrenamiento. Una cuenta que creaste o restableciste aquí vale con la contraseña de aquí: la del entrenamiento ya no abre esa cuenta en esta competencia.
Convertir en cuentas propias (Personas › Cuentas › tarjeta 🔗 Cuentas compartidas):
Lo que hace la conversión:
time-…) con contraseña única, y los miembros dejan
de entrar con sus propias cuentas; el miembro que ya envió pasa a ser
una cuenta deshabilitada, y su fila en el marcador se mantiene;.admin del entrenamiento pasa a ser un
.admin propio de la competencia con contraseña nueva (la
pantalla la muestra);En la CLI: moj-contest -c <id> users convert
(vista previa) y users convert --apply --csv creds.csv.
Pégala en la carga en lote de Personas › Cuentas (una línea
por cuenta: login nome), o crea uno por uno con
moj contest -c <cid> users add <login> --name "<nome>":
juiz1.judge Juez Uno
juiz2.judge Juez Dos
juiz3.judge Juez Tres (reserva del quórum de 2)
chefe.cjudge Juez Principal
apoio1.staff Staff de impresión y globos
sede1.cstaff Jefe de la Sede 1 (etiquetas + revelación)
monitor1.mon Monitor (responde aclaraciones)
Después: activa Veredicto manual (y ajusta el N.º de jueces) en Central › Reglas; distribuye las contraseñas generadas; cada persona inicia sesión en la MISMA pantalla de la competencia y ve los botones de su rol.
El panel administrativo del Entrenamiento libre
(/treino/admin/, cuenta .admin) tiene la
pestaña 🏆 Contests. Lista las competencias creadas por
la interfaz y controla quién puede crear competencias y problemas.
Quién ve qué. La regla vale en la API, no solo en la pantalla.
.admin listada en
SUPERADMINS en el archivo contests/treino/conf
(usuarios separados por espacios). Solo quien tiene acceso al servidor
edita esa lista. No hay pantalla para eso.Filtros de la lista. Busca por nombre, id o propietario. Filtra por propietario, modo y situación (próxima, en curso, terminada). Ordena por fecha de creación, inicio, nombre o propietario. Marca solo las mías para ver solo lo que creaste. El propietario aparece con foto, nombre y enlace a su perfil.
Id reservado. Un id que empieza por
icpc es de la organización de la Maratona. Solo un
super-admin crea una competencia con ese id. El asistente avisa antes y
la API la rechaza.
Prioridad (columna Prioridad). El superadministrador
cambia la prioridad de cualquier competencia directamente en la tabla,
incluida Super, que salta toda la cola. Este es el
único lugar para dar o quitar Super. El asistente solo ofrece Super al
superadministrador, y una copia (duplicar) de una
competencia Super hecha por otra cuenta nace como
Competencia. Los demás administradores solo ven la
columna: el admin de cada competencia cambia las otras prioridades en
Central › Reglas. Todo cambio queda en la Auditoría de la competencia y
en la traza del entrenamiento (feed 📜 Actividad, acción
contest-priority). Por la CLI:
moj contest priority <cid> <prioridad>.
Quién puede crear competencias y problemas. El mismo
permiso vale para crear competencias y para crear problemas y
colecciones en la Gestión de Problemas. Las cuentas .admin
siempre pueden. Para las demás: