c287202b9d
The actual fix (main_menu.gd's _ready() checking ApiClient.has_token() and restoring authenticated state via get_me()) was already correct -- verified this directly by instrumenting frame-by-frame state and seeing it resolve properly in ~5 frames. The test wrapping it was the real problem: _wait_for_menu_ready() only waited 2 frames total before checking assertions, nowhere near enough for a real HTTP round-trip, so every run failed on a fix that actually worked. Root fix: added a real auth_state_ready signal to main_menu.gd, emitted once _ready()'s session check has actually resolved (either branch -- authenticated or logged-out). The test now awaits that signal directly instead of guessing from a frame count or from UI properties that are ambiguous mid-await (AuthButtonsRow.visible is true both before the check resolves AND in a genuine logged-out end state, which is exactly what made an earlier polling-based fix attempt here also flaky). Also fixed a second real bug in the test itself: unique_id used Time.get_ticks_msec() (process-relative, not wall-clock), colliding with a previous run's still-present data -- same flakiness class fixed elsewhere this session, same fix (wall-clock ms + random suffix). Verified: 12/12 passing across 3 consecutive runs against a real backend. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>