закрыта задача long-title-to-review

This commit is contained in:
av
2026-08-10 12:16:58 +03:00
parent b9f0929d0c
commit 1479d10d4c
2 changed files with 0 additions and 73 deletions
-1
View File
@@ -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 и живым прогоном не подтверждена — при иной форме разбор молча уходит в фолбэк, гейт зелёный, локализованное название не работает - [🔬 Форма ответа поиска 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, записать в спеку - [✨ Узаконить confidence-гейт авто-раскладки в спеке и сделать его выключаемым (дефолт 0.7)](items/auto-link-confidence-gate.md) — Решено (B): гейт оставляем как доп. проверку на ревью — выключаемый порог, дефолт 0.85→0.7, записать в спеку
- [✨ Пересчитывать абсолютную нумерацию аниме в SxxEyy](items/anime-absolute-numbering.md) — аниме со сквозной нумерацией (#137) не раскладывается в SxxEyy, который ждёт Jellyfin — нужен пересчёт абсолютной нумерации - [✨ Пересчитывать абсолютную нумерацию аниме в SxxEyy](items/anime-absolute-numbering.md) — аниме со сквозной нумерацией (#137) не раскладывается в SxxEyy, который ждёт Jellyfin — нужен пересчёт абсолютной нумерации
-72
View File
@@ -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 как универсальную константу не стоит, но и
выяснять предел у ядра в рантайме ради этой задачи не требуется — достаточно
консервативного значения с объяснением, откуда оно.