Skip to content

Phase 3: resumable dialog-batch по образцу photo_batch (таблицы+сервис) #1178

Description

@axisrow

Родитель: #1174 (эпик batch-устойчивости). Phase 3 из 3 — последняя, после Phase 2. Автор допускает 1-2 PR.

Что сделать

Resumable batch по образцу photo_batch (per-item ledger + atomic claim + crash-safe resume):

  • 3.1 Схема: dialog_batch_operations (id, phone, op_type, status, created/finished) + dialog_batch_items (batch_id, phone, dialog_id, channel_type, status pending/running/completed/failed, error, attempts). Миграция в src/database/migrations.py (ALTER/create по паттерну _migrate).
  • 3.2 Сервис DialogBatchService (новый): создаёт batch+items, atomic-claim due item (PENDING→RUNNING), обрабатывает по одному с flood-retry (Phase 1) + warm-resolve, пишет per-item статус. Resume на старте подбирает незавершённые.
  • 3.3 Wiring: web/CLI/agent ставят batch (возвращают batch_id), прогресс читается из БД (без гонок кэша). Parity всех поверхностей.

Файлы

  • src/models.py (модели batch/item)
  • src/database/schema.py + src/database/migrations.py
  • src/services/dialog_batch_service.py (новый)
  • repo (dialog_loader/аналог), web/CLI/agent-tool, тесты

Эталон (готовый надёжный batch)

  • src/services/photo_task_service.py:52-169 (per-item прогресс)
  • src/database/repositories/photo_loader.py:274-321 (atomic claim PENDING→RUNNING)
  • модель PhotoBatchItem (src/models.py:952)

Тесты

  • crash-resume: прервать mid-batch → перезапуск добирает остаток;
  • idempotency: повтор не трогает completed;
  • partial-failure учтён;
  • миграция без потерь на :memory:; e2e через очередь.

Оценка

  • LOC > 1200 (новый компонент: таблицы + миграция + сервис + parity web/CLI/agent + crash-resume тесты)
  • Размер: XXL
  • Минуты: 200–280 (+30% новый agent-tool гейты/снапшот, +20% claim-гонка concurrency-тесты)
  • Приоритет: medium
  • ⚠️ Кандидат на дробление при реализации: 3.1+3.2 (ядро) отдельным PR, 3.3 (wiring/parity) вторым.

⚠️ Не трогать ci.yml. Контракт-гарды: PUBLIC_CONTRACT, cli_agent_parity, tool_permissions_snapshot.

Metadata

Metadata

Assignees

No one assigned

    Labels

    priority/mediumСредний приоритет

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions