How santifer/career-ops Classifies Jobs into LLMOps, Agentic, PM, SA, FDE, and Transformation Archetypes
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). The prompt contains a constrained Domain bullet list that explicitly limits the LLM to the six valid archetypes:
- 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, 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:
// 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) into every evaluation prompt:
| 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 lines 82-88).
Multi-Language Localization Support
Career-Ops supports 14 language packs, with each locale maintaining its own oferta.md variant:
- Ukrainian:
modes/ua/oferta.md(line 18) - Portuguese:
modes/pt/oferta.md(line 16) - German:
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:
- Prompt Injection: The user invokes
/career-ops {job description}, triggering theofertaskill with the Domain list and keyword table from_shared.md - LLM Evaluation: The model analyzes the job description and outputs a markdown report containing the
**Archetype:**line - Pattern Extraction:
analyze-patterns.mjsparses the report using regex to populatereport.archetype - 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
- User Display: The final report (see [
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.mdthat forces the LLM to choose between six specific archetypes - The extraction logic in
analyze-patterns.mjsuses regex pattern matching (/^\*\*Archetype\:\*\*\s*(.+)$/m) to harvest the classification from markdown output - Keyword reinforcement in
modes/_shared.mdimproves 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 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 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 file and update the keyword table in 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, 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), 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.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →