Utkrusht · Recruiter · Design

Résumé → Fit: what we extract, and how we decide

A decision engine, not a scoring engine. Not "who's the best engineer" — "who's most likely to succeed in this role?" We extract every signal and evaluate it against the JD, but we score selectively — only evidence that matters for the role moves the score; the rest inform confidence or context. Everything is judged against what's reasonable for the candidate's stage & this job, and backed by explicit evidence.

Can they do it? · CapabilityHave they done it? · EvidenceBelieve it? · CredibilityHow risky? · Risk
1 · Read the JD 2 · Extract signals 3 · Evidence & relevance 4 · Judge vs stage 5 · Score 6 · Report

A worked example runs through the whole doc — a Senior Backend Engineer role and one candidate — so you can see the exact output at each step.

STEP 1Read the JD — the yardstick

Skills, band, emphasis and depth come mostly from structured position data (competencies + weights + experience enum); one LLM pass reads the JD prose for nuance. Our example role:

Senior Backend Engineer
Required: Node.js · TypeScript · PostgreSQL · AWS · Docker · Kubernetes
Preferred: GraphQL · Redis · Kafka
Band: Senior · Emphasis: backend + distributed systems · JD nuance: "high-scale, owns architecture"

STEP 2Extract the signals — what we pull, and from where

Pure extraction — nothing scored yet. ~40–50 signals from up to three sources. For each: what we pull, and a real output for our candidate.

Three zoom levels of "signal." The ~16 rows below are signal families, grouped so this isn't a wall of 50 rows. Per-skill and per-item they expand to the ~40–50 atomic signals we actually extract (e.g. "Hard skill match" becomes matched · years · last-used · depth for each of the 9 skills; "GitHub" becomes ~9 sub-signals). Step 5 then aggregates those back into ~10 scoring dimensions — many extracted signals feed one dimension. So: extract ~40–50 → shown as ~16 families → scored on ~10 dimensions.
SignalSourceWhat we extract
Hard skill matchRésumé + JDwhich required/preferred skills appear, years per skill, last-used, and depth (built vs just listed)
Evidence strengthRésuméis each skill backed by projects, production systems, quantified outcomes — not just a keyword
RecencyRésumélast time each skill was actually used (React 2019 ≠ React today)
Relevant experienceRésuméyears doing this role's work — not total (3y frontend + 1y backend = 1y for a backend role)
Domain matchRésuméindustry — FinTech, Healthcare, Gaming, AI… (bonus if it matches the JD's domain)
Project complexityRésuméarchitecture depth — CRUD vs microservices / event-driven / CQRS / distributed / HA / multi-region
ScaleRésuméusers, traffic/TPS, data volume, uptime — context from the named company & whether it's a real role vs a side-project section (team size only when stated)
OwnershipRésuméimplement → lead → design → architect → own → mentor → hire → review (from the bullet prose)
Career progressionRésuméSDE1 → SDE2 → Senior → Lead; promotions, growing responsibility & team size
StabilityRésuméavg tenure, longest tenure, job hops, current tenure, employment gaps
Engineering maturityRésuméinferred — RFCs, design docs, migration ownership, incident/on-call, perf & cost work
Quantified impactRésuménumbers > adjectives — "−42% latency", "saved $2M", "5M users"
Education / certsRésumédegree, branch, university; AWS/CKA/etc. — only when the JD values them
GitHubGitHub APIactivity & consistency, tests / CI-CD / docs in real repos, languages actually used, project sophistication, OSS PRs, stars (minor)
Writing qualityRésumégrammar, formatting, action verbs — moves confidence, not competence
Red flagsRésumé + GitHubstuffing (50 techs), no projects, big gaps, contradictions, dead/faked GitHub, skill inflation

What that produces for our candidate

Skill match — required
Node.js (5 yrs)   TypeScript (4 yrs)   PostgreSQL (5 yrs)
AWS (4 yrs)   Docker (3 yrs)   Kubernetes (exposure only)
Preferred   Redis   GraphQL   Kafka
Evidence strength — Node.js
used in 5 projects
largest: payments @ 15M req/day
→ strong, production-backed (not a keyword)
Recency
Node current · Docker current · AWS this year
Kubernetes 2022
Experience & scope
Relevant: 6.2 yrs backend (not total)
Scale: 15M req/day · 8 microservices · 99.95%
Context: startup, 8-eng team
Ownership & maturity
Designed the platform · set SLAs
Led monolith→microservices migration
On-call · mentored 4 · reviewed designs
Quantified impact
−42% API latency
−18% infra cost
Deploys: weekly → daily
GitHub (via API)
Activity ★★★★★ · Maturity ★★★★
Tests in 82% of repos · CI/CD in 18
9 active personal projects · last commit 3d ago
Where the nuanced stuff comes from: "designed it / set SLAs / mentored / ran incidents" is read from the résumé's experience prose by the LLM — GitHub can't show SLAs or mentoring. GitHub's job is proving the actual code is tested, CI'd, documented and real. Two sources, two questions.

STEP 3Facts → Evidence → Role relevance

Extracted facts pass through three lenses before any score — keeping them separate is what stops a keyword-matcher from mis-ranking people. Extract everything; score selectively.

LensQuestion it answersExample
1 · FactsWhat's objectively on the page? (never scored)"8.5 yrs backend · Node 6 yrs · AWS in 4 projects · GitHub: 27 repos, last active 2 mo"
2 · EvidenceWhat capability does a fact prove — and how confident are we?"Node → production payments, 5M users · confidence: high"
3 · Role relevanceHow much does this JD care about that evidence?the same GitHub is worth a lot for a junior and almost nothing for a senior (below)

The question to ask: "what uncertainty does it reduce?"

Not "how important is GitHub?" — a signal's value is how much doubt it removes for this role.

Fresher — résumé says "I know React."
Uncertainty is very high → GitHub is strong evidence, reduces a lot.
Principal — "led migration of 300 services."
Uncertainty is already low → GitHub adds almost nothing.

Worked comparison — a Senior Backend role

Candidate A

12 yrs · Staff Engineer @ Amazon
Designed distributed systems · led 25 engineers
No GitHub link

Candidate B

5 yrs experience
Active GitHub · 2000 commits/yr · 150 stars
Great personal projects

A naïve ATS ranks B higher — it awards points for GitHub. A recruiter ranks A higher: the résumé already proves the production & leadership capability the role needs, so A's missing GitHub is a missing supporting signal (trims confidence a touch, never the score). B's active GitHub is nice but doesn't cover the senior-level evidence the role requires. Penalizing A for an empty GitHub is the wrong ranking — and the mistake most screening tools make.

Which is why: missing ≠ negative — three kinds of signal

Absent optional evidence lowers confidence, never the score. Only real negative evidence lowers the score.

Signal typeEffect on the scoreExamples
Core evidenceDrives the score — required for the rolerequired skills, relevant experience, ownership, project impact
Supporting evidenceBonus present · never hurts if absentGitHub, portfolio, blog, talks, open source, patents
Risk indicatorsOnly on real negative evidencegaps, contradictions, missing required skill
GitHub — not available (missing)
No effect on score · confidence slightly lower. Never "GitHub 2/10".
GitHub — concerning (negative)
8-yr-old commits · tutorial repos · "K8s expert" but only HTML → lowers the score.

Unknown ≠ Low. When the résumé gives no evidence either way, we label the conclusion Unknown, never a low score — "Leadership: Unknown — insufficient evidence" is honest; "Leadership: 3/10" invents a negative that isn't there. And every conclusion carries its own confidence, not just the overall report: "Leadership: High · confidence Medium — mentored 4, led 2 projects" tells the recruiter both what we found and how sure we are.

STEP 4Calibrate against the stage's bar

Step 3 decided which signals count and how much the role cares. Now we grade each one against the level expected for the stage — the same evidence can be above the bar for one stage and below it for another. Ask "is this appropriate for 8 years?", never "do they have it?"

Same evidence, four different verdicts

One résumé line — "Designed & owned a payment service · set SLAs · led the migration" — graded across stages:

StageVerdict on that same evidence
Junior well above expectation — a standout
Mid above expectation — strong
Seniormeets the bar — the baseline this role is hired at
Staff below the bar — should be owning platforms / org-wide systems, not one service

So we report "above expectation for a 4-yr engineer", never a bare "8/10" — the baseline is the stage, not the universe.

The bar rises with stage

Expected level of…JuniorMidSeniorStaff
Architecturenot expectedexposureexpectedmust show
Ownership scopea taska featurea systema platform / org
Leadership / mentoringbonussomeexpectedessential
System designlearningworkingstrongexpert
Engineering maturitybonus (Growth)somerequiredrequired

Maturity flips by stage: junior → a Growth bonus (absent = fine, teachable); senior → required (absent = a real gap).

…and supporting signals fall with stage

The mirror image. For a junior these are strong independent evidence (little work history to lean on); for a senior the résumé already proves capability, so they fade to nice-to-have — and their absence is never a penalty (§3).

Value of…JuniorMidSeniorStaff
GitHub activitystrong evidenceusefulnice-to-haverarely matters
Internship qualityhigh value
LeetCode / competitive prog.usefulminordoesn't matterdoesn't matter
Open source / side projectsusefulusefulnice-to-havenice-to-have

This is the same logic that collapses GitHub's weight from ~15% (junior) to ~1% (senior) in the Step 5 dial — a junior is carried by these; a senior is judged on production evidence instead.

Calibration traps we avoid

TrapWhat we do instead
Years = seniorityGrade scope, not tenure — 12 yrs of implementation sits below the senior bar; 6 yrs of platform ownership clears it.
Missing tool = failConcept vs tool — deep RabbitMQ ≈ close to Kafka; don't fail a proven concept for a missing brand.
All experience equalEvidence decays — recent > stale (first/last-used, duration, depth).
Activity = impactImpact > activity — one widely-used library > 2000 commits.
Trust the titleResponsibilities > titles — grade what they actually owned, from the bullets.
Scale is a bare numberContext from what's on the page — weigh a scale claim by the named company and whether it's in a real role vs a side-project section. If context isn't stated, it lowers confidence — we never invent a team size.

STEP 5Score — two views, read against the band

Each signal gets a 0–1 sub-score (rules for objective ones, LLM for fuzzy ones). The percentages below are the mid-level anchor — the default importance for a typical role — not a fixed weight used for every JD. (The dial table further down shows each one swinging down for juniors, up for seniors, around this anchor.) The Re-weighted by column says what moves each one: Stable ≈ same everywhere, JD = set by the role's subject, Band = shifts with seniority. So no two JDs use the same numbers — importance = weight, but it's never universal, and never summed into one blended score.

SignalImportanceRe-weighted byFeedsNotes
Required skill match
25%
StableReadinessmatching matters everywhere; which skills is JD-set
Evidence strength
20%
Stablebothdemand for proof is universal
Relevant experience
15%
BandReadinessexpected years scale with seniority
Project complexity
10%
Bandbothexpected depth rises with the band
Scale handled
8%
BandReadinessusers / TPS / uptime — more expected of seniors
GitHub maturity
7%
BandGrowth*supporting — collapses toward ~0 for seniors
Domain match
5%
JDReadiness~0 for generic roles, high for FinTech / HIPAA
Ownership
5%
Bandbothnear-0 junior → critical staff (steepest mover)
Recency
Stableskill matchcurrent, active skills matter for any role
Career progression
3%
BandGrowthtrajectory weighs more mid-career up
Resume quality
2%
Stableconfidencenot a score — sets confidence

* Supporting signals (GitHub, portfolio…): bonus when present, never a penalty; importance shrinks with seniority (§4). Recency is a Stable modifier that feeds skill match rather than carrying its own weight.

How the dial turns — junior → mid → senior. The Mid column is the % from the table above (the typical-role anchor); junior swings it down, senior swings it up. The Band rows swing hard; the Stable rows barely move; the JD row is set by the role, not the band. Magnitudes are illustrative — they show direction and relative size, not a balanced ledger.

SignalJuniorMid (anchor)SeniorWhat changed
Ownership Band~2% barely counts5%~18% criticalsteepest mover ↑
Relevant experience Band~5% little track record15%~22%years become evidence ↑
Project complexity Band~5%10%~14%expected depth rises ↑
Scale handled Band~2%8%~12%seniors must have hit it ↑
GitHub maturity Band~15% decisive7%~1% already provencollapses ↓
Evidence strength Stable~20%20%~20%flat — proof always
Required skill match Stable~25%25%~22%near-flat
Domain match JDset by the role (0% generic → ~15% HIPAA/FinTech) — same at every bandmoves by JD, not band

Read one row across: 5% for ownership isn't a fixed weight — it's the mid anchor, swinging to ~2% for a junior and ~18% for a senior. A junior is carried by GitHub + fundamentals + learning velocity; a senior by ownership, relevant years and scale — their missing GitHub weightless. Same table, re-weighted.

Risk indicators are a gate, not a dimension — résumé stuffing, unstable tenure / heavy job-hopping, large unexplained gaps, contradictory timelines, dead/faked GitHub, skill inflation → cap the score and surface as concerns (only on real negative evidence; §3).

Some extracted signals feed these dimensions rather than standing alone: recency → skill match · quantified impact → evidence strength · engineering maturity → ownership. Stability & gaps → risk indicators (above). Education / certs → count only when the JD values them.

Two independent scores (0–100)

Each view sums the signals tagged for it above (re-weighted for its question), plus a few derived signals of its own:

Readiness

Perform on day one?

required skills + recency · evidence strength · relevant experience · domain · scale · ownership at the needed level

Growth

Become exceptional — how fast?

learning velocity (lang/framework/domain switches) · strong fundamentals · increasing scope · quality projects · curiosity

Read both against the band → a bucket

No single blended number. The pass bar moves with the band — a senior needs high Readiness; a junior isn't expected to be day-one ready, so their Readiness bar is low but their Growth bar is high.

BandStrongPotentialWeak
Senior / Staff (Readiness-led)Readiness clears the day-one bar (Growth = bonus)Readiness has coachable gapsReadiness below bar — can't deliver now, even with high Growth
Junior / Fresher (Growth-led)High Growth + can start contributingGrowth moderate, or low Readiness but high GrowthWeak Growth — flat trajectory, thin fundamentals
Mid (balanced)Both solidOne solid, one gapBoth weak

Ranking within a bucket goes by the band's primary score — seniors by Readiness, juniors by Growth (the other breaks ties). No fake precision from a blended number.

STEP 6The report — one minute to decide

Every line is backed by evidence, and labelled by source. This is what the recruiter reads.

Senior Backend · Strong Match
Readiness 94 — clears the senior bar  ·  Growth 82 — bonus
Confidence: High  ·  Strong Interview

Top reasons (résumé)

5/6 required skills matched (Kubernetes the gap) · 2/3 preferred
6.2 yrs relevant backend — above expectation for the band
Designed distributed payments @ ~15M req/day (startup, 8-eng team)
Owned it: SLAs · migration · on-call · mentored 4

Concerns

Kubernetes exposure only (required, last used 2022) — the one required gap
No Kafka (preferred) — but deep RabbitMQ + event-driven, likely quick to learn

JD match

required Node TS PG Docker AWS K8s
preferred Redis GraphQL Kafka

Evidence (résumé)

6.2 yrs relevant · now on Node/AWS
Largest: payments ~15M req/day
Impact: −42% latency · −18% cost · weekly→daily deploys

GitHub signals (supporting · API)

Activity ★★★★★ · Maturity ★★★★ · Tests 82% of repos · CI/CD in 18 · Docs strong · 9 personal projects · last commit 3d ago
Role relevance: nice-to-have (senior — already proven in production)

Interview focus

1. Kubernetes depth   2. Kafka fundamentals   3. System design at scale

Evidence rule: never "AWS 9.1/10" — always "AWS across 4 production projects over 5 years, incl. infra for 15M req/day." Evidence is what makes every line explainable and defensible.

The same two metrics, judged against each band's bar — two different applicants:

A senior applicant · Readiness 94 (clears the high senior bar) · Growth 82 → Strong Interview
A junior applicant · Readiness 61 (fine — junior bar is low) · Growth 90 (well above bar)Strong — hire to grow

Sample reports — good & bad hires

Six candidates, spanning the range — chosen to surface as many signals as possible (each concern/plus is tagged). Watch how the band re-weights the signals (§ dial table above) and how the missing-vs-negative rule changes each verdict — the same fact carries a different weight for a junior vs a senior.

Strong · good hire

Senior Backend

Readiness 94 (clears the senior bar) · Growth 82Strong Interview · Confidence High
  • Skills 5/6 required (K8s the gap) · relevant exp 6.2 yrs · scale ~15M req/day (startup, 8-eng)
  • Ownership + maturity — designed it, SLAs, monolith→microservices migration, on-call, mentored 4
  • Progression SDE1→Staff · impact −42% latency, −18% cost · stable (avg tenure 3.4 yrs)
  • Recency: Kubernetes last used 2022 · no Kafka (deep RabbitMQ, learnable) · no GitHub → confidence trimmed, not scored
Band re-weight: at senior, ownership (~18%) + relevant years (~22%) + scale (~12%) carry the score, and GitHub drops to ~1% — so proven production ownership drives Readiness and the missing GitHub is weightless.
Strong · good hire

Junior Full-Stack

Readiness 62 (fine for the band) · Growth 91 (well above bar) → Strong — hire to grow · Confidence High
  • Fundamentals strong · learning velocity — 3 stacks in 2 yrs
  • GitHub 9 real projects, tests + CI, a shipped side product · relevant CS degree
  • Writing quality clean, quantified bullets · trajectory intern → junior, growing scope
  • Limited production experience — expected at this stage, not a penalty
Band re-weight: at junior, GitHub jumps to ~15% and relevant experience shrinks to ~5% — so real projects + learning velocity carry it, and thin production experience barely dents the score. The exact opposite weighting of the senior above.
Weak · bad hire

Senior Backend — looks impressive, isn't

Readiness 48 (below the senior bar) · Growth 40Pass · Confidence Medium
  • 12 years' experience · lists 40 technologies
  • Years ≠ seniority — implementation only; no architecture / ownership / maturity evidence
  • Keyword-stuffed (low claim density) · flat progression (same role 12 yrs)
  • Stale recency — headline skills last used 3–4 yrs ago
Band re-weight: at senior the weight sits on ownership (~18%), complexity (~14%) and scale (~12%) — exactly what's absent here — so 12 years and 40 keywords can't lift Readiness. For a junior the same résumé would score far better, because those dimensions barely count.
Potential · borderline

Mid Backend — domain gap + job-hopping

Readiness 71 · Growth 66Interview only if the pipeline needs it · Confidence Medium
  • Skills core matched · recent backend · decent project complexity
  • Domain mismatch — all FinTech; role is Healthcare/HIPAA, no domain evidence (learnable, but a gap)
  • Stability risk — 5 jobs in 4 years (avg tenure ~0.9 yr), a heavier concern at this level
JD re-weight: domain is a JD dial — for a generic role it'd be ~0, but this HIPAA role pushes it to ~12%, so the mismatch actually bites here. Job-hopping is handled by the risk gate, not a weight. Capable, but both are real reservations — a conditional interview.
Potential · borderline

Senior Backend — claims need calibrating

Readiness 76 · Growth 70Interview · Confidence Medium
  • Strong ownership language · AWS Solutions-Architect cert (JD doesn't require it → neutral, not a bonus)
  • Scale unverified — "15M req/day" is a bare figure in a Personal Projects section (no company, architecture, or metrics behind it) → confidence reduced, not taken at face value
  • Recency — core stack current, but the distributed-systems work was 2019
Solid, but two claims need calibrating; the cert doesn't move the score (the JD doesn't value it).
Weak · bad hire

Senior Backend — risk gate tripped

Readiness / Growth cappedPass · Confidence Low
  • Contradictory timeline (overlapping roles) · 3-yr unexplained gap
  • "K8s & Kafka expert" but GitHub shows only tutorial-copy HTML repos — skill inflation
  • No measurable achievements anywhere
These are real negative evidence (not missing) — the risk gate caps the score regardless of the claims.

Utkrusht — internal design · a recruiter's decision engine · résumé + GitHub vs the JD