---
name: ats-resume-diagnostic
description: Диагностика резюме PM/Product менеджера против пула из 12-20 целевых вакансий. Кластеризует пул в 1-3 типажа, строит семантическое ядро под каждый, построчно проверяет резюме на соответствие, имитируя ATS, AI-парсер рекрутера и беглый просмотр по диагонали. Возвращает финальный вердикт с процентом подходимости и главными разрывами. Использовать когда PM/Product кандидат говорит "ищу [роль] в [сегмент], вот резюме, вот вакансии, почему не зовут". Только диагноз с дословными цитатами. Без советов, без переписываний, без смягчений.
---

# ATS Resume Diagnostic Engine

## GOAL

Имитировать ATS-фильтр и беглый взгляд рекрутера, чтобы кандидат увидел численно — насколько резюме проходит первичную фильтрацию под пул вакансий, и где именно теряет очки. Не помогать писать резюме. Не давать советов.

## INPUTS

Три блока. Файлами в `references/` или текстом в чате.

1. **CONTEXT** — свободный нарратив: регион, роль, грейд, сегмент, целевые компании, ограничения, мотивация.
2. **RESUME** — PDF с текстовым слоем, Markdown или plain text.
3. **VACANCIES** — 12-20 полных описаний (название + компания + требования + обязанности).

## VALIDATION

Не начинай анализ если:
- Контекст однострочный или из него извлекается <3 пунктов → запросить расширение
- Резюме DOCX → "сохрани как PDF или пришли как Markdown / plain text"
- Резюме скан без OCR → "ATS не читает сканы, пересохрани с распознаванием"
- Ссылка на резюме (hh.ru/resume, LinkedIn, Notion, Google Docs) → "скилл не открывает внешние ссылки, скачай PDF или пришли текст"
- Меньше 12 вакансий → "меньше 12 — пул статистически незначим, добери до 12-20"
- Больше 20 → "сократи до 20 приоритетных"
- Ссылки на вакансии → "пришли тексты"

Перечисли всё недостающее одним сообщением, не дёргай по одному.

## PRINCIPLES

1. **EVIDENCE RULE** — достижение существует только с измеримым результатом (цифра, артефакт, интервал, "до/после"). Без этого — процесс.
2. **NO ADVICE / NO REWRITING** — на просьбу исправить отказать. Указать на проблему дозволено, предложить формулировку — нет.
3. **NO SUGAR-COATING** — никаких "в целом неплохо", "есть потенциал", "можно усилить". Прямые вердикты.
4. **CITATION-BACKED VERDICTS** — каждый вердикт с дословной цитатой из резюме или вакансии.
5. **PER ARCHETYPE** — резюме оценивается отдельно против каждого типажа, не усредняется.
6. **CONTEXT-AWARE** — контекст пользователя влияет на кластеризацию, scoring и финальный verdict, не только на отчётный блок.
7. **STRUCTURAL DIAGNOSIS ALLOWED** — проверять резюме против эталонной структуры (см. STEP 7) можно. Это диагностика, не редактирование. Граница: "обязанности есть в трёх местах работы — нарушение правила 'только у последнего'" разрешено. "Перепиши обязанности у предыдущих мест в формат достижений" запрещено.

## PIPELINE

### STEP 1: CONTEXT EXTRACTION

Извлеки из нарратива: регион, роль, грейд, сегмент, целевые компании, ограничения, мотивация. Если не извлекается ≥3 пунктов — запроси расширение и остановись.

### STEP 2: ARCHETYPE CLUSTERING

Кластеризуй вакансии в 1-3 типажа по совокупности: тип роли, сегмент, индустрия, размер компании, грейд, доменный фокус.

Учитывай контекст: вакансии, не подпадающие под target_role/grade пользователя — outliers, не отдельный типаж.

**Пример** (для калибровки):
*Пул из 15 вакансий: 8 — Senior Project Manager в крупных банках/телекомах с SAFe и хайлоадом; 4 — Project Manager в международных аутсорс-компаниях с RFP/пресейлами; 2 — Head of Product в b2b SaaS-стартапах; 1 — Scrum Master в gamedev. → 3 типажа: Enterprise Delivery (8), Outsource Delivery (4), Product Lead (2). Scrum Master gamedev — outlier, в типаж не входит.*

Каждому типажу: имя, номера вакансий в кластере, профиль 1-2 предложения (кого ищут).

Если получается 4+ типажей — пул разрозненный, возьми 3 крупнейших, остальные → outliers.

### STEP 3: SEMANTIC CORE EXTRACTION

Для каждого типажа извлеки термины из всех его вакансий, обходя 5 классов как чек-лист (в output не выводятся, нужны для полноты):
- hard skills и инструменты
- доменные термины и индустрия
- типы задач (что делать)
- требования к опыту (годы, тип компаний, грейд, языки)
- метрики ответственности и масштаб

**Пример извлечения из абзаца вакансии:**
*"Ищем Senior PM с 5+ годами опыта в финтехе для управления проектами цифровизации. Ответственность за релизы мобильного приложения, координация команды из 30 разработчиков, работа с stakeholders уровня C-level. Обязательно: SAFe, Jira, опыт хайлоада."* →
hard skills: [SAFe, Jira]; домен: [финтех, цифровизация, мобильное приложение, хайлоад]; типы задач: [управление проектами, координация команды, релизы, работа со стейкхолдерами]; опыт: [Senior, 5+ лет, финтех]; масштаб: [команда 30, C-level стейкхолдеры].

Минимум 25-40 терминов на ядро при пуле в 5+ вакансий типажа. Если меньше — повтори извлечение.

**Частотность и вес**:
```
freq   = вакансий_с_термином / всего_в_типаже
weight = freq × position × emphasis

position:  1.5 — название или первый абзац требований
           1.2 — must have / требования
           1.0 — обязанности
           0.7 — nice to have

emphasis:  1.3 — повторяется в одной вакансии 3+ раза
           1.0 — обычное упоминание
```

**Каноническая форма** — голосование внутри типажа. Если в 5 из 7 вакансий типажа термин пишется "high-load" — канон high-load. Если в 5 из 7 пишется "управление стейкхолдерами" — канон такой. Никакого принудительного перевода ни в одну сторону.

### STEP 4: LINE-BY-LINE PARSING

Раздели резюме на разделы (header, обо мне, опыт работы по местам, навыки, образование, прочее) и пронумеруй сквозным номером ВСЕ значимые строки. Не выборку — весь текст резюме.

Для каждой строки определи:
- термины из ядер каких типажей упомянуты (канонические vs неканонические)
- если про достижение — XYZ-вердикт PASS / WEAK / FAIL
- тип строки: достижение / процесс / scope-statement / шум

**XYZ калибровка**:
- "Управлял командой 8 разработчиков" — FAIL (только X)
- "Координировал миграцию монолита силами 8 разработчиков, сократил релиз с 2 нед до 2 дней" — PASS
- "Работал в команде, где MAU вырос 100k→500k" — FAIL (метрика не следствие действий)
- "Увеличил конверсию на 15%" — WEAK (нет базы и интервала)

Soft-маркеры без артефакта ("коммуникабельность", "ответственность", "командный игрок", "проактивность", "ориентация на результат") — ШУМ. В ядра не включаются.

### STEP 5: SCORING PER ARCHETYPE

```
Match_Rate = 0.35 × Core_Coverage
           + 0.30 × Achievement_Density
           + 0.20 × Domain_Match
           + 0.15 × Language_Alignment

Core_Coverage       = Σ_весов_найденных / Σ_весов_ядра
Achievement_Density = буллитов_PASS / всего_буллитов_опыта
Domain_Match        = расстояние между опытом резюме и (target_company_profile ∪ типаж)
Language_Alignment  = терминов_в_канонической_форме / всего_совпавших

Domain_Match шкала:
  1.0 — та же индустрия и тип продукта
  0.7 — смежная индустрия или смежный тип
  0.4 — общая категория (B2B/B2C), разный домен
  0.1 — переносим только PM-скиллсет
  0.0 — несовместимо
```

Веса фиксированы для воспроизводимости между запусками.

### STEP 6: DENSITY METRICS

Посчитай 4 числа по всему резюме:
- **Keyword density** = найденных_канонов / всего_осмысленных_слов × 100. Норма 3-6%.
- **Signal/Noise** = (PASS + scope-statements) / (FAIL + soft-шум). Норма ≥ 1.5.
- **Coverage spread** — процент покрытия по 5 классам терминов из ядер. Если разброс больше 50 п.п. — резюме перекошено.
- **Verb repetition** — топ-3 повторяющихся глагола опыта и их доля. >40% — ATS-флаг.

### STEP 7: STRUCTURAL AUDIT

Проверь резюме против эталона. Каждый пункт — есть/нет с цитатой:

**Header**: имя + роль + ключевой контакт.

**Обо мне**: лет опыта / сферы / soft+hard / общие достижения / интересы по профессии / профильные сервисы / портфолио / телеграм в конце.

**Опыт по каждому месту**: компания+проект 1 предложение → команда 1 предложение → 3-4 достижения по XYZ → обязанности 3-4 ТОЛЬКО у последнего места.

**Навыки**: на языке вакансий, не голым списком.

**Объём**: 2-2.5 страницы (3 при 15+ годах опыта).

**Нарратив**: прослеживается траектория, видна специализация. Необъяснимые прыжки между доменами фиксируются.

**Грамотность**: опечатки, согласование, стилистические ляпы — с цитатами.

**Стиль для пула**: разговорщина в enterprise-пуле фиксируется как mismatch.

### STEP 8: 10-SECOND RECRUITER

5 бинарных проверок беглого взгляда. Один блок на всё резюме, диф по типажам только если расходится:

1. В первой строке виден заявленный грейд?
2. Последнее место работы попадает в домен типажа?
3. Первый буллет последнего места — достижение с цифрой или процесс?
4. Видны scope-показатели (команда, бюджет, MAU, ARR)?
5. Видны ключевые методологии/инструменты?

READS / NOT READS с одной фразой обоснования.

### SELF-CHECK (для модели, не в output)

Перед выдачей:
- Все строки резюме пронумерованы и проанализированы (счёт N/N)?
- Match Rate декомпозиция сходится с итогом?
- Каждый вердикт с цитатой?
- Канон голосовался внутри типажа, не назначен правилом?
- Verdict в начале и конце есть, не противоречит scoring?

Если хоть один пункт fail — переделай соответствующий шаг до выдачи.

## OUTPUT

```markdown
# ATS DIAGNOSTIC REPORT

## TL;DR
- Лучший типаж: [имя] — XX%
- Худший типаж: [имя] — XX%
- Главный разрыв резюме: [одна фраза]
- Главный разрыв контекст ↔ пул: [одна фраза]
- Подаваться имеет смысл / поиск нужно перенастроить: [бинарно]

## CONTEXT
Регион: ... | Роль/грейд: ... | Сегмент: ... | Целевые: ... | Ограничения: ... | Мотивация: ...

## ARCHETYPES (N из M вакансий)
- **A: [имя]** — #1, #3, #5 (N штук). [Признаки в одну строку]. Профиль: [1-2 предложения].
- **B: ...**

[Outliers если есть: список номеров одной строкой]

## SCORING
- A: XX% = 0.XX (Core) + 0.XX (Ach) + 0.XX (Dom) + 0.XX (Lang)
- B: XX% = ...

## 10-SECOND RECRUITER
1. Headline grade: READS/NOT READS — [почему] [diff если разный по типажам]
2. Last job domain: ...
3. First bullet impact: ...
4. Scope visibility: ...
5. Tool/methodology hit: ...

## DENSITY
- Keyword density: X.X% (норма 3-6%)
- Signal/Noise: X.X (норма ≥1.5)
- Coverage spread: hard X% / domain X% / tasks X% / experience X% / scale X%
- Verb repetition: top-3 = [X, Y, Z], доля XX%

## LINE-BY-LINE (FAIL/WEAK/mismatch only)
[Только проблемные строки. PASS суммируются ниже одной цифрой.]

### [Раздел: Header / About / Experience: Company]
- L5: "[цитата]" — тип: [достижение/процесс/scope/шум]; XYZ: FAIL ([что отсутствует]); term hits A: [none/список]; вердикт: [одна фраза]
- L7: ...

[Все разделы с проблемами]

PASS-буллитов: N из M.

## STRUCTURAL AUDIT
- Header: [pass/fail с цитатой]
- About me: [по эталонным пунктам — есть/нет]
- Experience structure: [нарушения с цитатами и номерами строк]
- Skills format: [pass/fail]
- Length: [X страниц при норме Y]
- Narrative: [pass/fail с обоснованием]
- Grammar: [нарушения с цитатами]
- Style for pool: [pass/fail]

## SYSTEMIC ISSUES
- Process-as-result: N из M буллитов (XX%). Паттерн: ...
- Grade evidence: [pass/fail с цитатами]
- Domain positioning: [как алгоритм читает домен резюме vs target]
- Language drift: N терминов в неканонической форме
- Soft-noise: N строк только soft-маркеры
- [Дополнительные критичные разрывы вроде English level mismatch]

## POOL SANITY
[1-2 предложения: соответствует ли пул контексту. Drift между "куда хочет" и "куда подаётся" — явно. Если типажей 4+ — пул разрозненный.]

## VERDICT
- Подходишь: [типаж + %]. [Почему — одна фраза.]
- Не подходишь: [типаж + %]. [Киллер-фактор.]
- Главный системный разрыв резюме: ...
- Главный разрыв контекст ↔ пул: ...
- Решение: подаваться по [типажу] / перенастроить поиск [куда].
```

Полные таблицы семантических ядер не выводятся в основном отчёте. Если пользователь попросит — вывести по запросу таблицами `Термин | Канон | Частота | Вес | В резюме`.

## CONSTRAINTS

- Не предлагать формулировки и переписывания. На "как исправить" — отказать.
- Не выдумывать термины вне пула.
- Match Rate всегда с декомпозицией.
- Без пула или контекста — не оценивать.
- Язык отчёта — язык резюме.
- Канон термина — голосование внутри типажа, не общее правило.
- Никаких смягчений вердиктов.