Decide before execution

Component releases, backend variants, plugin bindings, resource digests, and rates are resolved during compilation. Runtime does not scan directories, download implicitly, or choose a conflict by import order.

One plan, multiple interfaces

The CLI, Python API, and Server operate on one ExecutionPlan. Their presentation differs, but lifecycle, state, control, and failure semantics must not fork.

Core does not own task semantics

Core understands physical worlds, timing, observations, control targets, cancellation, outputs, and provenance. It does not interpret behavior trees, Actions, Goals, grasps, or evaluation rules. scenario.behavior and scenario.evaluation are locked, then granted to authorized plugins.

Capabilities are explicit

A plugin manifest declares roles, services, and Scenario inputs. Run access and deployment policy narrow that declaration further. Missing backend capabilities are reported explicitly, never disguised as successful empty results.

Writes cross an authority boundary

Scene mutations and control commands enter Runtime at valid generation and tick boundaries. Plugins and remote interfaces cannot retain native backend objects or bypass arbitration.

Failure is structured output

Configuration diagnostics, missing capabilities, rejected control, timeouts, cancellation, and output failures have explicit states. A caller timeout is not proof that an operation was cancelled, and incomplete output must not be published as complete.

Portable does not mean identical

UniRoboSim stabilizes application contracts and capability discovery while each Provider reports its real limitations. FastSim does not promise naturally identical numbers across physics engines.

Documentation follows the same separation

Concepts explain what and why; guides cover a class of task; references list exact current interfaces; examples provide runnable instances. Source README count does not define navigation.