Pm-ops / server /world /org_generator.py
Aditya Guntur
base iteration
1f213fe
Raw
History Blame Contribute Delete
3.38 kB
import random
from typing import Any, Dict, List
_LABEL_VARIANTS = {
"bug": ["bug", "defect", "issue", "fault"],
"feature": ["feature", "enhancement", "request", "improvement"],
"docs": ["docs", "documentation", "doc-update", "guide"],
"security": ["security", "vuln", "vulnerability", "sec-issue"],
"performance": ["perf", "performance", "slowness", "optimization"],
}
_PRIORITY_SCHEMES = [
["P0", "P1", "P2", "P3"],
["critical", "high", "medium", "low"],
["urgent", "high", "normal", "low"],
["blocker", "major", "minor", "trivial"],
]
_SERVICES = ["payments", "auth", "search", "notifications", "api-gateway", "checkout", "inventory"]
_TEAM_POOL = ["platform", "growth", "infra", "security", "backend", "frontend", "data"]
_CHANNEL_SUFFIXES = ["-alerts", "-oncall", "-ops", "-team", "-eng"]
_NOISE_CHANNELS = ["#random", "#general", "#water-cooler", "#announcements", "#off-topic", "#hiring"]
_ESCALATION_POLICIES = ["dm-manager", "page-oncall", "post-channel"]
_RELEASE_STYLES = ["terse", "verbose", "bulleted"]
def generate_org_config(seed: int, difficulty: str = "medium") -> Dict[str, Any]:
rng = random.Random(seed)
n_labels = {"easy": 3, "medium": 4, "hard": 5}.get(difficulty, 4)
label_keys = rng.sample(list(_LABEL_VARIANTS.keys()), n_labels)
label_taxonomy = {k: rng.choice(_LABEL_VARIANTS[k]) for k in label_keys}
priority_levels: List[str] = rng.choice(_PRIORITY_SCHEMES)
severity_to_priority = {
"critical": priority_levels[0],
"high": priority_levels[1] if len(priority_levels) > 1 else priority_levels[0],
"medium": priority_levels[2] if len(priority_levels) > 2 else priority_levels[-1],
"low": priority_levels[-1],
}
n_services = {"easy": 2, "medium": 3, "hard": 5}.get(difficulty, 3)
services = rng.sample(_SERVICES, min(n_services, len(_SERVICES)))
teams = rng.sample(_TEAM_POOL, min(len(services), len(_TEAM_POOL)))
team_map: Dict[str, str] = {svc: teams[i % len(teams)] for i, svc in enumerate(services)}
oncall_channels: Dict[str, str] = {}
for svc in services:
team = team_map[svc]
suffix = rng.choice(_CHANNEL_SUFFIXES)
oncall_channels[svc] = f"#{team}{suffix}"
escalation_policy: str = rng.choice(_ESCALATION_POLICIES)
release_notes_style: str = rng.choice(_RELEASE_STYLES)
all_fields = ["summary", "description", "priority", "label", "assignee"]
n_required = {"easy": 2, "medium": 3, "hard": 4}.get(difficulty, 3)
required_ticket_fields = ["summary"] + rng.sample(all_fields[1:], min(n_required - 1, len(all_fields) - 1))
n_noise = {"easy": 1, "medium": 2, "hard": 3}.get(difficulty, 2)
noise_channels = rng.sample(_NOISE_CHANNELS, min(n_noise, len(_NOISE_CHANNELS)))
return {
"label_taxonomy": label_taxonomy,
"priority_levels": priority_levels,
"severity_to_priority": severity_to_priority,
"team_map": team_map,
"oncall_channels": oncall_channels,
"escalation_policy": escalation_policy,
"release_notes_style": release_notes_style,
"required_ticket_fields": required_ticket_fields,
"noise_channels": noise_channels,
"services": services,
"teams": teams,
}