The terminal states (expired / already-used / not-found) were duplicated as
markup in show and result, and #verify re-implemented the nil→expired→!pending
cascade that #show already had — a copy edit meant four touch points.
- device_code_state(dc) resolves a code to :not_found / :expired /
:already_handled / :ok. Both #show and #verify branch on it, so the cascade
lives in one place.
- _terminal_state partial renders the terminal heading/message/link once;
result.html.erb now renders it instead of inlining the markup.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F7cwhwDJp3MJJDoNPVE6zq