- база своя: два пула, захват одним UPDATE ... RETURNING, шаги схемы на goose
под файловым замком, одна миграция начальной схемы вместо семи прежних
- транспорт переписан на net/http: свои слои, свой ограничитель частоты,
отдача файла с проверкой владельца; панель /_/ и пространство /api/ исчезли
- по находкам ревью: журнал не пишет путь под корнем приложения, ключ бюджета
читается справа налево, узнавание известного идёт читающим пулом
- main.go и journal_route_test.go переехали в cmd/transcriber без правок
содержимого; образ собирает ./cmd/transcriber поимённо
- cmd/oidcstub отвечает на /authorize, /token и /userinfo, проверок не делает
и слушает петлевой адрес: войти без Authelia стало чем
- ступень сборки приложения переехала на node:24 с alpine — musl ждёт ответа
на AAAA, которого нет, и npm ci висел вместо отказа
- убраны клиент бота, транспорт обновлений, отправитель сообщений, сборка
входа при старте, секция настроек и зависимость go-telegram-bot-api; из
конвейера ушла доставка ответа отправителю — исход виден опросом готовности.
Колонки адресата и значение источника остались в схеме: применённые шаги не
переписываются
- шаг 202608140003 запрещает пустого владельца у аудиозаписи и у файла;
существующие строки он не проверяет, и это принято сознательно — искать их
надо запросом до выкладки
- ревью нашло два пред-существующих дефекта, оба закрыты: пустой второй ответ
распознавателя стирал сохранённую расшифровку, а пустая расшифровка перестала
быть заметной вместе с убранной доставкой. Попутно поднят golang.org/x/image
до v0.45.0 — красный шаг vulns, воспроизводился и на чистом master
- включены noctx, contextcheck и bodyclose (отмена доходит до внешнего вызова,
контекст приезжает сверху, тело ответа закрывается), nilerr, rowserrcheck и
sqlclosecheck (отказ не теряется молча), testifylint и nolintlint (форма
утверждения и форма подавления), плюс errcheck check-type-assertions:
непроверенное приведение типа паникует, и check-blank его не видит
- заведён шаг tests: go test -race, потому что «результат пишет только держатель
захвата» — утверждение об одновременности. Без компилятора C шаг гоняет тесты
без детектора и краснеет кодом 3 после них: гонки не повод отнимать у гейта
сами тесты
- заведён шаг migrations: у файла шага схемы допустим один статус — A. Баз диффа
две, BASE и HEAD: первая отвечает на «уже уехал» настолько, насколько свежа
origin/master, вторая ловит правку закоммиченного шага независимо от неё.
Каталог берётся из docs/.docs.json, пустой каталог роняет шаг
- единственное подавление — noctx на httptest.NewRequest в проверках: за
фикстурой запроса внешнего собеседника нет. Граница проверена мутацией —
http.Get и exec.Command из проверки правилу по-прежнему подсудны
- документ docs/autotests.md снят: перечень правил, подавлений и лестница
механизации — это конвенция о том, чем машина читает код, и место ей среди
прочих записей
- в шапке названо, чего в записи нет: как писать тесты. Свойства, которые обязан
проверять тест, остаются в review.md, «Типовые узлы»
- ссылки переставлены в памятке, индексе конвенций, четырёх записях, review.md,
.golangci.yml, lefthook.yml и пакете сканеров
- включены sloglint, misspell, depguard; forbidigo получил запреты на чтение
времени, окружения и вывод в stdout — каждый по свойству, а не по одному
имени: запрет на os.Getenv без соседей обходится os.LookupEnv
- заведён internal/archrules — тесты-сканеры: направление зависимостей между
ядром, транспортами и адаптерами, узнавание ошибки по тексту в шести формах,
и согласованность колонок очереди во всех четырёх местах плюс шаг схемы
- каждое правило проверено мутацией, каждое исключение объявлено с причиной
- forbidigo с analyze-types запрещает в файлах проверок обращение к
httptest.ResponseRecorder.Header и .HeaderMap: правило судит по типу
приёмника, поэтому ловит и цепочку, и переменную, и индекс, и обход
- класс стоил трёх зелёных гейтов при неработающем коде; правило записано
строкой в перечне механизированного, прозой не дублируется
- поправлены два утверждения «механизировано: ничего», разошедшиеся с
включённым линтером и со сверкой шага схемы
- признаки «работы нет» и «задача не найдена» узнаются по смыслу, а не
приведением типа: обёртка `%w` на пути больше не превращает пустой прогон
воркера в отказ раз в секунду
- отказ закрытия соединения с распознавателем доходит до вызывающего
(`errors.Join`) либо до журнала; у `errcheck` включён `check-blank`, иначе
критерий принимал реализацию, выбрасывающую отказ в пустоту
- заведены первые тесты пакета worker и capability `pipeline`; долг из четырёх
замечаний линтера закрыт, гейт зелёный целиком
- проверки больше не зовут ffprobe и не меняют рабочий каталог процесса;
добавлены случаи на отказ чтения метаданных и на отсутствие поля audio
- заведена спека intake на приём по HTTP, ADR о подставных адаптерах,
запись в журнал ревью о проверке, которая не могла упасть
- go test снят из объявленных долгов CLAUDE.md, послабление errcheck
для _test.go в .golangci.yml убрано
CLAUDE.md описывает конвейер задач, подвохи конфига и правило про четыре
списка колонок в репозитории sqlite.
.golangci.yml включает стандартный набор плюс errorlint; осознанные
непроверенные вызовы вынесены в исключения.
README приведён к коду: эндпоинты /api/audio и /api/status/:id, состояния
задач, структура internal/, фактические колонки таблиц.