Phase 5 OCR pipeline. The web layer enqueues jobs on POST /api/v1/projects/[id]/documents/[documentId]/ocr and the worker watchdog ocr_dispatcher drains them via Azure Document Intelligence.
Single provider in v1 — Azure Document Intelligence. Configuration is read from the Container App env. Worker and web read the same vars, so this banner matches what the dispatcher actually picks up.
provider: azure-di · missing-credsAZURE_DI_ENDPOINT is unset. POSTs to the OCR enqueue endpoint return 501; the queue stays empty until you wire the env var.
AZURE_DI_ENDPOINT=https://<resource>.cognitiveservices.azure.com AZURE_DI_KEY=<provisioned key>
Set both on the staging Container App before the dispatcher will succeed. Until then jobs flip to failed with AZURE_DI_NOT_CONFIGURED.
Latest 50 jobs for this tenant. The dispatcher promotes queued → running → completed/failed every 60s.
/api/v1/projects/{id}/documents/{docId}/ocr to enqueue.POST /api/v1/projects/[id]/documents/[documentId]/ocr — idempotent per document.ocr_dispatcher drains queued rows every 60s. Failures surface here with the underlying error message.ocr_jobs.extracted_text + extracted_fields so downstream consumers (search, submittal review, claim QA) read once.