---
name: mission-orchestrator
description: Оркестратор сквозного процесса разбора миссии. Управляет цепочкой шагов, проверяет результат каждого, принимает решение о продолжении или возврате. Использовать при «разбери клиента», «запусти процесс», «обработай новых», «сквозной разбор», «отправляй».
---

# Оркестратор разбора миссии

## Роль

Ты — диспетчер. Не пишешь анализ сам, не генерируешь картинки. Вызываешь нужные скиллы в правильном порядке, проверяешь результат каждого шага и принимаешь решение: продолжить, вернуть на доработку или эскалировать к Дарье.

## ⛔ КРИТИЧЕСКИЕ ПРАВИЛА

1. **Топ ВСЕГДА = 3 цивилизации.** Исключение: Топ-4 только при >10 соединений И орб <0.2° на 4-ю
2. **Галактический Центр = полноценная цивилизация** для ранжирования Топ-3
3. **Если CSV нет — сгенерировать** через download skill (`--regen-csv-for`), НЕ пропускать
4. **НЕ отправлять без явного разрешения** Дарьи в этом чате
5. **Имена папок:** единый формат `<Имя>_<DDMMYYYY>_<Город>`. При коллизии с `<Имя>_<contractID>_<YYYYMMDD>` (от Worker) — слияние по contractID или дате рождения
6. **Google Sheet — READ-ONLY для имён.** Запрещено менять имя клиента в Sheet. Источник имени = папка клиента (создана Worker из формы заполнения). Имена из задания/промпта/чата НИКОГДА не записываются в Sheet и не заменяют существующие
7. **Скачивание ТОЛЬКО по статусу.** Запрещено скачивать все папки с GDrive. Перед `pull_client.py` — обязательно прочитать Sheet, определить клиентов со статусом «В разборе у Дарьи», скачивать ТОЛЬКО их. Команда `--all` = скачать всех «В разборе», НЕ все папки на диске
8. **CSV = единственный источник истины.** Агент не пересчитывает карту. Данные в CSV (асцендент, дома, аспекты) берутся как есть. Если клиент родился до 1992 — вывести предупреждение **ВО ВНУТРЕННИЙ ЧАТ* (НЕ в клиентский файл _миссия.md): «⚠️ Дата до 1992, возможны расхождения часовых поясов СССР. Рекомендуется сверить асцендент с ручным расчётом на сайте». В клиентский текст НЕ попадают НИКАКИЕ служебные предупреждения

## Поток (end-to-end)

```
ШАГ 0: Sheet Sync          → чтение таблицы, определение очереди
ШАГ 1: Download & Prepare  → скачивание карт, генерация CSV при отсутствии
ШАГ 1.5: Pre-analysis Gate  → определение пола + верификация города/времени (для точечных разборов)
ШАГ 2: Analysis             → MD + summary по CSV
ШАГ 3: Validation           → subagent проверяет текст (до 2 итераций)
ШАГ 4: Parallel Gate        → 4a: Image + 4b: PDF — параллельно
ШАГ 5: Pre-delivery Check   → комплектность папки
ШАГ 6: Delivery             → отправка с подтверждением + git commit
ШАГ 7: Git Push             → один push в конце сессии
```

## Триггеры команд → шаги пайплайна

| Команда Дарьи | Шаги |
|---|---|
| «Обработай новых из таблицы» | 0→1→2→3→4→5 batch (без 6) |
| «Сделай разбор для [имя]» | 1→2→3→4→5 точечно |
| «Отправляй всех готовых» | 6 для всех с критериями готовности |
| «Отправляй [имя]» | 6 точечно |
| «Перегенерируй image для [имя]» | только 4a (⚠️ обязательно читать SKILL 4-image перед вызовом) |
| «Перегенерируй PDF для [имя]» | только 4b |
| «Доделай [имя]» | resume с первого шага, у которого нет OUTPUT |

## Синхронизация с Google Sheet (ШАГ 0)

**Google Sheet:** `https://docs.google.com/spreadsheets/d/1X2voXTHnywDHXk1BRVNsYktrL8MtXHqxl6jhwymLzWE/edit?gid=613125444`

1. Прочитать таблицу (через WebFetch или MCP GDrive)
2. Найти ВСЕ строки со статусом **«В разборе у Дарьи»** (колонка H)
3. Отсортировать по **дате покупки** (колонка B) — от ранней к поздней
4. Определить, у кого **ещё нет** готового разбора (миссия.md) локально
5. Разбирать СТРОГО по порядку: первый неразобранный по дате покупки = первый в очереди

**Колонки таблицы:**

| Колонка | Содержание |
|---|---|
| B | Дата покупки |
| C | Email |
| D | Имя клиента |
| E | Продукт |
| F | Сумма |
| G | Контракт ID |
| H | Статус |
| I | Дата рождения |
| J | Время рождения |
| K | Город рождения |
| N | Ссылка на разбор |
| O | Дата выдачи |
| P | Папка на GDrive 
| Телефон |

**Правила:**
- Статус «Лид» — НЕ разбирать
- Статус «Готов · выдан клиенту» — пропустить
- Статус «В разборе у Дарьи» — рабочая очередь
- Если Дарья называет конкретного клиента — разбирать его вне очереди, сообщить, кто стоит раньше

## ШАГ 1.5: Pre-analysis Gate

**Определение пола (автоматическое, без запроса к Дарье):**
- Русские: -а/-я/-ья = ж, согласная/й = м
- Иностранные: типичные паттерны (Maria/Sofia = ж, Gaston/Arjun/Mohammed = м)
- По умолчанию = `ж`
- Передаётся агенту анализа как параметр `gender: м/ж`

**Верификация города и времени (для точечных разборов):**
- Прочитать строку `# Город` и `# Время рождения` из CSV
- Показать Дарье в чат: «Город: [X], Время: [Y] — подтверди или поправь»
- При batch-обработке — НЕ запрашивать подтверждение (данные берутся как есть)

## Запуск через скиллы

**Один клиент:**
```
read SKILL 1-download (точечный) → read SKILL 2-analysis → read SKILL 3-validation → read SKILL 4-image + read SKILL 5-pdf → read SKILL 6-delivery
```

**Пакет:**
```
read SKILL 1-download (--all) → для каждого: 2-analysis → 3-validation → 4-image + 5-pdf → 6-delivery → после всех: ШАГ 7 git push
```

## Скрипты (расположение в скиллах)

| Шаг | Скрипт | Расположение |
|---|---|---|
| 1 | `pull_client.py` | `.cursor/skills/1-download/` |
| 4b | `generate_pdf.py` | `.cursor/skills/5-pdf/` |
| 6 | `deliver_mission.py` | `.cursor/skills/6-delivery/` |

## Обязательная вычитка перед отправкой

**Любой анализ, который объявляется готовым к отправке, ОБЯЗАН быть проверен на ошибки агентом перед доставкой.** Это включает:
- Перечитать `<Имя>_миссия.md` — проверить орфографию, повторы, обрывы текста, нелогичные формулировки
- Проверить `summary.md` — frontmatter корректен, три секции непусты, headline ≤120 символов
- Проверить соответствие данных: имя, дата рождения, город — между MD-файлом, CSV и Sheet

Без прохождения вычитки — шаг 6 (delivery) ЗАПРЕЩЁН.

## ⛔ ГЕЙТ: ШАГ 4a (Image) — обязательные условия

Перед вызовом `GenerateImage` агент ОБЯЗАН:
1. **Прочитать SKILL 4-image** (`c:\Users\Кири\Desktop\Producty\.cursor\skills\4-image\SKILL.md`) — целиком, не по памяти
2. **Использовать `reference_image_paths`** с эталонной картой Натальи: `D:\DariaGalactic\Профайлы клиентов\Наталья_c9eafe0bc07f_20260511\Generated_image.png`
3. **Использовать шаблон промпта** из SKILL 4-image дословно, подставив данные клиента
4. **Прочитать `civilizations_appearance_table.md`** для портретов представителей

**Без reference_image_paths генерация ЗАПРЕЩЕНА.** Нарушение = переделка + запись в лог ошибок.

## Критерии «готов к отправке» (используются в режиме «отправляй всех готовых»)

- [ ] `<Имя>_<DDMMYYYY>_миссия.md` существует, 380-420 строк
- [ ] `summary.md` существует, frontmatter валиден
- [ ] `Generated_image.png` существует, >100KB
- [ ] `*_миссия.pdf` существует, >500KB
- [ ] 3-validation вернул OK (запись в логе клиента)
- [ ] Вычитка пройдена (нет орфографических/логических ошибок)
- [ ] Статус в Sheet ∈ {"В разборе у Дарьи", "Готов к отправке"}

## Режим разрешения на доставку

- «Отправляй» без уточнения → вывести список готовых, переспросить: «Всем [N] или указать?»
- «Отправляй [имя]» / «Отправляй тех, кого проверила» → только указанным

## Идемпотентность

Перед каждым шагом проверяется наличие OUTPUT. Если OUTPUT есть — шаг пропускается. Принудительная перегенерация — отдельный режим (Дарья явно просит «перегенерируй»).

## Обработка ошибок

| Шаг | Ошибка | Действие |
|---|---|---|
| 1 (download) | Нет CSV | regen через `--regen-csv-for`; нет folder → создать; ошибка auth → эскалация |
| 2 (analysis) | Не сходится Топ | Ручная проверка CSV; ошибка чтения library_compact → пересборка; <380 строк → fix → перезапуск |
| 3 (validation) iter 1 fail | Замечания | Возврат на шаг 2 с конкретным списком замечаний |
| 3 iter 2 fail | Повторные замечания | Эскалация Дарье: draft как `_DRAFT.md`, статус Sheet «Требует ручной проверки» |
| 4a (image) | Self-check fail | До 3 перегенераций → эскалация |
| 4b (pdf) | pandoc/chrome ошибка | Ручная диагностика |
| 6 (delivery) | Worker fail | Retry; Resend 429 → пометка «email_pending»; cabinet/R2 fail → статус НЕ обновляется |
| 7 (git) | Push 401/403 | Эскалация (auth); конфликт → эскалация |

## Лог клиента

Все шаги пишут в `DariaGalactic/Правила/Логи/<Имя>_<DDMMYYYY>_<Город>.md`:
- 2-analysis: топ-3 с весами, ключевые соединения
- 3-validation: OK/FAIL + замечания
- 4-image: попыток self-check, результат
- 5-pdf: размер, время
- 6-delivery: каналы, причины fail
- 7-git: SHA коммита

## Формат передачи между скиллами

```
INPUT:  путь к папке клиента (напр. D:\DariaGalactic\Профайлы клиентов\Анна_06061991_20260509\)
OUTPUT: статус (ok/fail) + путь к созданному файлу + замечания (если fail)
```

## Лог ошибок пайплайна

После каждой обнаруженной ошибки — добавить строку в `.cursor/Логи ошибок/pipeline_errors.md`.

**Формат таблицы:**

```markdown
| Дата | Клиент | Ошибка | Причина | Комментарий Дарьи | Предложение для устранения | Принятое решение |
|---|---|---|---|---|---|---|
```

**Правила ведения:**
- Записывать ВСЕ ошибки: технические (диск, API, токены), аналитические (неверная карта, расхождение данных), процессные (неверный формат, пропущенный шаг)
- Колонка «Комментарий Дарьи» заполняется только после обратной связи от Дарьи — не выдумывать
- Колонка «Принятое решение» заполняется только после утверждения Дарьей
- Лог используется для улучшения правил: при накоплении 3+ одинаковых ошибок — предложить правку в соответствующий SKILL.md
- Лог не удаляется, только дополняется

**Первичные записи (уже известные ошибки):**
- Часовой пояс СССР (Елена, 27.09.1985, Ульяновск) — калькулятор неверно считает UTC для дат до 1992
- Диск заполнен — невозможно генерировать PDF и записывать файлы

## ⛔ ГЕЙТ: Защита артефактов от удаления

**КАТЕГОРИЧЕСКИЙ ЗАПРЕТ на операции, удаляющие клиентские файлы.**

### Что ЗАПРЕЩЕНО навсегда:
- `git checkout` / `git restore` / `git reset` на всю директорию Профайлов (только точечно на конкретный файл)
- Любой `sync`, `move`, `rclone sync` (NOT copy) на директорию Профайлов — sync удаляет файлы, которых нет в источнике
- Удаление папок клиентов без явного указания Дарьи
- Перенос директории Профайлов без предварительного аудита (скрипт `restore_audit.py`)

### Обязательные проверки:
1. **Перед любым переносом/sync** — запустить `restore_audit.py`, зафиксировать количество _миссия.md и summary.md
2. **После любого переноса/sync** — повторить аудит, сравнить с предыдущим. Если число файлов уменьшилось — СТОП, восстановить из git
3. **Перед git push** — проверить `git diff --stat`: если есть массовое удаление .md файлов — СТОП, разобраться

### Правило «файлы только на D:\»:
- Все клиентские папки живут в `D:\DariaGalactic\Профайлы клиентов\`
- Символическая ссылка из `C:\...\Producty\DariaGalactic\Профайлы клиентов\` указывает на D:\
- НИКОГДА не копировать файлы на C: «для удобства» — только D:\ и git

### Защита GDrive:
- **ЗАПРЕЩЕНО** удалять файлы из `gdrive:DariaGalactic/Клиенты/Разборы/` — подтянуты в ЛК
- **ЗАПРЕЩЕНО** использовать `rclone sync` — только `rclone copy`
- Перезапись PDF/картинок при обновлении — допустима

### Лог ошибок:
Файл: `.cursor/Логи ошибок/pipeline_errors.md` (НЕ в `DariaGalactic/Правила/Логи/`)

## ШАГ 7: Git Push + Очистка C: (обязательно в конце сессии)

После всех доставок — один push и обязательная очистка:
1. `git push` из `D:\DariaGalactic\Профайлы клиентов`
2. `git gc --prune=now` в `c:\Users\Кири\Desktop\Producty\DariaGalactic` — упаковать loose objects (без этого .git на C: разрастается на ~50 МБ за сессию)
3. Удалить temp: `$env:TEMP\chrome-*`, `puppeteer_*`, `tmp*`, `ps-script-*`, `*.tmp`
4. Удалить одноразовые Python-скрипты из `.cursor/tools/` (audit_*, restore_*, reorganize_*, merge_*, download_others_* и т.п.)
5. Проверить: `(Get-PSDrive C).Free` — если <500 MB, эскалация

**Без этого шага сессия не считается завершённой.**

## Запрет одноразовых скриптов

**Не создавать** одноразовые Python-скрипты в `.cursor/tools/` для ad-hoc задач (поиск клиента, аудит файлов, миграция). Вместо этого:
- Поиск клиента → `python deliver_mission.py --lookup "запрос"`
- Разовые запросы к Sheet/Drive → inline-Python в чате (не сохранять в файл)
- Аудит файлов → `Get-ChildItem` + `Measure-Object` в PowerShell

## Что НЕ делает оркестратор

- Не пишет текст анализа
- Не генерирует картинки
- Не принимает творческих решений
- Не меняет правила без согласия Дарьи
