Выявлено Codex при ревью #1253 (#1239 идемпотентная публикация). PR #1253 вводит metadata.unconfirmed_targets: если отправка в Telegram таймаутит ПОСЛЕ ухода запроса, цель помечается «unconfirmed» и НЕ переотправляется при ретрае (защита от дубля) — вместо этого сюрфейсится как «Unconfirmed delivery — manual check required».
Проблема (follow-up, вне scope #1253)
Нет operator-facing пути снять/разрешить unconfirmed-статус. Цель застревает в unconfirmed_targets навсегда: если пост НЕ дошёл — он никогда не будет опубликован (нет resend), если дошёл — статус не снять. Run остаётся status="completed" и фактически неопубликованным без пути вперёд.
Что сделать
Добавить operator-путь (CLI + Web + agent-tool, по правилу parity), позволяющий по run.id + цели:
- пометить unconfirmed-цель как delivered (пост подтверждён вручную в канале) → перевести в published_targets;
- ЛИБО пометить как failed/eligible-for-resend (пост НЕ дошёл) → убрать из unconfirmed, разрешить повторную публикацию.
Файлы
src/services/publish_service.py (unconfirmed_targets lifecycle)
- CLI
src/cli/commands/pipeline.py, Web src/web/.../moderation.py, agent-tool src/agent/tools/pipeline_runs.py (parity)
Оценка
- LOC: ~150–350 (parity 3-4 слоя + tests)
- Размер: M–L
- Время (агент): ~50–90 мин
Выявлено Codex при ревью #1253 (#1239 идемпотентная публикация). PR #1253 вводит
metadata.unconfirmed_targets: если отправка в Telegram таймаутит ПОСЛЕ ухода запроса, цель помечается «unconfirmed» и НЕ переотправляется при ретрае (защита от дубля) — вместо этого сюрфейсится как «Unconfirmed delivery — manual check required».Проблема (follow-up, вне scope #1253)
Нет operator-facing пути снять/разрешить unconfirmed-статус. Цель застревает в
unconfirmed_targetsнавсегда: если пост НЕ дошёл — он никогда не будет опубликован (нет resend), если дошёл — статус не снять. Run остаётсяstatus="completed"и фактически неопубликованным без пути вперёд.Что сделать
Добавить operator-путь (CLI + Web + agent-tool, по правилу parity), позволяющий по run.id + цели:
Файлы
src/services/publish_service.py(unconfirmed_targets lifecycle)src/cli/commands/pipeline.py, Websrc/web/.../moderation.py, agent-toolsrc/agent/tools/pipeline_runs.py(parity)Оценка