Files
vesti/openspec/changes/archive/2026-09-16-own-content-hub/proposal.md
T

65 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Why
У пользователя есть собственные ресурсы (канал Telegram «Дед в АйТи» @dedinit, сайт dedinit.ru,
далее — феды/видео), но они живут разрозненно: контент, опубликованный в одном месте, не
попадает в другие. Цель — **собственный контент-хаб**: единая точка сбора ВСЕХ постов
пользователя из разных платформ, один банк своего контента, и **автораспространение**
этого контента по тематическим новостным ботам VESTI (и в перспективе — по другим
платформам), чтобы органически росла аудитория на всех площадках.
Задача НЕ «сделать копию канала»: канал @dedinit — полноценный источник данных в общей
логике проекта (как любой TG-канал): краулер → классификатор → кандидат → подтверждение →
публикация в тематические каналы → банк статей. Отличие от внешних источников — это
СВОЙ контент (is_own=1): он всегда кандидат на публикацию («инъекция» в ленту),
не блокируется политикой чужих форвардов и помечается атрибуцией автора.
## What Changes
- Добавить канал @dedinit (id 1150165846) в sources.yaml как источник `own: true`
(свой контент пользователя), направление определяется классификатором (канал
разносторонний: Linux, IT, AI, игры...).
- Краулер: посты своего канала помечаются `is_own=1`, для них продолжает работать
дедуп (sha256/url); политика форвардов для своего канала — как обычно (чужие
форварды → fwd-поля без медиа).
- Классификатор: свой контент с relevance critical/high → «сильные кандидаты»
(самокатегоризация; приоритет в ленте подтверждения).
- **Автораспространение (distribution)**: подтверждённый пост рассылается НЕ только
в один канал @dedinit_vesti_<dir>_<lang>_bot, а во ВСЕ тематические боты/каналы,
соответствующие направлениям поста (один пост может попасть в несколько лент).
Режим — по-прежнему «черновик на подтверждение», но подтверждение ведёт к
множественной публикации (fan-out).
- Веб: фильтр «Свои» (только is_own посты), отображение бейджа «СВОЙ», выбор
направлений для рассылки при подтверждении.
- Расширить таблицы: posts.is_own, posts.is_own_canonical (первичный экземпляр),
sources.own, published.distributed_dirs (какие направления розданы).
## Capabilities
### New Capabilities
- `own-content`: Свой контент-хаб: пометка постов пользователя (is_own), приоритет
в кандидатах, сквозная ссылка на оригинал во всех публикациях.
### Modified Capabilities
- `tg-crawler`: пометка is_own по источникам с own: true; политика форвардов для
своих каналов не отличается от внешних (dedup + fwd-поля).
- `classifier`: свой контент → «сильный кандидат» (relevance critical/high при
словарном попадании; classified=True даже без LLM-подтверждения, если есть
направление).
- `tg-publisher`: fan-out по нескольким направлениям; атрибуция «Дед в АйТи» +
ссылка на оригинал.
- `vesti-web`: фильтр «Свои», бейдж, выбор направлений рассылки при подтверждении.
- `news-store`: бандл своего поста помечается origin=own + ссылка на оригинал в
frontmatter.
## Impact
- Затронутые сервисы/порты: без новых портов; краулер (cron), классификатор,
tg-publisher, веб 127.0.0.1:8400 — те же.
- Файлы: sources/sources.yaml (новый источник), crawler/telegram_crawler.py,
classifier/classify.py, publisher/bot.py, publisher/card.py, web/app.py,
db/schema.sql (миграции ADD COLUMN is_own и др.).
- Данные: 1039 постов канала @dedinit появятся как is_own посты; медиа своего канала
скачивается (это контент пользователя — можно).
- Секреты: не требуются новые (та же Telethon-сессия, токены ботов в .env).
- Rollback: отключение источника `own: false` / удаление поля is_own; существующие
внешние посты не затрагиваются; данные не удаляются (правило пользователя).