Skip to content

Worlds, tasks, and populations

An environment owns external state, objects, fields, encounters, and effects. A task defines how a composition enters that environment and how a declared outcome is measured.

Task contract

TaskSpec owns:

  • setup and sensorimotor ports;
  • accepted setup option defaults;
  • default horizon and scoring window;
  • interaction timing when required;
  • one optional scalar outcome key;
  • floor and ceiling anchors;
  • descriptors, tags, and experimental status.

Use task_outcome(sim) to read the declared outcome. Other metric fields are diagnostics unless the task contract names them.

A normalised score maps the raw outcome between the task’s anchors. It is useful within a task. It does not make outcomes from different tasks interchangeable.

One agent and many agents

The same Ensemble lifecycle runs one agent and a fixed population. Each Agent combines one reservoir, one body, and one interaction cycle.

Entity-aligned recorder values retain their EntityIDs. Agents and ticks inside one world are not automatically independent samples.

Core tasks

Tracking, Pong, and Wall are the core benchmark tasks. Each declares a scalar outcome and anchors. Wall sits near its analytic ceiling for canonical Falandays, so it is a competence floor-check with little upward discrimination.

Query the live registry:

tasks(DEFAULT_REGISTRY)
tasks(DEFAULT_REGISTRY; tag=:benchmark)
BrainlessLab.task_spec(DEFAULT_REGISTRY, :tracking)

Read the Core catalogue for current outcome and anchor details.

Source: src/tasks/Tasks.jl, src/world/Ensemble.jl, src/api/Highlevel.jl.