Files
jellybit/openspec/changes/archive/2026-08-10-long-title-to-review/proposal.md
T
av b9f0929d0c layout: непомещающееся целевое имя уводит задачу в review вместо failed
- предел длины компонента (255 байт) проверяется в BuildLinks до первой
  операции с ФС: ни каталога, ни ссылки при отказе не создаётся
- причина пустого предпросмотра считается на показе (ReviewData.PreviewError)
  и печатается в панели действий и в карточке Telegram: у задачи без
  записанной причины взять её больше неоткуда
2026-08-10 12:16:44 +03:00

48 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Why
Название бывает длиннее, чем файловая система разрешает назвать файл. Сегодня
раскладка узнаёт об этом от ядра, уже начав работу: задача падает в `failed`, а
владелец видит вместо карточки ревью английскую строку `file name too long`.
Состояние `failed` терминальное — починить случай нечем, хотя чинится он одной
подсказкой на ревью, ровно как занятый целевой путь.
## What Changes
- Раскладка проверяет длину имени **до** первой операции с файловой системой:
каждый компонент целевого пути (папка тайтла, папка сезона, имя файла) обязан
помещаться в предел, который держат распространённые файловые системы Linux.
- Не помещается — раскладка отказывается целиком, не создав ни одного каталога и
ни одной ссылки, и задача уходит в `review` со своей причиной («имя не
помещается»), а не в `failed` с текстом системной ошибки.
- Владелец правит название подсказкой на ревью и применяет заново — путь тот же,
что при коллизии цели.
## Capabilities
### New Capabilities
Новых нет.
### Modified Capabilities
- `file-layout`: новое требование о непомещающемся целевом имени — проверка до
файловых операций, отказ целиком, уход в `review` с доменной причиной.
- `review`: панель действий при пустом предпросмотре печатает записанную причину
вместо общего «Подтверди источник». Пустой предпросмотр наступает от коллизии,
от непомещающегося имени и от невалидного плана — текст один на всех и в трёх
случаях из четырёх неверен.
## Impact
- `internal/layout` — проверка длины компонентов в `BuildLinks` (чистая функция,
до `mkdir`/`link`) и своя доменная ошибка вместо системной.
- `internal/worker` — ветка перевода задачи в `review` по этой ошибке, рядом с
веткой коллизии цели; свой код причины для корреляции.
- Веб-UI и Telegram — панель действий и карточка ревью называют причину, по
которой плана нет; причина считается на показе, поэтому относится к текущему
плану. Ревью показало, что взять её из записанного поля недостаточно: на самом
частом входе оно пусто.
- `internal/httpapi` — трансляция новой доменной ошибки в конфликт, а не в сбой
сервера; `internal/tgbot` — своя ветка ответа, как у коллизии.
- Внешних зависимостей, схемы БД и конфига изменение не трогает.