Full ingestion workflow: upload → analyze → rechunk → POST /api/ingestion
→ assert chunksIndexed > 0 and embeddingDimension > 0. Idempotency verified
with a second ingest. Failure scenario for non-COMPLETED job. @ingestion tag
for selective CI execution.
Re-read the job from DB before mark_completed so that
progress_current/progress_total written during batched conversion
are not overwritten by the stale in-memory object.
Add regression unit test and e2e assertion on final progress values.