diff --git a/tasks/BACKLOG.md b/tasks/BACKLOG.md index 81e4acc..c8517d1 100644 --- a/tasks/BACKLOG.md +++ b/tasks/BACKLOG.md @@ -44,7 +44,6 @@ ## Очередь - [🧹 Поднимать сервис для локальной работы одной командой](items/dev-run-task.md) — Локальная проверка требует ручной чистки каталога данных и остановки процесса, а владельца панели заводят по одноразовой ссылке из журнала. -- [🧹 Снять мёртвый godotenv.Load() вместе с зависимостью](items/drop-dead-dotenv-loader.md) — сервис на каждом старте печатает предупреждение, приглашающее завести .env, читать который некому: это вторая точка, где может завестись секрет, и путь к нарушению критического инварианта сервис подсказывает сам - [🧹 Вынести тело подкоманды resume из main-пакета и покрыть тестом](items/devtools-resume-testable.md) — go test ./cmd/... отвечает no test files: подкоманда возврата записи в работу не проверена ничем, а тест на неё пришлось бы писать, повторяя её тело руками. - [🧹 Механизировать правило «internal/config не знает транспорта»](items/archrule-config-knows-no-transport.md) — правило записано конвенцией, а сканера у него нет; проект его уже нарушает — go test ./internal/config линкует всю поверхность HTTP, и будущая надобность конфига в транспорте даст цикл импорта на уровне проверок - [✨ Сделать экран загрузки записи и её состояния](items/upload-and-status-screen.md) — Первое, ради чего приложение открывают: отдать файл и увидеть, что с ним происходит. @@ -113,4 +112,5 @@ - [🔬 Пределы длительности, приходящей из метаданных](items/duration-bounds-from-metadata.md) — Длительность приходит от ffprobe числом и не проверяется ничем: приведение к целому переполняется, а испорченная гистограмма чинится только перезапуском. - [🧹 Проверять уязвимости в зависимостях приложения](items/npm-deps-vulnerability-scan.md) — Зависимости приложения пришли задачей spa-skeleton, а сканера у них нет: govulncheck смотрит только модули Go. Ни проверки, ни объявленного исключения — непроверенная поверхность, о которой никто не решал - [🧹 Разобрать мелочи входа по доверенному заголовку](items/test-headers-login-nits.md) — три пункта ниже потолка триажа остались от одной задачи: функция строки старта не вызвана ни одним тестом, форма записи необязательного поля конфига стала неотличима от обязательного, два комментария описывают снятую подкоманду и не то число звеньев цепочки +- [🧹 Снять мёртвый docker/entrypoint.sh вместе с его следами в образе](items/drop-dead-entrypoint-script.md) — Скрипт копируется в образ, линтуется шагом гейта и переназначает uid/gid из окружения, но не выполняется ни разу: ENTRYPOINT закомментирован без записанной причины, а переназначение спорит с решением от 2026-08-22 о числовом USER 1000:1000 - [🔬 Квота по общему размеру загруженного на пользователя](items/per-user-size-quota.md) — Паспорт и security.md запрещают отказы по квоте пользователю, а заметка владельца просит квоту по умолчанию 5 ГБ — открытое противоречие с границей домена, которое владелец решил не разбирать сейчас. diff --git a/tasks/items/drop-dead-dotenv-loader.md b/tasks/items/drop-dead-dotenv-loader.md deleted file mode 100644 index e5e51ba..0000000 --- a/tasks/items/drop-dead-dotenv-loader.md +++ /dev/null @@ -1,37 +0,0 @@ -# 🧹 Снять мёртвый godotenv.Load() вместе с зависимостью - -- **Тип:** chore -- **Категория:** Очередь — Чистка старта сервиса идёт вместе с задачей о локальном запуске: обе трогают одну точку входа -- **Зачем:** сервис на каждом старте печатает предупреждение, приглашающее завести .env, читать который некому: это вторая точка, где может завестись секрет, и путь к нарушению критического инварианта сервис подсказывает сам -- **Теги:** review-2026-08-23 - -Настройки сервис берёт из файла конфига целиком, а переменных окружения не -читает нигде. Вызов `godotenv.Load()` остался от прежней раскладки и на каждом -старте печатает предупреждение, приглашающее завести `.env`, — то есть завести -вторую точку, где может осесть секрет. - -Нашёл прогон ревью `config-test-headers-login` 2026-08-23. - -## Затрагивает - -- `cmd/transcriber/main.go` — вызов `godotenv.Load()` и его импорт; -- `go.mod` — зависимость `github.com/joho/godotenv`; -- `.dockerignore` — строка `.env`. - -## Критерии приёмки - -- Переменных окружения не читает никто. **Оракул:** - `grep -rn "os.Getenv\|os.LookupEnv" --include=*.go internal/ cmd/ | grep -v _test` - → пусто. -- Зависимости в `go.mod` нет. **Оракул:** `grep godotenv go.mod go.sum` → пусто, - `go build ./...` зелёный. -- Предупреждения на старте нет. **Оракул:** прогон бинарника сегодня печатает - `level=WARN msg="Warning: .env file not found, using system environment variables"`; - после правки такой строки в выводе старта нет. - -## Рамки - -Если переменные окружения кому-то понадобятся, у них заводится свой читатель, и -это другая задача. Строку `.env` в `.gitignore` уже добавило слияние прежней -задачи — она -остаётся. diff --git a/tasks/items/drop-dead-entrypoint-script.md b/tasks/items/drop-dead-entrypoint-script.md new file mode 100644 index 0000000..ab69d2e --- /dev/null +++ b/tasks/items/drop-dead-entrypoint-script.md @@ -0,0 +1,45 @@ +# 🧹 Снять мёртвый docker/entrypoint.sh вместе с его следами в образе + +- **Тип:** chore +- **Категория:** Очередь +- **Зачем:** Скрипт копируется в образ, линтуется шагом гейта и переназначает uid/gid из окружения, но не выполняется ни разу: ENTRYPOINT закомментирован без записанной причины, а переназначение спорит с решением от 2026-08-22 о числовом USER 1000:1000 +- **Теги:** review-2026-08-23 + +`Dockerfile` копирует `docker/entrypoint.sh` в образ и делает его исполняемым, а +строку `ENTRYPOINT` держит закомментированной — работу делает `CMD`. Скрипт +поэтому не выполняется ни разу, но платится за него трижды: слоем образа, шагом +`shell` гейта, который линтует его поимённо, и строкой `ENV USER=transcriber`, +заведённой ради него. + +Сам скрипт — перенос из чужого проекта: в его сообщении об ошибке названа Gitea. +Он переназначает uid и gid из переменных `USER`, `USER_UID`, `USER_GID`, +а этого проект уже не делает: решением от 2026-08-22 пользователь в образе +назван числом, `USER 1000:1000`, и причина записана строками рядом. + +Нашёл прогон ревью `drop-dead-dotenv-loader` 2026-08-23, урожаем. + +## Затрагивает + +- `docker/entrypoint.sh` — сам файл; +- `Dockerfile` — `COPY docker/entrypoint.sh`, `RUN chmod 755`, закомментированная + строка `ENTRYPOINT` и `ENV USER=transcriber`; +- `Taskfile.yml`, шаг `shell` — скрипт назван в аргументах `shellcheck` поимённо. + +## Критерии приёмки + +- Скрипта нет ни в дереве, ни в образе. **Оракул:** + `grep -rn "entrypoint" Dockerfile Taskfile.yml` → пусто, файла + `docker/entrypoint.sh` нет. +- Шаг `shell` гейта зелёный и не ссылается на пропавший файл. **Оракул:** + `task shell` → код 0; сегодня та же команда линтует два скрипта, после правки — + один. +- Образ собирается и поднимается. **Оракул:** `task image` собирается, а + поднятый контейнер отвечает на `/metrics` и пишет файлы в смонтированный + каталог от владельца `1000:1000`. + +## Рамки + +Числового `USER 1000:1000` не касаться: он поставлен решением владельца +2026-08-22 и закрывает `DL3066`. Возврат `ENTRYPOINT` в строй — не эта задача: +если выяснится, что переназначение uid и gid из окружения всё-таки нужно, это +отдельное решение с ценой, и принимают его разведкой, а не чисткой.