Core Concepts
Risk Taxonomy
The accompanying paper defines a 13-risk taxonomy organized into three interaction categories: cooperative, competitive, and collective. RiskLab provides the infrastructure to study any of these risks through a unified experiment framework.
To help new users get started, 4 reference detectors are included as
working examples. These demonstrate how to implement the Risk interface
and can serve as templates when building your own detectors for other risks
in the taxonomy.
Reference Detectors (Included)
The following detectors ship with RiskLab out of the box. Each one illustrates a different detection strategy and can be used as a starting point for your own implementations.
ID |
Risk |
Category |
What it demonstrates |
|---|---|---|---|
R2 |
Tacit Collusion |
Competitive |
Price convergence detection via similarity metrics and counterfactual analysis |
R9 |
Strategic Misreporting |
Cooperative |
Information distortion detection — compares reported values against ground truth |
R10 |
Normative Deadlock |
Cooperative |
Loop detection on group decision processes — identifies when agents get stuck in unproductive cycles |
R13 |
Excessive Rigidity to Initial Directives |
Collective |
Behavioral inflexibility measurement — tracks how much an agent’s strategy changes (or fails to change) over rounds |
Full 13-Risk Taxonomy
The complete taxonomy from the paper is listed below. Risks without built-in
detectors can be implemented by subclassing Risk and registering via
RiskRegistry (see Extending the Framework).
ID |
Risk |
Category |
|---|---|---|
R1 |
Competitive Resource Overreach |
Competitive |
R2 |
Tacit Collusion |
Competitive |
R3 |
Priority Monopolisation |
Competitive |
R4 |
Centralized Prior Bias & Info Asymmetry |
Competitive |
R5 |
Steganography |
Competitive |
R6 |
Semantic Drift in Sequential Handoffs |
Cooperative |
R7 |
Redundant Effort & Role Drift |
Cooperative |
R8 |
Unchecked Assumptions |
Cooperative |
R9 |
Strategic Misreporting |
Cooperative |
R10 |
Normative Deadlock Across Agents |
Cooperative |
R11 |
Majority Sway & Conformity Cascades |
Collective |
R12 |
Authority Deference Bias |
Collective |
R13 |
Excessive Rigidity to Initial Directives |
Collective |
Interaction Categories
Cooperative — Agents work toward shared goals. Risks arise from semantic drift, redundant effort, unchecked assumptions, or strategic misreporting, as well as normative deadlock under incompatible norms.
Competitive — Agents pursue individual advantage. Risks include resource overreach, collusion, priority monopolisation, information asymmetry, and steganography.
Collective — Agents participate in group-level processes. Risks emerge from conformity cascades, authority deference bias, and excessive rigidity.
Key Abstractions
CommunicationTopology
An adjacency-matrix representation of agent connectivity. Topologies are
specified by providing agents (list of IDs) plus matrix, edges,
or neither (defaults to fully connected). The directed flag controls
whether edges are unidirectional.
InformationFlowConfig
Controls execution order within a round. Supports sequential stages,
parallel stages (nested lists), and stop conditions (max_rounds,
max_messages, convergence, node_reached, custom).
Default mode is cyclic — the flow loops between entry and exit nodes
until a stop condition is satisfied.
TaskConfig
Defines scenario inputs and parameters passed to the environment and agents:
# TaskConfig fields
task_id: str # unique identifier
task_type: TaskType # e.g., MARKET_TRADING, NEGOTIATION
description: str # free-text description
parameters: dict # task-specific key-value pairs
success_criteria: dict # task success definition
constraints: dict # task constraints
inputs: list | None # inline per-agent input data
input_file: str | None # or load from file
Risk Detectors
Every risk detector extends the Risk base class with two methods.
This is all you need to implement to add a new risk to the taxonomy:
from risklab.risks.base import Risk
class MyRisk(Risk):
def detect(self, trajectory) -> bool:
"""Return True if the risk is present."""
...
def score(self, trajectory) -> float:
"""Return severity score in [0, 1]."""
...
Register your detector, and it becomes available in YAML configs:
from risklab.risks.registry import RiskRegistry
RiskRegistry.register("my_risk")(MyRisk)