80d5372131
from_accept returns JPEG unless Accept contains image/webp, and no thumbnail test sent the header — curl defaults to */*, which does not match. So the whole suite ran on JPEG and the WebP path was never exercised over HTTP, despite being what background generation writes and what the derived tier was built around. The gap was invisible because the JPEG results were all correct. Three assertions, one property each. Content-Type proves negotiation happened: thumbnail_content_type sniffs the body with `infer` rather than echoing the request, so image/webp cannot be right by accident — serve JPEG bytes down the WebP path and it reads image/jpeg and fails. Differing bytes prove they are genuinely two artifacts rather than one served twice. Differing ETags prove the validators are separate. `variant` has carried the format only since 20261022000000; before that a JPEG request could match the WebP row and be served the wrong codec, and a shared validator is exactly how a cache would then hand either to either. A final conditional request confirms each codec revalidates against its own. Together these also cover the per-format variant keying that lets one source hold both codecs — the prerequisite for JPEG clients ever leaving the sidecar, and therefore for step 10e. Note on placement: thumb_etag stays in step 4's capture block, beside thumb_bytes. Every later request omits Accept and so negotiates JPEG, so the validator must be the JPEG one — captured after the new block it would describe a different codec than the bytes next to it, and the copy assertions compare against both.