logsentinel / tasks.py
Surya-sj's picture
feat: LogSentinel v2 — Multi-Agent SOC War-Room
f7d58be
Raw
History Blame Contribute Delete
5.22 kB
"""Task definitions for LogSentinel v2."""
from models import DifficultyLevel, ScenarioConfig, TaskDefinition
TASKS: dict = {
# ------------------------------------------------------------------
# Legacy tasks (backward-compatible)
# ------------------------------------------------------------------
"log_classification": TaskDefinition(
name="log_classification",
description=(
"Classify 10 log entries by severity and type from a single source. "
"Each log should be classified as: normal, warning, error, critical, or security. "
"Submit a final report when done."
),
difficulty="easy",
max_steps=15,
num_logs=10,
num_sources=1,
num_incidents=0,
),
"incident_detection": TaskDefinition(
name="incident_detection",
description=(
"Analyze 20 log entries from 3 different sources. Classify each log, "
"detect 2 incidents by correlating related logs across sources, "
"and assign correct severity (P1-P4) to each incident. "
"Submit a structured incident report when done."
),
difficulty="medium",
max_steps=25,
num_logs=20,
num_sources=3,
num_incidents=2,
),
"full_triage": TaskDefinition(
name="full_triage",
description=(
"Full incident triage with 30+ log entries from 5 sources including noise. "
"Classify all logs, detect 3 incidents (one is a subtle security issue), "
"correlate logs across sources, assign severity, recommend remediation "
"for each incident, and submit a comprehensive incident report. "
"Includes red herrings and ambiguous logs."
),
difficulty="hard",
max_steps=35,
num_logs=34,
num_sources=5,
num_incidents=3,
),
# ------------------------------------------------------------------
# Phase-2 Multi-Agent SOC War-Room tasks
# ------------------------------------------------------------------
"soc_warroom_easy": TaskDefinition(
name="soc_warroom_easy",
description=(
"Multi-agent SOC scenario: detect and triage 1 incident across 4 roles "
"(incident_commander, app_sre, db_sre, security_analyst). "
"Each role sees only role-relevant logs. Use handoffs and shared board to collaborate. "
"Episode phases: detect → triage → mitigate → verify → final_report."
),
difficulty="easy",
max_steps=30,
num_logs=20,
num_sources=4,
num_incidents=1,
multi_agent=True,
scenario_config=ScenarioConfig(
num_incidents=1,
difficulty=DifficultyLevel.EASY,
attack_subtlety=0.2,
observability_quality=0.95,
confounding_noise_ratio=0.25,
seed=100,
),
),
"soc_warroom_medium": TaskDefinition(
name="soc_warroom_medium",
description=(
"Multi-agent SOC scenario: detect and triage 2 overlapping incidents. "
"Partial observability, telemetry delays, and confounding noise. "
"Roles must negotiate severity and share evidence via handoffs."
),
difficulty="medium",
max_steps=45,
num_logs=35,
num_sources=5,
num_incidents=2,
multi_agent=True,
scenario_config=ScenarioConfig(
num_incidents=2,
difficulty=DifficultyLevel.MEDIUM,
attack_subtlety=0.5,
observability_quality=0.85,
confounding_noise_ratio=0.35,
seed=200,
),
),
"soc_warroom_hard": TaskDefinition(
name="soc_warroom_hard",
description=(
"Multi-agent SOC scenario: 3 simultaneous incidents including a subtle APT. "
"High noise, low observability quality, telemetry delays. "
"Requires careful evidence collection, cross-role handoffs, and coordinated mitigation."
),
difficulty="hard",
max_steps=60,
num_logs=50,
num_sources=5,
num_incidents=3,
multi_agent=True,
scenario_config=ScenarioConfig(
num_incidents=3,
difficulty=DifficultyLevel.HARD,
attack_subtlety=0.8,
observability_quality=0.70,
confounding_noise_ratio=0.50,
seed=300,
),
),
"adaptive_curriculum": TaskDefinition(
name="adaptive_curriculum",
description=(
"Adaptive difficulty task that auto-adjusts based on rolling success rate. "
"Starts at easy, promotes to medium/hard when avg success > 70%, "
"demotes when avg success < 35%."
),
difficulty="adaptive",
max_steps=45,
num_logs=35,
num_sources=5,
num_incidents=2,
multi_agent=True,
scenario_config=ScenarioConfig(
num_incidents=2,
difficulty=DifficultyLevel.EASY,
seed=None, # randomised per episode
),
),
}
TASK_LIST = list(TASKS.keys())