work / telos

Telos

AI candidate sourcing for IT staffing agencies. It ranks people on who actually got placed — not on how well a résumé echoes a job description.

Cosine similarity tells you a candidate looks right. Placement history tells you a recruiter would actually submit them. Those two disagree more often than I expected.

Status
Building · in use at one staffing firm
Role
Solo — architecture, backend, frontend, client feedback loop
Stack
FastAPI · Pinecone · Supabase · GPT-4o · JobDiva API v2 · People Data Labs · Microsoft Graph
Shipped
23 merged releases

01  The problem

Every sourcing tool does the same thing: embed the job description, embed the résumés, return the nearest neighbours. That optimises for a résumé that sounds like the req. It is a search problem wearing a hiring problem’s clothes.

But a staffing agency already knows something a search engine doesn’t: who they submitted, who got interviewed, and who got hired. That history is sitting in their ATS, unused, and it is the only ground truth in the building.

02  How it works

Telos architecture: a nightly ingest path from JobDiva into Pinecone and Supabase, and a query path that retrieves by similarity then re-scores on placement outcomes before GPT-4o ranks the top candidates. INGEST · nightly sync JobDiva ATS · API v2 sync_jobdiva scoped universe /ingest chunk + embed Pinecone résumé vectors Supabase candidates placements submitted · interviewed · hired submittal history QUERY · per open requisition Open req requirement search top-50 cosine rerank similarity + bounded outcome bonus GPT-4o top-10 + reasons Ranked shortlist vectors outcome signal Recruiter verdict submit / reject + notes every decision becomes tomorrow's training signal
Two paths. The nightly sync embeds a deliberately scoped candidate universe; the query path retrieves on similarity, then re-scores on placement outcomes before the LLM ever runs. The dashed red loop is the part that matters — a recruiter’s submit/reject decision feeds back into the outcome signal. Schematic — boxes illustrative, not to scale.

03  Try the re-ranker

This is the re-ranker, with the outcome weight exposed as a dial. Illustrative candidates — the scoring shape is the real one: similarity is the base, placement history is a bounded bonus on top.

rerank · score = (similarity + w · outcome) / (1 + w)
outcome weight w 0.20

Drag to 0 and you get pure semantic search. Drag it high and the same few veterans win every requisition — which is exactly the failure mode that made the bonus bounded.

04  The parts that were actually hard

  • Scoping the candidate universe. The full sourced database is hundreds of thousands of bulk-imported job-board résumés — embedding all of it buries the signal in noise and costs a fortune. Telos syncs everyone ever submitted (full history, because that’s the outcome data) plus anyone updated in the last three years. Choosing what not to index was the highest-leverage decision in the project.
  • Outcome score as a bonus, not a multiplier. Early versions let placement history dominate and the system just kept resurfacing the same twenty veterans. Similarity is the base; outcomes are a bounded bonus on top. Otherwise you build a machine that refuses to consider anyone new.
  • Scoring the whole résumé. A bug I shipped and then fixed: candidates were being scored on roughly their first page, so a fifteen-year career got judged on its oldest job. Obvious in hindsight, invisible until a recruiter said “why is this person ranked so low.”
  • Location as a universal signal. Contract IT staffing is intensely local. Treating location as one feature among many produced technically excellent, geographically useless matches.
  • Idempotent sync. The nightly job is keyed on JobDiva’s CANDIDATEID, so re-running it never duplicates a candidate — it can crash halfway and be safely restarted, which it has needed to be.

23

merged releases

3 yr

active-candidate window

50 → 10

retrieve, then re-rank

1

design partner using it

Honest limits. The outcome model is only as good as one agency’s history, so it inherits that agency’s past biases about who gets submitted — which is a real fairness problem, not a hypothetical one, and the bounded-bonus design is a partial mitigation rather than a solution. There is no held-out evaluation yet: I know the rankings are better because recruiters say so, which is a weaker claim than I would like to be making.