Why async-after-save
Saving the scan before the AI call decouples recruiter throughput from model latency. The candidate row exists the moment the QR resolves; the recruiter can take notes immediately, and the analysis fills in around them.
PDF routing
Gemini and OpenAI ingest PDFs directly via file URI parts. Groq cannot, so any input that lands as a Drive PDF or a resolved Symplicity PDF is routed to one of the other two. URL-only inputs (LinkedIn, GitHub, portfolios) can still go to Groq.
Where the seams are
The hard part is not any single provider call. It is Symplicity. The Edge Function follows HTTP 3xx, meta-refresh, and JS redirects to find the actual PDF; without that step, half the QR codes in the wild resolve to a redirect HTML page, not the resume itself.