Start here

Participation Guide

A clean path from first login to live competition. Follow the steps in order, and use the recovery notes when something blocks you.

Rules

Season lifecycle, scoring, auctions, perks, and economy formulas.

SDK Docs

Strategy contract, validation rules, context API, and examples.

Starter Bots

Practice against built-in opponents before ranked play begins.

Main Path

Six checkpoints from account setup to ranked matches.

Approx. 7 minutes before validation wait
Step 1

Create Account

~2 min

Register with your email and username, then verify your email address before entering a season.

Step 2

Upload Strategy

~1 min

Upload a Python file or a Tier C zip archive. Use a memorable strategy name so it is easy to recognize later.

If this step fails: If upload returns 422, check local syntax first with python -m py_compile strategy.py.
Step 3

Validate

Under 2 min

The worker runs AST checks, a smoke match, and a context test. The strategy detail page shows the current result.

If this step fails: If validation fails, open the report, fix the failing stage, and re-upload. Re-uploading queues a fresh run.
Step 4

Enroll

~1 min

After validation passes, enroll the strategy in the open season before registration closes.

If this step fails: If enrollment is rejected, the season may have moved past registration. Watch the dashboard for the next window.
Step 5

Activate

~1 min

Set the enrolled strategy as your active official entry. Only the active strategy plays ranked matches.

Step 6

Watch Live

Ongoing

Follow live matches, review standings, and use feed events to understand how the season is moving.

A Practical Strategy Skeleton

Start simple, then add memory and economy decisions.

The minimum strategy returns one move. A stronger one tracks recent opponent behavior and reacts to the auction market.
from collections import Counter
from rpsa_sdk import Strategy, Context

class MyStrategy(Strategy):
    uses_context = True

    def __init__(self):
        self._history = []
        self._beats = {
            "rock": "paper",
            "paper": "scissors",
            "scissors": "rock",
        }

    def next_move(self, context: Context) -> str:
        market = context.market_state()

        for auction in market["active_auctions"]:
            if auction["window_phase"] == "open":
                context.bid(auction["stock_id"], 10)
                break

        if len(self._history) < 5:
            return "rock"

        counts = Counter(self._history[-10:])
        predicted = counts.most_common(1)[0][0]
        return self._beats[predicted]

    def notify(self, own_move: str, opp_move: str) -> None:
        self._history.append(opp_move)

For deeper examples, read Strategy Patterns in the SDK docs.

FAQ

How do I know when a season opens for registration?
The Dashboard shows the current season status. When it moves to registration_open you can enroll. Check the Dashboard and Feed for announcements.
What happens when validation fails?
Open the strategy detail page and view the report. It identifies the failing stage and the specific error. Fix the code and re-upload.
My strategy passed validation but now shows failed. What happened?
Re-uploading creates a new version and resets validation to pending. Wait for the new validation run to complete.
What happens after the season ends?
The leaderboard is frozen. Your strategy remains in your account, but each new season starts with a fresh wallet.
Do strategies carry over between stages within a season?
The enrolled strategy stays the same. Wallets may be reset at stage boundaries, and perks do not carry over.
Can I import numpy or PyTorch in my strategy?
Yes, ML imports are allowed in the supported tiers. The sandbox still enforces an allowlist, so check the SDK docs before depending on a library.