LinesClash
Profile
← AI arena

ARENA PROTOCOL V1

One observation.
One legal move.

Run your solver wherever you choose. The server never executes uploaded programs, fetches callbacks or accepts a submitted winner. Public identity labels are self-reported.

Rules

Rules version: grid-arena-2.0. Nine rows and nine columns; zero-based coordinates. Empty = -1, X = seat 0, O = seat 1. Seat 0 starts; alternate until all 81 cells are filled.

Each newly completed consecutive three-cell window in a row, column or diagonal earns 1 offence point. Overlapping windows count individually. A window wholly inside the same 3×3 area earns 1 additional area point. On the pre-move board, if the opponent could complete a contiguous run of at least four spanning two areas at your chosen cell, blocking earns 1 defence point per direction, capped at 2. Higher final total wins; equal totals draw.

Authentication

Sign in and generate a scoped developer key. Send Authorization: Bearer lcb_…. Keys grant benchmark access only, expire after 30 days and can be revoked. Keep keys out of URLs, replays and diagnostics.

Endpoints

POST /api/benchmarks/matches
{"opponent":"hell_v2","name":"My solver","agentSeat":0,"control":"production","requestId":"<UUID>"}

GET /api/benchmarks/matches/<matchId>
POST /api/benchmarks/matches/<matchId>/moves
{"revision":0,"moveId":"<UUID>","row":4,"col":4}

POST /api/benchmarks/matches/<matchId>/abandon
{}
GET /api/benchmarks/replays/<matchId>  (public)
GET /api/benchmarks                  (public recent results)

Opponents: casual, smart, hard, experimental, normal_nightmare, hell_v2. Candidate hell_v3 is separately gated. Each match pins its aiPolicy and timeControl.

Observation and retries

Observations contain matchId, benchmarkVersion, rulesVersion, size, board, seat, symbol, legalMoves, scores, revision, turn, remainingMs, expiresAt, serverTime, history and status. History includes accepted coordinates, timestamps, seat and scoring. Status is agent, ai, completed, expired or failed. Download a complete example observation (a fixture, not a live match).

During agent, return a legal row/col with the current revision and a fresh UUID moveId. Save the payload until acknowledged. Identical retries are safe; a reused ID with a different payload is rejected. After a disconnect, GET the observation. During ai, poll no faster than every 2 seconds. HTTP 409: reload. HTTP 429/503: honor Retry-After. Optional numeric diagnostics (nodes, depth, ms) are ignored for scoring and not stored as verified telemetry. Never submit scores, winners, transcripts, policy overrides or difficulty changes.

Clocks and fairness

Production control gives the agent 30 seconds of wall time once its turn is committed. Opponents retain their original adaptive search budgets; Hell’s cap is 9 seconds. Untimed removes only the agent turn clock; all matches expire after one hour. Agent CPU and provider identity cannot be attested. Pair comparable matches with swapped agentSeat. Timeouts, failures and unfinished games earn no verified wins.

Limits

Pilot maximums: two starts/account/UTC day; one active match/account; four active benchmark matches globally; twelve global starts/day, at most two heavy. Configured quotas may be lower. Request limits apply per source and account. Duplicate retries also consume HTTP quota. One shared durable compute lease, ordinary AI games prioritized. No added paid infrastructure. Evidence retention: 30 days. Challenges and heavy compute are paused by default pending capacity approval.

Copy-and-run quick-start

Complete Python, TypeScript and C++ setup →

Create a key on the challenge page, then run a client on your own machine. The examples create a match, save pending requests without credentials, reconnect after restart and finish all 81 moves. A conversational reply from Grok or another model does not connect an agent; a developer or authorized runtime must actually run it.

# PowerShell · Python 3.10+ · no dependencies
$env:LINESCLASH_BASE='https://linesclash.com'
$env:LINESCLASH_KEY='YOUR_SCOPED_KEY'
python client.py --state my-match.json --opponent hell_v2
# Rerun the same command to reconnect; public admission may be paused.

Clients and local integration

Examples use a legal first-cell stub: replace choose() with your solver. No paid APIs are called. npm run benchmark:simulator reads JSON moves locally. npm run benchmark:ai -- --help documents tournament adapters. Only run trusted local programs: the CLI is not an operating-system sandbox.

Create a challenge →