CareerOps Compensation Evaluation: What Block D Analyzes in Job Offers

CareerOps evaluates compensation in Block D—"Comp and Demand"—by classifying employer types, rating salary reliability tiers, breaking down cash and non-cash components, generating HR verification questions, and gathering market demand signals within a strict five-query research budget.

The open-source CareerOps framework (available at santifer/career-ops) provides a structured methodology for evaluating job offers through discrete analysis blocks. When assessing CareerOps compensation evaluation criteria, the system processes salary data through a rigorous, bounded-research workflow defined in modes/oferta.md.

Understanding the Comp Evaluation Workflow

CareerOps treats compensation analysis as a forensic exercise rather than a surface-level reading. The system first classifies the employer to establish trust baselines, then rates the reliability of any advertised figures, and finally deconstructs the offer into negotiable components. This approach prevents candidates from accepting "total compensation" packages that mask low base salaries or volatile equity stakes.

The evaluation follows a strict sequence defined in Block D, ensuring consistent analysis across public big-tech corporations, VC-backed startups, government entities, and agency roles.

The Five Components of CareerOps Compensation Analysis

Employer Type Classification

The foundation of reliable compensation analysis rests on categorizing the employer correctly. In modes/oferta.md#L30-L46, CareerOps defines distinct employer archetypes including public big-tech, VC-backed startup, early-stage startup, enterprise, agency, SMB, sales-heavy organizations, recruiters, government bodies, and open-source projects.

Each classification receives a confidence level that dictates how much trust the system places in public salary figures. A classified public big-tech employer with transparent pay bands receives higher confidence than an early-stage startup with no funding history.

Compensation Reliability Tiering

When a job description omits salary data, Block D collapses to a minimal two-line report stating the employer type and a "Low" reliability tier. If figures appear, CareerOps assigns a tier—High, Medium, Low, or Unknown—based on JD wording and external verification.

As specified in modes/oferta.md#L68-L73, specific linguistic patterns automatically downgrade reliability. Phrases like "up to," "OTE" (on-target earnings), "total package," or wide salary ranges trigger a Low reliability classification, signaling that the candidate must verify details before negotiation.

Component Breakdown Structure

When salary data exists, CareerOps separates the offer into distinct components documented in modes/oferta.md#L92-L98. The system always records the advertised figure verbatim before analysis:

  • Advertised range: The exact number shown in the job description, preserved verbatim
  • Likely guaranteed base: Conservative estimate of fixed cash salary
  • Variable / conditional cash: Bonuses, commissions, attendance bonuses, KPI incentives, sign-on payments, and overtime eligibility
  • Expected stable cash: Recurring monthly cash the candidate can count on pre-tax
  • Non-cash benefits: Equity, insurance, pension contributions, meals, transport, learning budgets, and equipment allowances

This granular separation prevents conflating volatile variable pay with guaranteed base compensation.

HR Verification Questions

Block D generates 3–6 concrete verification questions for recruiters or hiring managers, defined in modes/oferta.md#L81-L88. These include targeted inquiries such as "What is the fixed base salary in the contract?" and "Does the advertised range include bonus or allowances?"

These questions create an audit trail for negotiations and expose discrepancies between marketing language and contractual reality.

Market Demand Signals

CareerOps gathers external salary benchmarks from sources like Glassdoor, Levels.fyi, and Blind to contextualize the offer. Per modes/oferta.md#L33-L38, the system enforces a hard cap of five web-search queries for this research phase. This bounded budget prevents analysis paralysis while providing sufficient data to identify market gaps.

Working with Compensation Data Programmatically

CareerOps provides utilities to automate compensation analysis and extract data for spreadsheet workflows.

Running the salary-gap analysis tool:


# Show the market-gap analysis for a given report number

node salary-gap.mjs 042

The salary-gap.mjs script reads the Advertised (JD) row from the specified report, fetches benchmark salaries for the same role, and outputs a concise gap table comparing the offer against market rates.

Extracting the compensation section programmatically:

import fs from 'fs';

const report = fs.readFileSync('reports/042-company-role-2024-06-15.md', 'utf8');
const compSection = report.match(/## Block D — Comp and Demand([\s\S]*?)## Block E/)[1];

console.log(compSection);

This regex extraction isolates Block D content, enabling programmatic feeding of compensation data into negotiation scripts or financial planning spreadsheets.

Configuration and Source Files

Several files govern how CareerOps processes compensation data:

  • modes/oferta.md – The master specification defining Block D, employer-type tables, reliability tier logic, component breakdown structure, and HR question templates.

  • salary-gap.mjs – The utility script that compares advertised compensation against market benchmarks to quantify negotiation leverage.

  • config/profile.yml – Stores candidate-specific preferences including location authorization and salary targets (preferred base versus equity splits), which inform the "Comp" analysis filters.

  • templates/states.yml – Defines canonical status values including Discarded, which Block D may trigger when compensation falls below acceptable thresholds.

Summary

  • CareerOps compensation evaluation occurs in Block D ("Comp and Demand"), not Block C, following a strict five-step workflow.
  • The system classifies employer types to establish baseline trust levels for salary data.
  • Reliability tiers (High/Medium/Low/Unknown) derive from specific JD phrasing like "up to" or "OTE".
  • Offers deconstruct into five components: advertised range, guaranteed base, variable cash, stable cash, and non-cash benefits.
  • HR verification questions expose discrepancies between advertised and contractual compensation.
  • Market research operates under a five-query cap to balance thoroughness with efficiency.

Frequently Asked Questions

Is CareerOps compensation evaluation in Block C or Block D?

CareerOps implements compensation evaluation in Block D, labeled "Comp and Demand." While the query mentions Block C, the source code in modes/oferta.md explicitly defines Block D as the canonical location for salary analysis, reliability tiering, and market demand research.

How does CareerOps determine if a salary figure is reliable?

The system scans job description text for hedging language. Phrases such as "up to $X," "OTE," "total package," or excessively wide ranges automatically downgrade the reliability tier to Low per the logic in modes/oferta.md#L68-L73. Transparent, narrow ranges without conditional language receive High or Medium ratings.

What specific compensation components does CareerOps track beyond base salary?

CareerOps separates offers into advertised range, likely guaranteed base, variable/conditional cash (bonuses, commissions, sign-on), expected stable cash (guaranteed monthly pre-tax income), and non-cash benefits (equity, insurance, pensions, perks). This breakdown occurs in modes/oferta.md#L92-L98.

How can I automate market rate comparisons using CareerOps?

Run node salary-gap.mjs [report-number] to execute the built-in comparison tool. This script cross-references the advertised figure from your report against Glassdoor and Levels.fyi data, outputting a gap analysis that reveals whether the offer sits above or below market medians for the role.

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:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →