SCRAPLINE League — Rules
The sporting law of the league: how a season is structured, how points are scored, how you submit, what is illegal and what it costs, and how the rules themselves change. If a rule binds your bot or your team, it is here.
Two companions: GAME-SPEC.md is the normative rulebook for what happens
inside a match — every constant lives there and wins any conflict — and
BOT-API.md is the contract your bot is written against. Nothing outside
those three documents binds you.
Standing decisions this document implements: divisions with promotion/relegation (2×10 at launch) · an original game · one participant class on equal terms (Python-only pilot) · bot vs bot, always.
1. Structure
- Two divisions of ten teams at launch. Division 1 and Division 2.
- Divisions are never widened. Growth happens by adding divisions below: Division 3 opens when the waitlist reaches 8 teams. (The chess Bundesliga started as regional groups of eight — small divisions are the proven shape.)
- One entry per author; identity is the submission content hash (§6). Second entries (“B-teams”) are allowed only in a lower division and can never meet their parent entry — if promotion would put them in the same division, the B-team’s promotion passes to the next-placed team (football’s own rule).
2. Season anatomy
A season runs 2 weeks, three seasons a year. Everything below happens on a fixed, published calendar: a freeze never lands without warning. The calendar is published as data at kickoff, and the site shows the next fixture night together with the freeze deadline that binds your submission.
- Registration window (off-season): new teams register and attempt the entry gate.
- Entry gate (“the Doorman”): mechanical validity (import check, crash-smoke against the archetype set, budget compliance — all run inside the sandbox) plus a sporting bar: score >50% against the public Doorman boss bot over a full 30-game map draw. Passing joins the waitlist; entry into Division 2 happens via vacancy or when Division 3 opens. The Doorman filters broken bots, not people — it is public, beatable by the starter kit plus an evening of work, and its source is published.
- Season spec freeze at kickoff: engine version, all game constants, and the full season map book (§5) freeze when the season starts. No mid-season balance changes, ever.
- Four legs, one per matchday. Per leg, every pairing plays 15 stratified maps × both sides = 30 games. Bot submissions freeze T-24h before each leg (§4).
- Broadcast night after each leg: results drop and the leg’s featured tie is cast from replays.
- Final standings after leg 4 → promotion/relegation (§3.2) → playoff tie → season review.
- Off-season (~2 weeks): the balance-patch window (§7), Doorman refresh, registration.
2.1 The census format
A deterministic engine makes an honest table cheap: the season is a full round-robin census with zero sampling error — the only residual uncertainty is how well the map draw generalizes.
- 10 teams → 45 pairings; 4 legs × 30 games = 120 games/pairing; 1,080 games/team, 5,400/division, 10,800/season across both divisions.
- Resolution bought: ~±0.018 game-share (~13 Elo) between adjacent teams. That is roughly 5× finer than a 25-match window, which is the scale at which league tables start reporting noise as skill.
3. Scoring, standings, and tiebreaks
3.1 Per game and per table
- Every game scores 3 / 1 / 0 (win / draw / loss). Draws are legal and
expected to be rare — inside a match the chain is HQ kill → damage dealt
→ energy collected → draw (
GAME-SPEC.md). - Table = total points across all 1,080 games. Game-win totals are published alongside for narrative.
- Per-map-class standings are always published next to the pooled table. Results are never silently pooled across map classes: measured per-map win rates in a comparable league ran 0.118–0.671, so a single pooled figure averages boards that flatly disagree with each other.
3.2 Promotion and relegation
- 2 automatic up/down between adjacent divisions + 1 playoff: Division 1 №8 vs Division 2 №3.
- Playoffs and deciders are full 30-game map-draw ties, never best-of-5. Short series reintroduce exactly the map and side luck the census removes, and the marginal compute is ~zero. Highlights of a 30-game tie are broadcast; the raw series is not streamed.
- Promotion is mandatory; relegation is non-declinable (this kills sandbagging).
- Promotion, playoff and relegation places are published as data with every standings table, so the zones you are playing for are never inferred from the page layout.
3.3 Standings tiebreak chain
Published before Season 1, because an unpublished tiebreak becomes a governance crisis on first contact.
- Points.
- Head-to-head points between the tied teams.
- Aggregate HQ-damage differential across the season (dealt minus received).
- Aggregate energy-collected differential.
- Fresh-draw tie: a new 15-map × both-sides series between the tied teams (up to 3 series).
- Sudden-death map pairs: fresh generated maps played both sides, one pair at a time; the first pair with an unequal outcome decides. Two non-identical bots must eventually separate under a deterministic engine, and two byte-identical bots cannot both be entered (§6). There is no coin flip anywhere in this league.
4. Submissions
- One bot per team per leg. Submissions are versioned, immutable, and identified by content hash.
- Late, failing, or missing submission ⇒ the previous frozen version plays. A team always has exactly one playable version on file.
- The gate runs at freeze: import check, crash-smoke against the archetype set, and a budget-compliance run, all inside the sandbox. A gate failure is reported to you immediately and your previous version stands — a rejected upload never becomes your active bot.
- The ghost-ship rule: a withdrawn team’s last frozen version keeps playing to the end of the season; the format needs 10, and the results are real games against a real artifact. If the author requests removal, a clearly badged house bot replaces it — house bots are ineligible for promotion and their fixtures score normally for opponents.
- There are no forfeits in this league, by construction. A bot that crashes every tick still plays (all-IDLE) and loses honestly, so the round-robin can never break the way a no-show breaks a human league.
5. Map pool governance
- Maps come from the parameterized generator only (rotationally symmetric by construction), stratified across the map-class axes: node richness, HQ separation, choke density.
- The whole season’s map book — all 4 legs × 15 maps = 60 maps — is generated, stratified, and published at season kickoff, under the season spec freeze. Every team can prepare every board from day one, like chess openings: there are no mid-season map surprises and nothing to leak. Each leg uses its own 15.
- Between seasons the generator’s parameters may change like any other constant, through the rules-change process (§7), with the change noted.
- Standings per map class ship with every leg’s results (§3.1).
6. Integrity
What is illegal, and what it costs. Detection methods are not published, and no verdict is ever issued by tooling alone — the rules committee decides every case.
- Identity = content hash of the submission. One entry per author (the B-team rule in §1).
- Clone policy: entering a copy or near-copy of another team’s bot is illegal, including near-copies that a content hash cannot catch.
- Collusion / kingmaking: deliberate result manipulation between entries, such as throwing games to steer promotion, is illegal. The format is strictly 1v1 — there are no free-for-alls, which is where collusion metas historically grow.
- Sanctions ladder (committee applies, proportional to intent):
- Warning + required resubmission.
- Point deduction (the fixture’s points → 0 for the offender; opponents’ results stand).
- Disqualification from the season (a ghost-ship replacement plays on, flagged; the team’s slot relegates).
- Ban (author-level, for repeated or egregious cases).
- Official runs: standings matches run fresh, unloaded, on trusted hardware — never from cache. Any promotion- or relegation-deciding result is re-run 3× before publication.
- Disputes: every published result carries its exact rerun command. There is a 48-hour protest window after each leg; the remedy is a fresh sequential re-run on the reference hardware, and the re-run is final. Determinism makes this airtight: same bots + same map = same game.
- Faults: infrastructure faults (host error, runner crash, corrupted replay, hash mismatch between the three deciding runs) mean the affected games are re-run — that is a fault, not a result. Bot behaviour is never a fault: crashes, fuel exhaustion and timeouts inside the sandbox are IDLE ticks by the game rules, and the result stands.
- All replays publish with every leg. The league is a research commons.
- Your code stays yours. Submissions are never shared, never published, and are visible to no other participant; only replays — which record commands, not code — are public. Organizers read submissions solely to investigate an incident.
6.1 Intent moderation
Intent strings (BOT-API.md §3) are bot-supplied public text shown to every
spectator. Three layers, none of which touch a replay:
- A wordlist floor at display time. The viewer masks listed slurs and
profanities as
***on the replay and live pages, whole-word and case-folded. It is a floor, not a promise; the engine records what the bot said, because the replay is canonical and hashed. - First report → a written warning to the team, naming the fixture and tick.
- Repeat abuse → the team’s intent channel is revoked for the rest of the season. From the next fixture the engine records no intent for that seat; the replay header marks it and the viewer shows “intent revoked”. Game state and hashes are unchanged, so results stand. The channel reopens next season.
- Replays are never edited. Fixtures played before a revocation keep their text (masked at display); the committee may unpublish a replay from the site, never rewrite it.
7. How the rules change
- In season: nothing changes. Engine version, constants, maps — frozen at kickoff and hash-pinned.
- Between seasons, any change follows: proposal → measurement against the archetype suite and its published gates → decision by the rules committee → patch notes with design intent (every change states the problem it targets and the expected, measurable effect) → a version-tagged engine release, with the new season pinned to it.
- The sandbox runtime version is part of the frozen spec: upgrading it changes effective fuel budgets, so it happens only between seasons, with budgets re-baselined.
8. Who decides
- The rules committee of 3: one elected captain per division plus the league operator. It owns integrity verdicts (§6), between-season rule changes (§7), and tiebreak edge cases.
- The league operator runs the matchday, chairs disputes, and owns the calendar.
- Community roles: casting (invited; replays are public), a map council (phase 2 — proposes generator parameter changes through §7), and division captains for communications.
9. Calendar
Season 0 — the pilot (invite-only, 4 weeks)
A shakedown of the engine, the gate and the balance gates with real strangers’ bots before anything is at stake. 6–10 teams, free-for-all rules feedback, everything double-checked by hand.
| Week | What happens |
|---|---|
| 1 | Starter kits out; teams build; Doorman open for dry runs; two scrimmage legs mid-week (results published, nothing counts) |
| 2 | Legs 1–2 (Mon, Thu freezes; overnight runs; results next morning); first broadcast VOD after leg 2 |
| 3 | Legs 3–4 |
| 4 | Playoff-format rehearsal (top 2 play a 30-game tie, cast); retrospective; balance review; Season 1 rulebook + calendar published |
Season 0 results confer nothing except seeding for Season 1’s division split (top half → Division 1 by the Season 0 table, remainder plus new entrants fill Division 2).
Season 1 (full format, 2 weeks)
| Day | What |
|---|---|
| Mon W1 | Kickoff: spec freeze, map book published; leg 1 freeze 20:00 UTC; overnight census |
| Tue W1 | Leg 1 results + broadcast night |
| Thu W1 | Leg 2 freeze; overnight |
| Fri W1 | Leg 2 results |
| Mon W2 | Leg 3 freeze; overnight |
| Tue W2 | Leg 3 results + broadcast |
| Thu W2 | Leg 4 freeze; overnight |
| Fri W2 | Final standings; promotion/relegation confirmed |
| Sat–Sun W2 | Playoff tie (Div 1 №8 vs Div 2 №3) + title/decider cast VOD |
Then ~2 weeks off-season: the protest window closes, the balance window runs, the Doorman refreshes, registration opens, and the next season’s calendar is posted.