# Server Map - `server/app.py` > FastAPI backend with REST + WebSocket endpoints. The normal path now uses > the real `ReplicaLabEnv`; `_StubEnv` remains only as a fallback if the env > package cannot be imported. > > **Tasks implemented:** API 01-09, 13, 15 ## Environment path ### `ReplicaLabEnv` Primary environment implementation imported from `replicalab.env.replicalab_env`. ### `_StubEnv` Legacy fallback kept so the server can still boot if the real env import fails. It is no longer the intended local or Docker runtime. ### `_make_env()` Factory that prefers `ReplicaLabEnv` and falls back to `_StubEnv` only on import failure. ## REST endpoints ### `GET /health` Returns a liveness payload. When the real env path is active, the response includes `env: "real"`. ### `POST /reset` Starts a new episode and returns: - `session_id` - `episode_id` - typed `Observation` ### `POST /step` Submits a typed `ScientistAction` and returns `StepResult`. When `done=true`, the terminal `StepResult` is also used to build the replay log so `reward_breakdown`, `judge_notes`, and `verdict` stay aligned with the real env result. ### `GET /scenarios` Returns the available scenario families and supported difficulties. ### `GET /replay/{episode_id}` Returns the stored `EpisodeLog` for a completed episode or 404 if not found. ## WebSocket endpoint ### `WS /ws` Per-connection isolated environment session supporting: - `reset` - `step` - `ping` Idle timeout and disconnect cleanup are implemented and verified. ## Session management | Store | Purpose | | --- | --- | | `_sessions` | Active REST sessions | | `_replay_store` | Completed episode logs | ## Key helpers | Function | Purpose | | --- | --- | | `_build_episode_log(episode_id, state, result)` | Build replay log from final state and terminal step result | | `_touch(session_id)` | Refresh REST session last-active timestamp | | `_cleanup_stale_sessions()` | Remove expired REST sessions | ## Current deployment state - Local OpenEnv validation passes - Local Docker build and run verification passes - HF Spaces metadata is present in the root `README.md` and root `Dockerfile` - Live hosted verification remains `API 10`