MOJ: Organizer manual (the contest .admin panel) — MOJ docs

MOJ: Organizer manual (the contest .admin panel)

Translation note. This manual is a translation of the Portuguese original. The command-line tools (moj, moj-contest, moj-comp) print their messages in Portuguese, and the command examples below are identical to the original.

This manual is for the person who operates a contest: the owner of the .admin account. It explains each tab of the administration panel and each configuration option. It also explains how to enable the special roles (.judge, .cjudge, .staff, .cstaff, .mon) and how to turn on judge-validated grading, including how many persons you need.

Creating the contest (wizard, problems, accounts) is in the other guide: the organizer tutorial. This manual is about OPERATION, on the contest day.

To get to the panel, log in with the .admin account of the contest. Then click Administration in the top bar.

1. The panel: Home, the groups and the MODULES

The panel opens on 🏁 Home. The top bar has the four common groups, which every contest has. After a separator, it has the event groups. An event group appears only when the contest turns on the related module (section 1½). Each group shows its panels on the second line. The address keeps the panel (#group/panel), so you can save the link. The old links (#settings, #users, #machines, #prova/rodadas…) continue to work: they are redirected. A link to a panel of a module that is off goes to Home › Modules, with a notice that tells which module to turn on.

[🏁 Home] [🧩 Contest] [👥 People] [🎛️ Operations] │ [🏟️ Event] [🖥️ Machines]        📖 Manual
                                                   └── only with the module on ──┘
Group Panels Appears
🏁 Home Home · Modules · Rules always
🧩 Contest Problems · Skeletons (esqueletos) · Report always (Skeletons only with the module)
👥 People Accounts · Registrations (inscricoes) · Sessions always (Registrations only with the module)
🎛️ Operations Status · Staff · Judges · Audit always
🏟️ Event Rounds (rodadas) · Documents (documentos) · Balloons (baloes) · Qualification (classificacao) · Teams (sedes or telao) · Cohorts (coortes) · Sites & schools (sedes) with the module in parentheses
🖥️ Machines Gate & lock · Anomalies · mlinux with the maquinas module

🏁 Home: what is missing and what to generate

Block What it does
🚦 Before you start The pre-contest checklist (green/yellow/red), with a button that opens the exact panel of each open item. Red is critical: check it before the start. The checklist is only a warning. MOJ does not block login or submissions because of it. The items that are already correct stay collapsed. It checks the window, the judging log, the freeze, the judges, the languages, the calibrated TL, the pool, the accounts, the staff and the daemon. It checks if a problem of an ICPC contest keeps judging after the 1st failure (Judging stops at the 1st failure: the TLE of a problem with hundreds of tests takes minutes — tick "stop at first" TLE/WA in the Limits tab of the problem editor). It also checks if each judge has already calibrated each problem (Judges warmed up). The time limit is measured per machine. A judge that did not calibrate a problem yet does it on the 1st submission of that problem, and that submission waits for minutes. When a judge is cold, the item shows the 🔥 Warm up judges button, which tells only the cold judges to calibrate. Do this before the start (each calibration uses one slot of the judge for some minutes). Then run the checklist again (↻) to see "warming up" change to "warmed up". The same button is also always in Operation › Status, and, in a contest with the Contest priority (or Super), the warm-up also runs by itself: when a round is promoted and about 15 minutes before the start of each round (it goes to the audit as warm-judges). A class list has only the button. Only with the module on, it also checks cohorts, browser gate, site lock, next round, documents, balloons and extensions. The modules check warns when a module is off but the contest has data for it. No freeze and shared accounts are a warning only in a contest with the Contest priority (in a list they are normal).
🧰 Generate One card per artifact, with the current state. Always: credential badges, contest report and jplag (jplag also opens for the chief judge, who can run it, and for the judge, who can only see it). With the module: documents (documentos), promote round (rodadas), reveal ceremony and big screen (telao).
📡 Live A short summary (pending, submissions, online judges, p95 response, manual review). It refreshes automatically. The full panel is Operations › Status.
⏱️ Contest rules Start, end and freeze, which you can edit there. The mode and the languages, read-only. The modules that are on (with a shortcut to turn them on/off). All other options are in Home › Rules.
Panel What it does
Home › Modules Turns the contest modules on and off (section 1½). One card per module shows what it opens and if the contest already has data for it. Presets: course exam · course exam with Maratona Linux · selection contest · Maratona.
Home › Rules All the contest options, in five collapsible sections (identity and window · what the team sees · judging · scoreboard/freeze/penalty · access). Section 2 explains each option. The ⏱ extension by site is in Event › Sites & schools.

🧩 Contest: the content

Panel What it does
Problems The contest itself: rename/reorder/remove problems. Edit the identifier (the "letter": it can be W1, Q…; reordering keeps a custom identifier, and the balloon color moves with it. With the automatic letters A, B, C…, reordering changes the letters, and the balloon color and the clarifications follow each problem. When the contest is live, the panel asks for confirmation). Restrict the languages or the judge pool PER problem. Update the statement from the bank (MOJ reindexes the problem and replaces the statement in a few seconds; the current one stays until then). Send or remove HTML/PDF per language. The 🌐 Statement languages panel (below) and 🏦 Add from bank (search and random draw).
Report The static contest report in one place: download the browsable tar.gz, publish it as history at /relatorio/<contest>/ (republish, unpublish) and publish the report of each archived round. Section 6½ explains it.

🌐 Statement languages. A problem from the bank can have its statement in Portuguese, English and Spanish (the author writes docs/enunciado.en.md and docs/enunciado.es.md in the package). The 🌐 Statement languages panel (Contest › Problems; the chief judge has the same panel in the 🌐 Languages tab of the chief judge panel) has two modes:

Problem name in the contest. The name in the problem list, in the clarifications, in the submissions and in the report is ONE name per problem. When you insert a problem and do not type a name, MOJ uses the bank title in the language that the accordion opens (the LOCALE, if the contest offers it). If the problem has no title in that language, MOJ uses the Portuguese title.

👥 People: who gets in, who is who

Panel What it does
Accounts Create/reset/disable/remove accounts (one by one, or in bulk from a .txt/.csv file). Change the password of all accounts. The shortcut to the Credential badges. You create the role accounts HERE (section 3). In a contest with users shared with Free Training, the 🔗 Shared accounts card converts all of them into own accounts (section 8¾). In a batch, Process shows how each line was read (login, password, name, email) and the result says why each line was left out. A line with : and no header is always login:password:name:email — localhost:6767 on its own becomes a login + password; a name with : or , goes in the CSV with a header. A : in a team (or school) name is saved as ∶ (looks the same): the scoreboard uses : as a separator. This holds everywhere a name is saved (here, Teams, contest creation and the students' registration).
Registrations (module inscricoes) The contest roster (only registered persons get in) and the window: when it opens, when it closes (default: the contest start) and how many minutes of late entry. It lists teams and individuals. It can dissolve a team, register a person manually, nudge a pending invitation by DM (🔔) and export CSV. Section 8½ explains it.
Sessions Who is logged in now, with logout. 🚪 Mass logout and login lock: close the login, log everybody out, reopen. This is the end of a room exam and the round change. It also has the access log per day. It applies to any contest.

🎛️ Operations: the contest day

Panel What it does
Status The live dashboard (it refreshes in place every ~12 s): logged-in users, online/busy judges, queue, pending, latency, timeline, manual evaluation, the suggested actions when something is wrong and the 🔥 Warm up judges button. Pending/held balloons only with the baloes module.
Staff Overview of the print queue, and actions on it (+ balloons with the module). Performance per staff member, and the scope of each staff member / site chief (regex or region:<site>). region:<name> covers everything that is in that node of Event › Sites & schools: the site and, if it is a parent node, all the sites below it (region:Nordeste sees the sites of Nordeste), and also a cut (view) by its name. The site stored on the team applies or, without it, the regex. A regex in the scope is tested on the login.
Judges The manual review queue: who claimed each submission, votes, age. Decide/resolve immediately. It also has the manual verdict configuration: the label options and 🔎 What goes to review. This is a problem × verdict table: a checked cell goes to the judges, and the rest goes out automatically. With no cell checked, everything goes out automatically. The table has exceptions per language, and a button to release the held submissions that the new table no longer holds.
Audit A unified feed of all events (admin actions, logins, submissions, verdicts) with filters and CSV. It also has the backups that the users uploaded (per user, with ZIP).

🏟️ Event: what a multi-site contest has in addition

Panel (module) What it does
Rounds (rodadas) Warm-up and official contest in the SAME contest: plans each round (window + problems), shows the checklist and promotes. The promotion archives all that happened. Section 6 explains it.
Documents (documentos) Generates the contest documents, in PDF and HTML, in the three languages (pt/en/es): Judging environment (info sheet), problem set (cover + statements), time limits sheet and the editorial (it is published only after the END of the contest). Section 5 explains it.
Balloons (baloes) The color of each letter. This is the color on the balloon sheet. The default covers A–O. With more than 15 problems, set the other colors (if not, they are gray). These are the colors of the live round. To give its own colors to another round, use Event › Rounds. When you change a color, the balloon tasks that are not printed yet get the new color; the screen tells how many sheets were already printed with the old color.
Qualification (classificacao) Who qualifies for the next stages. Each stage (Brazilian Final, PDA, World Finals) has its own engine, which you select in the panel: preview, draft, publication (one 🎓 chip per stage on the scoreboard) and the manual override — exclude from the computation, withdraw without recomputing, promote by hand, always with a reason. For smaller contests (a selection contest), the Manual engine: you set how many teams advance and what the next stage is, and you click on the scoreboard to promote teams (reason optional). docs/CLASSIFICACAO.md explains it.
Teams (sedes or telao) The identity of each account on the scoreboard: team name, country/flag, site, university, crest and photo. Load from CSV and "materialize matches". A : in a name or school becomes ∶ (looks the same; the screen tells you).
Cohorts (coortes) Guest teams (unofficial, "CCL") separated from the official teams: who appears on the public scoreboard, who sees whom, and the 🔓 Release results of the post-ceremony. Section 8 explains it.
Sites & schools (sedes) The sites (name + regex on the login). The sites feed the scoreboard filter, the staff scope, the badges, the photos/music that each site chief manages on the big screen and the gate by site. It also has the country/school rules by regex and the ⏱ extension by site/group (regex → new end; it only extends, it never shortens). In three modes (Simple, Intermediate, Advanced) with a preview — section 7¼.

🖥️ Machines: when the contest runs on Maratona Linux (module maquinas)

Panel What it does
Gate & lock Where each team logged in from (IP and browser) in each round, with CSV. The configuration of the browser gate by site (expected × seen per team) and the per-site IP lock (pinned IPs, blocks, pin/release). Section 7 explains it. The map counts logins from the round's login opening (without taking the previous round's), not only those after the start.
Anomalies What is wrong in the use of the machines during the contest (when the MLinux browser identifies the machine, with or without the gate; "UA off-site" needs the gate in Block or Observe): a team with 2 live sessions, a machine shared by 2 teams, a submission from another machine, a UA outside the site, a site with fewer machines than teams, machine changes, the single session trail and the lock blocks. Timeline, table per team, CSV, logout, log out mismatched UA and explain a case. Section 7½ explains it. A team that logged in before the start (login opens before the contest) shows the machine of its last login before the start, marked "before the start": that is the session the team starts with; switching machines before the start is not an anomaly.
mlinux The overview of the machines per site that nutellaboot collects: hardware and equipment model, RAM, editors, memory pressure with PSI, health during the contest (restarts, processes killed for lack of memory, wrong clock, idle time). It also has the collection and the remote commands. The health and PSI data appear only for machines with the new mlinux agent; the screen tells how many there are. The Machine-team link card shows how many machines MOJ has already linked to a team in nutellaboot. This occurs automatically when the team logs in, with the new mlinux agent. The card has the send roster and republish links buttons. Use the two, in this order, when the card says "team not in the image roster". Saving the key (or turning the link back on) with teams already logged in republishes the links of those logins by itself. The Real-time machine alerts card installs the nutellaboot notification. When a machine raises an alert (USB drive, mobile phone, network over USB, repeated identity), the alert appears in Machines › Anomalies. During the contest, the contest owner also gets it on Telegram. To install or remove it, the saved key must be the nutellaboot administration key. docs/NUTELLABOOT.md explains it.

Balloons and the freeze. By default, an accepted submission made while the scoreboard is frozen does not create a balloon task. These balloons are not delivered later: the task does not exist. This is the competition rule (a balloon that moves through the room shows what the freeze hides). It applies only to balloons: print requests continue to work. If you want the classic ICPC behavior (balloons in the room during the freeze, and the audience guesses), check Deliver balloons during the freeze in Home › Rules. This also releases the balloons that were already held. The pre-contest checklist shows which policy applies, and Operations › Status shows how many balloons are held.

How the scoreboard marks who solved a problem. By default, the cell of a team that solved a problem is always the same (green), and the balloon color is in a dot next to it. This is intentional. The ICPC palette gives problem A the color white, and white on the white background of the scoreboard is the same pixel. A team that solved A looked like it did not solve it (the complaint that caused the change came from a student). If you prefer the classic style (the full cell painted with the balloon color), set it in Home › Rules › "Solved" cell on the scoreboard. Light colors get an outline so that they stay visible. This applies to the scoreboard, the reveal ceremony and the report.

Outside the panel, but linked from Home: credential badges, reveal ceremony, jplag, staff queue and scoreboard.

1½. Contest modules: turn on only what your contest uses

A module is a group of features that the contest uses. A course exam turns on no module: the panel shows only the common part (problems, accounts, sessions, scoreboard, staff, judges). A course exam in a lab with Maratona Linux turns on maquinas (machine gate, single session, anomalies). The Maratona turns on all of them. When you turn on a module, MOJ shows the related panels, Home checks and cards. When you turn it off, MOJ hides them and deletes nothing. When you turn it on again, all comes back.

While a module is off, its rule does NOT apply, also with the configuration saved: Machines turns off the browser gate, the single session and the site lock (the pinned IPs are released at once); Sites turns off the per-site extension; Registration lets in persons who did not register (a team member still enters as the team), removes the Register button from the home page and nobody can register; Cohorts puts all teams on the public scoreboard; Balloons stops creating balloon tasks (turning it on again creates the missing ones). Before you turn off a module of a contest that is running, make sure that this is what you want.

Module What it turns on Detected by
sedes Event › Sites & schools, Event › Teams (identity), extension by site, staff scope by site regions.json, teams-meta.json, extensions
maquinas Machines › Gate & lock, Anomalies, mlinux; gate/lock/single-session checks UA gate on, SITE_LOCK=1, nutellaboot key
rodadas Event › Rounds; Promote card; round reports rounds.json
documentos Event › Documents; Documents card; chief judge tab docs/config.json
baloes Event › Balloons; balloons in the staff queue and in Status; balloons in the freeze balloons.json
coortes Event › Cohorts cohorts.json
inscricoes People › Registrations registrations.json
telao Reveal and Big screen cards; Event › Teams (photos) animeitor.json, webcast.json, team photos
classificacao Event › Qualification (stage and engine selector) classification.json
virtual Event › Virtual; Virtual button on the card of the ended contest; link on the scoreboard (see §6¾) virtual/runs/
esqueletos Contest › Skeletons: the team code editor opens with the language skeleton (below) esqueletos.json

Where to turn a module on: Home › Modules (the presets only preselect), step 7 · Modules of create contest, moj-contest -c <cid> modules on|off or the modules{} section of the creation spec. It also turns on automatically when you use the feature. Create a round or a cohort, turn on the gate, generate a document, turn on registration, set a balloon color, a site or a webcast key, on the web or in the CLI: the related module turns on immediately (the audit records modules-auto). Only turning off is manual. This also applies to the creation spec: one JSON creates the full contest, with the data of each module (sites, colors, cohorts, gate, rounds, documents, registration window, big screen, qualification). The export gives back the same section, without secrets. For contests created before the modules, MOJ detects the modules one time from the files that they already have (server/bin/contest-modules-detect.sh).

Prerequisites. Two modules only work with another contest setting, so they only turn on with it (virtual participation has its own conditions, in §6¾; the cheat sheet below shows all of them): inscricoes (registration) needs the Free Training accounts (a contest created with shared users): each student registers with their own training account. In a contest with its own accounts, registration would block every student, so it does not turn on (not from the panel, not when saving the registration window, not at creation, when duplicating or from a template). With own accounts, hand out the credentials in People › Accounts. esqueletos (code skeletons) needs the in-browser code editor (Rules). The module card shows a lock and what is missing. If a contest already had the module on without the prerequisite, the Home checklist warns (and, without the training accounts, the "registered only" rule does not apply). Converting shared accounts into own accounts (section 8¾) turns registration off as well.

Cheat sheet: what each module needs. On the left, what MOJ requires to turn the module on (↔︎ = it applies in both directions); on the right, what the module needs, when it is on, to do something.

To turn on, it needs
Module
When on, it acts with
the Free Training accounts (USERS_FROM)converting to own accounts turns the module off
→
inscricoes
→
registration on (People › Registrations)
the in-browser code editor (Rules)while the module is on, the editor stays on
↔
esqueletos
→
nothing: the default skeleton of each language
ICPC modenot secretscoreboard not anonymousstart and endall problems public in the trainingat creation, it starts off and the screen tells why (§6¾)
→
virtual
→
contest ended for all sitesscoreboard unfrozen (Finish event)
—
sedes
→
the site tree (Event › Sites & schools)
—
maquinas
→
gate: a rulemlinux: the NutellaBoot key
—
rodadas
→
the round plan (Event › Rounds)
—
documentos
→
nothing: made from what the contest has
—
baloes
→
nothing: ICPC colors by default
—
coortes
→
the cohorts (Event › Cohorts)
—
telao
→
big screen: the event published in Animeitor
—
classificacao
→
the engine of each stage (Event › Qualification)

Code skeletons (module esqueletos)

In a contest, the team code editor opens empty: the team writes its full code. With the module esqueletos, the editor opens with the language skeleton (the main and the usual reads). Use it in a course list or a course exam, when the skeleton helps the student.

2. Rules (Home › Rules): option by option

Identity and window

👁 What the team sees during the contest

⚖️ Judging (languages, pool, manual verdict)

Save writes only what changed (the Audit log records only that). If an option is wrong (for example, a time zone that does not exist), nothing is written and the message tells which option to correct.

In the CLI, all of this is moj contest -c <cid> settings set chave=valor (for example: settings set manual_verdict=true review_judges=3).

3. Special roles: what they are and how to enable them

To enable a role, create the account with the correct suffix in the login, in the People › Accounts panel (or moj contest -c <cid> users add fulano.judge). There is no permission checkbox: the suffix IS the role. The public self-registration never creates accounts with these suffixes (they are reserved). Bulk operations (password reset, disable) skip privileged accounts on purpose.

Role Suffix Can Cannot
Administrator .admin All: ⚙ panel, submit at any time, see the problems before the start, scoreboard without freeze, vote as a judge, resolve conflicts, answer clarifications. Appear on the scoreboard (no role appears).
Judge (human) .judge Judge tab (manual review), submit/see the problems at any time (test the contest!), scoreboard without freeze, answer clarifications, Statistics. Resolve conflicts; admin panel.
Chief judge .cjudge All that .judge can + the Chief judge panel: resolve vote conflicts, edit clarification answers already given, see the login and the name of who asked, release the reservation of another judge (own button, with confirmation), options and what goes to review. Admin panel (Home › Rules, etc.). Reserve a clarification that another judge has already reserved.
Staff (room staff) .staff The 🖨️ print and balloons queue (claim/print/deliver, automatic kiosk mode). See problems or submit (never); badges; scoreboard without freeze.
Site chief .cstaff Follow the staff queue of the site (read-only). Badges with the credentials of the competitors and of the .staff of the site (with password, except in a contest that uses the training accounts: there the password is personal and does not go on the badge; the credential of the site chief also never goes on a badge). The 🎥 big screen of the site and the 🏆 reveal by site after the end. Act on the print queue; see problems/submit; does not inherit .staff.
Monitor .mon Submit DURING the contest (without appearing on the scoreboard), answer clarifications, All Submissions and Statistics. See the problems before the start; manual review.

Golden rule: no account with a role suffix goes to the scoreboard or to the statistics. Create as many as you need: they do not change the result.

Alert for the organization on any page. Admin, chief judge, judge and .mon get, on any page of the contest, a bar at the top with a sound: 💬 unanswered clarification (all these roles), ⚖ verdict awaiting your vote (admin, chief and judge, when manual verdict is on) and ⚠ conflict (admin and chief). The count also shows in the title of the tab. The sound plays again every 2 minutes while items are pending. The bar has the buttons to enable or mute the sound and to ask for the system notification. The scoreboard reveal, the Animeitor big screen and the editor window do not show the bar. More information in MANUAL-JUIZ.md.

Contest with users shared with Free Training: a role account of the training site does not get in with its role here. Only the .admin of the person who created the contest and the training superadmins get in. A judge, a staff member or a co-organizer = an account that you create in this contest (section 8¾).

4. Grading validated by judges (manual verdict)

With Manual verdict on, the automatic judging continues to run, but the verdict is held: the student sees the submission as pending until human judges validate it.

The flow, in the Judge tab (the .judge page):

  1. The judge claims a submission from the queue (a reservation with a deadline; max. N judges on the same submission).
  2. The judge sees the computed verdict, the log and the code, and votes (confirm, or change the label).
  3. When N unanimous votes accumulate (N = Judges required to validate each verdict, default 2), the verdict is released. It goes to the history of the student and to the scoreboard immediately.
  4. Different votes become a conflict: the chief judge (.cjudge) decides in the chief judge panel (a global alert gives a warning).

Verdict options. The chief judge or the admin edits the list in 🏷️ Options (chief judge panel or Operations › Judges). Each option has three fields:

  1. The text that the judge sees and selects. Example: 5 - NO - Wrong answer.
  2. The class: one of the six canonical classes. The class sets the score, the penalty and the color on the scoreboard. Example: Wrong Answer.
  3. The text that the team sees. Example: Formato de saída errado. Leave it empty to show the class. The Accepted class has no text of its own.

Thus each contest customizes what the team reads, without a change to how the scoreboard counts points.

How many persons do you need? At least N .judge accounts (the quorum) + 1 .cjudge for conflicts. I recommend N+1 judges, so that the queue does not stop when a person takes a break. The .admin also votes (it counts as a judge), but in a large contest keep the admin free to operate. With N=1, one judge reviews everything (good for a small contest). N=2 is the balanced default. N≥3 is for finals where the verdict needs a panel.

5. Contest documents (Event › Documents — module documentos)

The tab exists for the .admin and for the chief judge (.cjudge). It produces the contest documents, each in PDF and HTML, in Portuguese, English and Spanish:

Document What it contains Where the data comes from
Judging environment (info sheet; formerly "Environment information") In the format of the Maratona SBC sheet: operating system and compiler versions, accepted languages with their extensions, limits of memory, time, source size, output and compilation, the compile and run lines of each language (the same as the judge), the verdicts, the judging notes, the penalty and the response times. Editable text (Markdown) + live data: run/registry (what the judges report), the contest conf and the calibrated TL.
Problem set Cover + one statement per problem, in letter order. If the problem has its own PDF in the contest, that PDF goes in (the layout stays the same). If not, MOJ renders the statement in the format of the Maratona SBC problem sets: Computer Modern with LaTeX line spacing and hyphenation, centered problem title, samples in stacked boxes (as on the site). Or, if you check "problem set samples as a table (input | output)" in the Documents panel, the samples go in an "Input sample · Output sample" table, as in the SBC (a sample with long lines is better stacked). The footer is "event – Problem X – title", with the page number. PROBS of the contest, enunciados/<chave>.{pdf,html} and, if missing, the statement from the bank.
Time limits sheet Table letter · name · time limit per test. If the limit is the same in all languages, there is one column and the note "does not depend on the language". If it is different, there is one column per language. Plus the errata that you write. The TL calibrated and served to the judges (run/tl).
Editorial A cover (title, date, introduction note and index of the problems) and the solution of each problem, in letter order, each problem on a new page. Generate and review it when you want. The server lets you PUBLISH it only after the end of the contest (extensions by site included), and the team can download it only after the contest ends. The docs/solucao.md of the package of each problem (the text that the author wrote and that never goes to the student).

Flow, from start to end

  1. Fill in the data (⚙️ Document data): problem set version (v1.0), cover note and errata. Save.

  2. Adjust the cover, if you want (🎨 Problem set cover). There are two modes, in this order of precedence: uploaded PDF › text. The text opens with the MOJ default cover: it is that cover, written in Markdown, so you edit only what you want to change. The markers are replaced when MOJ generates the document: {{CONTEST_NAME}}, {{DATE}}, {{N_PROBLEMS}}, {{N_PAGES}}, {{SITES}}, {{VERSION}} and {{NOTE}} (the cover note). {{N_PAGES}}, {{SITES}} and {{NOTE}} are optional: when one of them is empty, its block disappears. Upload a PDF when the cover is finished artwork of the event. It goes in as it is, and the rest of the problem set is attached after it.

    Logo (🏷️ Header logo, optional): a strip with the event logos (PNG, JPEG, WebP or SVG, up to 5 MB). It goes at the top of each page of the problem set and of the editorial, and on the generated cover, as in the Maratona SBC problem sets. It applies to the three languages; remove takes it out.

  3. Adjust the info sheet text, if you want (📝). It is also Markdown, with the markers {{TOOLCHAIN}}, {{TL_TABLE}}, {{LANGS_TABLE}}, {{MEMLIMIT}}, {{STACK}}, {{CONTEST_NAME}} and {{DATE}}.

    The two texts use the MOJ editor (Markdown colors and line numbers), with one tab per language (PT · EN · ES), as in problem management. Save saves all the changed languages. restore default gives the language of the tab back the MOJ text.

  4. Generate (the button of each line, or ⚙️ Generate all (pt+en+es)), or upload a finished PDF (the upload PDF button of the line). The uploaded PDF is a complete document. It overrides the generated one in all that MOJ serves, and you can publish it without generating. back to generated deletes only the uploaded file (on a published document with no generated PDF, MOJ refuses: generate first or unpublish). The conversion to PDF takes some seconds. The problem set takes the longest, because it joins one PDF per problem. If the conversion to PDF fails, the message tells which document failed, and the previous PDF (if there was one) stays the file that all persons download.

  5. Check: each line has PDF, HTML and open. Review before you publish. Something wrong in the generated PDF, such as too much or too little space between the elements, or a large image, caused by the Markdown of the statement? Each generated document also has the ✎ .odt, the editable file that the PDF came from. Download it, adjust it in LibreOffice (or Word), export it to PDF and upload it with upload PDF. The uploaded file overrides the generated one, and it is the file that all persons download. The .odt of the problem set has the cover as an editable page, followed by the statements. If the cover is an uploaded PDF, or a problem has its own PDF statement, the .odt marks the place, and you join the PDF when you export. Only the admin and the chief judge can download the .odt.

  6. Publish (only a document with a PDF, generated or uploaded). Publishing does two things: the document appears in the Contest section of the contest page and in Documents. Who sees what:

Did you generate again? You do not need to publish again. The published link points to the current document, so a new generation delivers the new version to the next person who downloads it. But tell the site: the persons who already printed it have the old version (this is why the cover has the problem set version field).

🌐 The problem set and the editorial are in the language of the document. The English problem set uses the enunciado.en.md of each problem (or the English HTML/PDF that you sent in the Problems panel), and the English editorial uses the solucao.en.md. A problem without a translation is in Portuguese in the middle of the problem set: the document never has only the cover translated. The problem title is translated when the package has the title in that language. A bilingual contest with statements prepared outside MOJ continues to use the uploaded PDF.

∑ The formulas in the PDF look as in the statement on the page, including the vertical bar (|x|, a | b). The author does not need to escape anything. If a formula symbol shows as a red ¿ in the PDF, this is a defect of the generator, not of the statement. Report it (with the problem) and, in the meantime, upload the finished PDF of that problem set. A problem set generated before a fix does not update itself: generate it again.

🖼 Statement images fit on the page. In the PDF, each image is at most the size that it has on the web page, and never larger than the usable area (a large image is reduced, with the same proportions). The width that the author set in the statement (![](figura.png){width=50%}) also applies in the PDF.

🔒 The problem set is contest content. Before it is published, only .admin and .cjudge can download it. After it is published, before the start only the judges (.judge) are added to them. For the site and the teams, the API responds 404 until the start: this is not an interface lock.

6. Rounds: warm-up and official contest (Event › Rounds — module rodadas)

Every programming marathon has a warm-up (dress rehearsal) before the contest: two or three easy problems, on the day before or on the morning of the contest. The team uses it to turn on the machine and to test the login, the editor, the printing and the balloon. Your team of judges and staff also rehearses. After that, the contest starts in the same contest, because you want to be sure of its configuration (accounts, passwords, sites, balloon colors, time limits, languages, judge pool).

In MOJ, these are rounds. The live round is the one that appears in Home › Rules and in Contest › Problems. The other rounds stay planned until you promote them.

The procedure (note the order: the warm-up comes FIRST)

  1. Set up the contest as usual, with the warm-up problems and the warm-up window.
  2. In Event › Rounds, give the correct name to the live round (aquecimento, type warm-up) and create the next round (oficial): window, freeze and the list of problems of the real contest. MOJ keeps the list and puts it live only at the promotion: nobody sees the contest problems before. You can use any problem that the contest owner can see: public, his or her own, of a collaborator or of his or her org. The rule is the same as in Contest › Problems, for the live round and for the planned round. Each round can have its own balloon colors. Open the round, go to "🎈 Balloon colours for this round" and save. The colors go live when the round is promoted. A round without its own colors inherits the current colors. For the live round, this section and Event › Balloons edit the same data.
  3. Run the warm-up. The team sees a fixed banner that tells that this is a warm-up and that this scoreboard is not the contest scoreboard. Use it as a full rehearsal of the whole operation. If the login opens at the minute of the start (ICPC model), this is the only moment when each role uses the real screens with nothing at stake. Before it, give each person the tutorial of his or her role (/contest/ajuda/), and ask each person to do his or her own list: the team (log in, open a problem, submit on purpose, clarification, printing, backup, scoreboard), the room staff (printer, the pop-up allowed, kiosk, the route), the site chief (every team of the site logged in at least one time), the judges (verdict options, log/code, the pair reads the same), the chief judge (number of judges, what goes to review, conflict alarm) and the big screen (projector, connection to the Animeitor — publish the scoreboards and turn on the feeder —, photos and music).
  4. When it ends, click 🚀 Promote now. MOJ checks the checklist and, if all is ready:

I registered the CONTEST first. What now? Did you set up the contest with the official contest first, and create the warm-up round only after? Do not promote. Promotion archives the live round (your contest, empty), and an archive cannot change. The correct procedure is to swap them by editing the two rounds in the same panel (the panel warns you when it finds a planned round that starts before the live round):

  1. Edit the planned round: rename it to prova, type official contest, and give it the window + freeze of the contest. In Round problems, put the list of the contest problems (MOJ keeps it, and nobody sees it).
  2. Edit the live round: rename it to aquecimento, type warm-up, warm-up window (no freeze), and replace the problems with the warm-up problems. For the live round, saving applies immediately.
  3. In Home › Rules, make sure that the current window is the warm-up window. Then follow the normal procedure from step 3.
  4. After: the scoreboard and the submissions of the warm-up stay readable in Rounds (and you can publish the round so that the teams see it). The raw archive in .tar.gz, with source code, is one click away, for a later audit.

The checklist is serious. The promotion REFUSES while there is:

Blocker Why
round_running the live round did not end (extensions by site included)
jobs_in_flight there is a submission in the spool/judge queue. If it were judged after the change, its time would be calculated against the contest start, and the warm-up submission would appear again in the contest history
pending_verdicts there is still a submission without a verdict in the history
review_pending there is a submission in the manual review without a released verdict: the judge vote would go to the contest scoreboard
judged_down the judging daemon is not alive, so the queue does not drain
no_next_round there is no planned round
official_over the live round is the official contest and it has ended: promoting archives its result and the visible scoreboard goes back to zero. To show the result, do not promote: turn the secret off in Rules and publish the report

There is a --force (the "ignore blockers" checkbox) for emergencies. It does not remove the risk: it only assumes that you know what you do. The only blocker that --force does not ignore is no_next_round (without a planned round, there is no round to promote to).

Did you promote by mistake? Undo it. In Event › Rounds, the card ↩︎ Undo the last promotion (or moj-contest rounds undo) brings the archived round back live with everything it had — submissions, verdicts, clarifications, prints, scoreboard — and the round that went live goes back to planned. It works only while the round that went live has had no activity (no submission, clarification, print or notice); if not, the card tells what happened in it. You type the contest id to confirm, and it goes to the audit. This was the case at TCP 2026: after the contest, the organizer created an extra round and promoted it, and the scoreboard went back to zero.

A contest that uses the accounts of another contest (USERS_FROM) promotes normally: the archive changes only the local users/. This was a blocker before. It is not a blocker now, because this is the real use case (warm-up + contest with the training accounts).

What does NOT change at the promotion: accounts and passwords, teams/sites/flags, staff scope, balloon colors, regions, calibrated time limits, languages, judge pool, the table of what goes to review and the texts/cover of the documents. What is reset: the scoreboard, the history and the submissions of the teams (archived, not lost), balloons, print numbering, extensions, and the list of published documents.

⚠️ Balloon colors are per LETTER. If problem A of the warm-up and problem A of the contest are different, the color of balloon A is the same in the two rounds. Check it in Event › Balloons before the contest.

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

6½. After the contest: finish the event

When the contest ends, the scoreboard stays frozen and the documents stay not published until a person releases them. None of this occurs automatically with the clock. Home then shows the "🏁 After the contest" block, with the checklist of what is still closed, and the 🏁 Finish event button. This button does at one time the two things that everybody forgets:

  1. it opens the scoreboard: it removes the freeze (FREEZE_TIME=0), so the final result becomes public (this has the same effect as the "🔓 Unfreeze all (public)" button of the reveal ceremony). MOJ accepts the unfreeze only from the end of the contest for all sites + 1 minute. The extension of a site counts. The rule applies to all paths: this button, the ceremony, the freeze field in Home and the round promotion. The screen shows the time from which the button is available;
  2. it publishes the documents already generated that are not published yet: problem set, time limits sheet, info sheet and editorial appear in "Files & Resources" for the teams. (The editorial can be published only after the end; this is why it is included here.)

The button does not change the rest. Release of the judging report to the teams (SHOWLOG), display of the time limits and release of the cohorts (guest teams) stay your decision. Each one appears in the checklist with a "fix →" shortcut to the correct screen. The button runs only after the contest ended for all sites (extension by site counts), and you can use it again as many times as you want: the second time, it does nothing.

The final report closes the cycle (Contest › Report). The browsable tar.gz contains the open scoreboard, the submissions, the full statistics, the statements and the published documents. This is the package that you send to the participants and to the event archive. Next to the download there is 📢 Publish as history. The same site then exists at https://moj…/relatorio/<contest>/, and the contest card on the home page and on /contests/ gets the 📑 Report button. It is the history of the event. The generation runs in the background (~1–2 min for a large contest; the panel shows "publishing…" and changes automatically when it ends). It is public. The report does not contain source code, judge log or passwords, and the clarifications are anonymous. But it shows team names, runs and statistics: publish it when all has been announced. 🔄 Republish generates it again and replaces the full site at one time (a reader does not see a half-done site). Unpublish deletes the address and the button of the cards. The archived rounds (warm-up, for example) have their own button in Contest › Report: 🌐 publish puts the report that the promotion generated at /relatorio/<contest>/rodada/<slug>/. When the main report is (re)published, its home page links the public rounds in "Earlier rounds of this event".

MOJ refuses to publish the report when it would show what is not public yet:

6¾. Virtual participation (Event › Virtual — module virtual)

After the contest ends, any Free Training account can do the contest again one time, in its own time, against the official scoreboard. The official scoreboard does not change. Full reference: docs/VIRTUAL.md.

To turn it on: Home › Modules › Virtual participation. The module turns on only when:

  1. the contest is not secret;
  2. the mode is ICPC;
  3. the scoreboard is not anonymous;
  4. the contest has a start and an end;
  5. all the problems are already public in the training. If one is not, the response is an error that tells how many are missing. Publish the problems first (problem management) and turn the module on again.

The module card shows a lock and what is missing, and the Home checklist warns about a module that is already on without it. At creation (spec, template or copy), a contest that does not meet these conditions starts with the module off, and the result screen (or the CLI) tells why: turn it on later in Home › Modules.

You can turn on the module before the end of the contest (with the problems already public). It stays inactive and opens automatically when the contest ends for all sites and the scoreboard is unfrozen (the Finish event button). The Virtual button on the contest card and the notice on the scoreboard show only when virtual participation is possible.

Caution: this module makes the final scoreboard and the problem list visible to training accounts. A contest that must not be seen from outside must not turn on this module.

The Event › Virtual panel shows:

Participant rule (the participant reads it before the start): one participation per account. The participant can give up without a record in the first 15 minutes, or while he or she has no accepted submission, at most 2 times. The 3rd start is final.

7. Team machines (Machines › Gate & lock — module maquinas)

The warm-up is when the teams really turn on the computers. From it, MOJ gets the room map team × IP × browser (from the contest access log, cut to the round window: MOJ captures nothing new). The tab shows, per round:

Two actions start here, and they write to the usual place:

The gate BY SITE (the programming marathon case)

When each site runs its own image, the UA of each machine contains a part of the team login: teambrspso001 (Brazil/BR, São Paulo/SP, Sorocaba/SO) runs on an image whose UA contains brspso. One substring is not sufficient, so MOJ derives the expected value from the login.

On the web (🔒 section of Machines › Gate & lock): the mode is Off, Observe or Block. Observe shows the expected × seen UA and "UA off-site" in Anomalies, without blocking anyone or ending a session: you can turn it on during the contest to check the room. Block makes the login return 403. Below are the login regex (with capture) and the expected UA (\1), with a live tester ("test with login" → UA must contain brspso · site Sorocaba), and three collapsible lists: per-site overrides, login regex rules and exempt. When you save, it applies from the next login. With no rule, the gate does nothing: the panel says "no rule: nobody is blocked or observed", MOJ refuses to save Block or Observe without a rule, and the 🏁 Home warns when the maquinas module is on with no saved gate (save Off if this is intentional). This occurred in TCP 2026: the old panel showed "active" with no rule at all.

In the CLI, the same:

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'     # site outside the pattern
moj contest -c <cid> ua-gate set --exempt '^ccl' --exempt time-reserva-07
moj contest -c <cid> ua-gate set --mode observe                     # look without blocking (enforce = block, off = turn off)
moj contest -c <cid> ua-gate check teambrspso001                   # what MOJ expects from it
moj contest -c <cid> ua-gate show

One rule covers all sites at one time. The resolution order is: exempt › role account (always gets in) › regex rule › site override › capture in the login › single substring (the usual login_ua_substring, which continues to apply as the last option).

7¼. Sites (Event › Sites & schools — module sedes)

The site of each team feeds the scoreboard filter, the staff scope (region:<name>), the badges, the per-site browser gate, the statistics, the classification and the big screen. All of them use the same rule:

  1. the site stored on the team wins (the name, not case-sensitive);
  2. otherwise, the deepest regex that matches the login (not case-sensitive);
  3. a group/country adds up the sites below it; a node with the same name as the site also counts it;
  4. a stored site that does not exist in the tree shows as "outside the tree" and counts in the node that the regex gives;
  5. a cut (view: super-site, women teams) groups teams that are already in the sites, and it is never the site of a team.

The panel has three modes. Choose the mode that is sufficient for your contest; you can go up a mode at any time. A mode that does not fit the current tree is disabled and tells you why.

The preview below shows what the scoreboard, the badges and the staff scope will see: how many teams each site has, who has no site, who stopped at a group/country (the regex matched the group and none of its sites), who matches two sites, and the stored sites that are outside the tree. "To save" summarizes the change. If another tab or the CLI changed the sites after you opened the screen, the save refuses: reload and do it again.

A registered team keeps its site in the registration: the site does not disappear when the team changes. The Home shows the item Sites when there is something to check.

The regex follows a subset that matches the same in the browser and on the server: \d \w \s and (?: are accepted; \b, (?=, [[:class:]], lazy quantifiers, an ambiguous hyphen inside [ ] and accented letters are not (logins have no accents). The save tells you which site and why.

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

7½. Machine anomalies (Machines › Anomalies) and Sessions (People › Sessions)

In the Maratona 2026, the question "did a team use two machines?" had an answer only after the contest, with a manual cross-check of logs. The Machines › Anomalies panel answers it during the contest (the active sessions, the mass logout and the access log, which apply to ANY contest, are in People › Sessions). The browser of the mlinux image identifies the machine (machine_id/boot_id), with or without the gate. A login from a common browser has only the IP, and behind NAT the IP is the full site. These logins stay out of the machine anomalies (they appear only in "UA off-site" and in the session list). "UA off-site" needs the expected UA of each team, that is, the gate in Block or Observe mode. When no machine is identified, the panel shows a warning and shows only the sessions and the access log.

8. Guest teams (scoreboard cohorts — Event › Cohorts, module coortes)

A programming marathon invites teams that compete without being in the official competition: people call them guest, unofficial, "CCL". MOJ handles them as a cohort: a group of teams with its own visibility policy.

What a private cohort guarantees

How to configure it (Event › Cohorts)

One row per cohort, with the fields that set the behavior: id, name, login regex, public (appears on the public scoreboard), unranked (included without taking a position), default (a team that matches nothing goes to it) and sees: the checkboxes that tell which cohorts that view sees (a cohort always sees itself). The teams column counts how many teams are in each cohort.

To change the default cohort, select the radio button of the other row and save that row. To remove a cohort, it must be empty (and you can never remove the default cohort).

The same in the 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     # guest team without 'ccl' in the login
moj contest -c <cid> cohorts materialize                    # records the rule as a field per team
moj contest -c <cid> cohorts release                        # the "release everything" (asks for the id)

The cohort matches by regex on the login and/or by the .team.cohort field of each team (the field overrides). materialize changes the rule into data: after it, a change to the regex moves nobody. A team that matches nothing goes to the default cohort (the one of the official teams).

What stays complete, on purpose: these are privileged roles, and you need them: All Submissions, Statistics (including who solved first), the staff queue (the balloon of a guest team must be delivered) and the final report. Two practical results:

ℹ️ Two numeric channels remain. They do not hide identity, but they exist: the public status page counts the pending submissions of all teams, and the print task numbering is unique per contest (gaps show activity that the team does not see).

8½. Pre-registration and teams of 3 training accounts

This applies to a contest created with "Share Free Training users". When you turn on registration (People › Registrations → Turn on), the contest gets a door: a person who did not register does not get in (the API refuses the login; it is not only the screen).

How a person registers: on the main site, logged in to the training, at /contests/inscricao/?c=<id> (the contest card on the home page gets the 📝 Register button). The person selects individual or create a team: gives a name and invites up to 2 training logins. Each invited person must accept. While the window is open, it is possible to leave, rename and undo. Participation is exclusive: to accept an invitation cancels the individual registration.

The invitation sends notifications automatically. At the moment when the captain invites, the mojinho sends a DM to the invited person, with the accept/decline link. On the day before the close (24 h before), it sends one last notification to the persons who did not answer yet (the message is in Portuguese; if the contest has LOCALE=en, it is in English and Portuguese in the same text: a DM has no language selector). It reaches only persons with a linked Telegram account (training profile → 📨 Telegram). This is why the invitation list shows 📨 (reachable) or ⚠️ (no channel), and the summary counts how many have no channel. In the team table, each pending invitation has the 🔔 button to nudge the person immediately, and the header has 🔔 Remind all. A manual nudge does not cancel the automatic notification of the day before. To turn off the automatic notification for this contest, clear automatic reminder in the window box (this saves REG_REMIND=n). This is important because a person who does not accept the invitation is not in the team, and sometimes is not even registered.

In the contest, each member logs in with his or her OWN training login and password, and the session becomes the team session: the scoreboard, the balloons and the printing see one row only. MOJ records who was at the keyboard (var/actor-log and the 5th column of var/access.log), which is useful for a later check.

The window (People › Registrations → Registration window): opens (empty = already open), closes (empty = the contest start) and late (min): the minutes after the start during which a person can still get in, but in the …-atrasado cohort. This cohort appears on the scoreboard without taking a position (it is the extra registration of Codeforces). After that, the door closes.

Which clock these fields use: the clock of your browser. The box shows which one, just below. But the times that MOJ writes for people (the mojinho DM, the pre-contest checklist, the date of the problem set, the final report) use the contest timezone. You set it in Home › Rules → 🕒 Identity and window → 🌎 Contest timezone (empty = America/Sao_Paulo). When the two clocks are different, the window box also shows the time in the contest timezone, so there is no doubt. Type the name of any timezone (America/Santiago, America/Mexico_City…). The list suggests all of them, starting with your browser's. Use your own city's timezone, not another one that has the same time today: daylight saving time changes on different dates in each country, and the texts would be 1 h off after the change. You can also select the timezone in the creation wizard, and it goes with the contest when you export, duplicate or save a template. From the CLI: moj-contest -c <cid> settings set tz=America/Santiago.

Scoreboard: registration creates the individual and times cohorts, each with its own scoreboard. The "Board: Overall | Times | Individual" selector appears automatically on the scoreboard page. If the contest already had cohorts, the pre-contest checklist warns that these two are missing.

With a WARM-UP (a warm-up that stays live for days): plan the two rounds in Event › Rounds (warm-up now, official contest on the real date). By default, the warm-up also requires registration. It is in the warm-up that the competitor solves login, submission and scoreboard problems. To let persons in without registration only moves the problem to the contest day. Registration closes automatically at the start of the official contest (this is the date that "closes" inherits, not the warm-up date). If you prefer a warm-up with an open door (any account of the source gets in without registration), set REG_WARMUP_OPEN=y in the conf. In this case, the promotion ends the session of each person who did not register, and the contest scoreboard starts with only the registered persons. While this applies, the panel shows the 🔥 warm-up: open door badge.

The participation mode is final: after registration (individual or in a team), the competitor cannot cancel or change the mode alone. The registration page makes this clear before the choice, and any change goes through you (People › Registrations: remove, dissolve, register manually).

The team also declares at registration: the university (it becomes the prefix [SIGLA] Nome do Time on the scoreboard, and the school column/filter), the use of AI (it appears as 🤖 next to the name: it is transparency, not judgment), the flag (country or Brazilian state: the small flag on the scoreboard) and a team photo (the one that goes to the big screen; the server processes it again, without metadata). The captain can edit all of this while the window is open, and it is visible in your panel and in the CSV. The INDIVIDUAL registrant declares the same data (except the photo): university, AI and flag, at registration or later, on the same page. The organization adjusts any of them with the team-meta/ individual-meta actions of the panel, without a regex rule in teams-meta.json (the legacy mechanism continues to apply only as a visual overlay).

Contest-day tip: the Home checklist shows how many persons registered and how many invitations are pending. A pending invitation means a person who thinks that he or she is in the team and who, at the time of the contest, cannot get in.

8¾. Accounts shared with Free Training: choose and undo

When you create the contest (step 3 of the wizard), you choose between own accounts of the contest and users shared with Free Training. With shared users, each person logs in with the account and the password of the training site. This is practical for an exercise list. For an exam, know the consequences:

  1. The login and the password are the Free Training ones. You cannot see or reset them, and the badges show no password.
  2. Any Free Training account gets in. To limit this, turn on the Registrations module (section 8½).
  3. Only your .admin (the one of the person who created the contest) and the training superadmins get in with a role. A judge, a staff member and a co-organizer need an own account of the contest (People › Accounts, section 3).
  4. There is no exam-wide password change. A person who knows the training password of another person also gets in as that person here.
  5. You can undo this: convert to own accounts (below). You cannot undo the conversion.

The wizard creates a shared contest only after you tick ☐ I understand. While the contest stays shared, the Home shows the item Shared accounts.

Act on a shared participant. In People › Accounts, a person who logs in with the training account shows 🔗 training. Disable blocks the person in this contest (the training account continues to work on the training site). Re-enable undoes this. Disqualify removes the person from the scoreboard. Remove blocks the person permanently: the person cannot come back with the training account. When you create or reset an account here, the password of this contest applies: the training password does not open that account in this contest any more.

Convert to own accounts (People › Accounts › the 🔗 Shared accounts card):

  1. Preview the conversion. Nothing is written. The preview counts who gets an account (the persons with a folder in the contest, an open session, a line in the access log or a registration), the teams, the team members who lose their login, and the warnings.
  2. Confirm. Before the contest, tick ☐ I understand. After the start, type the contest id. If the list changes between the preview and the confirmation (a person logged in), the screen shows the new preview and asks you to confirm again.
  3. Download the CSV with the credentials immediately. The new passwords show only there and on the Badges.

What the conversion does:

In the CLI: moj-contest -c <id> users convert (preview) and users convert --apply --csv creds.csv.

9. User template (enables all functions)

Paste it in the bulk load of People › Accounts (one line per account: login nome), or create the accounts one by one with moj contest -c <cid> users add <login> --name "<nome>":

juiz1.judge      Judge One
juiz2.judge      Judge Two
juiz3.judge      Judge Three (spare for the quorum of 2)
chefe.cjudge     Chief Judge
apoio1.staff     Print and balloons staff
sede1.cstaff     Site 1 chief (badges + reveal)
monitor1.mon     Monitor (answers clarifications)

Then: turn on Manual verdict (and adjust the number of judges) in Home › Rules. Give out the generated passwords. Each person logs in on the SAME contest screen and sees the buttons of his or her role.

9½. Training panel › Contests and who can create them

The administration panel of the Free Training (/treino/admin/, .admin account) has the 🏆 Contests tab. It lists the contests created with the interface, and it controls who can create contests and problems.

Who sees what. The rule applies in the API, not only on the screen.

List filters. Search by name, id or owner. Filter by owner, mode and state (upcoming, in progress, ended). Sort by creation date, start, name or owner. Check only mine to see only what you created. The owner appears with photo, name and a link to the profile.

Reserved id. An id that starts with icpc belongs to the Maratona organization. Only a super-admin can create a contest with this id. The wizard warns before, and the API refuses.

Priority (Priority column). The super-admin changes the priority of any contest directly in the table, including Super, which jumps the whole queue. This is the only place to give or remove Super. The wizard offers Super only to the super-admin, and a copy (duplicate) of a Super contest made by another account starts as Contest. The other administrators only see the column: the admin of each contest changes the other priorities in Central › Rules. Every change goes to the contest Audit log and to the training trail (📜 Activity feed, action contest-priority). From the CLI: moj contest priority <cid> <priority>.

Who can create contests and problems. The same permission applies to creating contests and to creating problems and collections in Problem Management. .admin accounts can always create them. For the other accounts:

10. References