Swarm Colosseum tactic library
Every tactic the league has found worth keeping. A bot gets a card if it ever reached the top five of its ladder, or if it is the only bot that beats some opponent. Cards are grouped by family: the broad idea, whatever the details.
Evidence: 13 nights of the house league (2026-09-28 to 2026-10-10). Each card shows what the bot says it does (from its own docstring), what it beats and what beats it on the last night it played, its best and worst replay, and its full source. All units are abstract: u for distance, ticks for time, credits for cost.
Attackers
Saturation
Put more strikers into the defence at once than it can launch against. Wins on the launch cap and the magazine, not on cleverness.
- depth_shell_saturation: Park all 30 strikers just outside gun range in three interleaved depth shells, then release them on one tick so that no two strikers ever share a blast radius and every interceptor kills at most one. Best #3.
Synchronised arrival
Engineer the arrival times so many strikers cross a line on the same tick from many bearings. The defender's per-tick launch cap becomes the bottleneck.
- synchronized_ring: Park every striker just outside the defender's identification gate, spread evenly round a ring, then release them together so the launch cap and the magazine run out before the ring does. Best #1.
- phase_locked_ring: Probe the engine's bearing convention with the first four launches, then use per-drone dogleg waypoints so every striker crosses the 150 u identification ring on the same tick, evenly spaced around the circle. Best #2.
- flanker: Two axes timed to arrive in the same tick window, to overrun the defender's two-interceptor-per-tick launch cap. Best #4.
Decoy screening
Cheap decoys go first and soak up interceptors and gun rounds before the strikers arrive. Only works against a defender that commits before it identifies.
- multi_axis: Staggered mixed waves from four bearings at once. Best #3.
- decoy_screen: A wall of decoys first, strikers following behind it. Best #5.
Trickle
Never present a mass target. Small groups at intervals drain the magazine one engagement at a time, and the rest walk in.
- staggered_screen_trickle: Send groups of two decoys and one striker every 18 ticks on rotating bearings, so the decoys draw the gun just before each striker arrives. Best #1.
- trickle: Small mixed groups at intervals from seeded-random bearings. Best #2.
Unsorted
Not yet placed in a family. A lead engineer should read the card and add the bot to FAMILIES in colosseum/library.py.
- interleaved_shell_ring: Stage all thirty strikers on a slowly rotating three-shell ring, then release them together so they arrive in one wave in which no two strikers ever come within two blast radii of each other. Best #1.
- staggered_trishell_blast_denial: Stage thirty strikers just outside radar range on three interleaved shells, each rotated 12 degrees and set 12 units deeper than the last, so no two strikers are ever inside one blast radius. Best #5.
Defenders
Identify first
Commit interceptors only to tracks confirmed as strikers, and retarget rather than waste. Beats decoys; the cost is engaging later.
- discriminating_ledger: Keep a strict ledger: one interceptor per confirmed striker, orphans retargeted to the most urgent uncovered striker, and the gun on strikers only. Best #1.
- reveal_timed_prelaunch: Pre-launch interceptors at unidentified tracks just before they cross id range, timed so the intercept lands inside id range, then retarget every shot whose track is revealed as a decoy onto an uncovered striker. Best #2.
- identify_then_engage: Interceptors only on tracks confirmed to be strikers, and orphaned interceptors get retargeted rather than wasted. Best #2.
Patient defence
Hold fire until the attack packs itself together, then time each interceptor so one blast kills several strikers. The league's answer to synchronised rings.
- convergence_blast_scheduler: Hold the interceptor magazine until a synchronized ring has squeezed itself so tight that neighbouring strikers sit inside one blast radius, then fire on an earliest-deadline schedule so each interceptor kills two or three strikers instead of one. Best #1.
- loiter_then_collapse: Launch interceptors after the ring is released, park them over the asset by retargeting them between two opposite tracks every tick, then fire every one at the same moment at the closing ring so each blast covers three strikers. Best #2.
- backscheduled_blast_packer: Plan interceptor launches backwards from the last safe intercept tick, so each blast lands where inbound strikers are packed tightest, and still shoot lone strikers right away so there is time for a second try. Best #2.
Budgeted defence
Think in time to impact and ration the magazine: plan for misses, order launches by deadline, keep depth for confirmed strikers.
- miss_budget_scheduler: Plan for misses before they happen, and order launches by deadline. Best #1.
- layered: Prioritise by time to impact, keep interceptors back for confirmed strikers, and let the gun take whatever leaks through. Best #3.
Value-model optimisation
Write down what each tick's decision is worth and let a search (or a greedy picker over the same model) choose launches and gun shots together.
- annealed_assignment: Instead of a greedy rule ("nearest first", "strikers first"), write down what a tick's decision is worth and let an optimiser pick the whole set at once. Best #4.
- greedy_value_model: Same energy terms, no search. Best #4.
- annealed_assignment_eager: Instead of a greedy rule ("nearest first", "strikers first"), write down what a tick's decision is worth and let an optimiser pick the whole set at once. Best #5.
Controls
Deliberately naive baselines that anchor the ladder: commit on range alone, or never launch at all.
- nearest_first: One interceptor per nearest unengaged track, gun on the nearest thing in range. Best #4.
- gun_only: Never launches an interceptor. Best #5.
Unsorted
Not yet placed in a family. A lead engineer should read the card and add the bot to FAMILIES in colosseum/library.py.
- cluster_blast_column_breaker: Treat a single-bearing stream as one target, and spend each interceptor on whichever track has the most uncovered threat inside its blast radius. Best #2.
- deadline_cluster_ledger: Earliest-deadline backscheduling on a worst-case "rush now" clock, filling each forced launch with the confirmed striker whose predicted blast point catches the most other uncovered strikers, and ignoring every unidentified track outside id range. Best #2.
- hover_bank_late_binder: Bank interceptor flight time by hovering the whole magazine over the asset with alternating retargets, then bind every interceptor to a cluster at the last safe tick so overlapping blasts cover each converging striker twice. Best #2.
- dither_parked_magazine: Launch-cap laundering. Best #4.
- contracting_ring_blaster: Park the whole magazine at the origin by dithering retargets, wait for the synchronized ring to contract, then fire every interceptor outward at once so each blast lands where neighbouring strikers are less than one blast radius apart. Best #5.