From 1479d10d4cded9888a8265d4cb8d0d8bc7a1be9e Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Mon, 10 Aug 2026 12:16:58 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B7=D0=B0=D0=BA=D1=80=D1=8B=D1=82=D0=B0=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=20long-title-to-review?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tasks/BACKLOG.md | 1 - tasks/items/long-title-to-review.md | 72 ----------------------------- 2 files changed, 73 deletions(-) delete mode 100644 tasks/items/long-title-to-review.md diff --git a/tasks/BACKLOG.md b/tasks/BACKLOG.md index 8cbc3fb..6513e45 100644 --- a/tasks/BACKLOG.md +++ b/tasks/BACKLOG.md @@ -13,7 +13,6 @@ ## Ядро продукта -- [🐞 Отправлять на ревью раздачу с непомещающимся именем вместо отказа](items/long-title-to-review.md) — название длиннее ~237 байт роняет раскладку в failed с текстом системной ошибки: пользователь видит «file name too long» вместо карточки ревью, где это чинится подсказкой - [🔬 Форма ответа поиска TheTVDB и семантика параметра language](items/tvdb-search-response-live-check.md) — форма ответа поиска TheTVDB принята по swagger 4.7.10 и живым прогоном не подтверждена — при иной форме разбор молча уходит в фолбэк, гейт зелёный, локализованное название не работает - [✨ Узаконить confidence-гейт авто-раскладки в спеке и сделать его выключаемым (дефолт 0.7)](items/auto-link-confidence-gate.md) — Решено (B): гейт оставляем как доп. проверку на ревью — выключаемый порог, дефолт 0.85→0.7, записать в спеку - [✨ Пересчитывать абсолютную нумерацию аниме в SxxEyy](items/anime-absolute-numbering.md) — аниме со сквозной нумерацией (#137) не раскладывается в SxxEyy, который ждёт Jellyfin — нужен пересчёт абсолютной нумерации diff --git a/tasks/items/long-title-to-review.md b/tasks/items/long-title-to-review.md deleted file mode 100644 index e5f3d11..0000000 --- a/tasks/items/long-title-to-review.md +++ /dev/null @@ -1,72 +0,0 @@ -# 🐞 Отправлять на ревью раздачу с непомещающимся именем вместо отказа - -- **Тип:** fix -- **Категория:** Ядро продукта — тот же урожай ревью и тот же стык «название → компонент пути»: вторая после первой дешевле -- **Зачем:** название длиннее ~237 байт роняет раскладку в failed с текстом системной ошибки: пользователь видит «file name too long» вместо карточки ревью, где это чинится подсказкой - -Длина компонента пути ограничена файловой системой (255 байт на имя, минус -расширение и суффиксы — практический потолок около 237). Название такой длины -приходит из метабазы или из распознавания штатно: длинные оригинальные заголовки -и сериалы с подзаголовком в имя укладываются не всегда. - -Сегодня это не проверяется нигде: раскладка доходит до `link(2)`, получает от ядра -`file name too long`, и задача уходит в `failed` с текстом системной ошибки в -поле ошибки. Для владельца это тупик — состояние терминальное, а причина написана -языком ядра. - -Правильный исход — **review**: там человек правит название подсказкой, ровно как -при коллизии цели. Коллизия уже так и обрабатывается, то есть путь в системе -есть и его надо переиспользовать, а не изобретать. - -Провенанс: ревью изменения `tvdb-title-locale`, находка AD4 — -[отчёт триажа](../../openspec/changes/archive/2026-08-07-tvdb-title-locale/review/report.md). -Понижена там не по доказательности, а по принадлежности к диффу: путь этим -изменением не тронут. - -## Воспроизведение - -Оракул из отчёта: подать раздачу, у которой имя целевого файла складывается в -250 байт. - -``` -n=250 → Apply err=… file name too long, results=0 -``` - -Наблюдаемо: задача в состоянии `failed`, в поле ошибки — текст системной ошибки, -ни одной ссылки не создано, карточки ревью нет. - -Ожидаемо: задача в `review` с названной причиной «имя не помещается», раскладка -не начата, подсказка человека чинит случай. - -## Затрагивает - -- `internal/layout` — проверка длины компонента до `link(2)` и доменная ошибка - вместо системной; -- `internal/worker` — ветка перевода задачи в `review` по этой ошибке, рядом с - существующей веткой коллизии цели; -- `openspec/specs/file-layout/spec.md` — требование о непомещающемся имени; - `state-reconciliation` — если переход в `review` заказывается там; -- текст причины в карточке ревью: веб-UI и Telegram показывают её человеку. - -## Критерии приёмки - -- Раздача с именем в 250 байт уходит в `review` с доменной причиной, а не в - `failed` с текстом ядра. **Оракул:** тест на временном каталоге прогона, - воспроизводящий случай из «Воспроизведения», — проверяет состояние задачи и - код причины. -- Ни одна ссылка не создана до отказа: частичной раскладки батча не остаётся. - **Оракул:** тот же тест — проверяет, что каталог цели пуст. -- Причина, показанная человеку, не содержит текста системной ошибки. **Оракул:** - утверждение теста на текст причины плюс конвенция - [errors.md](../../docs/conventions/errors.md) — перевод доменной ошибки на внешней - границе. -- Проверка длины стоит **до** первой операции с файловой системой. **Оракул:** - чтение диффа на ревью; тест на пустоту каталога цели его подтверждает. - -## Рамки - -Обрезать или переименовывать название самостоятельно нельзя — это решение -человека, у него для этого есть подсказка на ревью. Предел длины зависит от -файловой системы; зашивать 255 как универсальную константу не стоит, но и -выяснять предел у ядра в рантайме ради этой задачи не требуется — достаточно -консервативного значения с объяснением, откуда оно.