приём и чтение записей сведены к одному контракту приложения
- адреса приложения переехали в своё пространство `/app/`, опрос готовности убран целиком: рубеж и причину остановки владелец узнаёт карточкой записи, текст — отдельным адресом названного вида - заведена единая точка отображения доменной ошибки и слой, приводящий к той же форме отказы библиотеки: тело несёт машиночитаемый код рядом с сообщением - у записи появились имя файла отправителя, длительность и размер своими колонками, а у ленты владельца — свой индекс: без него страница сканировала весь архив сервиса
This commit is contained in:
@@ -172,6 +172,18 @@
|
||||
- `conventions`: новая колонка правится в обоих местах репозитория, а новый
|
||||
рубеж — одним дескриптором
|
||||
(CLAUDE.md, «Инварианты»).
|
||||
- `autotests`: судит ли проверка формы ответа по **настоящему запросу**, а не по
|
||||
прямому вызову отображателя ошибки. Вызов напрямую формой ответа не является и
|
||||
остаётся зелёным, когда отказ рождается слоем ниже обработчика (запись журнала
|
||||
2026-08-15 про единую форму отказа).
|
||||
- `operations`: есть ли у новой выборки свой индекс. Единственный индекс записи
|
||||
заведён под захват воркера — по рубежу и признаку остановки, — и выборке,
|
||||
сужаемой владельцем, он не помогает ничем: замер 2026-08-15 показал полное
|
||||
сканирование таблицы и рост времени страницы вместе с **чужими** записями.
|
||||
- `security`: не схлопнулись ли внутрипроцессные запросы в один счётчик
|
||||
ограничителя частоты. Запрос, собранный руками, приходит без адреса, а
|
||||
вырожденное значение библиотека отдаёт не пустой строкой, и её собственный
|
||||
страж «пустой ключ пропускаем» такое значение не ловит (запись 2026-08-15).
|
||||
- `autotests`: покрыт ли изменённый шаг конвейера хоть одним **проходящим**
|
||||
тестом. Что уже закрыто проверками, видно по журналу дефектов ниже и по
|
||||
[conventions/go-linters.md](conventions/go-linters.md), «Механизировано»;
|
||||
@@ -280,6 +292,29 @@ API и имя не откатываются обратной правкой по
|
||||
истории git 2026-08-10: поле «Чем воспроизведён» называет у них коммит, а не
|
||||
оракул, и выдумывать оракул задним числом нельзя.
|
||||
|
||||
## 2026-08-15 — единая форма отказа не покрывала то, что рождается не в обработчике [пойман ревью]
|
||||
|
||||
- **Где:** `internal/controller/http/errors.go`, слой `OneErrorForm`; задача
|
||||
`json-api-for-spa`
|
||||
- **Симптом:** три отказа под корнем приложения — превышение
|
||||
потолка тела, ограничитель частоты и неизвестный путь — уходили телом
|
||||
библиотеки, без машиночитаемого кода и без предела числом. То есть форм отказа
|
||||
на адресах приложения было две, а не одна, — ровно то, ради чего задача и
|
||||
заводилась
|
||||
- **Причина:** отображение доменной ошибки заведено верно, но покрывает лишь то,
|
||||
что вернул **обработчик**. Предел тела и ограничитель частоты рождают отказ
|
||||
слоями ниже, а «ничего не совпало» — вовсе маршрутом корневой группы, к
|
||||
которому слои нашей группы не привязаны. Комментарий у слоя при этом перечислял
|
||||
все три случая как закрытые
|
||||
- **Почему не поймали раньше:** оракулом служил комментарий, а не прогон.
|
||||
Приёмочный тест звал отображатель **напрямую** ошибкой, которую сам же и
|
||||
сочинил, — запроса он не слал и потому оставался зелёным независимо от того,
|
||||
что происходит при настоящем HTTP-запросе. Ветвь `too_large` при этом не имела ни одного
|
||||
производителя в рабочем коде
|
||||
- **Что меняем:** проверка, стерегущая форму ответа, обязана слать **настоящий
|
||||
запрос**; вызов отображателя напрямую формой ответа не является. Добавлено
|
||||
вопросом в раздел ниже
|
||||
|
||||
## 2026-08-15 — пустой второй ответ распознавателя стирал сохранённую расшифровку [пойман ревью]
|
||||
|
||||
- **Где:** `internal/adapter/repo/pocketbase/text_repo.go`, `TextRepository.Put`
|
||||
|
||||
Reference in New Issue
Block a user