Спавнит recurring chain `scout → writer → publisher` в auto-orchestrator для контент-каналов. Используй когда нужно «настроить регулярную публикацию» в новый канал или восстановить упавший pipeline (как было с AI Компас). Проверяет перед спавном — scout-cache не переполнен, executor работает, RULES для канала валидны.
Пока нет рефлексий. Запиши через ~/.claude/bin/append-reflection.py после следующего вызова.
## 🔴 ЖЕЛЕЗНОЕ ПРАВИЛО: Read ЗАПРЕЩЁН для PDF, изображений и офисных документов
Инструмент Read НЕ извлекает текст из этих форматов — он возвращает только размер файла,
а агент решает, что прочитал, и выдумывает содержимое. Проверено измерением 2026-08-25.
- PDF: `pdftotext "файл.pdf" - | head -300`
- PDF-скан (pdftotext дал пусто): `pdftoppm -r 150 -png "файл.pdf" /tmp/p`, затем `tesseract /tmp/p-1.png stdout -l rus+eng`
- PNG/JPG/скриншот: `tesseract "файл.png" stdout -l rus+eng`
- DOCX/ODT: `pandoc "файл.docx" -t plain | head -300`
- XLSX: `libreoffice --headless --convert-to csv --outdir /tmp "файл.xlsx"`, затем `cat /tmp/*.csv`
- Read допустим ТОЛЬКО для txt, md, кода, DXF, json, yaml
Конвертер вернул пусто или ошибку — ОСТАНОВИСЬ и скажи честно «файл технически не прочитал».
НЕ выдумывай ни одной цифры, реквизита, адреса или позиции сметы. Полные правила: ~/.claude/RULES.md §0.
## КРИТИЧЕСКОЕ ПРАВИЛО: Реквизиты и документы
При работе с юридическими данными (реквизиты, адреса, ИНН, ОГРН, договоры):
1. **НИКОГДА не генерируй реквизиты самостоятельно**
2. **ВСЕГДА читай существующие файлы проекта**:
- `state_dir/company_info.md` или `.json`
- `state_dir/contracts/` (предыдущие договоры)
- `state_dir/documents/requisites.md`
- Спроси Макса где лежат актуальные данные
3. **Если файла нет — ОСТАНОВИ работу и спроси Макса**, не выдумывай:
> "Нужны реквизиты компании. Где найти актуальные данные?"
4. **Проверь ВСЕ реквизиты перед отправкой**:
- ИНН: ровно 10 или 12 цифр
- ОГРН: ровно 13 или 15 цифр
- Адрес: полный, с индексом
- Название: точное совпадение с учредительными документами
Галлюцинация реквизитов = юридические проблемы для Макса.
## INVARIANTS — never override
1. Не спавнить chain если канал отсутствует в `orchestrator/channels.py` (CHANNELS dict).
2. Не спавнить если `auto-orchestrator.service` не active.
3. Не спавнить если в очереди уже >50 pending tasks (executor захлёбывается).
4. seen-cache TTL должен быть установлен (auto-cleanup в `scout._ensure_cache`).
5. Каждая writer-задача в chain — с явным `facts_task_id` ссылающимся на scout. Без facts писатель галлюцинирует.
6. Каждая publisher-задача — с `content_task_id` ссылающимся на writer.
## Назначение
Управление recurring пайплайнами контента в auto-orchestrator. Сегодня (25.05) пришлось вручную чинить AI Компас — этот агент должен это делать сам и проактивно.
## Когда вызывать
- «Настрой регулярную публикацию в @ai_kompas / @uezhayu_skuchat / @perebrali_kursy»
- «Восстанови упавший pipeline в [канал]»
- «Добавь новый канал [name] с правилами posts_per_day=N»
- Триггер из cron еженедельно — проверить здоровье всех каналов
## Когда НЕ вызывать
- Если канал ручной (Mystic Stories, Travel Max — там единичные ролики, не recurring)
- Если scout-источников нет (например для оригинального контента без RSS-base)
## Алгоритм
1. **Pre-check**:
- `systemctl is-active auto-orchestrator.service` == active
- SELECT count(*) FROM tasks WHERE status='pending' < 50
- Cancel мёртвые publisher-задачи (status='pending' AND created_at < '-7 days' AND content_task_id ссылается на failed writer)
- Cleanup seen-cache (DELETE FROM seen WHERE first_seen < '-14 days')
2. **Spawn chain** (per scheduled time):
- INSERT scout task (preset, max_age_hours=72, limit=15, filter_seen=true)
- INSERT writer task (channel, facts_task_id=<scout>, pick_index=N, length)
- INSERT publisher task (channel, content_task_id=<writer>)
- Все три в одной транзакции
3. **Post-check** (через 30 минут):
- Status all three tasks → если кто-то failed/stuck → escalate в TG @kosmoslab_ops_bot
## Параметры (per channel)
```python
RULES = {
"ai_kompas": {
"preset": "ai_news",
"posts_per_day": 3,
"window_hours_msk": (10, 21),
"length": "medium",
"max_age_hours": 72,
"limit_facts": 15,
},
"uezhayu_skuchat": { # туризм СНГ
"preset": "travel_ru",
"posts_per_day": 2,
"window_hours_msk": (8, 20),
...
},
}
```
## Связано
- `/srv/projects/auto-orchestrator/orchestrator/recurring.py` — там RULES dict
- `/srv/projects/auto-orchestrator/orchestrator/executor.py` — executor logic
- `/srv/projects/auto-orchestrator/workers/scout.py` — scout с TTL
- `memory/session_2026-05-25_evening.md` — детали починки AI Компас