---
name: ceberspost-connect-product-channel
description: "Как подключить ещё один личный продукт со своим Telegram-каналом к CebersPost, чтобы он сам пушил туда новости (по аналогии с VakHunter→@vakhunterInfo)"
metadata:
  node_type: memory
  type: project
  originSessionId: 805ead91-dfa3-49d2-a5e6-01a980e715fd
---

**Чек-лист подключения нового продукта со своим каналом к CebersPost** (паттерн обкатан на VakHunter→@vakhunterInfo, commit 6502e24). Repo CebersPost: **`/Users/cebers_mini/Разработки/CebersPost` на mini** (НЕ ~/Services; launchd `local.cebers-post`, venv `~/.venvs/cebers-post`), бот `@cebersLog_bot`, основной канал по умолчанию `@CodoCeh`.

**КРИТИЧНО для «не отлавливает изменения» (проверено 2026-06-22):** коллектор берёт коммиты ТОЛЬКО если у записи проекта `enabled: true` И `repo:` существует на мини. Грабли: (1) `enabled: false` (часто стоит, если проект добавляли до того, как стал git-репо — у avtero так было, исправлено) → коллектор молча пропускает; (2) `repo:` указывает на несуществующий путь → лог `Repo does not exist` (так у `cebers-pulse`: переехал в `~/Services/delor`). projects.yaml читается заново при каждом сборе — рестарт НЕ нужен. Окно сбора = `DRAFT_LOOKBACK_DAYS` (деф. 7) для нового проекта. Ручной триггер черновика — команда `/draft` боту (admin-only, approval-first). Проверка read-only: `cd ~/Разработки/CebersPost && PYTHONPATH=$PWD ~/.venvs/cebers-post/bin/python -c "...Collector(Storage(settings.database_path)).collect()"`.

Чтобы продукт X сам публиковал новости в свой канал @Xinfo (с одобрением мной), нужно:

1. **projects.yaml** — у записи проекта добавить поле `channel: "@Xinfo"`. Это единственный источник правды роутинга; `config._load_project_channels()` строит карту `project(lower)->канал`, `channel_for_project(name)` отдаёт канал проекта или дефолт `@CodoCeh`, `channel_label_for_project(name)` — метку для карточки одобрения. Проект должен быть в списке отслеживаемых (watcher по projects.yaml: git→LLM-черновик).
2. **@cebersLog_bot — админ канала @Xinfo с правом постинга** (иначе publish упадёт). Это ручной шаг в Telegram, его делает владелец.
3. Ничего в коде менять не надо — `publish_draft(bot, draft, channel)` уже принимает целевой канал, approve-хендлер берёт `settings.channel_for_project(draft.project)`, карточка одобрения показывает «📢 Канал: @Xinfo». **Approval-first сохранён**: сначала владелец одобряет черновик, только потом публикация.
4. Проверять конфиг ТОЛЬКО venv-интерпретатором `~/.venvs/cebers-post/bin/python` (в нём есть PyYAML; системный python3 даёт ModuleNotFoundError yaml).

Итого подключение = 1 строка в projects.yaml + назначить бота админом канала. Тэги/формат поста — забота драфтера/шаблона, не роутинга. См. [[ceberspost_overview]], [[cebers_dev_product_naming]] (каналы продуктов — нейтральные, не CeBers_dev).

**Поле `site` (2026-06-25, commit e916ea9):** у записи проекта можно задать `site: "https://X.codoceh.ru"` — тогда анонсы упоминают ОБА способа (бот И сайт), а `_append_project_link` даёт хвост «👉 Попробовать: @bot · https://site». Промпт-правило: если `site` задан → писать «и в боте, и на сайте»; иначе «только бот». **Ставить `site` ТОЛЬКО когда сайт реально готов и публично доступен** (проверять `curl https://X.codoceh.ru` = 200). Прокинут через collector.ProjectConfig/CollectedProject. Сейчас задан только у **VakHunter** (`https://vakhunter.codoceh.ru` — LIVE, 200 через VPS-edge 195.133.147.176). Автеро/Гаечкин сайты живут, но `site` им добавим, когда добьём их веб (форма+админка). Анонс запуска сайта VakHunter сгенерён (draft #203) и отправлен карточкой на одобрение админу — approval-first, не опубликован автоматически.
