hugsbun's picture
feat: add SRE incident benchmark (Pivot 2 - Scenario A)
a9f2957
Raw
History Blame Contribute Delete
7.02 kB
"""
Debug-Env Task Registry
Static task definitions for the debugging benchmark.
"""
from typing import Any, Dict, List
# Task metadata registry — mirrors the structure on disk under debug_env/tasks/
TASK_REGISTRY: Dict[str, Dict[str, Any]] = {
"task1": {
"id": "task1",
"title": "Syntax Error",
"description": "Fix a Python syntax error that prevents the module from importing.",
"difficulty": "easy",
"bug_type": "syntax",
"files": ["broken_code.py"],
},
"task2": {
"id": "task2",
"title": "Logic Error",
"description": "Fix a logical error in a boolean expression.",
"difficulty": "medium",
"bug_type": "logic",
"files": ["broken_code.py"],
},
"task3": {
"id": "task3",
"title": "Multi-file Bug",
"description": "Fix a bug that spans broken_code.py and a helper module it imports.",
"difficulty": "hard",
"bug_type": "multi-file",
"files": ["broken_code.py", "helper.py"],
},
"task4": {
"id": "task4",
"title": "Type Error Detection",
"description": "Identify and fix type annotation errors detected by static type checking.",
"difficulty": "medium",
"bug_type": "type_error",
"files": ["typed_code.py"],
"tools": ["run_type_check", "edit_file", "run_tests"],
},
"task5": {
"id": "task5",
"title": "Unused Imports and Dead Code",
"description": "Find and remove unused imports and dead code using code analysis tools.",
"difficulty": "medium",
"bug_type": "code_quality",
"files": ["messy_code.py"],
"tools": ["search_code", "get_file_structure", "get_dependencies", "edit_file", "run_tests"],
},
"task6": {
"id": "task6",
"title": "Complex Multi-file Refactoring",
"description": "Refactor code across multiple files while maintaining test coverage and fixing architectural issues.",
"difficulty": "hard",
"bug_type": "architecture",
"files": ["module_a.py", "module_b.py", "module_c.py", "integration.py"],
"tools": ["list_directory", "get_file_structure", "get_dependencies", "search_code", "get_test_coverage", "edit_file", "run_tests"],
},
"task7": {
"id": "task7",
"title": "Code Review Workflow",
"description": "Multi-user collaborative task: Junior developer submits fix that needs code review and approval",
"difficulty": "medium",
"bug_type": "code_quality",
"files": ["auth.py", "test_auth.py"],
"scenario_type": "code_review",
"participants": ["bob_junior", "alice_senior", "dave_lead"],
"tools": ["read_file", "edit_file", "run_tests", "search_code", "run_type_check", "get_test_coverage"],
},
"task8": {
"id": "task8",
"title": "Cross-team Bug Investigation",
"description": "Multi-user collaborative task: QA reported bug, dev team investigates and implements fix",
"difficulty": "hard",
"bug_type": "bug_investigation",
"files": ["user_service.py", "email_validator.py", "test_user_service.py"],
"scenario_type": "cross_team_collaboration",
"participants": ["carol_qa", "bob_junior", "alice_senior", "dave_lead"],
"tools": ["search_code", "get_file_structure", "read_file", "run_tests", "edit_file", "get_test_coverage"],
},
"task9": {
"id": "task9",
"title": "Collaborative Architecture Refactoring",
"description": "Multi-user collaborative task: Large refactoring with multiple developers working in parallel",
"difficulty": "hard",
"bug_type": "architecture",
"files": ["data_processor.py", "business_logic.py", "api_interface.py", "integration.py"],
"scenario_type": "team_refactoring",
"participants": ["alice_senior", "bob_junior", "carol_qa", "dave_lead"],
"tools": ["list_directory", "get_file_structure", "get_dependencies", "search_code", "read_file", "edit_file", "run_tests", "run_type_check", "get_test_coverage"],
},
"incident1": {
"id": "incident1",
"title": "Poisoned Database Record",
"description": (
"ALERT: Background job worker crash-looping. 15% HTTP 500 rate on /checkout. "
"Users report 'Serialization Error'. Diagnose, fix corrupted DB state, "
"patch worker code, and restore service."
),
"difficulty": "hard",
"bug_type": "incident",
"task_type": "incident",
"files": ["buggy_server.py", "worker.py"],
"server_entrypoint": "buggy_server.py",
"tools": [
"query_logs", "curl_endpoint", "execute_sql", "restart_service",
"read_file", "edit_file", "list_files",
],
"alert_message": (
"ALERT [P1]: PagerDuty triggered — background job worker is crash-looping.\n\n"
"Symptoms:\n"
" * Worker thread restarting every ~0.5 s (app.log shows repeated [WORKER CRASH])\n"
" * ~15 % HTTP 500 rate on POST /checkout — users see 'Serialization Error'\n"
" * Jobs queue depth increasing: pending jobs are not being drained\n\n"
"Your objective:\n"
" 1. Diagnose the root cause using query_logs, curl_endpoint, and execute_sql\n"
" 2. Fix the corrupted database state (update or delete the bad job row)\n"
" 3. Patch worker.py to handle malformed payloads gracefully (add try/except)\n"
" 4. Call restart_service to restart the server and trigger final verification\n\n"
"Available tools: query_logs, curl_endpoint, execute_sql, read_file, edit_file,\n"
" list_files, restart_service\n"
),
},
}
def get_task_by_id(task_id: str) -> Dict[str, Any]:
"""
Return metadata for a task by its ID.
Args:
task_id: e.g. "task1"
Returns:
Task metadata dict.
Raises:
ValueError: If task_id is not registered.
"""
task = TASK_REGISTRY.get(task_id)
if task is None:
available = get_available_task_ids()
raise ValueError(f"Unknown task '{task_id}'. Available: {available}")
return task
def get_available_task_ids() -> List[str]:
"""Return a sorted list of all registered task IDs."""
return sorted(TASK_REGISTRY.keys())
def get_task_files(task_id: str) -> List[str]:
"""
Return the list of source files belonging to a task.
Args:
task_id: e.g. "task1"
Returns:
List of filenames, e.g. ["broken_code.py", "helper.py"]
"""
return get_task_by_id(task_id)["files"]
def validate_task_id(task_id: str) -> bool:
"""
Check whether a task ID is registered.
Args:
task_id: The task ID to validate.
Returns:
True if the task exists, False otherwise.
"""
return task_id in TASK_REGISTRY