Родитель: #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.
Родитель: #1174 (эпик batch-устойчивости). Phase 3 из 3 — последняя, после Phase 2. Автор допускает 1-2 PR.
Что сделать
Resumable batch по образцу photo_batch (per-item ledger + atomic claim + crash-safe resume):
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).DialogBatchService(новый): создаёт batch+items, atomic-claim due item (PENDING→RUNNING), обрабатывает по одному с flood-retry (Phase 1) + warm-resolve, пишет per-item статус. Resume на старте подбирает незавершённые.Файлы
src/models.py(модели batch/item)src/database/schema.py+src/database/migrations.pysrc/services/dialog_batch_service.py(новый)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)Тесты
:memory:; e2e через очередь.Оценка
ci.yml. Контракт-гарды: PUBLIC_CONTRACT, cli_agent_parity, tool_permissions_snapshot.