How Does Career-Ops Use `cv.md` During Evaluation? Inside the 5-Stage Pipeline
Career-Ops treats cv.md as the immutable canonical source of candidate experience, reading it during five distinct pipeline stages—preparation, requirement mapping, PDF tailoring, skill deduplication, and fact verification—to ensure consistent, reproducible job evaluations.
The santifer/career-ops open-source engine implements a strict single-source-of-truth architecture where cv.md serves as the foundation for all candidate evaluation workflows. Unlike systems that cache or duplicate profile data, Career-Ops reads cv.md directly at multiple critical junctures to maintain absolute consistency between the candidate's official history and every generated output.
Stage 1: Evaluation Preparation and Prompt Construction
The pipeline begins in web/src/lib/run-prompts.mjs, where the system constructs the central prompt that drives the oferta evaluation mode. At line 25, the prompt explicitly instructs the LLM agent to load cv.md before executing any scoring logic.
This preparation step ensures the agent ingests the candidate's complete experience alongside complementary configuration files. The prompt mandates: "Read cv.md, config/profile.yml and modes/_profile.md" as prerequisites for analysis.
// Excerpt from web/src/lib/run-prompts.mjs (line 25)
1. Read modes/oferta.md and follow it EXACTLY … read cv.md, config/profile.yml …
Stage 2: Block B JD-to-CV Requirement Mapping
The core evaluation logic resides in modes/oferta.md, where Block B performs the critical alignment between job description (JD) requirements and candidate experience. At line 99, this block instructs the LLM to create a quantitative mapping that drives the final fit score.
The mode explicitly directs: "Read cv.md. Create a table with each JD requirement mapped to exact lines in the CV". This operation populates the "Match with CV" table that appears in evaluation reports, providing traceable evidence for every competency match.
<!-- Excerpt from modes/oferta.md (line 99) -->
Read `cv.md`. Create a table with each JD requirement mapped to exact lines in the CV.
Stage 3: PDF Generation and Dynamic Tailoring
When generating tailored PDF outputs via the pdf sub-mode, the engine again references cv.md as the base document. In web/src/lib/run-prompts.mjs (lines 74-76), the pipeline reads cv.md to perform keyword injection, section re-ordering, and competency-grid construction.
The LLM returns an updated HTML envelope containing the tailored content, which the backend subsequently converts to PDF. This ensures the generated resume remains synchronized with the canonical source while optimizing presentation for specific job applications.
Stage 4: Skill Deduplication in Upskill Analysis
The upskill.mjs utility prevents redundant skill recommendations by parsing cv.md to extract the candidate's existing competencies. At line 101, the script invokes extractSkills() against the canonical file to build a deduplication set.
// Excerpt from upskill.mjs (line 101)
const knownSkills = extractSkills(readFileSync(CV_FILE, "utf8"));
By comparing proposed new skills against this knownSkills set, the system ensures that skill-gap analyses only recommend genuinely new competencies, never duplicating existing entries from the candidate's official history.
Stage 5: Fact Verification Against Source Truth
The verify-cv-facts.mjs script treats cv.md as the primary source of truth for validation workflows. When invoked via CLI command, the tool cross-references generated CV content against the original cv.md (and optionally article-digest.md) to detect fabricated claims or semantic drift.
# Verification command syntax
node verify-cv-facts.mjs <generated-cv> --source cv.md
This verification step, implemented at line 11 of the script, ensures that all downstream artifacts remain factually consistent with the immutable base document.
Summary
- Single-source architecture: Every evaluation stage reads directly from
cv.mdrather than cached derivatives, eliminating synchronization errors. - Traceable mapping: Block B in
modes/oferta.mdcreates explicit JD-to-CV line mappings that justify every fit score with specific evidence. - Dynamic customization: PDF generation uses
cv.mdas a template for keyword injection and restructuring while preserving factual accuracy. - Intelligent deduplication: The
upskill.mjsparser extracts existing skills fromcv.mdto prevent redundant training recommendations. - Automated verification:
verify-cv-facts.mjsvalidates generated content against the canonicalcv.mdto catch hallucinations or drift.
Frequently Asked Questions
What happens if cv.md is missing during evaluation?
The evaluation pipeline will fail to initialize. Because web/src/lib/run-prompts.mjs explicitly mandates reading cv.md at line 25 before any scoring logic executes, the system requires this file as a mandatory input. The architecture intentionally prevents evaluation without a canonical candidate profile to ensure reproducible results.
How does Career-Ops prevent the LLM from hallucinating CV details?
The system implements a fact-verification layer via verify-cv-facts.mjs, which cross-checks generated outputs against the original cv.md at line 11. Additionally, Block B's requirement-mapping technique in modes/oferta.md (line 99) anchors all claims to specific line references in the source file, creating an auditable trail between JD requirements and CV evidence.
Can I evaluate multiple job postings against the same cv.md file?
Yes. Because Career-Ops reads cv.md fresh for each evaluation cycle rather than maintaining state, you can run unlimited oferta mode evaluations against different job descriptions using the same canonical cv.md. Each execution references the immutable source, ensuring consistency across all comparative analyses.
Does the PDF generation modify the original cv.md file?
No. The PDF sub-mode in run-prompts.mjs (lines 74-76) reads cv.md as input and generates a new HTML envelope for conversion. The original markdown file remains untouched, preserving the immutable single-source-of-truth while allowing dynamic customization for specific job applications.
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 →