docs: autotests.md стал переносимым документом об автопроверках
- лестница механизации из пяти ступеней, два круга проверок, перечень правил таблицами по родам, перечень подавлений с причинами, порядок заведения правила; названы остатки правил и отклонённые подъёмы - утверждения «Механизировано» в четырёх записях конвенций и единые точки в architecture.md приведены к сегодняшнему состоянию; изъятие «транспорт знает адаптер хранилища» названо строкой - в журнал дефектов записаны две находки: узнавание конца потока по тексту и правило гейта, обходимое одной лишней строкой
This commit is contained in:
@@ -238,6 +238,47 @@ API и имя не откатываются обратной правкой по
|
||||
поймать их было некому. У восстановленных нет поля «Чем воспроизведён», и
|
||||
выдумывать его задним числом нельзя.
|
||||
|
||||
## 2026-08-13 — конец потока распознавания узнавался по тексту сообщения [пойман сканером]
|
||||
|
||||
- **Где:** `internal/adapter/recognizer/yandex/speechkit.go`, чтение потока
|
||||
результата распознавания
|
||||
- **Симптом:** сегодня не наблюдался — путь рабочий, пока библиотека отдаёт конец
|
||||
потока значением `io.EOF`. Отказ с текстом «EOF» был бы принят за конец потока,
|
||||
и расшифровка вернулась бы усечённой: пользователь получил бы половину записи
|
||||
как готовый результат
|
||||
- **Причина:** конец потока узнавался сравнением `err.Error() == "EOF"`. Текст
|
||||
сообщения — не признак: его носит и чужая ошибка, а сменит его библиотека —
|
||||
условие перестанет срабатывать вовсе, и оба исхода молчаливы
|
||||
- **Чем воспроизведён:** не воспроизводился на живом сервисе — прогон на реальных
|
||||
ключах запрещён. Найден тестом-сканером `internal/archrules` при его заведении
|
||||
- **Почему не поймали раньше:** `errorlint` видит `err == ErrX` и приведение типа,
|
||||
но матчинг по тексту не видит; прозой это правило записано не было, и ревью его
|
||||
не спрашивало
|
||||
- **Что меняем:** узнавание переведено на `errors.Is(err, io.EOF)`; класс закрыт
|
||||
тестом-сканером (docs/autotests.md, «Ошибки и отказы»)
|
||||
|
||||
## 2026-08-13 — правило гейта обходилось одной лишней строкой [пойман ревью]
|
||||
|
||||
- **Где:** `.golangci.yml`, правило `forbidigo` о суждении по живой карте
|
||||
заголовков — заведено в тот же день задачей `response-assertions-judge-result`
|
||||
- **Симптом:** правило ловило только прямую цепочку `w.Header().Get`. Присваивание
|
||||
в переменную (`h := w.Header()`), чтение по индексу карты, обход `range` и поле
|
||||
`HeaderMap` проходили гейт зелёными — то есть класс, стоивший трёх зелёных
|
||||
гейтов, возвращался четвёртый раз, и уже без человеческой страховки: документы
|
||||
успели снять его с прохода ревью
|
||||
- **Причина:** `forbidigo` по умолчанию судит по печатному тексту вызова, а не по
|
||||
типу значения. Правило, записанное текстом, отсекает одну форму записи, а не
|
||||
свойство
|
||||
- **Чем воспроизведён:** прогоном линтера на файле проверок с шестью формами
|
||||
чтения живой карты: помечена была одна
|
||||
- **Почему не поймали раньше:** правило проверили ровно тем нарушением, против
|
||||
которого писали. Мутация была, но одна — нужна была по одной на каждую форму
|
||||
- **Что меняем:** правило судит по типу приёмника (`analyze-types`,
|
||||
`httptest.ResponseRecorder.Header` и `.HeaderMap`) и ловит все шесть форм;
|
||||
проверено мутацией по каждой. Отсюда же строка в docs/autotests.md, «Лестница
|
||||
механизации»: запрет по имени, обходимый лишней строкой, — это ступень
|
||||
тест-сканера, наряженная запретом
|
||||
|
||||
## 2026-08-12 — закрыли поверхность так, что войти не мог никто [пойман ревью]
|
||||
|
||||
- **Где:** шаг схемы `202608120001` задачи `oidc-login`, правило создания записи
|
||||
|
||||
Reference in New Issue
Block a user