CV matching benchmark

    After four fixes, across 4 jobs on the same 1,000 CVs, Formzed found 100% of the true fits within as many places as there are true fits, up from 82% before them, and average precision rose from 0.89 to 1.00. 40 of its 40 top-10 picks meet every must-have. True fits placed low fell from 39 before any fix to 1 after the third and 0 after the fourth. A first match of all four jobs cost $0.75 in AI, and asking again $0.11.

    A true fit is a candidate inside the job's rules (place, start date, experience limit) who meets every must-have, according to an answer key written from what each generated CV really shows and frozen before the first run. One run per job before any fix and one after each, all scored once against the same key. The charts below show the latest run.

    Five runs, four fixes

    The first run cut every requirement to its first 60 characters before the AI checked CVs against it, so long either-or lists lost options such as PHP, C#, Storybook and Snowflake. The first fix keeps each requirement in the job's own words, up to 160 characters, and ranks a candidate who only partly meets a must-have below those who meet them all.

    The second fix stops Formzed's proof check turning down correct answers when the AI quotes only the matching items of a skills list (“Storybook, Playwright, Jest” out of a longer list), checks old “missing” must-haves once more, and tells the AI plainly that a technology the requirement names always counts.

    The third fix aims at no qualified candidate missed: everyone inside the job's rules gets the detailed check, where before only the best rated did; any requirement judged missing where the candidate's own text names it gets a second, careful look on its own; and a certificate, course or degree naming a skill shows it.

    The fourth fix counts a technology named in a candidate's skills list (“Python, Django, PostgreSQL”) as meeting a requirement that only names technologies, such as “Python or Scala”, whatever a verdict said.

    First run, no fixAfter each earlier fixAfter the fourth fix, in the job's colour

    R-precision

    50%60%70%80%90%100%Backend Engineer70% → 100%Frontend Engineer89% → 100%Machine Learning Engineer91% → 100%Data Engineer79% → 100%

    Average precision

    0.50.60.70.80.91.0Backend Engineer0.77 → 1.00Frontend Engineer0.97 → 1.00Machine Learning Engineer0.94 → 1.00Data Engineer0.89 → 1.00

    Headline numbers, run by run

    JobRunAnswer logicR-precisionAverage precisionTop 10 meeting every must-haveTrue fits placed lowWrong top-10 picksDetailed fit rho
    Backend Engineer13370%0.7791510.66
    Backend Engineer23482%0.9310900.86
    Backend Engineer33590%0.9610500.90
    Backend Engineer436100%1.0010000.98
    Backend Engineer538100%1.0010000.98
    Frontend Engineer13389%0.9710900.76
    Frontend Engineer23488%0.97101000.77
    Frontend Engineer33594%0.9810500.86
    Frontend Engineer436100%1.0010000.89
    Frontend Engineer538100%1.0010000.89
    Machine Learning Engineer13391%0.9410500.95
    Machine Learning Engineer23489%0.9410600.93
    Machine Learning Engineer33591%0.9410500.95
    Machine Learning Engineer436100%1.0010000.97
    Machine Learning Engineer538100%1.0010000.97
    Data Engineer13379%0.89101000.75
    Data Engineer23490%0.9510500.88
    Data Engineer33594%0.9510300.91
    Data Engineer43698%0.9910100.96
    Data Engineer538100%1.0010000.97

    What each match cost

    Run 4 was the first to record what each match used, and the first to check everyone inside the job's rules in detail. The four jobs checked 2,865 CVs in 8 parts and 702 seconds, for 944 credits, or $0.75 of AI cost to Formzed at $0.0007925 a credit. Answers saved by earlier runs were reused where the requirement and CV were unchanged, so a first match on CVs never matched before can cost a little more.

    Asked again in the latest run, after the fourth fix, the same four jobs cost 141 credits ($0.11) in 245 seconds: nearly every answer was saved by the run before, so asking about the same job again costs a fraction of the first match.

    Written tokens, the AI's verdicts, cost five times as much as the CV text it reads, so they are about half the bill although there are far fewer of them. The runs before the third fix didn't record what they used.

    AI cost per job in run 4, by kind of token

    Read: the CVs, answers and instructionsWritten: the AI's verdicts and answerCache reads and writes
    Backend Engineer$0.081 · 102 creditsFrontend Engineer$0.196 · 247 creditsMachine Learning Engineer$0.219 · 277 creditsData Engineer$0.253 · 319 credits

    Cost per job in run 4

    Per 1,000 CVs: the job's cost spread over the CVs it checked in detail.

    JobChecked in detailPartsSecondsCreditsCostPer 1,000 CVs
    Backend Engineer339197102$0.081$0.239
    Frontend Engineer8102169247$0.196$0.241
    Machine Learning Engineer1,0002183277$0.219$0.219
    Data Engineer7163253319$0.253$0.353

    R-precision by job

    R-precision: of a job's true fits, the share Formzed placed within as many places as there are true fits. A perfect ranking scores 100%.

    100%

    Backend Engineer

    Rules: Based in the US, Canada, UK, Germany or Netherlands; Can start within 2 months95% interval 93% to 100%True fits 50, inside the rules 338Top 10 meeting every must-have 10Average precision 1.00
    100%

    Frontend Engineer

    Rules: Can start within 2 months95% interval 95% to 100%True fits 80, inside the rules 810Top 10 meeting every must-have 10Average precision 1.00
    100%

    Machine Learning Engineer

    Rules: none95% interval 93% to 100%True fits 54, inside the rules 1,000Top 10 meeting every must-have 10Average precision 1.00
    100%

    Data Engineer

    Rules: At most 8 years of experience95% interval 93% to 100%True fits 48, inside the rules 716Top 10 meeting every must-have 10Average precision 1.00

    Recall@k: how many true fits are in the top k places

    Share of true fits found in the top k places

    Recall in the top 10 is capped when a job has more than ten true fits, which is why R-precision is the headline.

    Backend EngineerFrontend EngineerMachine Learning EngineerData EngineerTop 10 shown
    1002003000%20%40%60%80%100%Top k placesShare of true fits foundTop 10

    Recall@k with 95% intervals

    Found: true fits in the top k. Precision: the share of the top k who are true fits.

    JobTop kFoundRecallFromToPrecision
    Backend Engineer101020%11%33%100%
    Backend Engineer252550%37%63%100%
    Backend Engineer5050100%93%100%100%
    Backend Engineer10050100%93%100%50%
    Backend Engineer15050100%93%100%33%
    Backend Engineer25050100%93%100%20%
    Backend Engineer50050100%93%100%10%
    Frontend Engineer101013%7%22%100%
    Frontend Engineer252531%22%42%100%
    Frontend Engineer505063%52%72%100%
    Frontend Engineer10080100%95%100%80%
    Frontend Engineer15080100%95%100%53%
    Frontend Engineer25080100%95%100%32%
    Frontend Engineer50080100%95%100%16%
    Machine Learning Engineer101019%10%31%100%
    Machine Learning Engineer252546%34%59%100%
    Machine Learning Engineer505093%82%97%100%
    Machine Learning Engineer10054100%93%100%54%
    Machine Learning Engineer15054100%93%100%36%
    Machine Learning Engineer25054100%93%100%22%
    Machine Learning Engineer50054100%93%100%11%
    Data Engineer101021%12%34%100%
    Data Engineer252552%38%66%100%
    Data Engineer5048100%93%100%96%
    Data Engineer10048100%93%100%48%
    Data Engineer15048100%93%100%32%
    Data Engineer25048100%93%100%19%
    Data Engineer50048100%93%100%10%

    Score vs. true fit

    True fit: the answer key's share of the job's requirements a CV meets (a must-have counts three times as much as a nice-to-have). Formzed gives every candidate inside the rules a quick rating, then checks them in detail for a fit score.

    Quick rating (0 to 10) against true fit

    Everyone rated. Points are spread a little so equal values don't hide each other.

    Meets every must-haveDoesn't
    0204060801000246810True fit (answer key, out of 100)Quick rating

    Detailed fit (out of 100) against true fit

    The candidates checked in detail. A missed must-have caps the fit. The dashed line is where the two agree.

    Meets every must-haveDoesn'tEqual
    020406080100020406080100True fit (answer key, out of 100)Detailed fit

    Rank correlation with true fit (Spearman)

    1 means the scores order candidates exactly as the key does; 0 means no relation.

    JobQuick ratingFromToRatedDetailed fitFromToChecked
    Backend Engineer0.740.680.793390.980.980.99339
    Frontend Engineer0.730.680.778100.890.870.91810
    Machine Learning Engineer0.400.340.471,0000.970.960.971,000
    Data Engineer0.700.650.747160.970.960.98716

    Precision and recall down the ranking

    Precision against recall, place by place

    Each point is one cut-off down Formzed's order. Up and to the right is better.

    Backend EngineerFrontend EngineerMachine Learning EngineerData Engineer
    0%50%100%0%20%40%60%80%100%Recall (share of true fits found)Precision

    Average precision with 95% intervals

    The area under each curve. A random order scores the share of true fits.

    JobAverage precisionFromToRandom order
    Backend Engineer1.001.001.000.050
    Frontend Engineer1.001.001.000.080
    Machine Learning Engineer1.001.001.000.054
    Data Engineer1.001.001.000.048

    Calibration: can a score be read as a chance of fitting?

    A quick rating is read as a chance out of ten of being a true fit, a detailed fit as a chance out of a hundred. Formzed's scores rank candidates and don't promise probabilities; this shows how far a score can be taken literally. Circles grow with the number of candidates in the band; whiskers are 95% intervals.

    Quick rating

    0%50%100%0%20%40%60%80%100%Score read as a chanceShare who truly fit

    Detailed fit

    0%50%100%0%20%40%60%80%100%Score read as a chanceShare who truly fit

    Calibration error

    ECE: the average gap between a score read as a chance and the share that truly fit, weighted by band size. Brier: the mean squared error of that chance. Lower is better for both.

    JobQuick rating ECEBrierDetailed fit ECEBrier
    Backend Engineer0.2290.1300.3360.141
    Frontend Engineer0.0950.0480.2440.081
    Machine Learning Engineer0.0470.0150.2530.083
    Data Engineer0.0860.0410.2090.068

    No true fit lost

    Every true fit in the four jobs is placed within as many places as there are true fits. The causes that took true fits before are gone: none was kept from the detailed check by a low quick rating, and none was lost to a certificate, a turned-down quote, a cut requirement or a misread skills list.

    True fits placed below the place a perfect ranking gives them, by cause

    All four jobs together.

    None: every true fit is placed within as many places as there are true fits.

    What else to know

    A certificate now shows a skill: candidates whose ML framework appears only as “TensorFlow Developer Certificate” count as meeting it, as the answer key reads them. Read strictly, with certificates not counting, Machine Learning Engineer's R-precision is 100% and its average precision 1.00.

    Everyone inside the job's rules is now checked in detail, so the quick rating only decides the order they're checked in, not who is considered.

    No top-10 pick is short of a must-have any more: a partly met must-have now ranks like a missed one. The data job's requirement is also kept as “Python or Scala”, where the first run narrowed it to “Python or Scala for data pipelines”.

    How this was measured

    The candidates are the 1,000 generated CVs on the test form (fictional people, 50 of them scanned images). Each was generated from a known record of skills, years, country and notice period, so the key works out every candidate's fit from what the CV shows: a skill counts when it is listed or named in a sentence. Before the run, 24,000 skill checks were repeated against the uploaded PDFs' own text with 0 disagreements, and the key was frozen on Oct 31, 2026, 22:12 UTC.

    Each job was asked five times in Formzed's live matching with production settings, from Oct 31, 2026, 23:21 UTC (answer logic version 33) to Nov 1, 2026, 09:51 UTC (version 38, 245 seconds for all four); the run-by-run table gives each run's version. A benchmark switch made the match return every candidate's place, rules result, quick rating and detailed fit, since the first fix each must-have's verdict and any quote the proof check turned down, and since the third what each part used. Intervals are Wilson intervals for shares and bootstrap resamples of candidates for average precision and correlations.