Phase 2 — Two-Pass + Scheduling

Digest System · feed-gathering
Дешёвый классификатор отсекает шум. Scheduler запускает дайджесты автоматически.
Cross-run dedup предотвращает дубликаты между прогонами.
Нажми на карточку чтобы раскрыть детали
1

2.1 Pass 1 Classifier

Дешёвая модель (Haiku) фильтрует треды перед дорогой экстракцией

Что делает:

  • Каждый реконструированный тред → быстрая классификация: interesting: true/false
  • Дополнительно: primary_kinds (prompt, config, troubleshoot...) и profile_routing
  • Используется DIGEST_CLASSIFY_MODEL (Haiku-class, ~10x дешевле Sonnet)

Как работает:

  • Батч-классификация: несколько тредов в одном промпте (экономия на round-trips)
  • Thread summary = первое сообщение + последнее + кол-во участников + feature flags
  • Не отправляем полный контент тредов — только метаданные и краткое содержание
  • Bias к interesting=true если есть has_code_block или reaction_count > 3

Целевые метрики:

  • Elimination rate: ≥50% тредов отсекается (типично 70-90% шум)
  • False negative rate: <5% на gold set (лучше потратить токены, чем потерять контент)
app/digest/classify.py
2

2.2 Profile Routing

Тред → профиль: каждый тред получает свой prompt supplement

Сейчас:

  • Один профиль на все треды в канале — все получают одинаковый prompt supplement

После:

  • Classifier определяет profile_routing per thread
  • Map prompt получает правильный supplement для конкретного типа контента
  • Per-channel override: discord_channel.digest_profile_id → приоритет
  • Server-level fallback: discord_server.digest_profile_id
  • Если classifier не определил — используется default канала/сервера
app/digest/profiles.pyapp/digest/pipeline.py
3

2.3 Cross-Run Dedup

RAG-for-extraction: inject known items чтобы LLM не переизвлекал

Перед каждым extraction run:

  • Достать top-K существующих knowledge items из discord_digest по embedding similarity к incoming тредам
  • Inject в map user prompt как "already-known items"
  • LLM видит что уже извлечено → возвращает update_of / supersedes вместо re-extract

Post-extraction dedup:

  • Pointer items: exact match на {message_id, char_start, char_end} → skip
  • Synthesized items: embedding similarity > threshold + overlapping citations → merge
  • Entity-aware: same entity_refs + same kind + high similarity → merge с version tracking
  • Idempotency: extraction_window_id — re-processing replaces, not appends

Embedding provider:

  • CLIProxy embedding endpoint или dedicated embedding model
app/digest/dedup.py
4

2.4 Digest Scheduler

Автоматический запуск дайджестов рядом с gather loop

Как работает:

  • _digest_loop() в app/scheduler.py рядом с _gather_loop()
  • Tick каждые 5 минут: проверить last_digested_at + digest_schedule_minutes
  • Создать pending digest job для due каналов
  • Runner из Phase 1 подхватывает и выполняет

Конфигурация (per channel):

  • digest_enabled: bool — default false, opt-in
  • digest_schedule_minutes: int — default 1440 (ежедневно)

Защиты:

  • Не создавать job если уже есть pending/running для этого канала
  • Wake signal: asyncio.Event для instant trigger (как у gather)
app/scheduler.py
5

2.5 Cost Tracking

Метрики per run в discord_digest_job

Поля в job:

  • chunks_processed: int
  • items_extracted: int — все типы (decisions + actions + knowledge + questions + topics + links + artifacts)
  • pass1_eliminated: int — сколько тредов Pass 1 отсёк
  • validation_failures: int

Примечание:

  • Token usage и cost — на стороне CLIProxy, не дублируем
  • wall_clock_seconds вычисляется из completed_at - started_at
  • Частично уже реализовано в Phase 1, тут — убедиться что все поля заполняются
app/digest/pipeline.py
6

2.6 Тесты

Classifier recall, dedup edge cases, scheduler integration

Тест-файлы:

  • test_digest_classify.py — classifier возвращает корректные interesting флаги, bias к true на code/workflow/reactions, batch classification
  • test_digest_dedup.py — pointer exact match dedup, embedding similarity merge, entity-aware merge, idempotency on re-run
  • test_digest_scheduler.py — digest loop scheduling, digest_enabled respected, no duplicate jobs, wake signal
tests/test_digest_classify.py tests/test_digest_dedup.py tests/test_digest_scheduler.py
Классификация
Дедупликация
Планировщик
Метрики
Тесты

✅ Exit Criteria

Scheduler автоматически создаёт digest jobs для enabled каналов.
Pass 1 отсекает ≥50% тредов. Cross-run dedup не даёт дублировать knowledge items.
Все метрики заполняются в discord_digest_job.

← Назад к общему плану · GitHub Issue #10