supergames-env / tasks.py
pvs333's picture
initial
0681dc4
Raw
History Blame Contribute Delete
15.2 kB
from models import (
Game, GameTitle, WorkItem, WorkType,
Severity, StaffPool
)
from itertools import combinations
from typing import List, Tuple
DAYS_PER_SPRINT = 10 # each staff member contributes 10 days per sprint
def task1Generate(seed: int = 42):
games = [
Game(
id="mmo",
title=GameTitle.MMO,
branch="Bangalore",
monthlyRevenue=789600.0,
revenuePotential=15670000.0,
activePlayers=325000,
churnRate=0.05,
)
]
workQueue = [
WorkItem(
id="b1",
gameId="mmo",
workType=WorkType.BUG,
title="Chat system lag",
severity=Severity.MEDIUM,
effort=120,
revenueImpact=30.00,
impactDelay=1,
churnReduction=0.0,
),
WorkItem(
id="b2",
gameId="mmo",
workType=WorkType.BUG,
title="Game crashes on login",
severity=Severity.BLOCKER,
effort=300,
revenueImpact=250.00,
impactDelay=0,
churnReduction=0.3,
),
WorkItem(
id="b3",
gameId="mmo",
workType=WorkType.BUG,
title="Payment processing failure",
severity=Severity.CRITICAL,
effort=200,
revenueImpact=180.00,
impactDelay=1,
churnReduction=0.2,
),
WorkItem(
id="b4",
gameId="mmo",
workType=WorkType.BUG,
title="Character progression reset",
severity=Severity.HIGH,
effort=180,
revenueImpact=90.00,
impactDelay=0,
churnReduction=0.1,
),
]
staffPool = StaffPool(total=67)
totalSteps = 1
goal = "You are the engineering lead for Super MMO, Bangalore branch. You have 67 staff and 1 sprint. Assign staff to bugs to maximise revenue recovered this sprint."
return games, workQueue, staffPool, totalSteps, goal
#task2
def task2Generate(seed: int = 42):
games = [
Game(
id="mmo",
title=GameTitle.MMO,
branch="Mumbai",
monthlyRevenue=1200000.0,
revenuePotential=2500000.0,
activePlayers=280000,
churnRate=0.04,
),
Game(
id="shooter",
title=GameTitle.SHOOTER,
branch="Chennai",
monthlyRevenue=800000.0,
revenuePotential=1400000.0,
activePlayers=150000,
churnRate=0.05,
),
Game(
id="strat",
title=GameTitle.STRAT,
branch="Bangalore",
monthlyRevenue=500000.0,
revenuePotential=1800000.0,
activePlayers=90000,
churnRate=0.06,
),
Game(
id="fighter",
title=GameTitle.FIGHTER,
branch="Hyderabad",
monthlyRevenue=300000.0,
revenuePotential=900000.0,
activePlayers=60000,
churnRate=0.07,
),
]
workQueue = [
# Bugs
WorkItem(
id="b1", gameId="mmo", workType=WorkType.BUG,
title="Payment gateway down", severity=Severity.BLOCKER,
effort=280, revenueImpact=320.0, impactDelay=0, churnReduction=0.3,
),
WorkItem(
id="b2", gameId="shooter", workType=WorkType.BUG,
title="Anti-cheat false bans", severity=Severity.CRITICAL,
effort=200, revenueImpact=180.0, impactDelay=0, churnReduction=0.2,
),
WorkItem(
id="b3", gameId="strat", workType=WorkType.BUG,
title="Save file corruption", severity=Severity.CRITICAL,
effort=160, revenueImpact=120.0, impactDelay=0, churnReduction=0.2,
),
WorkItem(
id="b4", gameId="fighter", workType=WorkType.BUG,
title="Ranked mode desync", severity=Severity.HIGH,
effort=120, revenueImpact=60.0, impactDelay=0, churnReduction=0.1,
),
# Features
WorkItem(
id="f1", gameId="mmo", workType=WorkType.FEATURE,
title="Season 8 content drop", severity=Severity.HIGH,
effort=400, revenueImpact=280.0, impactDelay=1, churnReduction=0.0,
),
WorkItem(
id="f2", gameId="strat", workType=WorkType.FEATURE,
title="Multiplayer co-op mode", severity=Severity.HIGH,
effort=500, revenueImpact=220.0, impactDelay=2, churnReduction=0.0,
),
WorkItem(
id="f3", gameId="shooter", workType=WorkType.FEATURE,
title="Ranked 2.0 system", severity=Severity.MEDIUM,
effort=300, revenueImpact=150.0, impactDelay=1, churnReduction=0.0,
),
WorkItem(
id="f4", gameId="fighter", workType=WorkType.FEATURE,
title="New fighter: Arjun", severity=Severity.MEDIUM,
effort=280, revenueImpact=100.0, impactDelay=1, churnReduction=0.0,
),
]
staffPool = StaffPool(total=80)
totalSteps = 3
goal = (
"You manage engineering across all 4 Super Games titles. "
"You have 80 staff and 3 sprints. Allocate staff to bugs and features "
"to maximise total revenue across all 3 sprints. "
"Unresolved critical bugs increase churn each sprint. "
"Features take longer but have higher long term payoff."
)
return games, workQueue, staffPool, totalSteps, goal
#task3
def task3Generate(seed: int = 42):
games = [
Game(
id="mmo",
title=GameTitle.MMO,
branch="Mumbai",
monthlyRevenue=1400000.0,
revenuePotential=2800000.0,
activePlayers=320000,
churnRate=0.03,
),
Game(
id="shooter",
title=GameTitle.SHOOTER,
branch="Chennai",
monthlyRevenue=900000.0,
revenuePotential=1600000.0,
activePlayers=180000,
churnRate=0.04,
),
Game(
id="strat",
title=GameTitle.STRAT,
branch="Bangalore",
monthlyRevenue=600000.0,
revenuePotential=2200000.0,
activePlayers=110000,
churnRate=0.055,
),
Game(
id="fighter",
title=GameTitle.FIGHTER,
branch="Hyderabad",
monthlyRevenue=350000.0,
revenuePotential=1000000.0,
activePlayers=70000,
churnRate=0.065,
),
]
workQueue = [
WorkItem(
id="b1", gameId="mmo", workType=WorkType.BUG,
title="Data breach vulnerability", severity=Severity.BLOCKER,
effort=350, revenueImpact=450.0, impactDelay=0, churnReduction=0.4,
),
WorkItem(
id="b2", gameId="shooter", workType=WorkType.BUG,
title="Wall hack exploit", severity=Severity.BLOCKER,
effort=280, revenueImpact=250.0, impactDelay=0, churnReduction=0.35,
),
WorkItem(
id="b3", gameId="strat", workType=WorkType.BUG,
title="Progression wipe on update", severity=Severity.CRITICAL,
effort=200, revenueImpact=130.0, impactDelay=0, churnReduction=0.2,
),
WorkItem(
id="b4", gameId="fighter", workType=WorkType.BUG,
title="Online multiplayer crash", severity=Severity.HIGH,
effort=150, revenueImpact=70.0, impactDelay=0, churnReduction=0.1,
),
WorkItem(
id="b5", gameId="mmo", workType=WorkType.BUG,
title="Guild bank duplication glitch", severity=Severity.HIGH,
effort=180, revenueImpact=80.0, impactDelay=0, churnReduction=0.08,
),
WorkItem(
id="f1", gameId="strat", workType=WorkType.FEATURE,
title="Open world expansion", severity=Severity.BLOCKER,
effort=800, revenueImpact=400.0, impactDelay=2, churnReduction=0.0,
),
WorkItem(
id="f2", gameId="mmo", workType=WorkType.FEATURE,
title="PvP battleground revamp", severity=Severity.HIGH,
effort=550, revenueImpact=300.0, impactDelay=1, churnReduction=0.0,
),
WorkItem(
id="f3", gameId="shooter", workType=WorkType.FEATURE,
title="Battle pass Season 5", severity=Severity.HIGH,
effort=320, revenueImpact=180.0, impactDelay=1, churnReduction=0.0,
),
WorkItem(
id="f4", gameId="fighter", workType=WorkType.FEATURE,
title="World championship mode", severity=Severity.MEDIUM,
effort=400, revenueImpact=110.0, impactDelay=2, churnReduction=0.0,
),
WorkItem(
id="f5", gameId="mmo", workType=WorkType.FEATURE,
title="Crafting system overhaul", severity=Severity.MEDIUM,
effort=280, revenueImpact=95.0, impactDelay=1, churnReduction=0.0,
),
]
staffPool = StaffPool(total=150)
totalSteps = 5
goal = (
"You are CTO of Super Games. Manage all 4 titles across all branches "
"with 150 staff over 5 sprints. Unresolved blocker bugs cause compounding "
"churn every sprint. Features take longer but unlock higher revenue. "
"Maximise total revenue across all 5 sprints."
)
return games, workQueue, staffPool, totalSteps, goal
#task4
def task4Generate(seed: int = 42):
games = [
Game(
id="mmo",
title=GameTitle.MMO,
branch="Mumbai",
monthlyRevenue=1400000.0,
revenuePotential=2800000.0,
activePlayers=320000,
churnRate=0.03,
),
Game(
id="shooter",
title=GameTitle.SHOOTER,
branch="Chennai",
monthlyRevenue=900000.0,
revenuePotential=1600000.0,
activePlayers=180000,
churnRate=0.04,
),
Game(
id="strat",
title=GameTitle.STRAT,
branch="Bangalore",
monthlyRevenue=600000.0,
revenuePotential=2200000.0,
activePlayers=110000,
churnRate=0.055,
),
Game(
id="fighter",
title=GameTitle.FIGHTER,
branch="Hyderabad",
monthlyRevenue=350000.0,
revenuePotential=1000000.0,
activePlayers=70000,
churnRate=0.065,
),
]
workQueue = [
WorkItem(
id="b1", gameId="mmo", workType=WorkType.BUG,
title="Login server instability", severity=Severity.CRITICAL,
effort=280, revenueImpact=160.0, impactDelay=0, churnReduction=0.15,
),
WorkItem(
id="b2", gameId="shooter", workType=WorkType.BUG,
title="Matchmaking ELO corruption", severity=Severity.HIGH,
effort=160, revenueImpact=90.0, impactDelay=0, churnReduction=0.1,
),
WorkItem(
id="f1", gameId="strat", workType=WorkType.FEATURE,
title="New biome: Crystal Caves", severity=Severity.MEDIUM,
effort=500, revenueImpact=150.0, impactDelay=1, churnReduction=0.0,
),
WorkItem(
id="f2", gameId="fighter", workType=WorkType.FEATURE,
title="Online tournament bracket", severity=Severity.MEDIUM,
effort=380, revenueImpact=100.0, impactDelay=1, churnReduction=0.0,
),
# Crisis item — injected at step 2
WorkItem(
id="crisis-1", gameId="mmo", workType=WorkType.BUG,
title="CRISIS: Player data exposed", severity=Severity.BLOCKER,
effort=350, revenueImpact=600.0, impactDelay=0, churnReduction=0.5,
crisis=True,
),
]
staffPool = StaffPool(total=100)
totalSteps = 3
goal = (
"A critical data exposure bug has been flagged in Super MMO. "
"You have 100 staff and 3 sprints. Sprint 1 is normal. "
"In sprint 2 a crisis item becomes active — prioritise it immediately "
"or face severe churn and revenue loss. "
"Maximise total revenue while containing the crisis."
)
return games, workQueue, staffPool, totalSteps, goal
#graders
def optimalRevenueSingleSprint(
workQueue: List[WorkItem],
staffPool: StaffPool,
) -> float:
"""
Brute force optimal for Task 1 — tries every subset of work items
and returns the highest achievable revenue in one sprint.
Only feasible for small queues (≤ 8 items).
"""
budget = staffPool.total * DAYS_PER_SPRINT
best = 0.0
for r in range(1, len(workQueue) + 1):
for subset in combinations(workQueue, r):
totalEffort = sum(item.effort for item in subset)
if totalEffort > budget:
continue
revenue = sum(
item.revenueImpact if item.impactDelay == 0
else item.revenueImpact * 0.5 if item.impactDelay == 1
else 0.0
for item in subset
)
if revenue > best:
best = revenue
return best
def task1Grade(
agentImpact: float,
workQueue: List[WorkItem],
staffPool: StaffPool,
) -> float:
optimal = optimalRevenueSingleSprint(workQueue, staffPool)
if optimal <= 0:
return 1.0
return round(min(1.0, max(0.0, agentImpact / optimal)), 4)
def task2Grade(agentTotalTevenue: float, optimalRevenue: float) -> float:
if optimalRevenue <= 0:
return 1.0
return round(min(1.0, max(0.0, agentTotalTevenue / optimalRevenue)), 4)
def task3Grade(agentTotalRevenue: float, optimalRevenue: float) -> float:
if optimalRevenue <= 0:
return 1.0
return round(min(1.0, max(0.0, agentTotalRevenue / optimalRevenue)), 4)
def task4Grade(
agentTotalRevenue: float,
optimalRevenue: float,
crisisResolved: bool,
) -> float:
if optimalRevenue <= 0:
return 1.0
baseScore = min(1.0, max(0.0, agentTotalRevenue / optimalRevenue))
# hard penalty if crisis was never resolved
if not crisisResolved:
baseScore *= 0.25
return round(baseScore, 4)
# final tasks list
TASKS = {
1: {
"generate": task1Generate,
"grade": task1Grade,
"description": "Single game bug triage — maximise revenue in 1 sprint",
"difficulty": "easy",
},
2: {
"generate": task2Generate,
"grade": task2Grade,
"description": "Multi-game mixed queue — balance bugs vs features over 3 sprints",
"difficulty": "medium",
},
3: {
"generate": task3Generate,
"grade": task3Grade,
"description": "Full portfolio — cross-game churn, 5 sprint revenue maximisation",
"difficulty": "hard",
},
4: {
"generate": task4Generate,
"grade": task4Grade,
"description": "Crisis interrupt — emergency bug mid-episode, contain churn",
"difficulty": "hard",
},
}