Skip to content

feat(ruleset_strategy): shuffled_seats — 16 distinct entrants per CTF episode, shuffled seat assignment - #24

Open
daveey wants to merge 2 commits into
mainfrom
daveey/ctf-shuffled-seats
Open

feat(ruleset_strategy): shuffled_seats — 16 distinct entrants per CTF episode, shuffled seat assignment#24
daveey wants to merge 2 commits into
mainfrom
daveey/ctf-shuffled-seats

Conversation

@daveey

@daveey daveey commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

Problem

CTF episodes were scheduled with just 2 players filling all 16 slots (8 copies each), with a deterministic round-robin pairing and a fixed [A, B, A, B, ...] seat pattern — one policy always owned the even (Red) seats.

Change

New shuffled_seats seating strategy:

  • each episode seats up to num_agents distinct entrants, dealt from a persistent shuffled ring so round-level per-entrant appearances stay balanced (min_episodes_per_entrant honored exactly);
  • the chosen entrants are then shuffled across seat positions, so slot-parity teams (CTF even=Red / odd=Blue) get random sides and random team compositions;
  • a field smaller than the seat count is repeated as evenly as possible and still seat-shuffled — never the parity lock;
  • wall-clock seeded like shuffled_window: rescheduled rounds never reuse a deal.

ctf.yaml switches from team_interleaved to it (and drops the now-unused team_count).

Tests

Rewrote the two team_interleaved CTF tests and added a full-field one: 18 entrants → 12 episodes, every episode 16 distinct policies, every entrant ≥10 appearances, sides mixed. Suite run 10× clean (assertions are shuffle-robust).

🤖 Generated with Claude Code

daveey and others added 2 commits July 11, 2026 12:40
…r episode, shuffled across seats

team_interleaved seats team_count (2) entrants per episode as a fixed
[A, B, A, B, ...] parity pattern with deterministic round-robin pairing,
so a 16-slot CTF episode had 8 copies of each of two policies and one
policy always owned the even (Red) seats. shuffled_seats deals up to
num_agents DISTINCT entrants per episode from a persistent shuffled ring
(round-level appearances stay balanced), then shuffles them across seat
positions so slot-parity teams get random sides and compositions. Fields
smaller than the seat count repeat entrants evenly and still shuffle.
ctf.yaml switches to it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Competition entrants switch from {status: competing} (every membership,
including benched old versions) to the champions shortcut: each player's
single designated is_champion policy. The status-competing filter dated
from the bootstrap era when one account seeded 16 baselines and
champions-only could not reach min_entries_to_start; the league has real
multi-player champions now.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant