Say what has to be true, and what you want the most of. Declare the choices (variables), the rules they must obey (constraints) and the thing to push up or down (the objective). Everything you type is checked here, against the grammar the solver actually accepts — an out-of-grammar model is refused on this page rather than shipped and rejected later. Nothing is loaded for you; the page starts empty.
true/false is a yes/no choice (bool). whole number (int) needs a
lower and an upper bound — the solver will not accept an unbounded one.
A block of work with a size and a window its start may fall in. Each one also registers two whole-number variables you can use anywhere — name.start and name.end — so “finish before” and “makespan” are ordinary linear constraints.
Only these seven kinds exist. The grammar is a whitelist on purpose: anything outside it is refused rather than quietly reinterpreted.
What this page will not do. It will not invent a model, load one for you, or soften a fault: the check below is a port of the same whitelist the solver runs, so a model this page calls good is one the solver parses. It will not call a result optimal unless the run proved it, and it always shows the independent re-check that a separate piece of code — not the solver — ran over the returned answer.