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.
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.
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:
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.
| Signal | Source | What we extract |
|---|---|---|
| Hard skill match | Résumé + JD | which required/preferred skills appear, years per skill, last-used, and depth (built vs just listed) |
| Evidence strength | Résumé | is each skill backed by projects, production systems, quantified outcomes — not just a keyword |
| Recency | Résumé | last time each skill was actually used (React 2019 ≠ React today) |
| Relevant experience | Résumé | years doing this role's work — not total (3y frontend + 1y backend = 1y for a backend role) |
| Domain match | Résumé | industry — FinTech, Healthcare, Gaming, AI… (bonus if it matches the JD's domain) |
| Project complexity | Résumé | architecture depth — CRUD vs microservices / event-driven / CQRS / distributed / HA / multi-region |
| Scale | Ré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) |
| Ownership | Résumé | implement → lead → design → architect → own → mentor → hire → review (from the bullet prose) |
| Career progression | Résumé | SDE1 → SDE2 → Senior → Lead; promotions, growing responsibility & team size |
| Stability | Résumé | avg tenure, longest tenure, job hops, current tenure, employment gaps |
| Engineering maturity | Résumé | inferred — RFCs, design docs, migration ownership, incident/on-call, perf & cost work |
| Quantified impact | Résumé | numbers > adjectives — "−42% latency", "saved $2M", "5M users" |
| Education / certs | Résumé | degree, branch, university; AWS/CKA/etc. — only when the JD values them |
| GitHub | GitHub API | activity & consistency, tests / CI-CD / docs in real repos, languages actually used, project sophistication, OSS PRs, stars (minor) |
| Writing quality | Résumé | grammar, formatting, action verbs — moves confidence, not competence |
| Red flags | Résumé + GitHub | stuffing (50 techs), no projects, big gaps, contradictions, dead/faked GitHub, skill inflation |
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.
| Lens | Question it answers | Example |
|---|---|---|
| 1 · Facts | What'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 · Evidence | What capability does a fact prove — and how confident are we? | "Node → production payments, 5M users · confidence: high" |
| 3 · Role relevance | How 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) |
Not "how important is GitHub?" — a signal's value is how much doubt it removes for this role.
12 yrs · Staff Engineer @ Amazon
Designed distributed systems · led 25 engineers
No GitHub link
5 yrs experience
Active GitHub · 2000 commits/yr · 150 stars
Great personal projects
Absent optional evidence lowers confidence, never the score. Only real negative evidence lowers the score.
| Signal type | Effect on the score | Examples |
|---|---|---|
| Core evidence | Drives the score — required for the role | required skills, relevant experience, ownership, project impact |
| Supporting evidence | Bonus present · never hurts if absent | GitHub, portfolio, blog, talks, open source, patents |
| Risk indicators | Only on real negative evidence | gaps, contradictions, missing required skill |
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 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?"
One résumé line — "Designed & owned a payment service · set SLAs · led the migration" — graded across stages:
| Stage | Verdict on that same evidence |
|---|---|
| Junior | ▲ well above expectation — a standout |
| Mid | ▲ above expectation — strong |
| Senior | ≈ meets 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.
| Expected level of… | Junior | Mid | Senior | Staff |
|---|---|---|---|---|
| Architecture | not expected | exposure | expected | must show |
| Ownership scope | a task | a feature | a system | a platform / org |
| Leadership / mentoring | bonus | some | expected | essential |
| System design | learning | working | strong | expert |
| Engineering maturity | bonus (Growth) | some | required | required |
Maturity flips by stage: junior → a Growth bonus (absent = fine, teachable); senior → required (absent = a real gap).
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… | Junior | Mid | Senior | Staff |
|---|---|---|---|---|
| GitHub activity | strong evidence | useful | nice-to-have | rarely matters |
| Internship quality | high value | — | — | — |
| LeetCode / competitive prog. | useful | minor | doesn't matter | doesn't matter |
| Open source / side projects | useful | useful | nice-to-have | nice-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.
| Trap | What we do instead |
|---|---|
| Years = seniority | Grade scope, not tenure — 12 yrs of implementation sits below the senior bar; 6 yrs of platform ownership clears it. |
| Missing tool = fail | Concept vs tool — deep RabbitMQ ≈ close to Kafka; don't fail a proven concept for a missing brand. |
| All experience equal | Evidence decays — recent > stale (first/last-used, duration, depth). |
| Activity = impact | Impact > activity — one widely-used library > 2000 commits. |
| Trust the title | Responsibilities > titles — grade what they actually owned, from the bullets. |
| Scale is a bare number | Context 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. |
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.
| Signal | Importance | Re-weighted by | Feeds | Notes |
|---|---|---|---|---|
| Required skill match | 25% | Stable | Readiness | matching matters everywhere; which skills is JD-set |
| Evidence strength | 20% | Stable | both | demand for proof is universal |
| Relevant experience | 15% | Band | Readiness | expected years scale with seniority |
| Project complexity | 10% | Band | both | expected depth rises with the band |
| Scale handled | 8% | Band | Readiness | users / TPS / uptime — more expected of seniors |
| GitHub maturity | 7% | Band | Growth* | supporting — collapses toward ~0 for seniors |
| Domain match | 5% | JD | Readiness | ~0 for generic roles, high for FinTech / HIPAA |
| Ownership | 5% | Band | both | near-0 junior → critical staff (steepest mover) |
| Recency | — | Stable | skill match | current, active skills matter for any role |
| Career progression | 3% | Band | Growth | trajectory weighs more mid-career up |
| Resume quality | 2% | Stable | confidence | not 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.
| Signal | Junior | Mid (anchor) | Senior | What changed |
|---|---|---|---|---|
| Ownership Band | ~2% barely counts | 5% | ~18% critical | steepest mover ↑ |
| Relevant experience Band | ~5% little track record | 15% | ~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% decisive | 7% | ~1% already proven | collapses ↓ |
| Evidence strength Stable | ~20% | 20% | ~20% | flat — proof always |
| Required skill match Stable | ~25% | 25% | ~22% | near-flat |
| Domain match JD | set by the role (0% generic → ~15% HIPAA/FinTech) — same at every band | moves 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.
Each view sums the signals tagged for it above (re-weighted for its question), plus a few derived signals of its own:
Perform on day one?
required skills + recency · evidence strength · relevant experience · domain · scale · ownership at the needed level
Become exceptional — how fast?
learning velocity (lang/framework/domain switches) · strong fundamentals · increasing scope · quality projects · curiosity
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.
| Band | Strong | Potential | Weak |
|---|---|---|---|
| Senior / Staff (Readiness-led) | Readiness clears the day-one bar (Growth = bonus) | Readiness has coachable gaps | Readiness below bar — can't deliver now, even with high Growth |
| Junior / Fresher (Growth-led) | High Growth + can start contributing | Growth moderate, or low Readiness but high Growth | Weak Growth — flat trajectory, thin fundamentals |
| Mid (balanced) | Both solid | One solid, one gap | Both 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.
Every line is backed by evidence, and labelled by source. This is what the recruiter reads.
Top reasons (résumé)
Concerns
JD match
Evidence (résumé)
GitHub signals (supporting · API)
Interview focus
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:
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.
Utkrusht — internal design · a recruiter's decision engine · résumé + GitHub vs the JD