A new problem starts empty: no statement, no tests, no checker, and unpublished. You create it in one click and then fill it in tab by tab.
You need permission to write problems in the space.
Open the console and switch to the space the problem should live in.
Go to Problems in the sidebar.
Click Add empty problem.
The problem is created and opens immediately. It has a number — its place in the space's public catalog — but it is not in the catalog yet, because new problems start unpublished.
If the problem already exists somewhere else, don't build it by hand: import it from Polygon, from Basecamp, or from another space you have access to.
Nothing below is required by the console, but a problem cannot be judged until it has tests and something to grade them with.
Set the type. Open Testing → Configuration and choose the problem type along with the time, CPU and memory limits. Do this first: the type decides whether the interactor row and the code-template header and footer editors exist at all.
Write the statement. Statement tab → Create statement. One statement per language; the first one you write is usually enough to start.
Set the difficulty and topics. The Classification row at the top of the Statement tab. These drive the filters in the problems list and in the public catalog.
Add testsets and tests. Testing → Tests. A new problem has no testset, so add one before adding tests, or import test files in bulk.
Configure the checker, and an interactor if the problem is interactive. A problem with neither cannot grade anything.
Add code templates if participants should start from something other than a blank editor.
Add reference solutions and run them. This is how you find out whether your tests and limits actually separate correct solutions from wrong ones.
Publish when it holds together.