2026-09-14 (session 103, list-first scheduling P0, entirely-api 5ed8b39): services/intake_telemetry.py records per-step wall-clock samples for the intake path (upload/classify/compress, parse, check_duplicates, confirm, enrich + google/geocode_validated/prior_work, execute_confirm, approve) as intake.timing log lines plus a Redis rolling window (1000 samples, 7 d) with p50/p95/max via stats(); anomaly() counters at ERROR (approval_sow_reparse, confirm_missing_sow_items). GET /intake/telemetry (owner/admin) exposes stats(). Fire-and-forget, never raises, no arq import at module load. Same commit: enrich_intake runs Address Validation and Geocode in parallel on the raw address (standardized address geocoded second only when the canonical forms differ); compress_pdf_async + classifier PyMuPDF work moved to worker threads; /intake/confirm guarantees parsed_data.sow_items is a list (_ensure_sow_items); PATCH/DELETE /portal/intake-requests now owner/admin only (_require_approver) — schedulers keep read access. Portal 082f2a8: api.ts 120 s default timeout, parse 240 s, upload 180 s, Friday 180 s, ApiError 408 timedOut.