# How Evaluation Criteria for Job Applications Are Defined in the AI Job Search Framework

> Discover how the AI Job Search Framework defines evaluation criteria. Learn about the centralized scoring matrix, weighted dimensions, percentile bands, and hard filter gates. Optimize your job search strategy.

- Repository: [Mads Lorentzen/ai-job-search](https://github.com/MadsLorentzen/ai-job-search)
- Tags: internals
- Published: 2026-09-03

---

**Evaluation criteria for job applications in the AI Job Search Framework are defined within a centralized scoring matrix stored in [`04-job-evaluation.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/04-job-evaluation.md), which establishes five weighted dimensions, percentile score bands, and hard filter gates such as the Language Gate.**

The MadsLorentzen/ai-job-search repository implements a structured approach to automating job searches through standardized evaluation logic. Understanding how evaluation criteria for job applications are defined allows candidates to customize the framework to match their specific career profiles and preferences. The system uses a single source of truth architecture to ensure consistency across every stage of the application pipeline.

## The Centralized Scoring Matrix

The framework stores its entire evaluation rubric 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). This file functions as the **single source of truth** for all scoring logic, containing the five evaluation dimensions, their respective weightings, score thresholds, and special gate rules.

This centralized approach ensures that every command—from initial scraping to final application drafting—references identical criteria. The rubric is written in structured markdown with embedded configuration data that the framework parses during execution.

## Five Dimensions and Weightings

The scoring matrix evaluates each posting across five distinct dimensions scored on a 0-100 scale:

- **Technical (30%)**: Alignment between required technical skills and the candidate's documented capabilities
- **Experience (25%)**: Relevance and depth of past work history compared to role requirements
- **Behavioral (15%)**: Match regarding culture, values, and soft skill requirements
- **Career Alignment (30%)**: Long-term trajectory fit, including mentorship opportunities and growth potential
- **Location (0%)**: Geographic feasibility (tracked but unweighted in final calculation)

These percentages are defined in [`04-job-evaluation.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/04-job-evaluation.md) and applied by both [`.claude/commands/rank.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/rank.md) and [`.claude/commands/apply.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/apply.md) when computing final fit ratings.

## Gate Rules and Deal-Breakers

Beyond weighted scoring, the framework implements hard gates that can override numerical results.

### The Language Gate

The **Language Gate** declares an automatic hard reject if a job posting requires a language not listed in the candidate's profile `Languages` table. If the posting lists a higher proficiency level than declared, it flags the posting for manual review rather than immediate rejection. This logic is defined in [`04-job-evaluation.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/04-job-evaluation.md) and referenced by [`.claude/skills/job-scraper/SKILL.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/skills/job-scraper/SKILL.md) during initial parsing.

### Personalized Deal-Breakers

Custom preferences extracted during setup—such as minimum salary thresholds, remote work requirements, or "no on-call" stipulations—are stored as weighted criteria within the same rubric file. [`SETUP.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/SETUP.md) populates these personalized constraints into [`04-job-evaluation.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/04-job-evaluation.md) during the initial configuration phase.

## Workflow Integration Across Commands

The evaluation criteria flow through a four-stage pipeline, with each stage reading from the same centralized rubric:

1. **Setup (`/setup`)**: [`SETUP.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/SETUP.md) extracts personal criteria and writes them into [`04-job-evaluation.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/04-job-evaluation.md), establishing the baseline rubric.
2. **Scrape (`/scrape`)**: [`.claude/skills/job-scraper/SKILL.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/skills/job-scraper/SKILL.md) performs quick fit checks and applies Language Gate filters during initial data collection.
3. **Rank (`/rank`)**: [`.claude/commands/rank.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/rank.md) applies the full dimension weightings to compute triage scores for bulk-scraped postings.
4. **Apply (`/apply`)**: [`.claude/commands/apply.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/apply.md) re-evaluates selected postings using the complete rubric plus company research data before drafting applications.

This architecture guarantees that **evaluation criteria for job applications** remain consistent whether filtering ten postings or ten thousand.

## Implementation Example

The following pseudocode illustrates how the framework loads the rubric and computes weighted scores, mirroring the logic found in [`rank.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/rank.md) and [`apply.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/apply.md):

```python

# Load evaluation rubric

with open('.claude/skills/job-application-assistant/04-job-evaluation.md') as f:
    rubric = yaml.safe_load(f)

# Example posting and candidate data

posting = {...}          # parsed job description

candidate = {...}        # skills, experience, languages, preferences

# Score each dimension (0-100)

scores = {
    "technical": score_technical(posting, candidate),
    "experience": score_experience(posting, candidate),
    "behavioral": score_behavioral(posting, candidate),
    "career": score_career_alignment(posting, candidate),
    "location": score_location(posting, candidate)
}

# Apply weightings from rubric

final_score = (
    scores["technical"]   * rubric["weights"]["technical"] +
    scores["experience"] * rubric["weights"]["experience"] +
    scores["behavioral"] * rubric["weights"]["behavioral"] +
    scores["career"]     * rubric["weights"]["career"] +
    scores["location"]   * rubric["weights"]["location"]
) / 100

print(f"Fit rating: {final_score:.1f}")

```

The actual implementation resides in the command specifications, with [`.claude/skills/job-application-assistant/SKILL.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/skills/job-application-assistant/SKILL.md) orchestrating the evaluation presentation to the user.

## Summary

- **Evaluation criteria for job applications** reside 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), serving as the framework's single source of truth.
- **Five weighted dimensions** (Technical 30%, Experience 25%, Behavioral 15%, Career Alignment 30%, Location 0%) provide the scoring foundation.
- **Language Gate** logic prevents applications to roles requiring unsupported languages.
- **SETUP.md** personalizes the rubric during initialization, while [`rank.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/rank.md) and [`apply.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/apply.md) execute the scoring logic.
- All pipeline stages reference identical criteria files to ensure evaluation consistency.

## Frequently Asked Questions

### Where are the evaluation criteria stored in the AI Job Search Framework?

The criteria are stored 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). This file contains the complete scoring matrix including dimension definitions, weightings, and gate rules that all commands reference during execution.

### What are the five scoring dimensions and their weightings?

The five dimensions are Technical (30%), Experience (25%), Behavioral (15%), Career Alignment (30%), and Location (0%). Each dimension is scored 0-100 and combined using these weights to produce a final fit rating out of 100.

### How does the Language Gate function within the evaluation process?

The Language Gate checks required languages against the candidate's declared language proficiencies. If a posting requires a language not in the candidate's profile, the system applies a hard reject. If the required proficiency level exceeds the declared level, it flags the posting for manual review rather than automatic rejection.

### How can I customize the evaluation criteria for my specific job search?

Run the `/setup` command, which executes [`SETUP.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/SETUP.md) to extract your personal preferences, skills, and deal-breakers. This process populates [`04-job-evaluation.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/04-job-evaluation.md) with your customized criteria, ensuring subsequent evaluations reflect your specific requirements and constraints.