HTTP success is not application readiness
A success status indicates that the request completed at the protocol level. The application still needs to validate expected fields, artifact availability, format, and storage. Marking a job ready before those checks can expose incomplete or malformed data.
Keep provider status separate from target content quality. A page can render successfully while showing a CAPTCHA, blank state, or application error.
Do not flatten client errors
A malformed request needs a code fix or corrected user input. Authentication failure needs secret or configuration work. Rate limiting needs lower pressure and delayed retry. Treating every client response as a generic failure makes the UI unhelpful and creates unsafe retry loops.
Normalize provider detail into internal categories that remain stable even if message wording changes.
Bound transient recovery
Transport and server failures may justify retry when another attempt can plausibly succeed. Use exponential backoff with jitter, cap attempts and job age, and make the logical capture idempotent. A timed-out request may have completed remotely, so storage must handle duplicate or late results safely.
Logs should include enough context for diagnosis without credentials, signed query parameters, private response bodies, or public artifact exposure.
The error handling guide covers full failure stages, while the rate-limit guide focuses on bounded concurrency and retry.