Files
healthlog/openspec/changes/archive/2026-08-02-otvet-i-svyortka/specs/parsing/spec.md
T
av 63bffe2865 Приём отвечает 200 до свёртки, свёртку ведёт фоновый воркер
- Очередью служит сама таблица: доставка ждёт свёртки в статусе `pending`,
  канал несёт только бит «есть работа». Переполнять нечего, падение процесса
  очередь не теряет, а подбор `pending` при старте — обычный проход воркера, а
  не отдельный код. Классификация исхода общая с пересборкой журнала.
- Исход разбора начал отражать доставку, а не обстоятельства: отмена и
  занятость базы статус не меняют (иначе конкуренция за базу выводила бы
  доставку из очереди навсегда), паника свёртки больше не валит процесс, а
  учёт доставки идёт через транзакцию с повторами.
- Длинный бюджет ответа выдан маршруту приёма, а не всему серверу:
  `write_timeout` в Go покрывает и чтение тела, и общий подъём снял бы защиту с
  остальных маршрутов.
2026-08-02 11:01:42 +03:00

1.1 KiB

MODIFIED Requirements

Requirement: Разбор не влияет на код ответа приёма

Система MUST сохранять правило «сохранили — значит приняли»: исход разбора не меняет код ответа на доставку.

Разбор идёт после ответа, поэтому исход виден не в ответе и не в момент ответа, а асинхронно — в delivery.parse_status и в записи лога. Когда именно отдаётся ответ и кто сворачивает принятое, определяет capability ingest; здесь нормируется только то, что от разбора код ответа не зависит.

Scenario: Содержимое не разобралось

  • WHEN тело сохранено в архив, но разбор его содержимого не удался
  • THEN ответ на приём остаётся 200
  • AND исход виден в delivery.parse_status и в записи лога