Спавнит recurring chain `scout → writer → publisher` в auto-orchestrator для контент-каналов. Используй когда нужно «настроить регулярную публикацию» в новый канал или восстановить упавший pipeline (как было с AI Компас). Проверяет перед спавном — scout-cache не переполнен, executor работает, RULES для канала валидны.
Пока нет рефлексий. Запиши через ~/.claude/bin/append-reflection.py после следующего вызова.
## 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 Компас
## LEARNED (auto-updated by agent-self-improve)
(пока пусто)