# Tasks: own-content-hub ## 1. Схема БД и реестр источников - [x] 1.1 Миграция схемы: ALTER TABLE posts ADD COLUMN is_own INTEGER DEFAULT 0, is_own_canonical INTEGER DEFAULT 0; sources ADD COLUMN own INTEGER DEFAULT 0; published ADD COLUMN distributed_dirs TEXT Проверка: `sqlite3 db/vesti.db "PRAGMA table_info(posts)"` показывает is_own/is_own_canonical; sources.own; published.distributed_dirs - [x] 1.2 Добавить источник dedinit в sources.yaml (channel: dedinit, own: true, direction: null, lang: ru) Проверка: `grep -A4 "slug: dedinit" sources/sources.yaml` → есть own: true - [x] 1.3 Синк реестра в БД (sources.own=1 для dedinit) Проверка: `sqlite3 db/vesti.db "SELECT slug, own FROM sources WHERE slug='dedinit'"` → dedinit|1 ## 2. Краулер - [x] 2.1 telegram_crawler.py: загрузка own-флага источников; проставление is_own/is_own_canonical для own-источников; медиа скачивается Проверка: код реализован (store_posts/is_own_source, py_compile OK); интеграционная проверка ждёт бэкфилла 2.3 - [x] 2.2 Форварды в своём канале: чужой форвард сохраняется с is_own=1 + fwd-полями, медиа НЕ скачивается Проверка: код реализован (skip_media для форвардов); интеграционная проверка после бэкфилла - [ ] 2.3 Бэкфилл своего канала: первый прогон ~1039 постов (медиа по возможности; при лимите — текст без медиа, бэкфилл-флаг) Проверка: `sqlite3 db/vesti.db "SELECT COUNT(*) FROM posts WHERE is_own=1"` > 0 (до ~1039) - [x] 2.4 Дедуп: тот же sha256/url во внешнем канале → is_own=0 (упоминание), канонический остаётся is_own_canonical=1 Проверка: код реализован (канон vs упоминание); проверка на реальных данных после бэкфилла ## 3. Классификатор - [x] 3.1 classify.py: is_own=1 + направление по словарю → relevance=critical, classified=True, method='dict-own' (без LLM при недоступности) Проверка: тестовый свой пост со словарным попаданием при выключенной Ollama → classified=1 relevance=critical - [x] 3.2 Поддержка мультинаправлений: классификатор может писать несколько записей classifications (fan-out) Проверка: пост linux+ai имеет 2 записи classifications ## 4. Публикатор (fan-out) - [x] 4.1 publisher/bot.py: publish_multi(directions) → публикация карточки в каждый @dedinit_vesti_