# How Career-Ops A-F Evaluation Scoring Works: The 1‑to‑5 Match Average Explained

> Understand how Career-Ops A-F evaluation scoring works by calculating the 1-to-5 match average per requirement. Get clear insights into your evaluation reports.

- Repository: [Santiago Fernández de Valderrama/career-ops](https://github.com/santifer/career-ops)
- Tags: deep-dive
- Published: 2026-06-09

---

**Career-Ops derives its A-F evaluation score by computing the arithmetic mean of per-requirement match ratings on a 1-to-5 scale, then persisting that value in the generated report and tracker.**

Career-Ops is an open-source job-offer evaluation tool in the `santifer/career-ops` repository. Its A-F evaluation scoring system analyzes a job description against your CV and produces a single match average that quantifies fit. Understanding how this number is calculated helps you interpret reports and decide which roles are worth pursuing.

## Where the Career-Ops A-F Score Is Defined

The report template in [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md) mandates that every evaluation output contain the line `**Score:** {X/5}` and explicitly defines the score as the *match average* across all JD requirements. This instruction appears at line 165 of the template and is replicated in globalized variants such as [`modes/pt/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/pt/oferta.md) (line 117) and [`modes/de/angebot.md`](https://github.com/santifer/career-ops/blob/main/modes/de/angebot.md). The requirement is also echoed in [`batch/batch-prompt.md`](https://github.com/santifer/career-ops/blob/main/batch/batch-prompt.md) at line 228, which instructs the LLM to emit the same placeholder during batch report generation. A rendered example of this output is visible in [`examples/sample-report.md`](https://github.com/santifer/career-ops/blob/main/examples/sample-report.md) at line 5.

## How Block B Computes Per-Requirement Match Ratings

Block B — **Match with CV** — is where the substantive scoring begins. The system parses your [`cv.md`](https://github.com/santifer/career-ops/blob/main/cv.md) and builds a table that maps each JD requirement to the exact line or lines in the CV that satisfy it, as specified in [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md) between lines 23 and 27.

For every requirement, the matching engine assigns a rating on a 1-to-5 scale:

- **5** — Exact wording or experience is present and clearly demonstrable.
- **4 to 3** — Relevant experience exists but contains gaps or is supported only by indirect evidence.
- **2 to 1** — Little or no evidence; the requirement is either a hard blocker or a nice-to-have.

The weighting is not uniform. The engine respects the **archetype** detected in Step 0 — defined in [`modes/_shared.md`](https://github.com/santifer/career-ops/blob/main/modes/_shared.md) — and biases the scoring toward that archetype’s priority proof points. For example, delivery speed is weighted heavily for an FDE archetype, while system design is emphasized for an SA archetype, as implemented in [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md) lines 27 to 34.

## Converting Ratings to the Final Evaluation Score

After all JD requirements receive a match rating, Career-Ops calculates the **arithmetic mean** of those numbers. The result is rounded to one decimal place and rendered as `X.X/5` in the final markdown report.

This computed score is then written to the tracker file [`data/applications.md`](https://github.com/santifer/career-ops/blob/main/data/applications.md) as part of the TSV entry produced by the post-evaluation step. You can see the mapping between the report template and the tracker persistence logic in [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md) lines 165 to 169.

## How to Interpret Your Career-Ops A-F Score

The score operates independently of the legitimacy tier reported in Block G. Use these ranges to guide your next steps:

- **4.5 – 5.0**: Very strong fit. Most JD requirements are met. Proceed to apply; the system may even auto-draft application answers in Block H.
- **3.5 – 4.4**: Good fit. A few gaps exist but they are manageable. Consider applying after addressing the gaps listed in Block B.
- **2.5 – 3.4**: Moderate fit. Several gaps remain. Weigh the effort to close them against the role’s seniority and compensation; a recruiter conversation may be worthwhile.
- **< 2.5**: Weak fit. Many hard blockers are present. The system generally discourages applying unless you have a compelling story to bridge the gaps.

## CLI: Generate and Inspect Evaluation Scores

Run a single evaluation by passing a URL or raw JD text to the CLI:

```bash

# Evaluate a job posting (URL or raw JD text)

career-ops evaluate "https://jobs.example.com/role/123"

# The system creates a report in reports/ that contains the line:

#    **Score:** 4.2/5

#    (this is the match average computed as described above)

# After evaluation the tracker entry is automatically added:

cat data/applications.md

```

To view the individual requirement ratings that produce your final number, inspect Block B directly in the generated report:

```bash
grep -A100 "## B) Match with CV" reports/001-exampleco-2026-06-09.md | head -n 40

```

## Summary

- The **A-F evaluation score** is the arithmetic mean of individual requirement match ratings on a 1-to-5 scale, not a traditional letter grade.
- **Block B** in [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md) drives the scoring by mapping each JD requirement to evidence in [`cv.md`](https://github.com/santifer/career-ops/blob/main/cv.md) and weighting by archetype priorities defined in [`modes/_shared.md`](https://github.com/santifer/career-ops/blob/main/modes/_shared.md).
- The final value is rounded to one decimal place, rendered in the report via the template in [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md), and stored in [`data/applications.md`](https://github.com/santifer/career-ops/blob/main/data/applications.md).
- **Block G** legitimacy ratings are independent of the numeric A-F score, giving users two distinct lenses for decision-making.

## Frequently Asked Questions

### What is the scale of the Career-Ops A-F evaluation score?

The score is a numeric match average on a 1-to-5 scale, rounded to one decimal place. It is derived from per-requirement ratings generated during Block B, not a traditional letter grade.

### How does the detected archetype affect the final score?

The archetype identified in Step 0 biases the weighting of proof points according to priorities listed in [`modes/_shared.md`](https://github.com/santifer/career-ops/blob/main/modes/_shared.md). For instance, an FDE archetype emphasizes delivery speed, while an SA archetype emphasizes system design, as implemented in [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md) lines 27 to 34.

### Is the A-F score related to the legitimacy rating in Block G?

No. The score measures how well your CV satisfies the JD requirements in blocks A through F. Block G judges posting legitimacy independently, so a high match score can coexist with a cautionary legitimacy tier.

### Where is the computed score stored after evaluation?

The score is written to [`data/applications.md`](https://github.com/santifer/career-ops/blob/main/data/applications.md) as a field in the TSV tracker entry. It is also visible in the generated report file inside the `reports/` directory, as specified in [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md) lines 165 to 169.