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).
- New shared launch module (web/src/lib/launch): preflight client, model/
exchange resolution, and a single launchAutopilot orchestrator used by both
Strategy Studio and the guided launch panel — the two previously duplicated
and divergent launch implementations are gone.
- Preflight runs BEFORE any strategy mutation, so a failed launch no longer
rewrites/activates the strategy as a side effect; readiness and minimums
come from the server (live balances) instead of stale client caches.
- Guided panel polls preflight every 20s so deposits are detected without
manual refresh; step metas show live balances and required minimums; the
beginner wallet page polls its balance while the deposit screen is open.
- Every failure now routes to a guided fix: hyperliquid-funds gets its own
setup anchor (scrolls to the launch panel), start rejections surface the
server's preflight reason (including manual restarts from the trader list),
and structured error bodies flow through ApiError.errorData.
- Terminal dashboard shows a persistent runtime banner when the AI fee wallet
runs low/empty or the trader enters safe mode.
- Vitest coverage for setup-target routing, readiness helpers, and the
launch orchestration order (no side effects before preflight).