Challenge Troubleshoot logo

Challenge Troubleshoot

OrganizationPopular
AgibotTech
challenge-troubleshoot

Use when something in the Simulation Challenge pipeline is misbehaving — auth errors, agent disconnects, jobs stuck in Pending, jobs ending in Failed, drain frames. Maps a symptom to its likely cause and the next command to run.

Overview

PublisherAgibotTech
Repositorygenie_sim
Skill namechallenge-troubleshoot
Stars
1.4K
Forks
119
Bundled files
Instructions only
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by AgibotTech on GitHub. Read the source before you install it.

Installation

Install the Challenge Troubleshoot AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/AgibotTech/genie_sim.git /tmp/genie_sim
mkdir -p .claude/skills
cp -r /tmp/genie_sim/source/geniesim_benchmark/skills/robocoliseum/challenge-troubleshoot .claude/skills/challenge-troubleshoot
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Challenge Troubleshoot in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Challenge Troubleshoot on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Challenge Troubleshoot is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

challenge-troubleshoot — Symptom → cause → next command

When the user reports a problem, do this in order:

  1. Reproduce / verify the symptom with a read-only call (/jobs, /result, /log, /current-user-info) before doing anything destructive. For "what's the status" questions, /jobs is the only endpoint that carries one.
  2. Match the symptom to the table below.
  3. Hand the user the next command from the Action column. Do NOT auto-resubmit jobs (quota cost) or auto-kill agents (loses in-flight cases) without explicit confirmation.

Diagnostic heuristic: 4xx is never a network blip

A structured {"status":"error", ...} body with HTTP 4xx (400/401/403/404) is a semantic rejection by the platform — the request reached the server and was refused on its merits. Retrying it without changing the request gets the same answer and, for POST /api/challenge/job, burns a daily submission slot each time.

Only these qualify as transient and may be retried with backoff:

  • TCP connection reset / timeout / DNS failure (curl exits non-zero before getting a response)
  • HTTP 5xx (server-side, signals a transient backend failure)

If the user says "可能是网络抖动 / maybe a network blip" but you have a 4xx body in hand, push back: name the actual error and point at the table row.

Diagnostic heuristic: 5xx is often a missing / wrong token, not a real platform outage

curl -fsS collapses any HTTP 5xx to a terse (22) The requested URL returned error: 5XX and hides the body. Before concluding the platform is down, check this in order:

  1. State file sourced? Each Bash call should start with [ -f ~/.simubotix-challenge.env ] && . ~/.simubotix-challenge.env — AI assistants spawn every command in a new subshell, so plain export from a previous call is gone.
  2. Token presence after sourcing. echo "len=${#CHALLENGE_TOKEN}" — if it's 0, either the file doesn't exist (re-run challenge-login Step 1) or the file exists but doesn't contain the key (the previous login silently failed — see challenge-login Step 1's status check).
  3. Token shape. Should be a 3-segment JWT (two dots). echo "$CHALLENGE_TOKEN" | head -c 20; echo — gibberish or null means a previous step persisted a bad value.
  4. Body of the actual response. Drop -f so curl prints the body even on non-2xx:
    bash
    [ -f ~/.simubotix-challenge.env ] && . ~/.simubotix-challenge.env
    curl -sS -i "$BASE_URL/api/challenge/current-user-info" \
      -H "Authorization: Bearer $CHALLENGE_TOKEN" | tail -15
    The body usually says exactly what's wrong (often a 401-style message returned with a 500 status code).

Only after the token is confirmed valid (e.g. the same value just succeeded against /login) should you treat the 5xx as a real platform issue and retry with backoff.

Symptom table

#SymptomLikely causeAction
1POST /api/challenge/job returns HTTP 400 invalid board / no task templates for boardconfig.board is missing or not in the currently-supported setToday 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 a daily submission slot 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 with the organizers first; challenge-submit-job Step 2 is the only list to trust.
2POST /api/challenge/job returns an "upload limit" error / /api/challenge/submission/quota returns remaining: 0Today's submission quota is used upWait until Beijing midnight (UTC+8), or work with an existing job. Report the actual used / limit from the endpoint — don't quote a cap from memory.
3Any plain HTTP /api/challenge/* call (login, result, log, job, tunnel-endpoint) returns 401Invalid / expired CHALLENGE_TOKENchallenge-login Step 3 to refresh; if refresh also 401s, fall back to Step 1 (email + password). This only affects the plain HTTP APIs — it does not touch a JOB_TOKEN-based tunnel dial.
3bThe WS handshake (GET /api/challenge/tunnel) returns 401When dialing with JOB_TOKEN (the default per challenge-run-agent), the handshake does not 401 on token expiry — job_tokens don't expire. A 401 here means the ?job= UUID is not owned by this account, the job is in a terminal state, or the ?job= doesn't match the job the token was issued for. If still dialing with CHALLENGE_TOKEN (no JOB_TOKEN available, e.g. an older platform build), a 401 can additionally mean the login token itself expiredVerify JOB_UUID / ?job= came from this account's POST /api/challenge/job and that the job isn't terminal. Only if dialing with CHALLENGE_TOKEN, also try challenge-login Step 3 to refresh.
4Agent connects, then immediately disconnectsPer-user parallelism cap exceeded — too many agents onlineReduce K in challenge-run-agent, or wait for older agents to finish.
5Job stuck at detailed_status: pending / inference_disconnected, or progress not advancing for minutesNo agent online, or all agents dropped past the 30 s windowps/check the agent processes; relaunch via challenge-run-agent if needed. queued is different — it means the cluster has no free GPU; the agent is fine and you must keep it online.
6Agent disconnected unexpectedly mid-runNetwork blipWithin the gateway-side 30 s reconnect window, 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 automatic redial and the gateway will reject the duplicate. Past 30 s the open session is gone; resubmitting a new job costs a daily submission slot — confirm before suggesting it.
7Received drain control framePlatform finished dispatching cases and is asking for graceful shutdownLet in-flight sessions finish, close the socket, and do NOT reconnect.
8Job ends at detailed_status: failed (list status = 4)A case exhausted its retries, which kills the whole jobGET /api/challenge/job/$JOB_ID/log (see challenge-poll-result). Read failure_reason before any log text: 5/6/7/8 are platform-side teardowns, not your bug — 8 in particular means a different case was the root cause. 9 (tunnel lost) is the opposite — it usually means your agent dropped the WebSocket; check result.error for the sub-reason and see rows #5/#6 above. For 1/3/4, fetch result.stdout (usually a presigned URL, not inline text) and read the traceback. Common causes: handler exception during warmup (row #11), OOM, action-encoding mismatch. Fix the bug locally before resubmitting — resubmission costs a daily submission slot.
9/api/challenge/tunnel/endpoint returns empty stringGateway not yet readyFall back to the fixed default ws://120.92.88.78/api/challenge/tunnel; the endpoint may simply be omitted because the host never changes.
10parallelism in the job response is 0User'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.
11Agent stuck in WARMUP, never reaches RUNNINGor the job ends Failed with a traceback referencing frame_bytes=b'' / zero-length decode in the /log outputInference handler errored on the warmup empty frameThe 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).
12tunnel.sh exits with code 1 immediatelyBad arguments / handler import failure / reconnect retries exhaustedRe-check <gpu_index> <job_uuid> <gateway_url> argument order; check inference-repo handler import path.
13tunnel.sh exits with code 130Ctrl-CExpected; user-driven.
14POST /api/challenge/job returns HTTP 400 paper_link is not a valid URL / paper_link too longOptional paper_link field is malformed or > 512 charsFix the URL or omit the field entirely; resubmit. Consumes a submission slot only if the call gets past validation.

Diagnostics shortlist

Run these in order when triaging an unclear failure:

bash
# 1. Token still valid?
curl -fsS "$BASE_URL/api/challenge/current-user-info" \
  -H "Authorization: Bearer $CHALLENGE_TOKEN" | jq

# 2. Job exists, what status? (status lives on the LIST — /result has no status field)
curl -fsS "$BASE_URL/api/challenge/jobs?page=1&per-page=100" \
  -H "Authorization: Bearer $CHALLENGE_TOKEN" \
  | jq -c --argjson id "$JOB_ID" '.items[] | select(.id == $id)
          | {id, status, detailed_status, progress, score}'

# 3. If detailed_status == failed, get the log (read failure_reason first)
curl -fsS "$BASE_URL/api/challenge/job/$JOB_ID/log" \
  -H "Authorization: Bearer $CHALLENGE_TOKEN" | jq

# 4. Scores, once terminal
curl -fsS "$BASE_URL/api/challenge/job/$JOB_ID/result" \
  -H "Authorization: Bearer $CHALLENGE_TOKEN" | jq

# 5. Gateway endpoint sane?
curl -fsS "$BASE_URL/api/challenge/tunnel/endpoint" \
  -H "Authorization: Bearer $CHALLENGE_TOKEN"

$JOB_ID must be the numeric id; the UUID belongs only to the tunnel dial. Passing a UUID to these paths yields 400 invalid job_id, which curl -fsS hides behind a bare exit code 22.

Things NOT to do

  • The website/API domain is robocoliseum.ai, but the gateway host is fixed at 120.92.88.78 and is a separate host: BASE_URL=https://robocoliseum.ai, TUNNEL_ENDPOINT=ws://120.92.88.78/api/challenge/tunnel. Do not "fix" the tunnel URL by swapping in the website domain. Prefer a tunnel_endpoint from the job response if present, but the fixed default is a safe fallback.
  • Do not reconnect after a drain — the platform is finishing up, and the connection will be rejected.
  • Do not spam POST /api/challenge/job to "retry" — each call consumes one of the day's submission slots. Remaining quota is not authorization to guess (e.g. guessing a board because "quota 还有"). Skill rules forbid the guess itself, independent of remaining slots.
  • Do not state the daily cap from memory. Read GET /api/challenge/submission/quota and quote its limit / used / remaining; the limit is a platform setting and has changed before.
  • Do not kill running agents to "free a slot" without checking the job list first; you may be killing the agent that's about to finish your last case.
  • Do not retry a 4xx as if it were a network blip — see the diagnostic heuristic at the top of this file.
  • Do not poll /result for status — it returns only {tasks, total}. A loop that branches on .status there never terminates. Use detailed_status from GET /api/challenge/jobs.

Reference

For the WS wire protocol (dial, control frames, binary frame layout, state machine, reconnect, heartbeat), see the appendix of challenge-run-agent — it is inlined there in full. Most contestants don't need it; ./scripts/tunnel.sh from the inference repo already implements it. For the observation/action payload schema inside the data frames, see challenge-inference-protocol.

Frequently asked questions

What does the Challenge Troubleshoot AI skill do?

Use when something in the Simulation Challenge pipeline is misbehaving — auth errors, agent disconnects, jobs stuck in Pending, jobs ending in Failed, drain frames. Maps a symptom to its likely cause and the next command to run.

Why use Challenge Troubleshoot on TypingMind?

Because you install it once and use it with any model. Challenge Troubleshoot is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Challenge Troubleshoot in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/AgibotTech/genie_sim/tree/main/source/geniesim_benchmark/skills/robocoliseum/challenge-troubleshoot. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Challenge Troubleshoot?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Challenge Troubleshoot?

As many as you like. As long as a model supports skills, you can use Challenge Troubleshoot with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Challenge Troubleshoot AI skill free?

It is published on GitHub by AgibotTech. Check the repository for licensing terms. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇