# Block G Posting Legitimacy in Career-Ops: 13 Signals Analyzed

> Discover the 13 signals career-ops uses to analyze Block G Posting Legitimacy. Understand job posting risks with this expert guide.

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

---

**Block G evaluates job posting legitimacy through 13 independent qualitative checks defined in [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md), aggregating findings into a tiered Risk Summary without rendering legal conclusions.**

Career-ops is an open-source evaluation framework that helps candidates assess job opportunities through systematic signal analysis. The **Block G Posting Legimacy** module specifically examines whether a listing represents a genuine, active opportunity by inspecting temporal, contextual, and jurisdictional indicators defined in the core specification.

## What Is Block G in Career-Ops?

Block G serves as the "Posting Legitimacy" section within a career-ops evaluation report. According to [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md), it aggregates independent qualitative checks that produce concise descriptive notes for the **Risk Summary** table. Each signal is *descriptive only*—the system flags anomalies but never instructs users to reject postings or issues legal determinations.

## The 13 Legitimacy Signals Defined in modes/oferta.md

The following thirteen checks are applied sequentially during pipeline execution, organized here by analytical focus.

### Posting Freshness and Availability

- **Posting Freshness**: Extracts posted dates or "X days ago" strings from the live page, verifies the Apply button state, and notes redirections to generic careers pages. This signal requires a Playwright snapshot and executes only during full pipeline runs.

### Content Quality and Description Analysis

- **Description Quality**: Validates whether the job description mentions concrete technologies, team size, reporting structure, realistic experience-to-technology ratios, a clear 6–12 month scope, compensation details, and the proportion of role-specific versus boilerplate text.

- **AI-Buzzword vs. Infrastructure Mismatch**: Detects discrepancies between AI-heavy marketing language and actual team size or infrastructure maturity. This requires at least two of three sub-checks to trigger a flag.

- **Benefits/Employment Terminology Country Mismatch**: Flags benefits or employment terms belonging to different jurisdictions than the posting location—for example, "401(k)" appearing on a Canadian posting.

### Company Hiring Context

- **Company Hiring Signals**: Executes web queries such as "`{company}` layoffs {year}" and "`{company}` hiring freeze {year}", then correlates findings with the role's specific department.

- **Reposting Detection**: Consults `data/scan-history.tsv` to identify earlier appearances of the same company and similar title under different URLs, reporting the recurrence count and time span.

- **Role Market Context**: Provides qualitative assessment of typical fill-times for the role, whether the position aligns with the company's business model, and whether the seniority level justifies the expected hiring timeline.

### Jurisdiction and Employment Classification

- **Employment-Classification Risk**: Compares job description wording against jurisdiction-specific data in [`templates/agency-licensing.yml`](https://github.com/santifer/career-ops/blob/main/templates/agency-licensing.yml) to identify contractor-style language, missing benefits, or unclear end dates.

- **Third-Party Platform Location Tag Mismatch**: When both a third-party platform (LinkedIn, Indeed, etc.) and the employer's page provide location data with matching requisition IDs, flags mismatches at the country level.

- **Agency Licensing Check**: Determines if the posting is agency-mediated and, if so, references [`templates/agency-licensing.yml`](https://github.com/santifer/career-ops/blob/main/templates/agency-licensing.yml) for the candidate's jurisdiction to display relevant licensing regimes and public registry URLs.

- **Immigration-Status Requirement Overreach**: Uses [`templates/immigration-status-requirements.yml`](https://github.com/santifer/career-ops/blob/main/templates/immigration-status-requirements.yml) to flag prohibited status-requirement patterns specific to the candidate's jurisdiction. This activates only when postings demand specific immigration statuses rather than general lawful authorization.

- **Jurisdiction-Prohibited Content**: References [`templates/jurisdiction-prohibited-content.yml`](https://github.com/santifer/career-ops/blob/main/templates/jurisdiction-prohibited-content.yml) to flag job description language expressly prohibited locally, such as salary-history questions in California.

### Compensation Transparency

- **Pay-Transparency Range-Width Check**: Computes the advertised compensation spread and flags when `top - bottom > 0.5 × bottom`. This pure arithmetic heuristic operates independently of legal thresholds.

## How to Execute Block G Analysis

You can trigger these legitimacy checks through the career-ops CLI. To run the full evaluation pipeline including Block G:

```bash
codex exec "career-ops auto-pipeline https://example.com/job/123"

```

For targeted legitimacy scans without the complete pipeline:

```bash
codex exec "career-ops oferta --block G https://example.com/job/123"

```

Both commands generate markdown reports containing the **Block G – Posting Legitimacy** section followed by the **Risk Summary** table, which categorizes findings into `High Confidence`, `Proceed with Caution`, or `Suspicious` tiers.

## Key Source Files and Templates

The following files encode the complete heuristic set for Block G analysis:

- **[`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md)** – Core specification defining all 13 signals and the Risk Summary layout.
- **`data/scan-history.tsv`** – Historical scan database used for reposting detection (Signal 4).
- **[`templates/agency-licensing.yml`](https://github.com/santifer/career-ops/blob/main/templates/agency-licensing.yml)** – Jurisdiction-specific licensing data employed by Signal 6 (Employment-Classification Risk) and Signal 10 (Agency Licensing Check).
- **[`templates/immigration-status-requirements.yml`](https://github.com/santifer/career-ops/blob/main/templates/immigration-status-requirements.yml)** – Data source for Signal 11, mapping prohibited immigration status requirements by jurisdiction.
- **[`templates/jurisdiction-prohibited-content.yml`](https://github.com/santifer/career-ops/blob/main/templates/jurisdiction-prohibited-content.yml)** – Reference for Signal 12, containing locale-specific prohibited job description language.

## Summary

- Block G aggregates **13 distinct signals** to assess job posting legitimacy without rendering legal conclusions.
- Analysis spans **temporal freshness**, **content quality**, **company context**, and **jurisdictional compliance**.
- Configuration relies on [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md) and three jurisdiction-specific YAML templates in the `templates/` directory.
- Execution requires either full pipeline runs (with Playwright for Signal 1) or targeted `--block G` invocations.
- Output appears in the **Risk Summary** table with three-tier classification: High Confidence, Proceed with Caution, or Suspicious.

## Frequently Asked Questions

### How does Career-Ops determine if a job posting is a repost?

The system queries `data/scan-history.tsv` to locate previous entries matching the same company and similar title under different URLs. It reports the total recurrence count and the elapsed time since the first appearance, helping identify artificially "fresh" listings that may indicate high turnover or stale opportunities.

### What triggers the Pay-Transparency Range-Width Check?

This Signal 13 heuristic activates when the mathematical difference between the top and bottom of the advertised salary range exceeds 50% of the bottom value (`top - bottom > 0.5 × bottom`). For example, a range of \$100,000 to \$160,000 triggers the flag because the \$60,000 spread exceeds \$50,000 (0.5 × \$100,000).

### Does Block G make automated decisions about job legitimacy?

No. According to the [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md) specification, all Block G signals are **descriptive only**. The system generates notes for the Risk Summary table but explicitly avoids making legal conclusions or recommending rejection. Candidates receive tiered classifications to inform their own evaluation.

### Which signals require external data sources beyond the job description?

Signal 1 (Posting Freshness) requires a Playwright snapshot of the live page. Signals 4, 6, 10, 11, and 12 read from `data/scan-history.tsv` or the three template files ([`templates/agency-licensing.yml`](https://github.com/santifer/career-ops/blob/main/templates/agency-licensing.yml), [`templates/immigration-status-requirements.yml`](https://github.com/santifer/career-ops/blob/main/templates/immigration-status-requirements.yml), [`templates/jurisdiction-prohibited-content.yml`](https://github.com/santifer/career-ops/blob/main/templates/jurisdiction-prohibited-content.yml)). Signal 3 (Company Hiring Signals) executes live web queries for layoff and hiring freeze information.