CV Standardisation & Scoring Methodology
Automated CV parsing with intelligent scoring algorithms for efficient talent evaluation
Overview
The CV Standardisation Tool automates the candidate evaluation process by parsing CVs, extracting structured data, and applying configurable scoring algorithms. This eliminates manual review bottlenecks while ensuring consistent, fair, and transparent assessment across all applicants.
Automated Processing
Parse and analyse hundreds of CVs in minutes, extracting skills, experience, languages, and credentials into structured, queryable data.
Canonical Standardisation
Normalise skill terminology using canonical mappingsβ"React.js", "ReactJS", and "React" all map to the same standardised skill for accurate Matching. Recruiters can tune Qualified and Shortlist cutoffs live in the Matching drawer to refine the ranked results instantly.
Complete Transparency
Every score includes detailed breakdowns showing exactly how it was calculated, with direct links to supporting evidence in the candidate's CV.
Flexible Configuration
Customise scoring weights, bonus criteria, and evaluation parameters to match your specific requirements and organisational priorities.
Canonical Skill Standardisation
The system employs sophisticated standardisation to handle the diverse ways candidates describe their qualifications. This ensures accurate assessment regardless of terminology variations.
Technology & Skill Normalisation
CVs use inconsistent terminology for the same technologies. The system maps all variants to canonical names:
Implicit Skill Recognition
The system infers related skills even when not explicitly stated. For example, a candidate listing "React" implicitly has:
- JavaScript (React requires JavaScript knowledge)
- HTML/CSS (fundamental to frontend development)
- Component-based architecture understanding
- Modern frontend tooling experience
Matching Modes
Each requirement carries a matching_mode label
(EU_TENDER, BE_TENDER, BE_DIRECT) that
records what kind of hiring context the role belongs to. The label drives
grouping, defaults, and the recruiter's choice of preset β it does not
change the scoring math. The actual ranking always runs through the same
Fit Lab engine: five sub-scores blended live by recruiter-tunable weights and
modifiers. See Fit Lab & Settings for the controls
and Engine Internals for the formulas.
EU Tender
EU CommissionEuropean Commission / EU Agency procurement. Mandatory criteria from the Terms of Reference are loaded as non-negotiable skills, so the Must-Have Strictness modifier carries most of the rejection signal. Recruiters typically start from the EU Tender Strict preset: heavy Skills weight, max Must-Have Strictness (95), high Qualified + Shortlist cutoffs (65 / 80).
BE Tender
Belgium — publicBelgian public-sector procurement. Same engine, but recruiters usually keep Must-Have Strictness moderate and lean a touch more on Languages (Dutch / French coverage) and Experience. The Balanced preset is the typical starting point; switch to EU Tender Strict for compliance-heavy lots.
BE Direct
Direct placement
Confirmed openings outside formal tenders. Availability and Rate
matter β the requirement file populates
availability_required_date and
rate.max_daily_rate, which the Fit Lab uses to demand
those two axes and to surface CVs missing recruiter-set placement
details. The Direct Placement preset is the typical
starting point: more weight on Experience and Domain Context, lower
cutoffs, generous Implied Skills Credit.
The four built-in presets β Balanced, EU Tender Strict, Direct Placement, Lenient / Broad β are explained in Fit Lab & Settings → Presets along with their exact weight / modifier / cutoff values.
Engine Internals
The matching engine computes five sub-scores per candidate Γ requirement
pairing, then the cockpit reweights and post-processes them live as the
recruiter moves sliders. The sub-scores themselves come from two sources:
Skills is LLM-authored (the matching JSON's
skill_fit), while Experience, Languages, Availability
and Rate are recomputed deterministically by
backend/services/match-subscores.js from the candidate +
requirement data each time placement details change.
Sub-score formulas
β Skills
Read from the matching JSON, normalised against the
core_skills weight (default 45). Implied skills are credited
via the Implied Skills Credit modifier in the cockpit (see below).
skills = clamp01(skill_fit / weight.core_skills) Γ 100
β Experience
Total professional experience in years, mapped linearly to 0β100 with 20 years = full credit. Junior-in-senior gaps trim credit by Γ0.85 (one band) or Γ0.50 (two+ bands). The chart's Experience axis plots raw years, not the normalised score.
exp = min(1, years / 20) Γ seniorityGapFactor Γ 100
β Languages
For each mandatory required language, the candidate's CEFR level is
compared against max(required, B2). Full credit at or
above, partial credit proportional to CEFR distance, 0 if missing.
lang = mean(min(1, candCEFR / max(reqCEFR, B2))) Γ 100
β³ Availability
100% if the candidate is available on or before the required date;
linearly degrades to 0 at 90 days late. The recruiter-set
availability_date on the CV drives this.
avail = max(0, 1 β daysLate / 90) Γ 100
β¬ Rate
100% if the candidate's daily rate β€ the requirement's cap; degrades to 0 at 50% over budget. Recruiter-set on the CV.
rate = max(0, 1 β 2Β·overshoot) Γ 100,
overshoot = (candidate β cap) / cap
Demanded-dimension gating
If the requirement doesn't specify a rate cap or a required-by date, those weights are zeroed and the remaining weights renormalise. Sliders for non-demanded axes are greyed in the drawer.
w_total = Ξ£ demanded weight[axis]
Cockpit modifiers
Five recruiter-controllable knobs reshape the sub-scores before the weighted average runs.
Implied Skills Credit (default 60)
Scales the Skills sub-score so implied / adjacent skills can lift a candidate. At 100, Skills passes through unchanged. At 0, Skills is clipped to 70% of its raw value.
skills *= 0.7 + impliedCredit/100 Γ 0.3
Recency Bias (default 40)
Above 50 favours recent experience; below 50 discounts it. The factor is a small linear nudge, not exponential decay β older experience isn't ignored, just weighted down.
exp *= 1 + (recencyBias/100 β 0.5) Γ 0.3
Domain Context (default 30)
Lifts Experience based on the cross-domain
extras sub-score (industry / project-type alignment).
exp += extras Γ domainBonus/100 Γ 0.4
Seniority Alignment (default 50)
Penalises the composite when the candidate's detected seniority is far from the requirement's; raw mismatch is integer band distance.
composite β= mismatch Γ seniorityFit/100 Γ 0.5
Must-Have Strictness (default 70)
Pulls the composite down when non-negotiable skills go unevidenced. With 4 of 4 must-haves missing at strictness=70 the composite is multiplied by 0.30.
composite *= 1 β strictness/100 Γ (missing/total)
Tender Bonus (default 5, range 0β15)
Range-limited bonus that rewards EU / public-tender relevance,
scaled by the candidate's extras sub-score (domain
alignment). Only applied when the requirement's
matching_mode is EU_TENDER or
BE_TENDER; ignored for BE_DIRECT. The
slider replaces the previous hard-coded "+10 for EU Commission
Projects" style bonuses with a single tunable knob.
composite += tenderBonus Γ extras/100 (tender modes only)
Composite
The final composite is the weighted average of the demanded sub-scores after modifiers, with the seniority penalty subtracted and the must-have multiplier applied:
composite =
( Ξ£ demanded { sub_score[axis] Γ weight[axis] } / Ξ£ demanded weight[axis] )
β mismatch Γ seniorityFit/100 Γ 0.5
Γ ( 1 β mustHaveStrictness/100 Γ missing/total )
+ tenderBonus Γ extras/100 [only if matching_mode β {EU_TENDER, BE_TENDER}]
The composite is then clamped to 0β100, rounded to one decimal, and bucketed by the Qualified and Shortlist cutoffs into Shortlist / Qualified / Below bands.
What the engine does not do
- No location-proximity scoring β the requirement file does carry a location string, but it isn't a weighted axis today.
- No automatic re-evaluation of Skills when sliders move β the LLM's
skill_fitis frozen at the time the matching pipeline ran. Re-trigger the matching LLM to refresh it.
Note: Recency is a recruiter-settable slider (Recency Bias) that applies a linear Β±15% nudge on Experience β not an exponential decay, but tunable per session. Tender / EU bonuses also live as a single range-limited slider (Tender Bonus, 0β15) rather than hard-coded "+10 for EU Commission Projects" rules.
Fit Lab β Live Matching & Settings
The Matching tab is the recruiter's tuning surface, internally nicknamed Fit Lab. It blends backend-computed sub-scores with recruiter-controlled weights so the same matching results can be re-ranked instantly without re-running the LLM. Every change in the drawer reflows the table and the 2D chart in milliseconds.
The five dimensions
Every candidate Γ requirement pairing is scored on five axes. Skills and Experience come from the LLM's structured analysis of the CV against the requirement; the other three are recomputed deterministically from candidate and requirement data each time a placement field changes.
β Skills
How well the candidate's skill matrix maps to the role. Driven by the
LLM-authored skill_match_matrix with canonical-term
normalisation. Implied skills (e.g. Laravel β PHP) are credited via the
"Implied Skills Credit" modifier.
β Experience
Duration of professional experience, mapped linearly to 0β100 with 20 years = full credit. A junior in a senior role keeps some credit multiplied by Γ0.85 (one band below) or Γ0.50 (two+ below). The chart's Experience axis plots raw years (10y, 15y, 20y, β¦) rather than the normalised score.
β Languages
Each mandatory required language is graded against the candidate's CEFR level. Threshold = max(required minimum, B2); at or above = full credit, below = proportional partial credit. Result averaged across mandatory languages.
β³ Availability
100% if the candidate's availability_date β€ the requirement's
availability_required_date; linearly degrades to 0 at 90 days
late. Recruiters set the candidate side in the CV viewer ("Placement β
recruiter-set").
β¬ Rate
100% if the candidate's daily_rate_eur β€ the requirement's
max_daily_rate; degrades to 0 at 50% over budget. Same
recruiter-set source as Availability.
Demanded-dimension gating
Not every requirement asks for every dimension. If the requirement leaves
max_daily_rate or availability_required_date empty,
those sliders are greyed out in the drawer and their weights
are zeroed before normalisation. The remaining axes renormalise so a candidate's
composite isn't dragged down by an axis the role never demanded.
Conversely, when a requirement demands a dimension but a candidate's CV doesn't carry the data, that candidate is moved into the collapsible "Cannot be matched β missing fundamental data" section under the main results, listing exactly which field is missing per CV.
The drawer β 13 controls
5 dimension weights
Skills (default 35), Experience (25), Languages (15), Availability (10), Rate (15). Weights are renormalised over whatever set is currently demanded, so moving any slider shifts the relative importance live.
6 modifiers
- Must-Have Strictness (default 70). Multiplies the composite by
1 β strictness Γ (missing/total)when non-negotiable skills aren't evidenced. At 100, even one missing must-have can effectively halve the score. - Recency Bias (default 40). Nudges the Experience sub-score toward recent work: above 50 favours recent; below 50 dampens it. Linear Β±15% applied once β not an exponential decay.
- Seniority Alignment (default 50). Penalises bigger
seniority gaps;
raw.seniorityMismatch Γ seniorityFit Γ 0.5is deducted from the composite. - Domain Context (default 30). Bonus when the candidate's primary domain matches the requirement's; expressed as an Experience-axis lift.
- Implied Skills Credit (default 60). Scales the Skills
sub-score by
0.7 + impliedCredit Γ 0.3. At 100 the Skills score passes through unchanged; at 0 it's clipped to 70%. - Tender Bonus (default 5, range 0β15). EU / public-tender
bonus scaled by the candidate's domain alignment. Applies only when the
requirement is tagged
EU_TENDERorBE_TENDERβ for direct placements the slider has no effect (stays visible so recruiters see it isn't relevant in that context).
2 tiered cutoffs
Qualified (default 55) and Shortlist (default 75) partition results into three visible bands β Shortlist (β₯ Shortlist cutoff), Qualified (between cutoffs), Below (under Qualified). The Below band is the section dimmed in the table and drawn with red dots on the chart.
Recruiter-set placement details
Daily rate and availability date are not extracted from CVs β they
are recruiter-set per candidate. Open any CV in the viewer; the "Placement
(recruiter-set)" bar above the parse tabs accepts a daily rate and an availability
date. Saving writes a sidecar at backend/data/cv-placement.json and
propagates the new values into every matching JSON that carries the candidate's id,
re-running the deterministic Availability + Rate engine for those files.
Candidates without placement details will continue to land in the "Cannot be matched" section for any requirement that demands rate or availability, until you fill those values in.
Presets
Four built-in presets seed the drawer for common scenarios; save your own from the current slider state and optionally share with the team. Built-in presets are immutable; custom ones live server-side per recruiter.
- Balanced β the default, no axis dominates.
- EU Tender Strict β heavy Skills + Must-Have Strictness, high cutoffs; rejects anyone who doesn't tick every required box.
- Direct Placement β biases Experience and Domain Context, lowers cutoffs; designed for shortlisting confirmed openings.
- Lenient / Broad β flat weights, low cutoffs, high Implied Credit; sources a wide top of funnel.
Reading the chart
The 2D scatter is X-axis = Experience (years), Y-axis = Skills (0β100) by default; both are swappable from the toolbar. Dot colour encodes band:
- β Green β Shortlist (β₯ Shortlist cutoff)
- β Amber β Qualified
- β Red β Below
All dots are the same size; clicking selects a candidate, hovering shows a parameter-aware breakdown (sub-scores β weighted contributions β composite + band). Horizontal guide lines mark the Qualified and Shortlist cutoffs whenever the Y axis is on a 0β100 scale.
How a single composite is built
composite =
( Ξ£ demanded { sub_score[axis] Γ weight[axis] } / Ξ£ demanded weight[axis] )
β seniorityMismatch Γ seniorityFit Γ 0.5
Γ ( 1 β mustHaveStrictness Γ missingMustHaves / totalMustHaves )
+ tenderBonus Γ extras/100 [only if matching_mode β {EU_TENDER, BE_TENDER}]
Skills passes through Γ(0.7 + impliedCreditΒ·0.3) before entering the
sum; Experience passes through Γ(1 + (recencyBiasβ0.5)Β·0.3) plus a
domain-bonus lift on the extras sub-score. Everything else uses the
raw 0β100 from the bridge.
Settings → Matching defaults
The Settings tab exposes two per-recruiter defaults for the cutoffs (Qualified, Shortlist) and a default preset. Changes there take effect at the start of every new matching session. Ad-hoc drawer adjustments override those defaults for the current session only β switching requirements or reloading the matching tab discards the override.
Transparency & Explainability
Every candidate score includes complete provenance: where the data came from, how calculations were performed, and why specific decisions were made. This builds trust with hiring managers and ensures audit compliance.
Score Breakdown
Detailed component-by-component explanation showing contribution of each factor to the final score.
Evidence Linking
Direct references to CV sections supporting each claim, allowing manual verification.
Assumption Tracking
Clear documentation of implicit skill inferences and reasoning behind them.
Audit Trail
Complete logging of parsing decisions, score calculations, and manual overrides.
Taxonomy Management
The Settings β Taxonomy panel is the source of truth for how raw skill mentions in CVs and requirements are normalised to canonical names. Authenticated users can:
- Browse the taxonomy by category (Programming Languages, Databases, Frameworks, Tools, Infrastructure, Security, Monitoring, Methodologies, Certifications).
- Add or remove variants of a canonical term
(e.g.,
"Node.js"as an alternate spelling of JavaScript). - Manage implied skills β declare that one canonical implies another (e.g., "Drupal" implies "PHP"). Used to widen candidate skill sets during Matching. Scores now reflect a tiered model: candidates crossing the Qualified cutoff appear in results, while those crossing the Shortlist cutoff are highlighted for immediate action.
- Stage edits as a draft change set, then Publish to atomically bump the live taxonomy version.
- View the full audit history of every canonical term: who changed what and when, with the resulting taxonomy version.
- Import / export the full taxonomy as JSON.
Match results are now stamped with the taxonomy_version
in effect at match time. Editing and publishing a taxonomy change
moves match scores across the entire CV pool immediately
β no re-parsing required. The matching pipeline canonicalises raw skills
against the live taxonomy on every request.
Next Steps
The CV Standardisation Tool has established its core foundation. This roadmap outlines the path from proof-of-concept to enterprise deployment across Randstad Digital.
Sandbox Deployment
Deploy to the Randstad Digital Sandbox environment for controlled internal trials. This allows recruiters and HR managers to work with the system using real candidate data and actual requirements, providing hands-on feedback that shapes the final product.
PACMAN Integration
Connect the CV Standardisation Tool to PACMAN for automatic import of candidate CVs as they enter the recruitment pipeline, and direct flow of requirements from client requests into the matching engine. This eliminates manual uploads and accelerates time-to-shortlist.
Algorithm Configuration
Introduce a settings-based configuration panel where users can adjust weighting factors: exact skill matches versus related skills, recent experience versus total tenure, and Qualified/Shortlist cutoff defaults for must-have versus nice-to-have criteria. The Matching drawer already lets recruiters tune these cutoffs live per session.
Taxonomy Management β Shipped
Skill canonicalisation is now managed through the Settings β Taxonomy panel. Browse categories, manage variants and implied-skill rules, publish atomic version bumps, and view the full audit history β all without touching config files. See the Taxonomy section for full details.
Word Export Finalisation
Complete the Microsoft Word export pipeline to produce polished, client-ready CVs meeting Randstad Digital presentation standards. This includes proper table handling, consistent formatting, and brand-compliant styling.
DG DIGIT TM3 Compliance
Verify and adapt the export structure against DG DIGIT TM3 Framework Contract requirements. This includes reviewing skill categorisation against the updated master keyword list and validating cross-reference formats for EU tender submissions.
Future Vision
Beyond the immediate roadmap, these capabilities represent the long-term evolution of the CV Standardisation Tool platform.
Career Progression Guidance
Analyse a candidate's overall Matching profile across all active requirementsβwhere they score well, where gaps appear consistentlyβand suggest targeted skill acquisitions that would significantly expand their placement opportunities. For candidates just below the Qualified or Shortlist cutoffs on multiple requirements, a specific certification or technology exposure might unlock an entire category of positions. Recruiters can tune Qualified and Shortlist cutoffs live in the Matching drawer to immediately see how threshold changes affect the candidate ranking.
AI-Assisted CV Enhancement
Identify implicit competencies that a candidate's experience clearly demonstrates but their CV doesn't explicitly articulate. A developer with five years of enterprise Java projects almost certainly understands dependency injection and design patternsβeven if unlisted. Generate enhanced CV versions for human approval, maintaining factual integrity while ensuring candidates are fairly represented.
European Expansion
Extend deployment to Randstad Digital France and Germany. This requires extending language handling to German, adapting taxonomy mappings for regional technology terminology preferences, and integrating with local HR systems. The modular architecture supports this expansion without fundamental restructuring.