| 1 | POST /api/challenge/job returns HTTP 400 invalid board / no task templates for board | config.board is missing or not in the currently-supported set | Today the supported values are instruction (default), spatial, manip, robust. Use one of those and resubmit. Do not retry the same wrong board — 400 is a semantic rejection, retrying burns 1/4 daily quota each time. This holds even when the user says "maybe a network blip" — see the heuristic above. If a contestant insists a new board exists, verify against ../user-manual.md / organizers first. |
| 2 | POST /api/challenge/job returns an "upload limit" error / /api/challenge/submission/quota returns remaining: 0 | Today's 4-submissions quota is used up | Wait until Beijing midnight (UTC+8), or work with an existing job. |
| 3 | Any /api/challenge/* call (login, result, log, job, tunnel-endpoint, or the WS handshake) returns 401 | Invalid / expired access_token; for the WS handshake also: job_uuid not owned by this account | challenge-login Step 3 to refresh; if refresh also 401s, fall back to Step 1 (email + password). For the WS handshake specifically, also verify JOB_UUID came from this account's POST /api/challenge/job. |
| 4 | Agent connects, then immediately disconnects | Per-user parallelism cap exceeded — too many agents online | Reduce K in challenge-run-agent, or wait for older agents to finish. |
| 5 | Job stuck in Pending / Running with no score change for minutes | No agent online, or all agents dropped past the 30 s window | ps/check the agent processes; relaunch via challenge-run-agent if needed. |
| 6 | Agent disconnected unexpectedly mid-run | Network blip | Within the gateway-side 30 s reconnect window, the SDK / tunnel.sh redials automatically with the same agent_id to resume the open session. Do not manually relaunch in that window — you'd race the SDK and the gateway will reject the duplicate. Past 30 s the open session is gone; resubmitting a new job costs 1/4 daily quota — confirm before suggesting it. |
| 7 | Received drain control frame | Platform finished dispatching cases and is asking for graceful shutdown | Let in-flight sessions finish, close the socket, and do NOT reconnect. |
| 8 | Job ended in Failed | An evaluation case crashed | GET /api/challenge/job/$JOB_ID/log (see challenge-poll-result); read the latest stderr / exit code. Common causes: handler exception during warmup (see row #11 — surfaces here, not just as "stuck WARMUP"), OOM, action-encoding mismatch. Fix the bug locally before resubmitting — resubmission costs 1/4 daily quota. |
| 9 | /api/challenge/tunnel/endpoint returns empty string | Gateway not yet ready | Fall back to the fixed default ws://120.92.88.78/api/challenge/tunnel; the endpoint may simply be omitted because the host never changes. |
| 10 | parallelism in the job response is 0 | User's MaxConcurrentCases is misconfigured (not "exhausted" — exhaustion is a runtime gateway check, not a response field) | Stop and surface to organizers; do not launch agents. |
| 11 | Agent stuck in WARMUP, never reaches RUNNING — or the job ends Failed with a traceback referencing frame_bytes=b'' / zero-length decode in the /log output | Inference handler errored on the warmup empty frame | The warmup call passes an empty frame — handlers must tolerate that (e.g. short-circuit when len(frame_bytes) == 0 and return a no-op action). Fix in the inference repo, then resubmit (mind quota). |
| 12 | tunnel.sh exits with code 1 immediately | Bad arguments / handler import failure / reconnect retries exhausted | Re-check <gpu_index> <job_uuid> <gateway_url> argument order; check inference-repo handler import path. |
| 13 | tunnel.sh exits with code 130 | Ctrl-C | Expected; user-driven. |
| 14 | POST /api/challenge/job returns HTTP 400 paper_link is not a valid URL / paper_link too long | Optional paper_link field is malformed or > 512 chars | Fix the URL or omit the field entirely; resubmit. Counts as 1/4 quota only if the call gets past validation. |