One commit per issue. Do not merge before the bench test.
#20 (closed) — data path. One per bench (agent.yaml), set in Server ▸ Configure…, plesty-server data-path, or the Windows installer page (Skip allowed). Devices the bench starts get DEVICE_DATA_ROOT=<root>, DEVICE_DATA_PATH=<root>/<data_dir> else <root>/tmp/<device>; .env, fleet env: and a run still win. Absolute/.. data_dir refused. Devices read DEVICE_DATA_ROOT only once plesty-lib#59 (closed) lands.
#21 (closed) — configure. No-run Configure saves to <home>/run/<experiment>/config/…, which new runs start from; the module checkout is never written. Save edits only the changed values' lines (comments/layout kept).
#18 (closed) — fleets. New bench starts on empty <home>/fleets/default.yaml. fleet new, fleet list, declare --fleet. View ▸ Fleet: all (default) or one; Fleet column names each row's. Names unique across fleets. Every write re-reads the file; changed files are re-read on refresh.
Behaviour change: a bench with no fleet now gets fleets/default.yaml instead of <home>/fleet.yaml.
Untested until the Windows run: the installer page.