ATLAS
Automated Talent & Language Assessment System
AI-powered CV standardisation & talent matching ·
Multilingual Parsing
Process CVs natively in Dutch, French, English and German β€” no forced translation, preserving quality and context
Transparent Scoring
Every match score traces back to specific evidence β€” no black boxes, full auditability for EU tender compliance
Gemini-Powered
Leveraging Google Gemini for intelligent CV extraction, skill canonicalisation and experience analysis at scale
CVs in Pool
Parsed
Requirements

CV Pool

Upload and manage your CV collection with AI-powered parsing

Requirements Management

Create and manage job requirements for candidate matching

Select a Requirement

Choose a requirement from the sidebar to view or edit details

Matching

Tune your matching β€” live

Export CVs

Export CVs to various formats with multi-language support

Orchestration Dashboard

Status
Running
Queued
0
Processing
0
Completed
0
Failed
0
LLM Status
Available
Active Workers
0
Loading...

Settings

LLM Providers

CV Standardisation & Scoring Methodology

Automated CV parsing with intelligent scoring algorithms for efficient talent evaluation

Randstad Digital Solutions β€’ Version β€’ January 2025

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:

Programming Languages
"JavaScript" "Javascript" "JS" "ECMAScript" β†’ JavaScript
Frameworks
"React.js" "ReactJS" "React" β†’ React
Cloud Platforms
"Amazon Web Services" "AWS" β†’ AWS

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
Why This Matters: Without canonical standardisation, a requirement for "JavaScript" would miss candidates who write "JS" on their CV, despite having the exact skill needed. This standardisation ensures qualified candidates aren't overlooked due to terminology differences.

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 Commission

European 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 — public

Belgian 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_fit is 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.5 is 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_TENDER or BE_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.

HR Manager Trust: Transparency converts algorithmic black boxes into explainable decisions. Hiring managers can validate scores, understand edge cases, and confidently present recommendations to stakeholders.

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.

How it works: Raw skill tokens extracted from a CV or requirement are looked up against the variant table. Each raw token resolves to a canonical name. Implied-skill rules then expand the canonical set one hop. The resolved canonical set is what the scoring engine compares. All lookups are cached in an LRU cache keyed by taxonomy version, so publishing a new version automatically invalidates stale entries.

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.

1

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.

2

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.

3

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.

4

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.

5

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.

6

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.

Design Principles: Throughout this evolution, The CV Standardisation Tool maintains its core commitmentsβ€”transparency over black boxes, human judgment with AI assistance, compliance by design, and multilingual authenticity. Every score can be traced to specific evidence. AI-generated content always requires explicit approval before use.