RailCommand Operating Sessions (Running Trains)

Last updated: July 14, 2026

Concept

An operating session is where a RailCommand layout actually runs trains — it brings together the layout, trains, routes, schedules, crews, and the live runtime. Every session sits on one richness dial (SessionRichness): Arcade is museum "pick-up-and-run" — trains follow their routes on the fast clock with roles auto-filled and no paperwork; Operating-Session is the full club/prototype op — the same trains and routes, now with crew roles, jobs, car-forwarding, switchlists, and dispatcher warrants. This is not two code paths. It is one Operations Engine (OperationsEngine.ExecuteAsync); the dial only turns bureaucratic preconditions on or off (SessionProfile). It never relaxes the safety floor. Each train is either computer-driven or human-driven and can be switched live mid-run, but both flow through the identical interceptor, movement-authority window, and interlocking kernel.

How To

  1. Open Operating Sessions at /app/railcommand/operating-sessions. Existing sessions show a status badge (Planned, Active, Paused, Completed, Cancelled) and participant count. Click New Session from Layout.
  2. On Create Operating Session (/app/railcommand/operating-sessions/create): enter a Session Name, pick the layout (starting from the Layout Hub inherits era, integration mode, and theme), review the Ops Readiness panel, choose a Session Type (Solo, Collaborative, Competitive, Training), set Max Participants (1–50), then Create Session.
  3. On the session page (/app/railcommand/operating-sessions/{SessionId:guid}) use Join, assign crews from Crew Management at /app/railcommand/crew, and drive lifecycle with Pause, Resume, and End Session.
  4. On the session page, switch between the Overview tab (participants and lifecycle) and the Build Reports tab — a leveled, filterable log of why each train was built the way it was, filtered by severity and by build stage, with an optional Detail view for per-car reasoning. Toggling filters re-renders instantly and never rebuilds the trains.
  5. To dispatch, open Dispatcher at /app/railcommand/dispatcher, then Open CTC Panel (/app/railcommand/layouts/{LayoutId:guid}/ctc-panel). Click Set Route, then click the entrance signal and the exit signal to lock a route.
  6. To run a train, open a throttle at /app/railcommand/throttle, set Speed (0–128) and Forward / Stop / Reverse, and hand a train between computer- and human-driven as needed.

Troubleshooting

The session will not start — a session cannot start on un-synced layout data (ADR-0227). Resolve any blocking Ops Readiness findings first, then retry.

Set Route does nothing / won't lock — the entrance-to-exit path conflicts with an already-locked route or an occupied block. Cancel, wait for the conflict to clear, and set it again.

Throttle shows "Emergency stop may not have been sent" — the throttle is not connected to the operations hub. Reconnect before relying on that throttle; the web cannot stop a train it is not connected to.

A move is refused in an Operating-Session — richness preconditions (roles, crew, paperwork) are enforced. Assign the required crew/role, or lower the session richness to Arcade.

Safety Notes

Authority is layered and deliberate. The web authors sessions and forwards intent; the Avalonia desktop presents runtime state and forwards intent over the sidecar; the local/UE5 runtime is the authority node that owns every safety-critical decision and actuation — interlocking, movement authority, and hardware output. The web and the desktop never actuate hardware. Emergency stop is available from any client: the throttle's EMERGENCY STOP button forwards to OperationsHub.EmergencyStop, and the local authority actuates (signals to danger, trains stopped) — the cloud is a relay, never the actuator (ADR-0219/0227). The CTC panel has no separate all-stop; it routes through the operate console. The richness dial and the AutomationLevel ladder (FullAuto through Manual) can add restriction but never remove the safety floor — even a fully manual train keeps the emergency-stop path armed, and a live driving-mode handoff never drops the train's authority. On remote-dispatcher disconnect the authority node engages a territory-scoped HardStop. Related: Starting a Session, CTC Dispatcher, Emergency Stop, Ops Readiness.