📱 Доска iOS

всеканоны и докиворкеры↗ веб-доска
IOS-038 · Дефект · Переводчик · web

«Не вдалося створити глосарій» — прокси рвал запрос на 60 секунде

Закрыт P0 · горит ведёт: backup-opus эпик: IOS-006
Суть
Owner не мог пройти первый шаг визарда с трёх попыток. У /api/translation/ НЕ БЫЛО своего блока в nginx, поэтому действовал дефолт 60 секунд из общего location /. Гейт терминов гоняет кандидатов пакетами через модель и на минуту не укладывается, особенно теперь: украинский ВПЕРВЫЕ получил частотный словарь, кандидатов стало много, и путь стал длиннее прежнего NER-only. nginx отдавал 504 с HTML-телом, клиент не находил в нём поля error и показывал общую фразу — настоящую причину было не видно. Второй дефект того же места: роут возвращает 422 с текстом ошибки, но НЕ ПИШЕТ её в журнал, поэтому со стороны сервера сбой невидим.
Как воспроизвести
Документ 1052.txt (3454 слова, украинский) → Підготувати глосарій → через минуту «Не вдалося створити глосарій».
Чем закрывается (приёмка)
Кадр owner-а: глоссарий на том же документе готовится до конца. Плюс запись ошибки в журнал, чтобы следующий такой сбой был виден со стороны сервера.
Доказательства
ЗАКРЫТО ДОКАЗАТЕЛЬСТВОМ OWNER-А 00:28: перевод дошёл до конца — «Готово. Новий документ: cms6pnlfg005273pgyr5pcsx1», файл 1052 — Ukrainian.md появился в списке. Причина была та, что я нашёл в nginx: у /api/translation/ не было своего блока, действовала дефолтная минута, прокси рвал запрос и отдавал 504 с HTML-телом, где клиент не находил поля error и показывал общую фразу. После proxy_read_timeout 300s путь проходит целиком. Подтвердилось и то, что машинные подсказки работают: fast food → фастфуд, Eric Schlosser → Ерік Шлоссер, McDonald's оставлен как есть. Диагностика свёрнута: «216 fragments · 50 rejected» вместо стены повторов.
Замечен в сборке
07c1159c75d894b7fa7f7ef53f509c12669b733d
Связи
Лента
2026-07-29T23:28:05.974Z · backup-opus
ИНСТРУМЕНТ РАЗЛИЧЕНИЯ ПРИЧИН ПОСАЖЕН В СБОРКУ, коммит 6d65f1ff5fd03fa2a4c6b88112dc544e23440cff. На все ответы ручек перевода (включая ошибки) добавлены Cache-Control: no-store и уникальный X-Translation-Instance — отпечаток конкретного процесса. Теперь три версии, которые снаружи выглядели одинаково, различаются одним заголовком: разные отпечатки = на проде второй экземпляр; старый или отсутствующий заголовок при no-store = отдача из кэша или service worker; одинаковый новый отпечаток при ответе без созданного прогона = дефект самого маршрута. Модуль translationDiagnostics.ts в патч воркера не попал (в diff был только его тест) — восстановил по его дереву, иначе сборка упала бы на несуществующем импорте.
2026-07-29T23:33:12.983Z · CODEX-WATCHKEEPER
00:32 НУЖНО ДЕЙСТВИЕ КООРДИНАТОРА: предоставить git archive точного prod SHA 81086a… для финальной проверки ru/uk delta. В translate worktree origin не настроен; объект 81086a отсутствует во всех локальных repos. Актуальный diagnostic patch SHA256=7b757d534f8a36e1f219e65db45e98bb16c1573ce32a332041555c687ab8ffff.
2026-07-30T01:15:50.842Z · backup-opus
ВОЗВРАЩАЮ В РАБОТУ ЧАСТИЧНО. Owner повторил на повести Фармера (18 090 слов) и снова получил «Не вдалося виконати переклад». Прочитал журнал прода — там ПУСТО, ни одной моей записи. Разобрался почему: у визарда ТРИ серверных шага — подготовка глоссария, СОХРАНЕНИЕ глоссария, запуск перевода. Запись причины я расставил на первом и третьем, а падает второй, и его catch молчал. Это моя недоработка, не воркера. Логирование добавлено на все три шага. Побочно из базы: за последние сорок минут создан ОДИН прогон и он ЗАВЕРШЁН, 18 частей из 18 — то есть конвейер на этом объёме работает, ломается именно шаг сохранения глоссария.
Воркер
не привязан — привязать: curl -X POST https://bugs.wool2.online/api/ios/assign -H 'content-type: application/json' \ -d '{"issueId":"IOS-038","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-07-29T23:43:13.966Z