The Android TV sign-in screen can stay on "Loading pairing code…" indefinitely with no "Try again" button. "Sign in with a password" and "Use another server" still work, so the user can leave, but the QR sign-in never starts.
Why
TvLoginViewModel.startDeviceLogin returns early when captureAccountSessionExpectation() returns null: val expected = tokenManager.captureAccountSessionExpectation() ?: return@launch (TvLoginViewModel.kt). The device sign-in never starts and no error is set. The QR card shows "Loading pairing code…" for the Idle state and only offers "Try again" in Failed (TvLoginScreen.kt).
The expectation is null when the account generation changes between reading it and taking the identity lock, for example when a sign-out, session expiry or server switch lands while the sign-in screen opens. That's a narrow race, and it hasn't been reproduced.
Expected
Read the expectation again, or move the QR card to a failed state with "Try again".
Notes
AI disclosure
- Harness: T3 Code (Claude Code agent harness)
- Tool(s): Claude Code, GitHub CLI
- Model(s): claude-opus-5-5
- Involvement: AI-drafted at the maintainer's request, from reading the code on
main at c38fb93; not reproduced on a device
- Adversarial review: n/a
The Android TV sign-in screen can stay on "Loading pairing code…" indefinitely with no "Try again" button. "Sign in with a password" and "Use another server" still work, so the user can leave, but the QR sign-in never starts.
Why
TvLoginViewModel.startDeviceLoginreturns early whencaptureAccountSessionExpectation()returns null:val expected = tokenManager.captureAccountSessionExpectation() ?: return@launch(TvLoginViewModel.kt). The device sign-in never starts and no error is set. The QR card shows "Loading pairing code…" for theIdlestate and only offers "Try again" inFailed(TvLoginScreen.kt).The expectation is null when the account generation changes between reading it and taking the identity lock, for example when a sign-out, session expiry or server switch lands while the sign-in screen opens. That's a narrow race, and it hasn't been reproduced.
Expected
Read the expectation again, or move the QR card to a failed state with "Try again".
Notes
AI disclosure
mainat c38fb93; not reproduced on a device