19 KiB
TODO — VESTI
Формат: | дата | задача | статус | закрыта в |
|---|---|---|---|
| 2026-09-08 | Инициализировать OpenSpec-проект /opt/vesti, change tg-crawler-publisher-prototype | ✅ закрыта | сессия старта |
| 2026-09-14 | Фикс: статус группы при group_by=date брался от первого поста → группы с первым published выглядели опубликованными | ✅ закрыта | change fix-date-group-status |
| 2026-09-14 | Фикс /published: заголовок перекрывался fixed-top меню; на карточках нет ID поста | ✅ закрыта | change fix-published-page |
| 2026-09-14 | Кандидаты: в списке не должно быть одобренных/своих постов; при группировке по дате всё показывалось как «свои» | ✅ закрыта | change candidates-only-external-new (в списке только внешние new: is_own=0 AND status='new') |
| 2026-09-14 | Кандидаты: после reject сбрасывается группировка (date→source), ?status=rejected показывает пустой список | ✅ закрыта | change keep-candidates-context (сохранение group_by/фильтров через скрытые поля + cand_back; явный статус — единственный фильтр) |
| 2026-09-08 | Артефакты change: proposal, design, specs (5), tasks | ✅ закрыта | сессия старта |
| 2026-09-08 | PRD.md — требования, архитектура, стек, DoD | ✅ закрыта | сессия старта |
| 2026-09-08 | Каркас проекта: каталоги, venv, requirements.txt | ✅ закрыта | сессия старта |
| 2026-09-08 | Конфиг+БД: config.py, schema.sql (6 таблиц), db.py | ✅ закрыта | сессия старта |
| 2026-09-08 | sources.yaml (8 линукс-каналов), sources.py (синк+запуски) | ✅ закрыта | сессия старта |
| 2026-09-08 | crawler/telegram_crawler.py + auth_telegram.py | ✅ закрыта | сессия старта |
| 2026-09-08 | Починить telegram-tunnel (SSH-форвард :1080 до VPS01) | ✅ закрыта | 2026-09-08 |
| 2026-09-08 | Авторизовать Telethon-сессию (@kpa39l, 2FA) | ✅ закрыта | 2026-09-08 |
| 2026-09-08 | Краулер: собрать первые посты (137 с 8 каналов) | ✅ закрыта | 2026-09-08 |
| 2026-09-08 | Форварды: дедуп по fwd_from (свой источник → пропуск, чужой → сирота без медиа) | ✅ закрыта | 2026-09-08 |
| 2026-09-08 | Классификатор: keywords.py + classify.py (Ollama qwen3:8b-nothink, /v1, таймаут) | ✅ закрыта | 2026-09-08 |
| 2026-09-08 | Бот-публикатор: card.py + bot.py (Bot API, dry-run) | ✅ закрыта | 2026-09-08 |
| 2026-09-08 | Веб: FastAPI+Bootstrap 5.3+Jinja2+HTMX, :8400, approve/reject+бандл | ✅ закрыта | 2026-09-08 |
| 2026-09-08 | Банк статей: markdown-бандлы с frontmatter + media | ✅ закрыта | 2026-09-08 |
| 2026-09-08 | own-content-hub: спроектировать change | ✅ закрыта | 2026-09-08 (openspec validate чист) |
| 2026-09-08 | own-content-hub: миграция БД (migrate_own.py) | ✅ закрыта | 2026-09-08 |
| 2026-09-08 | own-content-hub: sources.yaml +dedinit (own:true) | ✅ закрыта | 2026-09-08 |
| 2026-09-08 | own-content-hub: краулер own-семантика | ✅ закрыта | 2026-09-08 |
| 2026-09-08 | own-content-hub: классификатор critical + мультинаправления | ✅ закрыта | 2026-09-08 (test linux+ai) |
| 2026-09-08 | own-content-hub: публикатор publish_multi + get_views_multi + карточка с атрибуцией | ✅ закрыта | 2026-09-08 (dry-run 2 направления) |
| 2026-09-08 | own-content-hub: веб «Свои», чекбоксы направлений, distributed_dirs | ✅ закрыта | 2026-09-08 |
| 2026-09-08 | own-content-hub: бандлы origin:own + source_url + author | ✅ закрыта | 2026-09-08 |
| 2026-09-08 | own-content-hub 2.3: бэкфилл @dedinit (~1092 постов is_own=1) | ✅ закрыта | 2026-09-10 (backfill_dedinit.py, fetched=1040, max_post_id=1092, 846 в БД) |
| 2026-09-08 | own-content-hub: повторный approve-тест после async form | ✅ закрыта | 2026-09-09 (реальный approve 136,137 через publisher-service) |
| 2026-09-08 | VESTI_BOT_TOKEN (реальная публикация) | ✅ закрыта | 2026-09-09 (тестовый пост message_id=2) |
| 2026-09-09 | publisher-service: OpenSpec change (proposal/design/spec/tasks), validate | ✅ закрыта | 2026-09-09 |
| 2026-09-09 | publisher-service: FastAPI-микросервис services/publisher/ (publish/healthz/views) | ✅ закрыта | 2026-09-09 (healthz ok, реальный publish message_id=2) |
| 2026-09-09 | publisher-service: web переключён на HTTP-клиент (publisher_client.py) | ✅ закрыта | 2026-09-09 |
| 2026-09-09 | publisher-service: Docker (compose up) + healthcheck | ✅ закрыта | 2026-09-09 (vesti-publisher Up healthy, healthz: bot/proxy/channels ok) |
| 2026-09-09 | Реальный approve через веб (сквозной путь с микросервисом) | ✅ закрыта | 2026-09-09 (посты 136,137 → @dedinit_vesti, tg_message_id 3,4) |
| 2026-09-09 | Web-фиксы: 500 /candidates (raise RedirectResponse) + tg_message_id для внешних | ✅ закрыта | 2026-09-09 |
| 2026-09-10 | Медиа в Docker: publisher маунт ../../media/media:/srv/publisher/media | ✅ закрыта | 2026-09-10 (контейнер пересобран, healthy) |
| 2026-09-10 | Веб :8400 перезапущен (после падения); юнит vesti-web.service | ✅ закрыта | 2026-09-10 (запущен; юнит подхватится при перезагрузке — daemon-reload зависает на bigbox) |
| 2026-09-10 | Cron per-source + тихий watchdog | ✅ закрыта | 2026-09-10 (crawler */30, watchdog */15; no_agent, тихие) |
| 2026-09-10 | Классификатор по неклассифицированным (870 постов) | ✅ закрыта | 2026-09-10 (обработано 870, классифицировано 391: 389 LLM + 2 словарь; 479 нерелевантных без direction) |
| 2026-09-10 | PRD v0.2 — актуализация под текущее состояние | ✅ закрыта | 2026-09-10 |
| 2026-09-11 | Web-замечания пользователя: unpkg/CDN, сырой markdown, даты ISO, ожидание CDN при фильтрации | ✅ закрыта | 2026-09-11 (4 openspec change) |
| 2026-09-11 | Веб доступен снаружи: vesti.nixg.ru через Caddy VPS02 | ✅ закрыта | 2026-09-11 (reverse_proxy 10.8.0.2:8400, LE-серт) |
| 2026-09-11 | Change deexternalize-web-assets: убраны htmx/unpkg и bootstrap/jsdelivr (bootstrap локален) | ✅ закрыта | 2026-09-11 (0 внешних доменов, approve/reject POST-формами) |
| 2026-09-11 | Change web-render-markdown: markdown-рендер (Python-Markdown, XSS-safe) | ✅ закрыта | 2026-09-11 (фильтр markdown, кандидаты+опубликованные) |
| 2026-09-11 | Change web-format-datetime: даты ЧЧ:ММ ДД.ММ.ГГГГ вместо ISO | ✅ закрыта | 2026-09-11 (фильтр dt, candidates/published/metrics) |
| 2026-09-11 | Change web-list-filter-no-js: фильтрация GET-формами без JS/CDN | ✅ закрыта | 2026-09-11 (кнопка «Применить», без ожидания CDN) |
| 2026-09-11 | Баг бандлов: двойной слэш /bundle//opt/vesti/... в published | ✅ закрыта | 2026-09-11 (create_bundle → относительный путь, 4 строки БД обновлены) |
| 2026-09-11 | AGENT.MD — правила проекта (все изменения через OpenSpec) | ✅ закрыта | 2026-09-11 |
| 2026-09-09 | git-репозитории (gitverse истина, gitea зеркало) — /opt/vesti НЕ git-репо | ✅ закрыта | 2026-09-13 (дубликат строки ниже: git init + коммит, gitverse kpa39l/vesti, gitea зеркало 8h) |
| 2026-09-08 | openspec archive web-изменений + own-content-hub + publisher-service (после подтверждения) | ✅ закрыта | 2026-09-16 (архивированы 14 change-ов: 12 веб/фиксы+crawler-queue + own-content-hub + publisher-service; спеки влиты в openspec/specs) |
| 2026-09-13 | После перезагрузки не поднялся веб :8400 (юнит vesti-web был disabled) + publisher возвращён с user-юнита на Docker | ✅ закрыта | 2026-09-13 (vesti-web enabled; docker compose up -d --build; vesti-publisher healthy; watchdog переписан на docker-проверку) |
| 2026-09-13 | Бэкап VESTI на Яндекс.Диск (по аналогии icq/netbox) | ✅ закрыта | 2026-09-13 (backup.sh + backups/ + ЯД vesti-backups, cron root 45 2) |
| 2026-09-13 | approve → 500 (UnboundLocalError 'dirn' в web/app.py) | ✅ закрыта | 2026-09-13 (change fix-approve-dirn; dirn/lang перенесены до использования; 303 вместо 500) |
| 2026-09-13 | Медиа в карточках новостей не отображаются | ✅ закрыта | 2026-09-13 (change web-media-preview; роут /media/{filename} + превью img/video в candidates/published; клик → полноразмер в новой вкладке) |
| 2026-09-13 | Пост без классификации: на карточке значок «?» — понять его роль; если классификации нет — дать возможность вручную указывать/изменять/добавлять направление при анализе | 🔵 открыта | |
| 2026-09-13 | git-репозиторий /opt/vesti (gitverse истина, gitea зеркало) | ✅ закрыта | 2026-09-13 (git init + commit; gitverse kpa39l/vesti main; gitea estorozhenko/vesti mirror 8h; .gitignore: backups/media/db/bundles/logs исключены) |
| 2026-09-13 | Интерфейс кандидатов: разделить окно на 2 панели — слева список кандидатов, справа меню действий с постом (опубликовать / отклонить / переклассифицировать / переписать новость под себя), ниже блок для моего комментария, потом оригинальный пост со всеми медиа | 🔵 открыта | (зафиксирована, проработать подробности) |
| 2026-09-13 | Контент-стратегия: не перепубликовать чужие новости, а публиковать переписанные от себя (персональный контент, добавление ценности). Связано с «переписать новость под себя» в интерфейсе кандидатов — нужна генерация пересказа через LLM + редактирование перед публикацией | ✅ закрыта | 2026-09-15 (change rewrite-as-author: textarea редактируема + кнопка сохранения; публикация идёт с пересказом от имени @dedinit) |
| 2026-09-13 | Извлечение источников новостей из полученных постов (каналы/сайты, откуда пришли новости) — чтобы в следующий раз забирать новости напрямую из источника. ДОПОЛНЕНИЕ: возможно стоит разработать сервис поиска источников в интернете (если источник не указан) и ДООБОГАЩАТЬ карточки кандидатов, но — чтобы не тратить лишние деньги — ТОЛЬКО для одобренных кандидатов. Пайплайн: отбор новостей из списка кандидатов → в «выбранные» → обработка/дообогащение/переписывание при необходимости → публикация | 🔵 открыта | (зафиксирована, проработать) |
| 2026-09-13 | OpenSpec change gotosocial-publisher: proposal/design/tasks/specs/gotosocial-publisher, validate чисто | ✅ закрыта | 2026-09-13 (архивирован как 2026-09-13-gotosocial-publisher, delta влита в specs/gotosocial-publisher/spec.md) |
| 2026-09-13 | Аккаунт-бот vesti на GtS (admin account create, confirmed+approved, admin=0) — публиковать НЕ от kpa39l | ✅ закрыта | 2026-09-13 (авто-подтверждение; токен в .env GT_SOCIAL_ACCESS_TOKEN) |
| 2026-09-13 | OAuth-приложение vesti-publisher (POST /api/v1/apps, scopes write write:media) + user-токен vesti (вставка в tokens, user_id из users) | ✅ закрыта | 2026-09-13 (client_id=01B09QNDM9YQ2VQVSRXHCVAV6K; verify_credentials → username=vesti) |
| 2026-09-13 | publisher: модуль gotosocial.py (httpx: post_status/upload_media/verify_credentials/delete_status), config gt_social*, channels gt:, main.py _publish_gotosocial + healthz + dry_run | ✅ закрыта | 2026-09-13 (реальные тесты: текст, медиа, delete; status_id ULID; канал @vesti@dedinit.ru) |
| 2026-09-13 | Доки + git + backup по gotosocial-publisher (STATUS/WALKTHROUGH/.env.example; коммиты bf176cc, 6b955aa на gitverse) | ✅ закрыта | 2026-09-13 (backup.sh в фоне — уведомление отдельно) |
| 2026-09-13 | Пометить аккаунт vesti как bot (PATCH /api/v1/accounts/update_credentials bot:true или actor_type Service) | 🔵 открыта | (косметика, не критично) |
| 2026-09-13 | Фан-аут направлений → каналы (в т.ч. fediverse-каналы по направлениям) | 🔵 открыта | (расширение публикации) |
| 2026-09-13 | Отдельная страница управления источниками новостей: отображение / добавление / удаление / редактирование, фильтр по типу источника (Telegram, RSS, почтовая рассылка, прямые новости с сайтов, Twitter и т.п.) | ✅ закрыта | change sources-admin; /sources + CRUD (add/edit/toggle/delete), yaml — источник истины |
| 2026-09-14 | Метрики: добавить инсайты — сколько в день новых постов получено / одобрено / опубликовано, по аналогии с существующими карточками метрик; плюс за неделю и месяц (итого 9 карточек: день/неделя/месяц × новые/одобрено/опубликовано) | 🔵 открыта | (задача на потом, просто зафиксировать) |
| 2026-09-15 | rss-crawler: OpenSpec change (proposal/design/tasks/spec), код rss_crawler.py, lwn | ✅ закрыта | change rss-crawler |
| 2026-09-15 | rss-crawler: cron vesti-rss-crawler (каждые 15 мин, no_agent, тихий) | ✅ закрыта | cron fa60bc830843 |
| 2026-09-15 | rss-crawler: собрать первые RSS-посты (15, lwn) | ✅ закрыта | 2026-09-15 |
| 2026-09-15 | rss-crawler: веб-скедулинг RSS (кнопка запуска краулера в админке) | 🔵 открыта | (зафиксирована, проработать) |
| 2026-09-15 | crawler-очередь: отдельная страница /crawlers — статус работы краулеров (alive/dead, last_fetch, ошибки) и размер очереди. Двухфазный сбор: (1) краулеры проходят по источникам и ищут новые кандидаты, (2) найденные кладутся в очередь, (3) воркеры разбирают очередь в несколько потоков | ✅ закрыта | change crawler-queue; /crawlers, worker.py (ThreadPoolExecutor) |
| 2026-09-15 | Кнопки правой панели: «Обработать моделью / Переписать / Отклонить» — ОДИН ряд НАД полем комментария | ✅ закрыта | change candidates-buttons-order (коммит 562d787) |
| 2026-09-15 | После «🚫 Отклонить» оставаться на странице кандидатов в текущей группировке (не уходить в отклонённые) | ✅ закрыта | change reject-stay-candidates (коммит 562d787) |
| 2026-09-15 | Флаг прочитанности: непрочитанные карточки жирные, открытый пост — светло-голубая заливка, дефолтная группировка по дате | ✅ закрыта | change candidates-read-flag (коммит c09dff0) |
| 2026-09-15 | «✅ Опубликовать» — НИЖЕ поля комментария рядом с «💾 Сохранить комментарий»; оригинальный пост растянут на всю высоту панели | ✅ закрыта | коммит b542e9b |
| 2026-09-15 | Пайплайн «Кандидаты → Отобранные → Опубликованные»: статус selected, /selected отдельный список, в кандидатах только «⭐ Отобрать», вся обработка в отобранных, классификация по кнопке | ✅ закрыта | change selected-list (коммит ae8af8d) |
| 2026-09-15 | Подготовка своего поста в «Отобранных»: поле «✍️ Мой пост» (rewritten_text всегда видно) рядом с оригиналом — черновик «Переписать» редактируется и публикуется | ✅ закрыта | change selected-list (коммит ae8af8d) |