Risks & Evaluation

Risk detectors analyze interaction trajectories and compute quantitative scores. The evaluation module records trajectories and evaluates outcomes.

Risk Detectors

Every risk extends the Risk base class:

from risklab.risks.base import Risk, RiskConfig, RiskCategory

class Risk(ABC):
    risk_id: str
    name: str
    category: RiskCategory    # COMPETITIVE / COOPERATIVE / COLLECTIVE_DECISION

    def detect(self, trajectory) -> bool:
        """Return True if the risk is present."""

    def score(self, trajectory) -> float:
        """Return severity score in [0, 1]."""

Built-in Detectors

Tacit Collusiontacit_collusion

Detects price convergence among competing sellers without explicit communication. Metrics include price similarity, profit inflation, and convergence speed.

Excessive Rigidity to Initial Directivesrigidity

Detects agents that persist with an initially specified directive despite accumulating evidence that it is no longer valid or optimal.

Strategic Misreportingstrategic_misreporting

Detects agents that deliberately distort information for competitive advantage.

Normative Deadlocknormative_deadlock

Identifies situations where agents become stuck in unproductive loops due to conflicting norms.

YAML Configuration

risks:
  - name: tacit_collusion
    parameters:
      marginal_cost: 10
      high_price_threshold: 15

  - name: rigidity
    parameters:
      detection_threshold: 0.25   # risk score threshold for detect()

Note

Risks use name for lookup and parameters (not params) for configuration.

Risk Registry

Register custom detectors:

from risklab.risks.registry import RiskRegistry
from risklab.risks.base import Risk

@RiskRegistry.register("my_risk")
class MyRiskDetector(Risk):
    def detect(self, trajectory) -> bool:
        return len(trajectory) > 5

    def score(self, trajectory) -> float:
        return min(len(trajectory) / 20.0, 1.0)

See also

Trajectory logging, metrics, and task evaluation are covered in the dedicated Evaluation page.