- шесть записей по кластерам причин: журнал под внешним значением, нулевой код ответа в журнале, затирание вложения бедным ответом, открытый анониму адрес подтверждения почты, рубеж расшифровки без работы, пределы длительности - находка про код 500 у отказа приёма дописана в json-api-for-spa: там живёт единая точка отображения доменной ошибки - telegram-account-link и bot-api-only-through-bot-client оставлены с оговоркой, что предмета у них нет до возвращения входа
4.8 KiB
🐞 Не затирать сохранённое вложение более бедным ответом
- Тип: fix
- Категория: Очередь — Заведена урожаем ревью и встала в конец машинально: место в плане стройки назначает человек.
- Зачем: Пустой ответ распознавателя сохранённое больше не стирает, а более короткий — стирает: вложение заменяется, и пересчитать архив становится нечем.
- Теги: review-2026-08-15
Сохранённый ответ провайдера заменяется только тем, что не беднее прежнего.
Задача remove-telegram-intake закрыла половину этого класса: текст и структура
реплик пустым больше не затираются, и норма записана требованием спеки хранилища
«Пустой результат не кладётся поверх сохранённого». Сырой ответ провайдера
защищён только от пустого — условием на непустую длину; ответ не пустой, но
короче прежнего, проходит это условие и заменяет сохранённое.
Цена именно у вложения самая высокая. Оно единственное, из чего архив пересчитывается без повторной оплаты: решение хранить его дословно записано ADR-2026-08-14-provider-payload-stored-verbatim, и обещание там прямое — «когда мы научимся размечать говорящих, архив пересчитается из сохранённого без единого рубля».
Воспроизведение
Повторный опрос одной операции наступает штатно: держатель захвата умер, сохранение рубежа отказало, человек снял признак остановки в панели.
Довести запись до сохранённого ответа, вернуть её на рубеж отправленной и
опросить снова, отдав со стороны провайдера ответ короче прежнего. Вложение
заменяется на короткое; прежнего не остаётся нигде. Оракул того же класса для
пустого ответа уже написан — TestEmptySecondAnswerKeepsArchivedText, — и этот
пишется по его образцу.
Затрагивает
- коллекция
recognitions, колонкаpayload— сохранённый ответ провайдера вложением; - спека
storage, требование «Пустой результат не кладётся поверх сохранённого» — норма расширяется с пустого на «беднее прежнего»; - определение «беднее»: длина в байтах либо число реплик разбора — выбирается задачей.
Критерии приёмки
- Более короткий ответ сохранённое вложение не заменяет. Оракул: проверка по
образцу
TestEmptySecondAnswerKeepsArchivedText— второй опрос отдаёт ответ короче, сохранённое вложение остаётся прежним, и проверка убеждается, что до второго обращения дело дошло. - Более полный ответ сохранённое заменяет. Оракул: та же проверка наоборот — второй ответ длиннее, вложение обновилось.
- Норма записана требованием спеки, а не только кодом. Оракул: правленое
требование
storageи ссылка на него из кода.
Рамки
Найдено прогоном ревью задачи remove-telegram-intake 2026-08-15, враждебный
проход, секция свойств без построенного пути: пустой случай доказан падающим
тестом и закрыт, этот — выведен из того же кода и оракула не имеет. Тексту и
структуре реплик защита уже стоит, трогать их не надо.