Two bugs that could cause blank PDFs to re-trigger indefinitely:
1. webdriver.py: tiled fallback used `if img is None:` which let b""
(returned by combine_screenshot_tiles on an empty tile list) pass
through silently. Changed to `if not img:` to catch both cases.
2. screenshots.py: compute_and_cache had no else branch after
`if image: cache_payload.update(image)`. When get_screenshot returned
None or b"" without raising, status stayed at COMPUTING instead of
ERROR, causing is_computing_stale() to re-trigger the task
indefinitely after THUMBNAIL_ERROR_CACHE_TTL. Added
`else: cache_payload.error()` so failed screenshots always transition
to ERROR and use the controlled TTL back-off.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>