учёт: закрыта задача drop-dead-dotenv-loader, заведена drop-dead-entrypoint-script

This commit is contained in:
av
2026-08-23 21:14:30 +03:00
parent b01bdabc37
commit c1dab24de1
3 changed files with 46 additions and 38 deletions
+1 -1
View File
@@ -44,7 +44,6 @@
## Очередь ## Очередь
- [🧹 Поднимать сервис для локальной работы одной командой](items/dev-run-task.md) — Локальная проверка требует ручной чистки каталога данных и остановки процесса, а владельца панели заводят по одноразовой ссылке из журнала. - [🧹 Поднимать сервис для локальной работы одной командой](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: подкоманда возврата записи в работу не проверена ничем, а тест на неё пришлось бы писать, повторяя её тело руками. - [🧹 Вынести тело подкоманды 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, и будущая надобность конфига в транспорте даст цикл импорта на уровне проверок - [🧹 Механизировать правило «internal/config не знает транспорта»](items/archrule-config-knows-no-transport.md) — правило записано конвенцией, а сканера у него нет; проект его уже нарушает — go test ./internal/config линкует всю поверхность HTTP, и будущая надобность конфига в транспорте даст цикл импорта на уровне проверок
- [✨ Сделать экран загрузки записи и её состояния](items/upload-and-status-screen.md) — Первое, ради чего приложение открывают: отдать файл и увидеть, что с ним происходит. - [✨ Сделать экран загрузки записи и её состояния](items/upload-and-status-screen.md) — Первое, ради чего приложение открывают: отдать файл и увидеть, что с ним происходит.
@@ -113,4 +112,5 @@
- [🔬 Пределы длительности, приходящей из метаданных](items/duration-bounds-from-metadata.md) — Длительность приходит от ffprobe числом и не проверяется ничем: приведение к целому переполняется, а испорченная гистограмма чинится только перезапуском. - [🔬 Пределы длительности, приходящей из метаданных](items/duration-bounds-from-metadata.md) — Длительность приходит от ffprobe числом и не проверяется ничем: приведение к целому переполняется, а испорченная гистограмма чинится только перезапуском.
- [🧹 Проверять уязвимости в зависимостях приложения](items/npm-deps-vulnerability-scan.md) — Зависимости приложения пришли задачей spa-skeleton, а сканера у них нет: govulncheck смотрит только модули Go. Ни проверки, ни объявленного исключения — непроверенная поверхность, о которой никто не решал - [🧹 Проверять уязвимости в зависимостях приложения](items/npm-deps-vulnerability-scan.md) — Зависимости приложения пришли задачей spa-skeleton, а сканера у них нет: govulncheck смотрит только модули Go. Ни проверки, ни объявленного исключения — непроверенная поверхность, о которой никто не решал
- [🧹 Разобрать мелочи входа по доверенному заголовку](items/test-headers-login-nits.md) — три пункта ниже потолка триажа остались от одной задачи: функция строки старта не вызвана ни одним тестом, форма записи необязательного поля конфига стала неотличима от обязательного, два комментария описывают снятую подкоманду и не то число звеньев цепочки - [🧹 Разобрать мелочи входа по доверенному заголовку](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 ГБ — открытое противоречие с границей домена, которое владелец решил не разбирать сейчас. - [🔬 Квота по общему размеру загруженного на пользователя](items/per-user-size-quota.md) — Паспорт и security.md запрещают отказы по квоте пользователю, а заметка владельца просит квоту по умолчанию 5 ГБ — открытое противоречие с границей домена, которое владелец решил не разбирать сейчас.
-37
View File
@@ -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` уже добавило слияние прежней
задачи — она
остаётся.
@@ -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 из окружения всё-таки нужно, это
отдельное решение с ценой, и принимают его разведкой, а не чисткой.