# How Career-Ops Maps JD Requirements to Your CV in Block B — CV Match

> Learn how Career-Ops uses archetype detection and data-driven gap analysis in Block B CV Match to map JD requirements to your CV, ensuring an exact text match for your application.

- Repository: [Santiago Fernández de Valderrama/career-ops](https://github.com/santifer/career-ops)
- Tags: how-to-guide
- Published: 2026-08-22

---

**Career-Ops performs deterministic, exact-text matching between job description requirements and your résumé in Block B — CV Match through archetype detection, line-by-line table generation, and data-driven gap analysis.**

The `santifer/career-ops` repository generates a seven-block evaluation report for every job posting you analyze. Block B — CV Match serves as the alignment engine where JD (Job Description) requirements are mapped against your canonical curriculum vitae stored in [`cv.md`](https://github.com/santifer/career-ops/blob/main/cv.md). This process eschews probabilistic LLM inference in favor of reproducible, traceable text matching that adheres to strict data-contract rules.

## The Seven-Block Evaluation Architecture

### Positioning Block B Within the Pipeline

Career-Ops structures every job evaluation into seven sequential blocks labeled A through G. Block A establishes the **Role Summary** through archetype classification, while **Block B — CV Match** immediately follows to ground that classification in your actual experience. The remaining blocks address compensation, cultural signals, interview readiness, and application strategy. This structured approach ensures that every JD-to-CV mapping occurs only after the system has determined which type of role archetype (FDE, SA, PM, LLMOps, Agentic, or Transformation) it is evaluating against.

## The CV Match Algorithm: Step-by-Step Execution

### Step 1: Archetype Detection and Role Classification

Before any matching occurs, the system classifies the JD into one of six predefined archetypes defined in [`modes/_shared.md`](https://github.com/santifer/career-ops/blob/main/modes/_shared.md). As implemented in [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md) (lines 42-47), this classification (FDE, SA, PM, LLMOps, Agentic, or Transformation) is stored in Block A and directly influences the prioritization logic for Block B. For example, a Systems Architect (SA) posting prioritizes system design proof points, while a Full-Stack Data Engineer (FDE) posting emphasizes delivery speed metrics.

### Step 2: Loading the Canonical CV

The engine reads [`cv.md`](https://github.com/santifer/career-ops/blob/main/cv.md) from the repository root as the single source of truth for candidate qualifications. This markdown file must follow the repository's canonical format, containing distinct sections for experience, projects, and skills that the matching algorithm can parse line-by-line. Unlike external CV parsers that ingest PDFs or Word documents, Career-Ops requires the native [`cv.md`](https://github.com/santifer/career-ops/blob/main/cv.md) format to ensure deterministic exact matching.

### Step 3: Exact Line-by-Line Mapping

For each requirement extracted from the JD—whether explicit skills, responsibilities, or mandatory experience—the system searches [`cv.md`](https://github.com/santifer/career-ops/blob/main/cv.md) for an **exact textual match** (not semantic similarity). The results populate a two-column markdown table inserted at the start of Block B (lines 97-100 in [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md)):

| JD Requirement | CV Line(s) |
|----------------|------------|
| Experience with Kubernetes | *Senior Engineer @ Acme — Built k8s CI pipelines* |
| Python + TypeScript proficiency | *Python: 5 yrs, TypeScript: 3 yrs (see Projects)* |
| Lead cross-functional teams | *Led 8-person ML platform team* |

This deterministic approach guarantees that every match is traceable to a specific line in your source file, eliminating hallucinated connections that plague LLM-based matching systems.

### Step 4: Archetype-Aware Prioritisation

Following the table insertion, the system applies archetype-specific highlighting rules defined in [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md) (lines 101-107). Depending on the Block A classification, different proof-point categories receive emphasis:
- **FDE**: Delivery speed and data pipeline architecture
- **SA**: System design and technical decision records
- **PM**: Product discovery and roadmap execution
- **LLMOps**: Evaluation frameworks and model observability
- **Agentic**: Multi-agent orchestration and tool-use patterns
- **Transformation**: Change management and stakeholder alignment

### Step 5: Gap Analysis and Mitigation Planning

Immediately following the match table, a **Gaps** section enumerates JD requirements not found in [`cv.md`](https://github.com/santifer/career-ops/blob/main/cv.md). As specified in [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md) (lines 109-114), the engine categorizes each gap across four dimensions:
1. **Blocker status**: Whether the gap represents a hard requirement or nice-to-have
2. **Adjacent experience**: Whether related CV entries partially satisfy the requirement
3. **Portfolio coverage**: Whether a side project could demonstrate the missing skill
4. **Mitigation plan**: Concrete phrasing suggestions for cover letters or specific projects to build

### Flag Integration and Conditional Rendering

If preliminary gates detect geo-mismatches, sponsorship requirements, or other hard-stop criteria, the system inserts additive flag lines **above** Block B without modifying the core CV match content (lines 70-75 and 91-95 in [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md)). This ensures that filtering criteria remain visible while preserving the integrity of the JD-to-CV mapping analysis.

## Running the CV Match Pipeline

You can trigger the full evaluation—including Block B generation—via the CLI or programmatically:

```bash

# Generate the full A-G report via stdin or file input

career-ops oferta < job_description.txt

```

For integration with custom workflows, import the core evaluation function from `modes/oferta.mjs`:

```javascript
import { evaluateOferta } from './modes/oferta.mjs';

// jdText: raw JD string, cvPath: path to cv.md
const report = await evaluateOferta({ jdText, cvPath: 'cv.md' });
console.log(report.blocks.B);   // outputs the Block B markdown

```

## Configuration Files and Data Contracts

The deterministic mapping relies on several canonical files:

- **[`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md)**: Defines the Block B workflow logic, archetype prioritization, and gap analysis structure (lines 42-47, 97-114)
- **[`cv.md`](https://github.com/santifer/career-ops/blob/main/cv.md)**: The canonical résumé used for all exact-match operations
- **[`config/profile.yml`](https://github.com/santifer/career-ops/blob/main/config/profile.yml)**: Stores location authorization (`location.authorized_in`), sponsorship needs (`location.needs_sponsorship`), and archetype customizations that influence gap analysis
- **[`modes/_shared.md`](https://github.com/santifer/career-ops/blob/main/modes/_shared.md)**: Contains the six archetype definitions and shared scoring rules referenced during prioritization
- **[`templates/states.yml`](https://github.com/santifer/career-ops/blob/main/templates/states.yml)**: Defines tracker states; when hard-stop states trigger, they appear as flags above Block B while leaving the CV match table intact

## Summary

- Career-Ops generates **exact-text matches** between JD requirements and [`cv.md`](https://github.com/santifer/career-ops/blob/main/cv.md), not semantic AI inferences
- **Block B — CV Match** produces a two-column markdown table mapping every JD requirement to specific CV line(s)
- **Archetype detection** (Block A) drives prioritization of proof points across six role types: FDE, SA, PM, LLMOps, Agentic, and Transformation
- The **Gap analysis** section categorizes missing requirements and suggests concrete mitigation strategies
- All logic is defined in [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md) with deterministic rules ensuring reproducible, auditable results
- Hard-stop flags (geo, sponsorship) appear above Block B without altering the underlying match data

## Frequently Asked Questions

### Does Career-Ops use AI to match my CV to job requirements?

No. The `career-ops` tool performs deterministic exact-text matching against your [`cv.md`](https://github.com/santifer/career-ops/blob/main/cv.md) file. According to the source code in [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md), the system searches for literal line matches rather than using LLM inference to invent connections. This design guarantees traceability and prevents hallucinated qualifications.

### What happens if my CV doesn't match a specific JD requirement?

Unmatched requirements appear in the **Gaps** section of Block B. As implemented in lines 109-114 of [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md), the system analyzes whether the gap is a hard blocker, identifies adjacent experience in your CV, suggests portfolio projects to cover the gap, and provides concrete phrasing for cover letters or mitigation plans.

### Where does Career-Ops store the CV that gets matched against JDs?

The system reads [`cv.md`](https://github.com/santifer/career-ops/blob/main/cv.md) from the repository root as the canonical curriculum vitae. This markdown file serves as the single source of truth for all Block B — CV Match operations, replacing external PDF or Word document parsers with a version-controlled, line-addressable format.

### Can I customize which CV sections are prioritized for different role types?

Yes. The prioritization logic in [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md) (lines 101-107) maps the six archetypes (FDE, SA, PM, LLMOps, Agentic, Transformation) to specific proof-point categories. You can influence this behavior by modifying [`config/profile.yml`](https://github.com/santifer/career-ops/blob/main/config/profile.yml) to specify archetype preferences or by structuring [`cv.md`](https://github.com/santifer/career-ops/blob/main/cv.md) with explicit sections that align with the priority categories defined in [`modes/_shared.md`](https://github.com/santifer/career-ops/blob/main/modes/_shared.md).