Limits and budgets
These values describe the checked-in Ants registration and deployment configuration as of 27 September 2026. A deployed competition’s announced rules take precedence if its configuration differs. Byte units are binary: 1 KiB = 1,024 bytes and 1 MiB = 1,048,576 bytes.
Model and adapter
| Limit | Current value | Applies to |
|---|---|---|
| Maximum size metric | 64 MiB | Largest eligible class; no season may set a class above it |
| Memory a class may allow, at most | 262,144 flat bytes, and 16 bytes a cell | The two numbers a season sets per class |
| ONNX opset range | 13–19 inclusive | The platform’s window; a season sets its own |
| Manifest ABI | orion:model@1.0.0 | manifest.json |
| Adapter operations | 1,000,000 | Each declared input’s adapter, per evaluation |
| Adapter boundary dtypes | bool, i8, u8, i16, u16, i32, u32, i64, u64, f32, f64 | Tensors an adapter hands the graph |
| Probe inferences at admission | 5, at probe_dims; the median must fit the turn, 1,000 ms | Whether the graph runs at all, and fast enough to answer a turn (models.max_probe_ms in Kalam’s runner template) |
The size metric is bytes(model.onnx) + bytes(manifest.json), uncompressed. The
class table has all five size boundaries, and the
format page lists the configured ONNX operators. No class has a compute cap
of its own; the probe’s turn applies to every class.
Ants matches
| Setting | Current value |
|---|---|
| Players on a board | 2 to 8, fixed by each board |
| A board’s sides | 24 to 124 squares each |
| Squares on a board | at most 14,880 |
| Maximum turns | 1,000 |
| Turn deadline, per seat, covering its adapters and its inference | 1,000 ms |
| View radius squared | 77 |
| Attack radius squared | 5 |
| Gathering radius squared | 1 |
| Strikes before forfeit | 5 cumulative per match, unless the season sets another |
| Stalemate duration | 150 consecutive qualifying turns |
| Domination threshold | At least 85% of the population: every living ant, each colony’s hive counted once per standing hill, and every food on the board |
The map table gives dimensions and generation inputs. Strikes are platform accounting. Under the game rules, an ordinary illegal move into water leaves the ant in place.
Admission and submissions
| Setting | Current value |
|---|---|
| In-flight candidate slots | 1 per model per season, covering testing and verified; a season may also cap the total across your models |
| Admission polling interval | 20 seconds |
| Admission batch | Up to 4 candidates per run |
| The admit clock’s hold on a prepared submission | 180 seconds |
| A runner’s admission claim | 600 seconds |
| Admission attempts | At most 3, then PROBE_TOO_SLOW if every attempt’s probe was over the turn, otherwise TIMED_OUT |
| Reference observations played at admission | The first 64 of the reference set, each inference allowed 5,000 ms |
| Upload window, and the URLs’ lifetime | 30 minutes from the first POST |
| Trial repair limit | 3 trial rows |
| Trials no runner could load the candidate for | 3, counted apart from the repair limit |
| Submission endpoint rate | 1 request/second, burst 5, per authenticated principal |
Season quotas
These have no platform-wide value. Each is absent unless the season declares it, and absent means
no limit, so the table below lists what a season may set. GET /v1/games/{game}/submission
reports your standing against the first six before you make a request.
| Rule | What it caps |
|---|---|
entries.max_per_user | how many of your models may enter the season |
entries.in_flight_max | how many of your versions may be in admission at once |
entries.versions_max_per_model | versions one model may enter |
entries.versions_max_per_user | versions you may enter across every model |
entries.cooldown_s | the gap between one model’s submissions |
entries.max_per_class | how many of your models may sit in one weight class: declared by the season, and not yet enforced |
classes.allow | which weight classes may be entered at all |
graph.params_max | a parameter ceiling, independent of the byte cap |
graph.opset_min / opset_max | the ONNX opset window the season admits under |
graph.op_allowlist | the operator set, narrowing the platform’s |
unique_weights.scope | whether two entries may stand on the same weights |
A rate limit overrides neither the one-candidate-per-model rule, the unique-weights rule nor any quota the season declares. The admission timeout guarantees no total turnaround time, and its validation deadline is longer than the turn deadline in a match.
Ratings and scheduling
| Setting | Current value |
|---|---|
| Initial rating mean | 25 |
| Initial uncertainty | 8.333333333333334 |
| Displayed rating | mu − 3 × sigma |
| Provisional uncertainty threshold | Greater than 3 |
| Placement target / initial request cap | 8 |
| Steady-state request cap | 2 |
| Successor uncertainty multiplier | 2, capped at initial uncertainty |
| Requested cross-class fraction | 0.20, with pool-dependent fallback |
These are policy settings, and they guarantee no competitor a match rate. Read Ranking before you interpret an idle or provisional entry.
Where values come from
Ants’ cartridge.json declares the limits every season’s board must fit (limits.boards, the
three board rows above), turn limits, and the adapter budget. A season’s boards are its own: an
admin uploads them, and GET /v1/games/ants/seasons/{slug}/maps lists them. The engine source
implements geometry and game-ending rules. The season fixes the size boundaries and every quota
in the table above, in the database, and Soma’s admission clock judges against them. The Orion
templates in Soma’s and Kalam’s docker/ configure opsets, trials, ratings, scheduling and the
operation budget the node enforces. The repositories page names each
owner.