Skip to content

CLI

The fieldproof command line interface is the entry point of the scenario engine (01-architecture.md). It is installed by the engine package: uv run --project engine fieldproof ... from the repository, or fieldproof ... inside an environment where the package is installed.

Command Produced by Description
fieldproof --version, -V P0-T07 print fieldproof <version> and exit; the version is the repository version of version.txt
fieldproof --help P0-T07 list the commands and options; running fieldproof without arguments prints the same
fieldproof validate <scenario>... P1-T05, P2-T03 validate scenario files against schema v0 and resolve them against the workspace: the world file and its frames, every vehicle manifest, the timeline's entries through their events' plan hooks (scenarios.md, events.md); no container is started; a warning per event plugin that could not be loaded; option --config
fieldproof run <scenario> P1-T05, P1-T06, P1-T07, P2-T01 run a scenario with the Docker backend: simulator (and the run's discovery server with --discovery server), the bridges, the recorder and the vehicles of a fleet in parallel with readiness gates and depends_on ordering, each vehicle under its namespace and budget (scenarios.md), the timeline with its entries started at their time and the assertions evaluated as it runs and, when outputs.video is set, the world's camera recording it (scenarios.md), teardown, the reports (Markdown, JSON, JUnit); writes runs/<run_id>/ (scenarios.md, assertions.md); prints the verdict of every assertion after the status line and the video's path; options --config, --runs-dir, --run-id, --render, --domain-id (the run's ROS_DOMAIN_ID, derived from the run id by default), --network, --discovery multicast\|server, --check-contracts (run every vehicle's bridge contract check), --keep, --quiet, --dry-run, --video/--no-video (override outputs.video), --seed (override the scenario's seed, time.md)
fieldproof schema P1-T05 print the JSON Schema of a scenario file (make scenario-schema writes engine/schemas/scenario.schema.json), the timeline entries of every registered event included
fieldproof events P2-T03 list the timeline actions the engine knows: the built-in events and the plugins installed next to it, with their source, summary and parameters (events.md); option --json; exit code 2 when a plugin could not be loaded, with the reason
fieldproof assertions P2-T05 list the assertion types the engine knows (the built-in library and the plugins installed next to it, with their source, summary, parameters and metrics) and the KPI collectors (assertions.md); option --json; exit code 2 when a plugin could not be loaded, with the reason
fieldproof report <run> P1-T06, P1-T07 render the report of a run from its run.json: a run directory, the file itself, or a run id under the workspace's runs directory (assertions.md); options --format md\|json\|junit (Markdown by default; junit is the JUnit XML document CI consumes, ci.md), --write (rewrite report.md, report.json and junit.xml in the run directory), --config; HTML arrives with P2-T06
fieldproof clock <run> status\|pause\|resume\|step P2-T04 the simulator's clock of a running run (or one kept with --keep), found by its directory or id: status prints whether the world is paused, its simulation time, iteration and real-time factor (--json for the statistics), pause, resume and step (--steps N, or --seconds S converted with the world's physics step) act on its control service (time.md); options --config; exit code 1 when the world refuses, 2 when the run has no running simulator
fieldproof compare <run-a> <run-b> P2-T04 compare the vehicles' ground-truth trajectories of two runs of a scenario in timeline time: per vehicle the largest deviation and when, the mean and the final one (time.md); options --tolerance-m (0.25 m), --json, --config; exit code 0 when every vehicle stays within the tolerance, 1 otherwise, 2 when a run cannot be compared
fieldproof replay <run-id> P2-T07 replay a recording
fieldproof matrix <sweep> P2-T06 run a parameter sweep
fieldproof bridge gen <robot.yaml> P1-T03 write the ros_gz bridge bundle of a vehicle: bridge configurations, adapter parameters, contract and launch file (bridge.md); options --out, --namespace, --frame-prefix, --no-clock, --no-robot-state-publisher, --without
fieldproof manifest validate <robot.yaml>... P1-T04 validate vehicle manifests against schema v0 with their extends chain resolved (manifest.md); --partial accepts a manifest meant only to be extended
fieldproof manifest schema P1-T04 print the JSON Schema of a manifest file (make manifest-schema writes engine/schemas/robot.schema.json)
fieldproof vehicle dockerfile <robot.yaml> P1-T04 write the build context of a vehicle image: Dockerfile, entry point, resolved manifest, vehicle.repos (manifest.md); option --out
fieldproof vehicle build <robot.yaml> P1-T04 write the context and run docker buildx build; options --context, --tag, --base-image, --no-cache, --progress, --docker-arg, --dry-run
fieldproof vehicle run <robot.yaml> [-- CMD...] P1-T04, P2-T01 docker run the vehicle image with the manifest's budget (cpus, cpuset, memory, pids), environment and DDS profile on the fieldproof network; options --name, --network, --domain-id, --namespace and --frame-prefix (into the environment and the launch's namespace_arg/frame_prefix_arg), --detach, --keep, --image, --env, --docker-arg, --dry-run
fieldproof vehicle wait <robot.yaml> P1-T04 wait until the running vehicle container satisfies the manifest's runtime.ready conditions, through the image's readiness probe (manifest.md); exit code 1 with the pending conditions on timeout; options --name, --timeout, --interval, --quiet, --dry-run
fieldproof cockpit P3-T01 serve the cockpit against the local engine

Exit codes: 0 on success, 1 on a failed scenario or assertion (also a run that timed out or could not start), 2 on a usage error (Typer's convention), 130 on a run interrupted by Ctrl-C or SIGTERM. Output is Rich-formatted on a terminal and plain when piped.