# How santifer/career-ops Classifies Jobs into LLMOps, Agentic, PM, SA, FDE, and Transformation Archetypes

> santifer/career-ops classifies jobs into LLMOps, Agentic, PM, SA, FDE, and Transformation archetypes using a constrained prompt-based system. Discover how this automated process categorizes job descriptions.

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

---

**Career-Ops uses a constrained prompt-based classification system paired with deterministic JavaScript extraction to automatically categorize every job description into one of six predefined archetypes.**

Career-Ops is an open-source evaluation framework that analyzes job postings through a hybrid AI-and-code pipeline. When you submit a job description, the system leverages the `oferta` skill to classify the role using a closed Domain list that forces the LLM to choose between **LLMOps**, **Agentic**, **PM** (Product Manager), **SA** (Solutions Architect), **FDE** (Full-Stack/Dev Engineer), and **Transformation** archetypes.

## The Six Career Archetypes Defined

The classification taxonomy organizes modern tech careers into six distinct buckets based on core responsibilities:

- **LLMOps**: Roles focused on AI platform operations, observability, evaluation pipelines, and production reliability (e.g., "AI Platform / LLMOps Engineer")
- **Agentic**: Positions centered on building autonomous agents, tool-use implementation, and advanced prompting strategies
- **PM**: Jobs involving product vision, roadmap ownership, and stakeholder alignment across technical and business teams
- **SA**: Architecture-heavy roles responsible for designing end-to-end solutions and integration patterns
- **FDE**: Generalist engineering positions covering front-end, back-end, and full-stack development responsibilities
- **Transformation**: Senior leadership or strategy-driven roles that drive organizational change and digital transformation initiatives

## Prompt-Driven Classification in modes/oferta.md

The classification originates in the evaluation prompt located at [[`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md)](https://github.com/santifer/career-ops/blob/main/modes/oferta.md). The prompt contains a constrained **Domain** bullet list that explicitly limits the LLM to the six valid archetypes:

```markdown
- Domain (platform/agentic/LLMOps/ML/enterprise/backend/frontend/devops)

```

When the LLM processes a job description, it evaluates the content against this closed list and outputs a standardized markdown line:

```

**Archetype:** AI Platform / LLMOps Engineer

```

This deterministic prompting strategy prevents drift by forcing the model to select from predefined buckets rather than generating free-form labels. The same Domain constraint appears across all 14 localized versions of the prompt (e.g., [`modes/pt/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/pt/oferta.md), [`modes/de/angebot.md`](https://github.com/santifer/career-ops/blob/main/modes/de/angebot.md)), ensuring consistent classification regardless of input language.

## Regex-Based Extraction in analyze-patterns.mjs

After the LLM generates the report, the system extracts the archetype using deterministic regex matching in [`analyze-patterns.mjs`](https://github.com/santifer/career-ops/blob/main/analyze-patterns.mjs):

```javascript
// locate a line that starts with "Archetype"
const archMatch = reportText.match(/^\*\*Archetype\:\*\*\s*(.+)$/m);
if (archMatch && !report.archetype) report.archetype = archMatch[1].trim();

```

The extraction logic handles multilingual variations (e.g., "Arquetipo" in Spanish) through additional regex patterns around lines 228-240. The extracted string populates `report.archetype`, which feeds downstream analytics, PDF generation via `generate-pdf.mjs`, and tracking TSV exports.

## Keyword Reinforcement via modes/_shared.md

To improve classification accuracy, the system injects a keyword lookup table from [[`modes/_shared.md`](https://github.com/santifer/career-ops/blob/main/modes/_shared.md)](https://github.com/santifer/career-ops/blob/main/modes/_shared.md) into every evaluation prompt:

```markdown
| AI Platform / LLMOps | "observability", "evals", "pipelines", "monitoring", "reliability" |
| Platform / LLMOps    | Production systems, observability, evals, reliability |

```

These keywords provide concrete signals to the LLM. For example, job descriptions mentioning "Langfuse," "Weights & Biases," or "evaluation pipelines" trigger the **LLMOps** classification because those terms appear in the archetype's keyword list (also referenced in [`templates/portals.example.yml`](https://github.com/santifer/career-ops/blob/main/templates/portals.example.yml) lines 82-88).

## Multi-Language Localization Support

Career-Ops supports 14 language packs, with each locale maintaining its own [`oferta.md`](https://github.com/santifer/career-ops/blob/main/oferta.md) variant:

- **Ukrainian**: [`modes/ua/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/ua/oferta.md) (line 18)
- **Portuguese**: [`modes/pt/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/pt/oferta.md) (line 16)
- **German**: [`modes/de/angebot.md`](https://github.com/santifer/career-ops/blob/main/modes/de/angebot.md) (line 16)

The extraction engine recognizes localized archetype headings, ensuring that a report generated in Spanish containing `**Arquetipo:** Arquitecto de Soluciones` is correctly parsed and normalized to the canonical **SA** archetype.

## Complete Classification Workflow

The end-to-end archetype assignment follows this deterministic pipeline:

1. **Prompt Injection**: The user invokes `/career-ops {job description}`, triggering the `oferta` skill with the Domain list and keyword table from [`_shared.md`](https://github.com/santifer/career-ops/blob/main/_shared.md)
2. **LLM Evaluation**: The model analyzes the job description and outputs a markdown report containing the `**Archetype:**` line
3. **Pattern Extraction**: `analyze-patterns.mjs` parses the report using regex to populate `report.archetype`
4. **Data Persistence**: The archetype is written to the tracking TSV, rendered as a badge in the PDF output, and fed into analytics engines for conversion-rate analysis
5. **User Display**: The final report (see [[`examples/sample-report.md`](https://github.com/santifer/career-ops/blob/main/examples/sample-report.md)](https://github.com/santifer/career-ops/blob/main/examples/sample-report.md)) presents the archetype alongside scoring breakdowns and recommendations

## Summary

- Career-Ops classifies jobs using a **constrained Domain list** in [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md) that forces the LLM to choose between six specific archetypes
- The **extraction logic** in `analyze-patterns.mjs` uses regex pattern matching (`/^\*\*Archetype\:\*\*\s*(.+)$/m`) to harvest the classification from markdown output
- **Keyword reinforcement** in [`modes/_shared.md`](https://github.com/santifer/career-ops/blob/main/modes/_shared.md) improves accuracy by mapping specific terms (e.g., "Langfuse," "agentic") to their respective archetypes
- The system supports **14 languages** through localized prompt variants and multilingual regex patterns
- Extracted archetypes drive downstream functionality including PDF badge rendering, analytics tracking, and personalized career recommendations

## Frequently Asked Questions

### What happens if a job description fits multiple archetypes?

The prompt instructions in [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md) direct the LLM to select the single most appropriate category based on primary responsibilities. If a role spans multiple domains (e.g., a PM with LLMOps exposure), the keyword reinforcement table in [`_shared.md`](https://github.com/santifer/career-ops/blob/main/_shared.md) guides the model toward the dominant function.

### Can I customize the archetypes or add new categories?

Yes. You can modify the **Domain** list in your language's [`oferta.md`](https://github.com/santifer/career-ops/blob/main/oferta.md) file and update the keyword table in [`modes/_shared.md`](https://github.com/santifer/career-ops/blob/main/modes/_shared.md) to include new archetypes or terminology. Changes take effect immediately on the next evaluation without requiring code changes, though you should verify that `analyze-patterns.mjs` can extract your new archetype labels.

### How does the system handle non-English job descriptions?

The classification supports 14 languages through localized prompt files (e.g., [`modes/pt/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/pt/oferta.md), [`modes/de/angebot.md`](https://github.com/santifer/career-ops/blob/main/modes/de/angebot.md)). The extraction logic in `analyze-patterns.mjs` recognizes translated archetype headings like "Arquetipo" or "Archétype," ensuring consistent categorization across language barriers.

### Where can I see the archetype classification in the final output?

The archetype appears in three locations: as a `**Archetype:**` heading in the markdown report ([`examples/sample-report.md`](https://github.com/santifer/career-ops/blob/main/examples/sample-report.md)), as a visual badge in the generated PDF via `generate-pdf.mjs`, and as a dedicated column in the tracking TSV file used for analytics and conversion-rate monitoring.