Quantifying Luck vs Skill in Warp Variants
The Warp 18 Problem
Observation: In 18-player Warp 18 (double-eighteen set, 190 tiles), the game devolves into pure chaos:
- Hand diversity is extreme (many unique pip values per hand)
- Building a coherent personal trail is nearly impossible
- Strategy reduces to “dump heaviest tile on any available train”
- Whoever happens to have one tile when their turn comes wins
Question: Can we quantify whether this is truly “all luck” and whether AI can even improve at such a chaotic game?
Proposed Metrics
1. Decision Complexity / Branching Factor
Track the average number of legal moves per turn:
interface TurnDecisionMetrics {
legalMoveCount: number;
uniqueTrainOptions: number; // How many different trains can be played on
dominoesPlayableOnAnyTrain: number; // "Universal" tiles
dominoesPlayableOnSingleTrain: number; // "Constrained" tiles
}
Hypothesis: Low branching factor with many constrained tiles = high skill ceiling. High branching factor with many universal tiles = luck-dominated.
- Warp 12, 4 players: Avg ~3-5 legal moves, often constrained by pip value → skill matters
- Warp 18, 18 players: Avg ~10-20 legal moves, many tiles playable anywhere → chaos
2. Hand Coherence / Pip Clustering
Measure how “connected” a hand is:
interface HandCoherenceMetrics {
uniquePipValues: number; // 0-12 for W12, 0-18 for W18
maxPipCluster: number; // Largest group of tiles sharing a pip
longestChain: number; // Longest potential sequence if you could build a trail
handEntropy: number; // Shannon entropy of pip distribution
}
Hypothesis: Low coherence = can’t execute strategy, pure reactive play.
- Warp 12: Smaller hands (10-15 tiles), moderate coherence possible
- Warp 18: Initial hand could be 6 tiles from 190-tile set → often completely fragmented
3. Strategic Depth: Move Value Spread
For each turn, evaluate all legal moves and measure the value spread:
interface MoveValueMetrics {
bestMoveValue: number;
worstMoveValue: number;
valueSpread: number; // best - worst
valueStdDev: number;
// What % of moves are within 10% of optimal?
nearOptimalMovePercentage: number;
}
Hypothesis: Narrow spread = moves are similar quality = luck. Wide spread = clear good/bad moves = skill.
If 80% of legal moves score within 5% of each other, strategic choice barely matters.
4. Outcome Variance Across Identical-Skill Matchups
Run self-play with identically-configured AIs:
interface SkillVarianceMetrics {
// Win rate variance when all seats are identical
identicalPlayerWinRateStdDev: number;
// Expected for pure luck: ~1/N for N players
// Expected for skill: one seat dominates
// How much does win rate change when you increase skill?
skillSensitivity: number; // Δ(win rate) / Δ(skill level)
}
Hypothesis:
- High variance + win rates approaching 1/N = luck-dominated
- Low variance + clear skill gradation = skill-dominated
5. Regret / Counterfactual Analysis
After game completion (when all hands are known), replay each decision:
interface RegretMetrics {
// What % of moves were objectively suboptimal given perfect information?
suboptimalMoveRate: number;
// Average points/turns lost due to suboptimal plays
averageRegret: number;
// Could the game outcome have changed with perfect play?
outcomeRegret: boolean;
}
Hypothesis: If perfect-information replay shows minimal outcome changes, luck dominates. If perfect play dramatically changes outcomes, skill dominates.
6. Train Development Success Rate
Track how often players successfully “develop” their trail:
interface TrailDevelopmentMetrics {
turnsWithOwnTrailPlay: number;
turnsForced ToOtherTrains: number;
consecutiveOwnTrailPlays: number[]; // Array of run lengths
shieldsDownPercentage: number;
}
Hypothesis: If players rarely play on their own trail (forced to opportunistically dump elsewhere), strategic planning is impossible.
Proposed Implementation
Phase 1: Instrumentation
Add metrics collection to self-play.ts:
export interface SelfPlayGameMetrics {
// Per-game aggregates
averageLegalMoves: number;
averageHandCoherence: number;
averageMoveValueSpread: number;
// Per-turn breakdown (optional, for deep analysis)
turnMetrics?: TurnMetrics[];
}
export interface SelfPlayGameResult {
winnerId: PlayerId | null;
completed: boolean;
completedRounds: number;
steps: number;
points: Record<PlayerId, number>;
finalState: GameState;
// NEW
metrics?: SelfPlayGameMetrics;
}
Phase 2: Comparative Benchmarks
Run standardized tests across Warp factors:
// Compare 4-player matches across all Warp factors
const benchmarks = {
warp9_4p: await runLuckSkillBench({ maxPip: 9, playerCount: 4, games: 1000 }),
warp12_4p: await runLuckSkillBench({ maxPip: 12, playerCount: 4, games: 1000 }),
warp15_4p: await runLuckSkillBench({ maxPip: 15, playerCount: 4, games: 1000 }),
warp18_4p: await runLuckSkillBench({ maxPip: 18, playerCount: 4, games: 1000 }),
// Extreme cases
warp12_2p: await runLuckSkillBench({ maxPip: 12, playerCount: 2, games: 1000 }),
warp12_8p: await runLuckSkillBench({ maxPip: 12, playerCount: 8, games: 1000 }),
warp18_18p: await runLuckSkillBench({ maxPip: 18, playerCount: 18, games: 1000 }),
};
Phase 3: Skill Sensitivity Test
Most important: does AI improvement even matter?
// Run matches with skill gradients
const skillTest = {
// All seats equal (Lieutenant)
baseline: runMatch({ allSeats: 'class-iii' }),
// One stronger seat
oneStrong: runMatch({ seatA: 'commander', rest: 'class-iii' }),
// Measure win rate delta
skillSensitivity: oneStrong.seatAWinRate - (1 / playerCount),
};
Expected results:
- Warp 12, 4p: Commander should win ~40-50% (skill matters)
- Warp 18, 18p: Commander might win ~6-8% (only slightly above 5.5% = 1/18, luck dominates)
Theoretical Predictions
Warp 12 (Double-Twelve, 91 tiles)
- 4 players, 15-tile hands: Moderate skill
- Hand coherence possible
- Strategic trail building viable
- AI improvement should show ~20-40% win rate delta
- 8 players, 10-tile hands: Lower skill
- Fragmented hands, less planning depth
- AI delta might drop to ~10-15%
Warp 18 (Double-Eighteen, 190 tiles)
- 4 players, 15-tile hands: Moderate-to-low skill
- Larger pip range (0-18) = less clustering
- More train variety, but still manageable
- AI delta ~10-20%?
- 18 players, 6-tile hands: Minimal skill (your case)
- Extreme fragmentation
- No strategic planning possible
- AI delta might be ~1-3% (barely above noise)
- Game becomes “Chutes and Ladders with dominoes”
Answering Your Questions
“Is that something an AI can improve at at all?”
Measurable answer: Run skill-sensitivity tests. If Commander wins 6% (vs expected 5.5%) in 18-player Warp 18, that’s only 0.5 percentage points of skill expression — essentially noise.
“Is that something we can say is ‘luck’?”
Yes, with quantification:
- High branching factor (many legal moves, most similar quality)
- Low hand coherence (fragmented pip distribution)
- Flat move value spread (dumping heaviest ≈ optimal for 80%+ of turns)
- Win rate approaching 1/N across skill levels
- Low regret (perfect-information replay barely changes outcomes)
All five point to luck-dominated game.
Next Steps
- Add metrics collection to
self-play.ts(basic version: legal move count, hand coherence) - Run comparative benchmark across Warp 9/12/15/18 at 4p
- Run extreme case (Warp 18, 18 players) with skill sensitivity test
- Publish results as
docs/luck-skill-analysis.mdwith data
Would you like me to start implementing the instrumentation?
Practical Implications
For TEI / Rating
If Warp 18 proves luck-dominated (skill delta <5%), consider:
- Only Warp 12 rated (current policy) ✅ correct
- Warp 15 might be borderline (needs testing)
- Warp 18 should remain exhibition-only
For AI Training
If Warp 18 at 18p has minimal skill expression:
- Don’t waste compute training Class I★ / Omega models on it
- Simple heuristics (greedy heaviest-first) might be 95% optimal
- Training data from chaotic variants adds noise, not signal
For Player Communication
Document findings in RULES.md:
Warp 18 at maximum fleet size (18 captains): IWGF analysis indicates this configuration is primarily luck-driven. Strategic planning is severely constrained by hand fragmentation and high train availability. Recommended for chaotic, casual play — not competitive rating.