Identical order tomorrow. No model drift, no temperature. If the ranking changed, something real changed and you can find out what.
Ask why she scored 71. Get the arithmetic, not a paragraph.
Most tools give you a number and a generated paragraph. The paragraph is produced separately from the number, so the two can quietly disagree. Here the explanation is that same arithmetic written out, so they cannot.
| Requirement | Necessity | Weight | Coverage | Matched via, and the evidence | Recency | Contribution |
|---|---|---|---|---|---|---|
| React, 5+ years | must-have | 18 | 100% | exact matchReact named in 3 of 4 roles, most recent 2026 | current | +18.0 |
| PostgreSQL | should-have | 10 | 95% | known aliasCV says “Postgres”, catalogue maps it to PostgreSQL | current | +9.5 |
| TypeScript | should-have | 10 | 80% | close enough“ES6 / modern JavaScript”, no TypeScript named | 2 years | +8.0 |
| Kubernetes | should-have | 8 | 0% | no evidenceNothing in the CV supports this | — | 0.0 |
| Team leadership | nice-have | 6 | 60% | close enough“mentored two juniors”, no formal reporting line | current | +3.6 |
| AWS | nice-have | 5 | 80% | known alias“EC2, S3, Lambda” named individually | 4 years | +4.0 |
Illustrative ledger for one role. Columns, behaviour and the formula match the product.
“Matched via” is the difference between a score and an argument.
When a score looks wrong, this column usually explains it in a glance. Four ways a requirement can be met, each worth a different amount.
But “they listed Postgres, the role asked for PostgreSQL, and those are a known alias”. One of those you can take to a hiring manager.
Five-year-old React counts for less than current React. If a strong candidate scores low, this is often why.
An assessment they actually sat. This replaces the claim.
The skill is named, as the role named it.
Postgres for PostgreSQL. The catalogue knows they are the same.
Similar, but a judgement rather than a fact.
Nothing in the CV supports it. Not a penalty, just a zero.
Seven factors, and the ones that did not apply drop out.
A factor the role never stated is removed from both sides of the division, never quietly scored zero.
“Not evaluated” is not zero. It means the factor could not be assessed, so it renormalised out of the calculation entirely. The header tells you how many were scored, and a candidate is never punished for a question the role never asked.
Three properties you only get if no model is grading each CV.
Correct a wrong seniority and every candidate re-scores at no cost. In a tool that grades each CV with a model call, that fix means paying to re-grade the whole database. Which is why nobody ever fixes the typo.
Change a weight and the whole database re-ranks, also for nothing. So tuning stops being something you avoid because of the bill.
Four flags, and what each one is telling you.
Where the AI actually is, and where it is not.
Worth being precise, because “AI-powered matching” is the phrase everyone uses for something else.
A JD becomes a weighted requirement spec; a CV becomes a structured profile. A human approves the requirements before the role goes live. An unreadable JD creates nothing and raises a task, rather than a half-built role scoring everyone against an empty spec.
No model call, no clock, no randomness. That is the reason the three properties above are true. Nothing is auto-rejected except by screening questions you wrote, and a knockout raises a review task rather than making someone disappear.
Send a JD and three CVs. Tell us which score is wrong.
That is a better demo than a slide deck, because the receipt lets you point at the exact row you disagree with. Most of the time it is a should-have that somebody marked must-have.