# How the Five Dimensions of Job Fit Are Scored: A Complete Technical Guide

> Learn how the AI job search assistant scores five dimensions of job fit technical skills experience behavioral fit career alignment and location to provide a 0-100 fit score and band.

- Repository: [Mads Lorentzen/ai-job-search](https://github.com/MadsLorentzen/ai-job-search)
- Tags: deep-dive
- Published: 2026-08-26

---

**The AI job search assistant scores job postings across five dimensions—Technical Skills, Experience, Behavioral Fit, Career Alignment, and Location & Logistics—to generate a weighted overall score from 0-100 that maps to fit bands like "Strong Fit" or "Good Fit."**

The job-fit evaluation system resides in the `MadsLorentzen/ai-job-search` repository, specifically defined in [`.claude/skills/job-application-assistant/04-job-evaluation.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/skills/job-application-assistant/04-job-evaluation.md). After a posting passes the initial Eligibility and Language gates, the scoring agent applies a structured rubric to assess compatibility across five distinct dimensions, translating qualitative job requirements into quantitative metrics that drive the `/rank` and `/apply` command recommendations.

## The Five Dimensions Defined in 04-job-evaluation.md

The scoring rubric defines five evaluation dimensions. Four return numeric scores (0-100) while one acts as a binary gate.

### Technical Skills Match (30% Weight)

This dimension assesses alignment between required technical competencies and the candidate's capabilities. The scoring bands are:

- **80-100**: Core requirements are primary skills
- **60-79**: Most requirements match, with 1-2 learnable gaps
- **40-59**: Partial match, significant up-skilling needed
- **0-39**: Fundamental mismatch

### Experience Match (25% Weight)

Rather than comparing exact job titles, this evaluates work history depth, scope, and functional relevance:

- **80-100**: Direct experience in the same domain and role type
- **60-79**: Related experience with clear transferable skills
- **40-59**: Adjacent experience requiring case-making
- **0-39**: Unrelated experience

### Behavioral and Culture Fit (15% Weight)

This measures alignment between the candidate's behavioral profile and company culture:

- **80-100**: Culture strongly matches behavioral preferences
- **60-79**: Mixed signals but mostly compatible
- **40-59**: Some friction areas exist
- **0-39**: Significant culture mismatch

### Career Alignment & Motivation (30% Weight)

This evaluates whether the role advances long-term career goals:

- **80-100**: Strongly aligned with career direction, clear growth path
- **60-79**: Good role but only partially aligned
- **40-59**: Decent job but doesn't build toward goals
- **0-39**: Dead-end or backwards step

### Location & Logistics: The Binary Gate

Unlike other dimensions, Location & Logistics operates as a **Pass/Fail** check that is **not weighted** in the final average. It can, however, veto a job posting entirely:

- **PASS**: Within commute range, remote-friendly, or sponsor-available
- **FAIL**: Requires relocation (deal-breaker)
- **FLAG**: Frequent travel requiring discussion

## Calculating the Weighted Overall Score

The final score is a weighted average of the four numeric dimensions. According to the source code in [`04-job-evaluation.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/04-job-evaluation.md), the formula is:

```python
overall = round(0.30 * technical + 0.25 * experience + 0.15 * behavior + 0.30 * career)

```

The Location gate is excluded from this calculation. If Location returns **FAIL**, the job is disqualified regardless of other scores.

## Mapping Scores to Fit Bands

The overall score determines the recommendation band used by the `/rank` and `/apply` commands:

- **Strong Fit**: ≥ 75 (Recommended for immediate application)
- **Good Fit**: 60-74 (Apply with minor caveats)
- **Moderate Fit**: 45-59 (Consider with significant reservations)
- **Weak Fit**: 30-44 (Generally skip unless strategic)
- **Poor Fit**: < 30 (Avoid)

These thresholds guide the assistant's recommendation to apply, apply with caveats, or skip the posting.

## Implementing the Scoring Logic

The repository includes Python-style logic that mirrors the agent's evaluation process. Here is the implementation referencing the scoring weights defined in the markdown rubric:

```python
def weighted_score(scores):
    """Calculate the weighted overall fit score."""
    tech = scores["technical"]
    exp = scores["experience"]
    beh = scores["behavior"]
    career = scores["career"]
    
    return round(0.30 * tech + 0.25 * exp + 0.15 * beh + 0.30 * career)

def classify_fit(overall):
    """Map overall score to a fit band."""
    if overall >= 75:
        return "Strong Fit"
    if overall >= 60:
        return "Good Fit"
    if overall >= 45:
        return "Moderate Fit"
    if overall >= 30:
        return "Weak Fit"
    return "Poor Fit"

# Example evaluation

posting = {
    "technical": 78,   # falls in 60-79 band

    "experience": 85,  # falls in 80-100 band

    "behavior": 62,    # falls in 60-79 band

    "career": 55,      # falls in 40-59 band

    "location": "PASS"
}

overall = weighted_score(posting)
fit_band = classify_fit(overall)
print(f"Overall: {overall}/100 → {fit_band}")

# Output: Overall: 71/100 → Good Fit

```

## Key Files in the Repository

Several files orchestrate this scoring system:

- **[`.claude/skills/job-application-assistant/04-job-evaluation.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/skills/job-application-assistant/04-job-evaluation.md)**: Defines the five dimensions, score bands, weightings, and fit thresholds.
- **[`.claude/commands/rank.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/rank.md)**: Implements the `/rank` command to evaluate and sort job postings using these dimensions.
- **[`.claude/commands/apply.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/apply.md)**: Uses scoring results to determine whether to draft application materials and what recommendations to provide.
- **[`.claude/commands/setup.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/setup.md)**: Guides users through personalizing the rubric, such as defining `YOUR_PRIMARY_SKILLS`.
- **[`tests/test_rank_command.py`](https://github.com/MadsLorentzen/ai-job-search/blob/main/tests/test_rank_command.py)**: Validates that the framework reads the evaluation tables correctly and confirms the language gate functionality.

## Summary

- The **five dimensions of job fit** are Technical Skills (30%), Experience (25%), Behavioral Fit (15%), Career Alignment (30%), and Location/Logistics (binary gate).
- Each numeric dimension scores 0-100 against specific rubric bands defined in [`04-job-evaluation.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/04-job-evaluation.md).
- The **Location & Logistics** dimension acts as a veto gate; a **FAIL** result disqualifies the job regardless of other scores.
- The **weighted overall score** rounds to the nearest integer and maps to fit bands: Strong (≥75), Good (60-74), Moderate (45-59), Weak (30-44), and Poor (<30).
- The `/rank` and `/apply` commands consume these scores to generate actionable job search recommendations.

## Frequently Asked Questions

### What are the five dimensions of job fit scored by the AI job search assistant?

The five dimensions are **Technical Skills Match**, **Experience Match**, **Behavioral/Culture Fit**, **Career Alignment & Motivation**, and **Location & Logistics**. The first four return numeric scores from 0-100, while Location operates as a Pass/Fail gate that can block applications requiring relocation.

### How is the final job fit score calculated from the five dimensions?

The final score is a **weighted average** of four numeric dimensions: 30% Technical Skills, 25% Experience, 15% Behavioral Fit, and 30% Career Alignment. The Location dimension is excluded from the mathematical average but can veto the entire evaluation if marked **FAIL**. The result is rounded to the nearest integer and classified into bands like "Strong Fit" (≥75) or "Good Fit" (60-74).

### Can the scoring weights be customized in the ai-job-search repository?

Yes. While the default weights are defined in [`.claude/skills/job-application-assistant/04-job-evaluation.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/skills/job-application-assistant/04-job-evaluation.md), the [`.claude/commands/setup.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/setup.md) file guides users through personalizing the rubric. You can adjust dimension definitions, score bands, and primary skill mappings to match your specific career profile and preferences.

### Why is Location & Logistics treated differently from other job fit dimensions?

Location & Logistics serves as a **binary eligibility gate** rather than a weighted score because geographic constraints are typically deal-breakers rather than gradable preferences. A **FAIL** result (requiring unwanted relocation) immediately disqualifies the posting, while a **PASS** allows the other four dimensions to determine the final fit score. This prevents high-scoring technical matches from overriding fundamental logistical constraints.