Live verification of the relaunch (update) branch surfaced this: the update
response omitted is_running, so the launcher fired a redundant start that got
400 'Trader is already running', showing an error toast and skipping the
dashboard navigation even though the relaunch succeeded.
- PUT /traders/:id now reports is_running (a running trader is restarted with
the new config, so it stays running).
- The already-running rejection carries error_key trader.start.already_running
and the shared launcher treats it as success (launch is idempotent).