Concepts

Jobs

Orchestrating multiple scenarios with shared pools and bindings.

A job coordinates multiple scenario workloads, each drawing from shared pools and running concurrently.

Structure

type: job
pools:
  - id: iam-users
    type: pool
    csv:
      path: ./users.csv
workloads:
  - scenario: ./brute-force.yaml
    count: 10
    bindings:
      target_user: pool.iam-users.username

Pools

Pools provide reusable datasets — IP ranges, user lists, CSV files. They are declared at the job level and referenced in workload bindings via pool.<id> or pool.<id>.<field>.

Pool types:

TypeDescription
ip_rangeGenerates IPs from a CIDR block (max 1,048,576 IPs)
string_listA static list of string values
csvRows loaded from a CSV file

Bindings

Bindings map pool draws to scenario state variables. When a workload runs, each binding expression is evaluated and injected into the scenario's state before execution.

Important: pool.* expressions are only valid in job bindings — they are rejected if used directly in scenario state or fields blocks.

Concurrency

Each workload runs in its own goroutine. The job runner forks a per-goroutine clock so concurrent workloads advance logical time independently. If any workload errors, the shared context is cancelled and sibling workloads stop.