How it works

Upload a polyman problem, or a contest of them, and the service runs polyman verify on it: it compiles everything, generates and validates the tests, runs every solution and checks that each one gets the verdict its tag promises. Then it goes through the contest guidelines.

Prepare the zip

A problem is a polyman folder: a Config.json and the files it names. If the problem lives on the problem platform, pull it first:

polyman remote pull 123456 ./my-problem
cd my-problem && zip -r ../my-problem.zip .

For a contest, put one folder per problem in the zip (one level deep, or inside a single top folder):

contest.zip
  A/Config.json ...
  B/Config.json ...

You don't need testlib.h, compiled binaries or generated tests: they are made fresh, and polyman's compile cache (.polyman/) is ignored.

What gets checked

  1. Generators compile and generate every test in the script.
  2. The validator compiles, passes its own tests, and accepts every test.
  3. The checker compiles and passes its own tests.
  4. Every solution compiles and runs on every test, with the time and memory limits from Config.json.
  5. Each solution's verdicts match its tag, which the check page calls its label (the same tags as on the problem platform):
TagMust
MApass every test (the main correct solution)
OKpass every test
WAget Wrong Answer on at least one test
TLexceed the time limit on at least one test
MLexceed the memory limit on at least one test
REcrash on at least one test
PEget Presentation Error on at least one test
TObe correct, though it may run out of time
RJfail at least one test, for any reason

Contest guidelines

A problem can run correctly and still not be ready for a round. These checks read the files; the must-fix ones decide whether it's marked ready.

CheckSeverity
The statement has a story, input and outputMust fix
At least 10 testsMust fix
Has an answer checkerMust fix
Has an input validatorMust fix
Has a main correct solutionMust fix
The answer checker passes its own tests
Correct solutions in C++ and Java, plus a wrong one
Has a written tutorial
Has topic tagsNice to have

API

The page uses the same API you can call from a script or CI.

curl -F problem=@my-problem.zip https://SERVICE_URL/api/verify

The answer streams one JSON object per line while it works:

{"type":"start","problems":["my-problem"],"polyman":"3.0.0"}
{"type":"step","problem":"my-problem","step":1,"title":"Compiling Generators"}
{"type":"problem","problem":"my-problem","ok":true,"seconds":19.3,"report":{...},"readiness":[...]}
{"type":"done","ok":true,"seconds":19.4}

report is exactly what polyman verify --json prints (or null with an error if the run timed out or crashed), and readiness is the list of guideline checks. The last line is done, or {"type":"error"} if the service itself failed.

RouteWhat it does
POST /api/verifymultipart field problem: the zip
GET /api/samplesthe sample problems
POST /api/samples/NAME/verifycheck a sample
GET /api/versionpolyman version and commit
GET /healthliveness

Answers you might get instead: 400 with the reason (the zip or Config.json was refused), 413 (over 20 MB), 429 (busy with another check; retry after the retry-after seconds).

Limits and privacy

  • Up to 20 MB per zip and 26 problems per contest; 120 s per problem.
  • Every path in Config.json has to stay inside the problem folder, and names (solutions, testsets, generators) have to be plain names.
  • Your code runs as a user of its own with no route to the internet. Nothing it starts outlives the check.
  • Your upload is deleted when the check ends. Nothing is stored.
  • The figures on the front page (go-ahead ledger, pipelines, agent carbon, incidents) are read by your browser from public gitlab.com pages and the project's public API, without signing in. Nothing about you is sent with them.