# Режим: pipeline — Черга URL (Second Brain)

Обробляє URL вакансій з `data/pipeline.md`. Користувач додає URL коли завгодно, потім запускає `/career-ops pipeline` для обробки.

## Workflow

1. **Прочитати** `data/pipeline.md` → знайти `- [ ]` в секції "Очікуючі" (або "Pendientes" / "Pending" — pipeline.md може містити заголовки будь-якою мовою)
2. **Для кожного URL**:
   a. Зарезервувати наступний `REPORT_NUM` атомарно, запустивши `node reserve-report-num.mjs` (та звільнити маркер, запустивши `node reserve-report-num.mjs --release <num>` після запису звіту)
   b. **🚦 Playwright verification gate (обов'язково):** `browser_navigate` → `browser_snapshot`. Визначити: title + description + Apply button = active; тільки footer/navbar без JD = closed/inactive. **Якщо inactive** → позначити `- [!] URL — Вакансія закрита/неактивна`, пропустити цей URL, перейти до наступного.
   c. **Витягти JD** з того ж Playwright snapshot (або WebFetch/WebSearch як fallback, якщо Playwright вже підтвердив активність)
   d. Якщо URL недоступний (login wall, 404, timeout) → позначити `- [!]` з приміткою, продовжити
   e. **Виконати auto-pipeline**: Оцінка A-F → Звіт .md → PDF (якщо бал >= 3.0) → Трекер
   f. **Перемістити з "Очікуючі" в "Оброблені"**: `- [x] #NNN | URL | Компанія | Роль | Бал/5 | PDF ✅/❌`
3. **Якщо 3+ URL**, паралелізація з Agent tool (`run_in_background`). **Обмеження:** тільки **один** Playwright-агент одночасно (правило `_shared.md`). Рекомендована схема: один агент послідовно проходить verification gate для кожного URL через Playwright; після підтвердження активності — запускає окремих агентів для evaluation/report/PDF (WebFetch, оцінка, генерація звіту паралельно). Жоден агент не починає evaluation, поки Playwright gate не підтвердив, що вакансія активна.
4. **По завершенні** показати таблицю:

```
| # | Компанія | Роль | Бал | PDF | Рекомендована дія |
```

## Формат pipeline.md

```markdown
## Очікуючі

- [ ] https://jobs.example.com/posting/123
- [ ] https://dou.ua/vacancies/company-role/ | Компанія | Senior Backend
- [!] https://private.url/job — Помилка: потрібна авторизація

## Оброблені

- [x] #143 | https://jobs.example.com/posting/789 | Acme Corp | AI PM | 4.2/5 | PDF ✅
- [x] #144 | https://djinni.co/jobs/123456 | BigCo | Backend | 2.1/5 | PDF ❌
```

## Визначення JD з URL

1. **Playwright (переважно):** `browser_navigate` + `browser_snapshot`. Працює з усіма SPA.
2. **WebFetch (fallback):** Для статичних сторінок.
3. **WebSearch (останній ресурс):** Пошук на вторинних порталах.

**Особливі випадки:**

- **DOU.ua**: Парсити сторінку вакансії через Playwright
- **Djinni.co**: Може вимагати логін → позначити `[!]`, попросити вставити текст
- **LinkedIn**: Може вимагати логін → позначити `[!]`, попросити вставити текст
- **PDF**: Якщо URL на PDF — прочитати через Read tool
- **`local:` префікс**: Читати локальний файл. Приклад: `local:jds/company-role.md`

## Нумерація

1. Запустити `node reserve-report-num.mjs` для атомарного резервування наступного порядкового номера (stdout поверне `{###}`).
2. Записати файл звіту, використовуючи цей номер.
3. Звільнити маркер, запустивши `node reserve-report-num.mjs --release {###}` після запису звіту.

## Синхронізація джерел

Перед обробкою URL:

```bash
node cv-sync-check.mjs
```

Якщо розсинхронізація — попередити користувача.
