Topology Size: 100 host array slots. Active topologies range from 15-30 nodes. Unused nodes use 169.254.0.0/16 addresses, serving as dynamic decoys.
State Representation: GlobalNetworkState contains host attributes, firewall ACLs, topologies, and visibility masks. Categorical properties are encoded against static codebooks (netforge_rl/core/functional.py).
Presets: easy / medium / hard via netforge_rl.environment.presets, varying
network size, DHCP churn, dynamic-topology rates, and SIEM latency. See the docs page on
Difficulty & Splits.
Held-out split: evaluation_mode=True draws from a disjoint seed pool (offset 1000);
EVAL_SEEDS is a frozen 20-seed evaluation suite.
Reward signals are defined per-scenario via BaseScenario; rewards are tanh-normalized.
Per-scenario reward decompositions are published in env_spec and on each scenario's
REWARD_WEIGHTS.
Per-episode metrics: MTTC, SLA uptime, total exfiltration, detection rate, and active-host
compromise/isolation counts (padding excluded).
Determinism: Byte-identical replay under seed — observations, SIEM embeddings, infos, and
rewards. Every stochastic source (topology, actions, exploit hypervisor, SIEM logger and
templates, green-agent noise) is reseeded on reset(seed); timestamps use a fixed epoch, not
wall-clock. See the Reproducibility docs page.
Splits: evaluation_mode=True draws from a disjoint held-out seed pool never seen during
training.
Limitations: Synthetic generation; no real network captures.
Six capability probes (memory, attention, temporal, precision, safety, generalization) that
score a policy in [0, 1] on isolated skills, plus an oracle information-asymmetry measure
and a capability_card aggregator (JSON + radar chart).