точки входа переехали в cmd/, заведена заглушка OIDC для локального входа

- main.go и journal_route_test.go переехали в cmd/transcriber без правок
  содержимого; образ собирает ./cmd/transcriber поимённо
- cmd/oidcstub отвечает на /authorize, /token и /userinfo, проверок не делает
  и слушает петлевой адрес: войти без Authelia стало чем
- ступень сборки приложения переехала на node:24 с alpine — musl ждёт ответа
  на AAAA, которого нет, и npm ci висел вместо отказа
This commit is contained in:
av
2026-08-15 20:15:57 +03:00
parent 63a13404df
commit 91138dd39a
19 changed files with 335 additions and 25 deletions
+41
View File
@@ -119,6 +119,18 @@
### Типовые ложноположительные
- **«Хранилище молча сливает две учётные записи с одной почтой в одного
владельца».** Для версии v0.39.10 неверно, и неверна именно развязка. Первая
половина цепочки настоящая: обмен ищет запись по признаку провайдера, а не
найдя — по адресу почты, и приходит к чужой записи. Но повесить на неё второй
признак он не может — уникальный индекс
`idx_externalAuths_record_provider (collectionRef, recordRef, provider)` связь
отвергает, обмен отдаёт `400`, а сервис — `401` со строкой
`Failed to exchange provider code`. Отказ **громкий**, тихого слияния владельцев
не происходит, и ложно-зелёной проверки разграничения такой дефект не даёт.
Проверено прогоном 2026-08-15 (задача про заглушку OIDC); найдено чтением
исходников библиотеки, опровергнуто запуском — то есть цена гипотезы, добытой
без прогона, здесь и измерена.
- **«Воркер глотает ошибку `NoopJobError`».** Не дефект: этот тип означает «задач
в этом состоянии нет», и `internal/controller/worker/worker.go` намеренно не
логирует его и не считает в метрику. Норма записана требованием
@@ -159,6 +171,14 @@
Форма: `<тема>: <вопрос> (<откуда>)`.
- `operations`: не завёл ли инструмент разработчика второй дом тому, что уже есть
в проверках. Подставных провайдера OIDC в репозитории теперь два — `cmd/oidcstub`
и `fakeProvider` в `internal/controller/http/login_test.go`, — с теми же
адресами и той же посылкой про `email_verified`, и они уже разошлись в мелочи
(`token_type` «bearer» против «Bearer»). Тем же вопросом судится подставной
распознаватель. Записанной конвенции о единственном доме подставных внешних
собеседников у проекта нет, поэтому спрашивать надо, а не считать нарушением
(ревью задачи про заглушку OIDC, 2026-08-15).
- `operations`: как шаг отвечает на отмену посреди работы — контекст доходит до
внешнего собеседника и это держат правила `noctx` и `contextcheck`
([conventions/go-linters.md](conventions/go-linters.md), «Отмена и внешний
@@ -312,6 +332,27 @@ API и имя не откатываются обратной правкой по
истории git 2026-08-10: поле «Чем воспроизведён» называет у них коммит, а не
оракул, и выдумывать оракул задним числом нельзя.
## 2026-08-15 — короткая форма рецепта входа не работала, а проверяли длинную [пойман ревью]
- **Где:** `cmd/oidcstub` — подставной провайдер OIDC для локального входа;
доккоммент пакета, подсказка флага `-sub` и проза `config.example.toml`
- **Симптом:** рецепт «второй вошедший получается сменой `-sub`» записан в трёх
местах и в короткой форме не работал вовсе. Заглушка отдавала обоим `sub` одну
и ту же почту умолчанием, вход отвечал `401`, а причина оставалась строкой в
журнале хранилища
- **Причина:** обмен ищет учётную запись сперва по признаку провайдера, а не
найдя — по адресу почты. Второй `sub` при общей почте приходил к первой записи,
а признак провайдера на записи уникален — `idx_externalAuths_record_provider`
и связь отвергалась. Умолчание почты стояло своим значением вместо выведенного
из `sub`
- **Почему не поймали раньше:** рецепт проверяли **длинной** формой, где почта
задана флагом явно. Короткую не гонял никто, хотя записана она первой и берут
читатели именно её
- **Что меняем:** проверять ту форму рецепта, которая записана **короче всех**.
Оракул — прогон именно её: два входа подряд разными `-sub` без прочих флагов,
затем счёт записей в коллекции пользователей. Само умолчание почты теперь
выводится из `-sub`
## 2026-08-15 — своя раздача статики потеряла отказ от записи успеха [пойман ревью]
- **Где:** `internal/controller/http/webapp.go`, регистрация корневого маршрута;