# How MadsLorentzen's ai-job-search Evaluates Candidate Fit with Job Postings: A Technical Breakdown

> Learn how MadsLorentzen's ai-job-search analyzes candidate fit with a six dimensional rubric. Get weighted scores and verdicts to match jobs to your profile.

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

---

**MadsLorentzen's ai-job-search evaluates candidate fit using a deterministic, six-dimensional scoring rubric that generates weighted numeric scores and actionable verdicts to determine whether a job posting matches your profile.**

The **ai-job-search** repository implements a structured, reproducible framework for assessing how well a candidate aligns with specific job opportunities. Rather than relying on subjective gut feelings, the system uses a predefined scoring matrix located 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) to compare candidate attributes against posting requirements consistently.

## The Six-Dimensional Scoring Framework

The evaluation rubric defines **six distinct dimensions** that cover both technical qualifications and cultural alignment. Each dimension carries a specific weight that contributes to the final weighted average:

- **Technical Skills** (30% weight): Compares required and preferred skills against the candidate’s primary, secondary, and missing skill lists
- **Experience** (25% weight): Evaluates direct, adjacent, or entry-level experience domains
- **Career Alignment** (30% weight): Verifies that role tasks align with stated career goals and energizing-task preferences
- **Behavioral/Culture** (15% weight): Matches cultural-fit descriptors against the candidate’s behavioral profile while flagging red flags like department disorganization
- **Location** (pass/fail): Binary assessment based on commute range, relocation willingness, or travel requirements
- **Salary Benchmark** (optional): External compensation verification via [`salary_lookup.py`](https://github.com/MadsLorentzen/ai-job-search/blob/main/salary_lookup.py)

Each dimension scores from 0-100 according to standardized tables in the rubric. For example, **80-100** indicates a core match, while **0-39** signals a fundamental mismatch.

## How the Fit Evaluation Process Works

When you trigger a fit evaluation, the system executes a deterministic pipeline that transforms raw job posting text into a structured decision matrix.

### Step 1: Load Candidate Profile Data

The system first retrieves your personalized data from [`.claude/skills/job-application-assistant/01-candidate-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/skills/job-application-assistant/01-candidate-profile.md). This file contains your skills inventory, experience history, behavioral traits, career goals, deal-breakers, and location constraints established during the `/setup` step.

### Step 2: Extract and Score Dimensions

For each job posting, the framework analyzes the text against your profile across all six dimensions. The **Technical Skills Match** identifies overlaps between required competencies and your capabilities, while the **Experience Match** categorizes your background as direct, adjacent, or entry-level relative to the role.

The **Behavioral/Culture Fit** dimension scans for cultural descriptors that align with your work style preferences, automatically flagging potential red flags. Meanwhile, **Career Alignment** ensures the role’s day-to-day tasks match your long-term professional objectives.

### Step 3: Calculate Weighted Verdict

The system computes a weighted overall score using the dimension percentages (excluding location, which remains binary). This score determines your **verdict band**:

- **Strong Fit**: ≥ 75
- **Good Fit**: 60-74
- **Moderate Fit**: 45-59
- **Weak Fit**: 30-44
- **Poor Fit**: < 30

### Step 4: Generate Structured Output

The evaluation renders as a markdown table containing dimension scores with explanatory notes, the overall weighted score, a final verdict, highlighted strengths, identified gaps, and a specific recommendation (apply, skip, or apply with caveats).

## Running Full Fit Evaluations with `/apply`

The `/apply` command orchestrates the complete evaluation workflow, including company research and document generation.

```bash

# Execute after completing /setup to populate your profile

/apply https://example.com/job-posting

```

This command internally:
1. Fetches the posting content via WebFetch
2. Loads the scoring rubric from [`04-job-evaluation.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/04-job-evaluation.md)
3. Scores all six dimensions against your profile
4. Produces a detailed markdown evaluation

### Sample Evaluation Output

```markdown

## Job Fit Evaluation: Data Engineer at Acme Corp

| Dimension | Score | Notes |
|-----------|-------|-------|
| Technical Skills | 85/100 | Core Python, SQL, and streaming skills match |
| Experience Match | 70/100 | Adjacent experience in ETL pipelines |
| Behavioral Fit | 60/100 | Culture values autonomy – candidate thrives |
| Location | PASS | Remote-friendly |
| Career Alignment | 78/100 | Role aligns with cloud-data-platform goals |

**Overall Score: 78/100** (weighted average)

### Verdict: Strong Fit

### Key Strengths for This Role

- Proven end-to-end data pipeline builds
- Strong cloud-native tooling experience
- High autonomy preference matches company culture

### Gaps to Address

- Limited exposure to real-time streaming platforms
- No formal certification in the new technology stack

### Recommendation

Apply – tailor the cover letter to acknowledge the streaming gap and highlight rapid learning ability.

```

## Batch Triage with `/rank`

For high-volume job searching, the `/rank` command provides rapid triage using the same rubric but omitting deep company research.

```bash
/rank --top 5

```

This batch operation scores every new scraped posting and returns a prioritized shortlist:

```markdown

## Job Ranking - 2026-07-12

Ranked 5 new postings (3 shortlisted, 2 below threshold, 0 excluded).

### Shortlist

| # | Score | Verdict | Title | Company | Location | Deadline |

|---|-------|---------|-------|---------|----------|----------|
| 1 | 82 | Strong Fit | Senior Data Engineer | Acme Corp | Remote | 2026-07-20 🔥 |
| 2 | 76 | Strong Fit | Data Platform Lead | Beta Ltd | Copenhagen | 2026-07-18 |
| 3 | 68 | Good Fit | Analyst Engineer | Gamma AB | Remote | 2026-07-22 |

```

You can then feed these shortlisted postings into `/apply` for comprehensive evaluation and application preparation.

## Key Architectural Files

The fit evaluation system relies on these specific source files:

- **[`.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 six scoring dimensions, weighting schema, numeric thresholds, and output format specifications
- **[`.claude/skills/job-application-assistant/01-candidate-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/skills/job-application-assistant/01-candidate-profile.md)**: Stores the personalized candidate data that the rubric consumes during scoring
- **[`.claude/commands/apply.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/apply.md)**: Orchestrates full fit evaluation, company research, and document generation workflows
- **[`.claude/commands/rank.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/rank.md)**: Implements batch-scoring triage using the standardized rubric
- **[`salary_lookup.py`](https://github.com/MadsLorentzen/ai-job-search/blob/main/salary_lookup.py)**: Provides optional external compensation benchmarking referenced in the rubric

## Summary

- **ai-job-search** evaluates candidate fit using a deterministic rubric with six weighted dimensions: Technical Skills (30%), Experience (25%), Career Alignment (30%), Behavioral/Culture (15%), Location (pass/fail), and optional Salary Benchmark.
- The `/apply` command executes full evaluations including company research, while `/rank` provides rapid batch triage for high-volume job searching.
- Scoring outputs use standardized 0-100 scales per dimension, generating verdict bands from Strong Fit (≥75) to Poor Fit (<30) with specific recommendations.
- Candidate profiles live in [`01-candidate-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/01-candidate-profile.md) and the scoring framework resides in [`04-job-evaluation.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/04-job-evaluation.md), ensuring consistent, reproducible evaluations across all job postings.

## Frequently Asked Questions

### How does ai-job-search calculate the overall fit score?

The system calculates a **weighted average** of dimension scores using the predefined percentages: Technical Skills contributes 30%, Experience 25%, Career Alignment 30%, and Behavioral/Culture 15%. Location operates as a binary pass/fail filter rather than a weighted score. The resulting numeric value maps to verdict bands that determine whether you should apply, skip, or proceed with caveats.

### What is the difference between `/apply` and `/rank` commands?

The **`/apply`** command performs a comprehensive fit evaluation including company research, salary benchmarking via [`salary_lookup.py`](https://github.com/MadsLorentzen/ai-job-search/blob/main/salary_lookup.py), and document generation for individual postings. The **`/rank`** command uses the identical scoring rubric but operates in batch mode for rapid triage, scoring multiple postings simultaneously without deep company research or documentation steps.

### Where does the scoring rubric store candidate preferences?

Candidate data resides in **[`.claude/skills/job-application-assistant/01-candidate-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/skills/job-application-assistant/01-candidate-profile.md)**, which the system populates during the initial `/setup` workflow. This file contains your skills inventory, experience domains, behavioral traits, career goals, location constraints, and deal-breakers that the evaluation framework references when scoring job postings.

### Can I customize the weights or dimensions in the scoring framework?

The rubric weights and dimensions 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)**. While the current implementation uses fixed weights (30/25/30/15), the markdown-based rubric structure allows for manual modification of the scoring tables, thresholds, and dimension definitions to match your specific evaluation criteria.