How to Use Jev for Resume Screening (Fair, Fast First Pass)

Updated Applies to Jev 1.13

TL;DR: A job description is a checklist wearing a paragraph costume. Convert each hard requirement into a judgment question, use a scoring call for overall fit on a 1-10 scale, and send anything borderline to a recruiter with the rationale attached. You get a fast, consistent first pass that is also auditable — which is exactly what fairness reviewers and compliance teams will ask for.

From JD to question list

Screening decisions must be explainable, so start by rewriting the JD:

{"answer":"yes","confidence":0.97,"rationale":"Led backend teams for 7 years per the work history section."}
{"answer":8,"scale":[1,10],"confidence":0.86,"rationale":"Matches stack and seniority; missing the stated fintech background."}

Screening flow

Resume + JD question list
   |
   v
Judgment call per hard requirement (yes / no / unclear)
   |
   +--> any "no" on a true hard requirement --> reject, keep rationale
   |
   +--> any "unclear" or low confidence --> recruiter queue
   |
   +--> all requirements pass
            |
            v
        Jev scoring call (fit, scale 1-10)
            |
            +--> score >= 8 and confidence high --> advance to interview
            |
            +--> score 6-7 or lower confidence --> recruiter queue
            |
            +--> score < 6 --> reject, keep rationale

Every reject and every advance stores answer, confidence, and rationale. Recruiters see why, candidates can be told why, and auditors can replay why.

Minimal implementation

import os, json, requests

URL = "https://openrouter.ai/api/v1/chat/completions"
# Confirm the exact model slug on the OpenRouter model page.
MODEL = "typesafe/jev-1.13"

def ask(question: str, resume: str) -> dict:
    resp = requests.post(
        URL,
        headers={"Authorization": f"Bearer {os.environ['OPENROUTER_API_KEY']}"},
        json={"model": MODEL, "temperature": 0, "messages": [
            {"role": "system", "content":
             "Answer strictly from the resume. yes, no, or unclear. "
             "If the resume does not state it, answer unclear."},
            {"role": "user", "content": f"Requirement: {question}\n\n{resume[:6000]}"}]},
        timeout=30,
    )
    resp.raise_for_status()
    # example fixture:
    # {"answer":"yes","confidence":0.97,"rationale":"..."}
    return json.loads(resp.json()["choices"][0]["message"]["content"])

def screen(resume: str, requirements: list[str], low=0.85):
    for req in requirements:
        r = ask(req, resume)
        if r["answer"] == "no":
            return {"stage": "rejected", "requirement": req, **r}
        if r["answer"] == "unclear" or r["confidence"] < low:
            return {"stage": "recruiter-queue", "requirement": req, **r}
    return {"stage": "checklist-pass", **ask("Overall fit 1-10.", resume)}

Note the “answer unclear if not stated” instruction — it is what stops the model from guessing on missing information.

Fairness and compliance notes

ConcernPractice
Question scopeOnly written, job-relevant requirements; no protected characteristics
Missing dataModel must answer unclear, never infer from gaps
Record keepingStore question, answer, confidence, rationale, model version per decision
Human in the loopAll unclear results, all low-confidence results, all final decisions
Bias checksPeriodically sample decisions across groups and compare pass rates

Why fixed-format questions beat asking a chat model to “evaluate this resume” is covered in the Jev vs. LLM-as-a-judge comparison, and the resume fit scoring case study shows the full pipeline. Threshold tuning details are in the confidence and fallback guide.

Applies to Jev 1.13.

FAQ

Frequently asked questions

Why break the JD into yes/no questions instead of one prompt?

Each hard requirement becomes a separate judgment call ('Does the candidate have 5+ years of backend experience?'). Small, fixed questions are answerable with confidence and rationale, which makes every screen decision reviewable.

How do I keep automated screening fair and compliant?

Score only job-relevant criteria, never protected characteristics; log answer, confidence, and rationale for every decision; keep humans in the loop below your confidence threshold and for all final decisions.

Where should the human review threshold sit?

A practical default: auto-advance only candidates who pass every hard requirement with high confidence, and route everything else — including any low-confidence judgment — to a recruiter queue.

Keep reading