Skip to content

Platform

The BDPD Arena is a configurable multi-agent simulation platform designed to isolate and recombine the dynamics of common-pool resources in a controlled, reproducible environment. Rather than assuming away complexity, the Arena treats agent heterogeneity, Knightian uncertainty about collapse thresholds, and wealth-driven power asymmetries as first-class experimental variables.


Design Philosophy

Existing analytical models can characterise equilibria but struggle to capture the combinatorial complexity that arises when heterogeneous agents, stochastic thresholds, and temporal asymmetries interact simultaneously. The BDPD Arena addresses this by:

  • Treating agent composition as a parameter. The ratio of aggressive to conservative agents is swept systematically, revealing a discontinuous collapse threshold at a single aggressor.
  • Making information structure configurable. Observability of the commons stock can be degraded with Gaussian noise at configurable resolution, directly testing whether transparency helps or hinders collective outcomes.
  • Embedding temporal asymmetry. The Seneca Effect (slow growth, fast collapse) is operationalised through regen shocks, a hidden reserve, and stochastic collapse die — mechanisms that make the "way to ruin" rapid and uncertain.
  • Allowing live structural change. The perturbation engine can override an agent's strategy mid-game (The Mule), testing the fragility of cooperative arrangements to well-timed defection.

Core Concepts

Logistic Commons

The resource stock \(S_t\) evolves according to a logistic growth model:

\[S_{t+1} = \max\left(0, \min\left(K, S_t - H_t + r S_t \left(1 - \frac{S_t}{K}\right)\right)\right)\]

where \(H_t\) is total harvest, \(K\) is carrying capacity (default 150), and \(r\) is regeneration rate (default 0.12). Harvest capacity scales with accumulated wealth as \(1 + 0.05 \times w_{i,t}\), modelling the compounding advantage of early extractors.

Dual Engine: Logistic and Seneca

The platform supports two engine modes via the engine plugin registry (≥ v0.5.0):

Mode Model Use
logistic Single-stock logistic (default) All existing sweeps (P1–P11, B1–B5)
seneca Bardi (2011) three-variable R/C/P Explicit Seneca cliff modelling

In seneca mode, the commons is modelled as three coupled ODEs: Resources (\(R\)), Capital (\(C\)), and Pollution (\(P\)). Capital accumulation drives pollution with a delay, creating the characteristic false stability before a tipping point.

Hidden Reserve & Forest Die (≥ v0.4.0)

A hidden reserve \(R_t\) is maintained behind the visible stock. When agents attempt to harvest beyond the visible stock, each excess unit triggers a \(d6\) roll. Success (≤ 4 by default) draws from the reserve; failure (5–6) causes immediate, irreversible collapse. This replaces a fixed gate threshold with Knightian uncertainty — agents cannot know how close they are to collapse until the die is cast.

Gate+Rank Victory

The game is won only if the resource has not collapsed (\(S_\text{final} > \text{threshold}\)). If the gate passes, agents are ranked by wealth; if it fails, all payoffs are zero. This two-stage function creates genuine tension between individual accumulation and collective preservation.

Nested Worlds (≥ v1.0)

A World federates N arenas into a single nested structure without cloning them. The World adds three substrates above the arena:

  • Resource Links — one-way per-round outflow \(\alpha \cdot S_t^{(\text{src})}\) from source to target arena, applied two-pass so link order does not matter.
  • Treaties — named cross-arena constraint records; the payload is read by world-level meta-agents which detect breaches and emit sanction perturbations.
  • World meta-agents (C3.b)world_sanctioner, treaty_enforcer. They observe the full federation each global round and route perturbations to the offending arena via target: { arenaIds }.

A fourth ingredient, the exclude perturbation, migrates a pact-violating player from its home arena to a designated junk arena. The migration preserves wealth and identity but resets pact membership.

Arena-level dynamics (single commons, single pact, single sanctioner) keep working unchanged when no World is used. See World, Treaties, and Governance for the full surface.


Architecture Overview

flowchart TD
    subgraph CLIENT["Client Layer"]
        WEB["Web Dashboard"]
        SCRIPT["Orchestration Script"]
        EXT["External Agent"]
    end

    subgraph SERVER["Node.js Server"]
        API["REST API"]
        REG["Arena Registry"]
        STR["Streamer (SSE)"]

        subgraph ARENA["Arena Instance"]
            ENG["Game Engine"]
            SCHED["Scheduler"]
            PERT["Perturbation Engine"]
            OBS["Observability Layer"]
        end

        subgraph AGENTS["Agent Runners"]
            BUILTIN["Built-in Heuristics"]
            SANDBOX["Sandboxed JS"]
            HTTP["HTTP Dispatcher"]
        end
    end

    SCRIPT --> API
    API --> REG
    REG --> ARENA
    ENG --> SCHED
    SCHED --> OBS
    OBS --> AGENTS
    AGENTS --> ENG
    ENG --> PERT
    ENG --> STR

See Architecture for a detailed breakdown of each subsystem.


How the Platform Relates to the Card Game

Every mechanical element of the platform has a direct analogue in The Forest of Humbaba:

Platform Card Game
Commons stock \(S_t\) Forest Deck (visible cedars)
Hidden reserve Box Reserve
Regeneration rate \(r\) Forest Health (0–10)
Forest Die (stochastic collapse) Physical Forest Die (d6)
Regen shock Seneca Clip
Harvest capacity Capacity tokens
The Mule (strategy override) Stranger-King dual mode
Gate+Rank victory Survival prerequisite
Observation noise --forest-noise (LLM agents only)

The mapping is exact: what happens in the platform has a direct analogue in the card game, and vice versa. This dual-mode design allows findings on one substrate to be tested for robustness on the other.


Agent Types

The platform supports four agent interfaces:

Type Description
Built-in 5 deterministic heuristics (aggressive, conservative, adaptive, rcp, random)
Code (sandbox) User-submitted JavaScript, 50ms timeout, persistent private memory
HTTP External callback — any language, any model
LLM via bdpd_agent.py Flask bridge → local llama-server or cloud API

See Agent Types for strategy formulas, strategyParams, and a worked code agent example.


Key Findings from the Platform

Finding Sweep Detail
Discontinuous collapse threshold at 1 aggressor P1, B1 100% → 0% gate pass; cliff at \(i \approx 0.05\)
Regen cannot offset aggression P2, B3 Rescue only at \(r \approx 0.95\), >7× canonical range
Reactive < Conservative P8, B2 Monotonic welfare cost of reactivity
Noise sweet spot at 35–50% P9 Welfare-optimal information degradation
Safe betrayal CT4 Defector profits +27% without triggering collapse
Graduated sanctions preserve commons D2, D3 Ladder ≥4/5 robust vs flat 1/5
Treaty enforcement at scale (LLM) D4 LLM Enforcer fires 2.4× more than built-in baseline
Behavioural contagion in junk arena (LLM) D5 LLM Purity drops 1.00 → 0.63 when violators are LLMs