The edge is unforgiving.
A 16 × 16 meter platform with no walls. A robot is out when its center crosses the edge. From 60 seconds onward, the half-side shrinks by 0.07 m/s.
Both robots have the same chassis, the same motors and the same energy. Only the controller changes. These are the rules the engine enforces, identical in the browser and in the tournament CLI.
A 16 × 16 meter platform with no walls. A robot is out when its center crosses the edge. From 60 seconds onward, the half-side shrinks by 0.07 m/s.
The wedge covers ±35° in front of the robot. A strong side or rear impact can flip an opponent; wedge-to-wedge contact never causes a flip. Taking two flips ends the match.
Motor cost is quadratic. There is no passive regeneration. Enter a ready blue cell to collect up to 60 energy. Each cell needs 8 seconds to reset; leave and return to collect again. At zero, the motors stop.
Only exact ties and simultaneous defeats remain draws.
Fixed 60 Hz steps, semi-implicit Euler integration, oriented rectangles and SAT collisions. The viewer reads a completed replay: pausing, moving the camera and changing playback speed do not affect the result.
One JavaScript file, one tick export, no imports or external APIs. QuickJS runs in a Worker sandbox. Public tests check execution, purity, memory and timing.
Every seed places four blue recharge cells, two or three open holes and four flame grates. Cells stay in fixed world positions as the boundary shrinks. Their states are visible in the bot sensors. During the match, four ordinary floor cells can also collapse. Each flashes red for three seconds before becoming a permanent hole. Robot weight also wears down every solid cell, including chargers and grates: 12 cumulative seconds under one bot exhausts it, then a three-second warning precedes collapse. Wear persists after leaving; two bots double the load.
Grates wait 4-8 seconds, warn in amber for one second, then burn for 1.5 seconds. Standing over a flame costs 30 energy per second, including while flipped or recovering.
The recovering state accepts commands and protects against flips. The 3 m limit is not reached within 120 seconds. Wall-clock timing depends on machine load, so exhibitions use a reproducible instruction limit; the CLI also supports the 2 ms budget. Results for these budgets are kept separate.
| Field | Value |
|---|---|
| Tick rate | 60 Hz |
| Match duration | 120 s |
| Spec version | 0.2.2 |
| Engine version | 0.2.2-r2 |
| Field | Value |
|---|---|
| Half extent | 8 m |
| Minimum half extent | 3 m |
| Shrink starts at | 60 s |
| Shrink rate | 0.07 m/s |
| Cell size | 1 m |
| Field | Value |
|---|---|
| Length × width | 0.8 × 0.6 m |
| Mass | 100 kg |
| Wedge half angle | ±35° |
| Max speed | 7 m/s |
| Max angular speed | 4 rad/s |
| Max thrust force | 800 N |
| Max torque | 45 N·m |
| Field | Value |
|---|---|
| Starting energy | 300 |
| Recharge cells | 4 |
| Recharge amount | 60 |
| Recharge cooldown | 8 s |
| Flame damage | 30 / s |
| Righting cost | 25 |
| Field | Value |
|---|---|
| Open holes | 2-3 |
| Flame grates | 4 |
| Collapsing cells | 4 |
| Collapse warning | 3 s |
| Floor load capacity | 1200 kg·s |
| Field | Value |
|---|---|
| Flips to lose | 2 |
| Flip recovery | 4 s |
| Memory limit | 64 KB |
| Tick budget | 2 ms |
| Init budget | 50 ms |
| Violations allowed | 20 |
The complete specification, the bot contract and the conformity checks are in AGENTS.md. Open the arena to watch the rules apply.