Runner
======
The runner is a standalone Python process (entry point ``sharpie-runner``)
that connects to the web server over WebSockets and drives the RL
experiment loop. It has **no direct database access**; all persistence
goes through the web server.
Entry point: :mod:`sharpie.runner.manage`.
Startup sequence
----------------
.. code-block:: text
main()
│
├── connect to Queue WS (/runner/connection)
│ └── poll: send {"status": "idle"}, wait for {"experiment": …, "room": …}
│
└── spawn Process → start_experiment()
│
├── connect to Experiment WS (/experiment//run/)
├── load_episode() ← receive env / agent / experiment settings
└── run_episode()
├── load_environment() ← importlib load of environment file
├── load_policies() ← importlib load of each policy file
└── step loop
├── send_message() → observation frame to web server
├── receive_message() ← batched participant actions
├── get_policy_actions() ← policy.predict()
├── override_actions() ← apply human overrides
├── override_rewards() ← apply human reward feedback
├── env.step()
└── train_policies() ← policy.update() (if interval hit)
.. autosummary::
:toctree: _autosummary
:recursive:
:signatures: short
sharpie.runner