Skip to content

3. удалить мёртвый REST interop-контур /api/tasks (решение по #1416) #1431

Description

@axisrow

Решение принято: контур удаляется

Это был главный вопрос исходного issue #1416 («остаётся ли REST актуальным
планом или отказываемся»). Решение владельца (2026-08-29): удалить.

Обоснование

Целевая архитектура: мессенджер — независимый TUI-проект, фабрика
переиспользует его код (вызов функции в своём процессе), а сам мессенджер
только принимает и отправляет сообщения — он не исполнитель поручений.

Внешнего процесса-исполнителя в схеме нет. Четыре типа задач (dm_reply,
chat_answer, fetch_dialogs, fetch_history) описывают поручения тому,
кому больше не поручают.

Дополнительные подтверждения

  • Никогда не работал: клиент мессенджера бьёт в /tasks, фабрика монтирует
    /api/tasks → 404. Живой прогон из критериев приёмки Интероп с tg_messenger: REST API задач + типы dm_reply/chat_answer #829 не выполнялся.
  • Ни один компонент фабрики не создаёт такие задачи (проверены все 8 вызовов
    create_generic_task).
  • Payload-модели нигде не инстанцируются — REST хранит тело как сырой dict
    (tasks.py:78).
  • Клиентская половина заброшена: ноль коммитов в interop/ мессенджера
    с 20.06.2026 (сам проект жил до 14.08.2026).
  • Нет lease/orphan recovery — задача упавшего воркера зависает навсегда
    (tasks.py:97-103, осознанно отложено).
  • Нерешённая проблема дублирующей отправки: Interop: add idempotency support for /tasks and /tasks/claim (companion to tg_messenger#228) #1407.

Что НЕ затрагивается

Обратное направление — самостоятельный мессенджер спрашивает фабрику (поиск
по архиву). Это обычный read-only запрос, а не очередь задач. Клиент
factory_search в мессенджере продолжает работать.

Состав удаления

  • src/web/routes/tasks.py — файл целиком (155 строк)
  • Регистрация роутера: src/web/assembly.py:158, :181
  • src/models.py: 4 значения CollectionTaskType (:274-282),
    EXTERNAL_INTEROP_TASK_TYPES (:285-295), 4 payload-модели (:529-583),
    фрагменты докстрингов (:255-261, :590-591)
  • Тесты целиком: tests/test_interop_task_types.py (68),
    tests/routes/test_tasks_api.py (119),
    tests/routes/test_tasks_api_concurrency.py (82)

Осиротеет и требует решения:

  • required_status в src/database/repositories/collection_tasks.py:379-380, 384-386, 428-430 — единственные вызывающие это tasks.py:135,150.
    После удаления не останется ни одного.

Оставить:

  • Колонка result_payload (schema.py:112, миграция migrations.py:81-82) —
    уже в существующих БД, удалять из схемы рискованно.
  • src/web/app.py:341-346 — исключение session-cookie для /api/*. Правило
    безвредно и защитит будущие API.

Документация — 4 файла, где /api/tasks заявлен как единственный
полноценный REST-контур проекта:

  • docs/feature-map.md:17,25,448
  • docs/parity-matrix.md:16,30,47,177
  • docs/index.md:46

Формулировка «пять поверхностей» схлопывается: FastAPI остаётся только
parity-зеркалами.

Acceptance Criteria

  • Роутер, типы задач, payload-модели и три файла тестов удалены полностью.
  • required_status — решено явно: удалён вместе с контуром либо оставлен
    с обоснованием. Не оставлять молча мёртвым.
  • result_payload и правило session-cookie оставлены (см. выше).
  • Документация приведена в соответствие (4 файла).
  • Interop: add idempotency support for /tasks and /tasks/claim (companion to tg_messenger#228) #1407 закрыт как неактуальный со ссылкой на это решение;
    companion tg_messenger#228 — уведомить.
  • Полный прогон тестов зелёный; lint-imports зелёный.
  • Мессенджер: interop/worker.py, interop/factory_client.py и CLI-команда
    worker — решить отдельно на его стороне (не блокирует эту задачу).
    factory_search сохранить.

Контекст

Этап 3 эпика #1416 — ответ на главный вопрос исходного issue.
Связано: #829/#960/#961 (создание контура), #1407 (идемпотентность).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    tech-debtСнижение техдолга

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions