Files
Deal/.superpowers/sdd/channel-discovery/task-1-report.md
T
Rustam Khalimov 27c7831910
ci / build-test (push) Canceled after 0s
Deal — единая кодовая база
SaaS-мониторинг Telegram: ядро (модули Cards/Kanban/Pipeline/Tenants/Settings/
Discovery, Api, Infrastructure), сервисы telegram/ai/ml/storage, фронт Vue,
контракты и grpc-hosting, деплой-конфиги (dev/prod/observability/CI-раннер),
Gitea Actions CI, документация (ТЗ, техдок, api-map, код-стайл, планы, бэклог).

Текущее состояние: все этапы роадмапа 0–12 закрыты, сборка 5 sln 0/0,
тесты 1340/130/52/38/9 зелёные.
2026-09-11 23:56:47 +03:00

5.5 KiB
Raw Blame History

Task 1 — Отчёт: Схема БД и настройки по умолчанию (Discovery)

Статус: DONE

Что сделано по шагам

Step 1: Таблицы в _SCHEMA (backend/app/db.py)

Добавлены перед таблицей settings (текст SQL — дословно из брифа):

  • disc_tasks — задачи поиска каналов (статус, прогресс, план);
  • disc_candidates — найденные кандидаты (оценки, статус);
  • disc_blacklist — чёрный список;
  • disc_log — лог событий по задаче;
  • индексы idx_disc_cand_task (candidates: task_id, status) и idx_disc_log_task (log: task_id, created_at).

⚠️ ВАЖНО (поймано при проверке): _SCHEMA исполняется по фрагментам через split(";"), поэтому в ---комментариях над таблицами не должно быть точки с запятой. Первая версия комментария содержала «;» внутри строки комментария — приложение падало на старте (Parser Error: syntax error at or near "столбцы"). Исправлено переформулировкой комментария без ;. Inline-комментарии внутри строк CREATE TABLE (из брифа, напр. -- draft|running|...) безопасны — в них ; нет.

Step 2: Настройки в DEFAULT_SETTINGS (backend/app/constants.py)

Добавлены в конец словаря (дословно из брифа):

# поиск каналов (Discovery)
"discJoinLimit": 50,        # суточный лимит авто-вступлений (общий)
"discJoinDelayMin": 50,     # сек, нижняя граница паузы между авто-вступлениями
"discJoinDelayMax": 70,     # сек, верхняя граница
"discEvalSample": 10,       # размер выборки сообщений при оценке
"discEvalThreshold": 40,    # % подходящих сообщений

Step 3: Публичные ключи и клампы (backend/app/routers/settings_routes.py)

  • В _PUBLIC_INT добавлены: discJoinLimit, discJoinDelayMin, discJoinDelayMax, discEvalSample, discEvalThreshold.
  • В patch_settings (по образцу существующих клампов archiveAfterDays/minLen):
    • discJoinLimit → 1..200;
    • discJoinDelayMin / discJoinDelayMax → 5..600;
    • discEvalSample → 3..30;
    • discEvalThreshold → 1..100.

Step 4: Проверка

Выполнена (вывод ниже).

Изменённые файлы

  • backend/app/db.py
  • backend/app/constants.py
  • backend/app/routers/settings_routes.py

Вывод проверок

1. py_compile

$ cd /c/telbase && python -m py_compile backend/app/db.py backend/app/constants.py backend/app/routers/settings_routes.py
PY_COMPILE_OK   # без ошибок

2. Пересборка и запуск контейнера

$ docker compose build app && docker compose up -d app
[+] build 1/1  ✔ Image telbase-app Built    (первый запуск упал — см. Concern/Фикс)
[+] up 3/3
 ✔ Container leadradar-ml    Running
 ✔ Container leadradar-minio Running
 ✔ Container leadradar       Started

Логи контейнера после фикса:

INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000 (Ctrl+C to quit)

3. API

POST /api/auth/login {"login":"admin","password":"admin"} → login status: 200
GET  /api/settings →
settings: {"discJoinLimit": 50, "discJoinDelayMin": 50, "discJoinDelayMax": 70,
           "discEvalSample": 10, "discEvalThreshold": 40}

Все пять ключей присутствуют и равны значениям по умолчанию. ✔

Дополнительно

  • Попытка прямой проверки таблиц в DuckDB вторым процессом (duckdb.connect(..., read_only=True)) не удалась ожидаемо: DuckDB — одна запись, лок держит процесс приложения (Conflicting lock is held... PID 1). Косвенное подтверждение: _SCHEMA исполняется в store.init() при старте и падает loudly (первый запуск упал с Parser Error — это и выявило баг), а финальный старт чистый.

Concerns

  1. ; в ---комментариях _SCHEMA опасен — пайплайн split(";") режет схему посередине комментария. В добавленном блоке таких мест больше нет, но при будущих правках схемы стоит избегать ; в комментариях.
  2. Клампы discJoinDelayMin/discJoinDelayMax независимы (оба 5..600) — нет перекрёстной проверки min <= max (в брифе её не требовалось).
  3. Прямой SQL-запрос к таблицам извне невозможен при запущенном приложении (лок DuckDB); фактическое наличие таблиц подтверждено чистым стартом и прохождением всей схемы в store.init().