fix(demo): never strand the user on the 'Converting' spinner
pollStatus() previously only rescheduled itself in the queued/running branch,
so a single non-OK poll response or unexpected shape (a transient hiccup during
a multi-minute run) silently killed the loop — the UI stayed on the spinner
even though the backend completed. Now it always reschedules unless a terminal
state (ready_for_review/failed) is reached, treats transient errors as
keep-polling, and surfaces a showResult render error instead of retrying it
forever. Also serve /demo with Cache-Control: no-store so fixes aren't masked
by a stale cached page.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>