# How the Blacklist Gate in Career-Ops Functions to Block Unwanted Employers

> Discover how the blacklist gate in career-ops stops unwanted employers. Learn to bypass it with the --include-blacklisted flag for seamless career management.

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

---

**The blacklist gate in career-ops reads your personal do-not-apply list from [`data/blacklist.md`](https://github.com/santifer/career-ops/blob/main/data/blacklist.md) and enforces a hard stop in the pipeline before evaluation or application, unless explicitly overridden with the `--include-blacklisted` flag.**

The **career-ops** repository provides an open-source job search automation framework that respects user boundaries through a strict gate mechanism. This blacklist gate prevents the system from processing postings from companies you have explicitly marked as undesirable, ensuring zero-touch automation for blacklisted employers across all pipeline modes.

## Where the Blacklist Is Stored and Defined

### The User-Layer Configuration File

The blacklist resides in [`data/blacklist.md`](https://github.com/santifer/career-ops/blob/main/data/blacklist.md), a **user-layer** file that the system never writes to automatically. You maintain this markdown table manually, adding employers you wish to avoid. If the file is missing, the gate initializes with an empty map and allows all postings through without filtering.

### Loading and Normalizing Company Names

When the scanner starts, the `loadBlacklist()` function in `scan.mjs` reads [`data/blacklist.md`](https://github.com/santifer/career-ops/blob/main/data/blacklist.md) and builds a `Map` of normalized company names. The `normalizeCompany()` helper strips punctuation and converts names to lowercase, enabling case- and punctuation-insensitive matching. For example, "Acme Corp." matches "acme corp" during the gate check.

## How the Gate Enforces the Do-Not-Apply List

### The Scanning Filter in scan.mjs

During the scanning phase, each job object is checked against the blacklist map. If a match is found, the posting receives a `job.blacklisted = true` property and a label such as `blacklisted: <reason>`. By default, these postings are excluded from further processing and counted in the run-summary statistic `filtered_blacklist`.

### Hard Stop in Pipeline Modes

The **auto-pipeline** and **oferta** modes insert a dedicated *Blacklist gate* step before evaluation or form-filling. If a posting is flagged as blacklisted, the pipeline aborts immediately with a message like "⚠️ Blacklist gate – job is on your do‑not‑apply list". The `apply` mode also checks this gate before generating application emails, ensuring blacklisted companies never receive submissions.

### Override Behavior with --include-blacklisted

Add the `--include-blacklisted` flag to `node scan.mjs` (or `scan-ats-full.mjs`) to disable the skip behavior. In this mode, blacklisted postings pass through the pipeline but remain annotated with their blacklisted status for audit purposes. This override does not remove the gate; it simply converts the hard stop into a labeled pass-through.

## Code Examples

Run a standard scan that automatically excludes blacklisted companies:

```bash
node scan.mjs --company "Software Engineer"

```

Audit blacklisted matches without removing them from your list:

```bash
node scan.mjs --company "Software Engineer" --include-blacklisted

```

Manually add a company to your blacklist:

```bash
cat >> data/blacklist.md <<EOF
| Initech | 2026-03-01 | company | example |
EOF

```

## Summary

- The **blacklist gate** in career-ops functions as a hard-wired terminate-and-skip filter using [`data/blacklist.md`](https://github.com/santifer/career-ops/blob/main/data/blacklist.md).
- The `loadBlacklist()` function in `scan.mjs` normalizes company names for case- and punctuation-insensitive matching.
- Pipeline modes including **auto-pipeline**, **oferta**, and **apply** enforce the gate before evaluation or submission.
- Use the `--include-blacklisted` flag to audit blacklisted postings without removing them from the list.
- The system never automatically writes to [`data/blacklist.md`](https://github.com/santifer/career-ops/blob/main/data/blacklist.md), preserving user control over the do-not-apply list.

## Frequently Asked Questions

### What file format does career-ops use for the blacklist?

The blacklist uses a markdown table format stored in [`data/blacklist.md`](https://github.com/santifer/career-ops/blob/main/data/blacklist.md). You manually edit this file to add company names, dates, and reasons, following the user-layer data contract defined by the repository.

### How do I temporarily view blacklisted postings without removing them?

Run your scan command with the `--include-blacklisted` flag. This allows blacklisted postings to appear in results with their `blacklisted` label attached, useful for reviewing your filter criteria without modifying [`data/blacklist.md`](https://github.com/santifer/career-ops/blob/main/data/blacklist.md).

### Does the blacklist affect job scoring or ranking?

No. The blacklist gate functions as a binary filter, not a scoring signal. Blacklisted postings are blocked from entering the evaluation pipeline entirely and do not contribute to any score calculations in the **auto-pipeline** or **oferta** modes.

### Which pipeline modes implement the blacklist gate?

The **auto-pipeline**, **oferta**, and **apply** modes all implement the blacklist gate according to the source documentation in [`modes/auto-pipeline.md`](https://github.com/santifer/career-ops/blob/main/modes/auto-pipeline.md) and [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md). They check the blacklist flag before proceeding with evaluation, form-filling, or application generation.