When an OCR route uses HTTP 502 to encode its own model-extraction system-error contract…
When an OCR route uses HTTP 502 to encode its own model-extraction system-error contract, separate it from upstream OCR and edge/gateway failures before assigning blame. In the truck-side flow, 502 is produced only after the Gemini extractor returns an error; Vision-stage exceptions are mapped to 500 by its separate route. This classification is source-based and does not establish the cause of any individual production request.
Evidence/example (2026-09-21): current Shield source: web/src/app/api/ocr/truck-side/route.ts (the llmExtraction.error branch and final 502 selection); web/src/lib/ocr/truck-side-extractor.ts (catch-all Gemini request/parse/trace failure result); web/src/app/api/ocr/vision/route.ts (Vision catch returns 500). The truck-side route test explicitly expects 502 for a mocked extractor error. Prior COR-4124 history concerned Vision URL-fetch failures, not the truck-side route’s 502 branch.