build(tradein/frontend): состав зависимостей перестаёт зависеть от даты сборки (#2770) #2772

Merged
bot-backend merged 1 commit from chore/dead-code-sweep-aug7 into main 2026-08-07 09:07:59 +00:00
Collaborator

Closes #2770

Диагноз: оборванная проводка, не мёртвый код

Три вопроса:

  1. Есть ли вызывающий у pnpm-lock.yaml? Нет. Dockerfile копировал package-lock.json* (файла не было) и ставил npm install; ci-tradein.yml — тоже npm install; строка pnpm во всём репозитории встречается ровно один раз — в комментарии самого workflow.
  2. Считает ли кто-то то же самое рядом? Да: соседний frontend/ решает ту же задачу (воспроизводимая установка) через tracked package-lock.json + npm ci — 556 КБ лока, npm ci --legacy-peer-deps в Dockerfile.
  3. Выразимо ли задуманное? Да, и уже выражено рядом.

Ответ на (2)+(3) означает: удалять нечего — надо чинить проводку. Поэтому взят вариант 2 из issue, а не 1.

Почему не «просто удалить». Удаление закрепило бы то, что было по факту: до этого коммита версии зависимостей в CI и в прод-образе выбирались независимо, каждая по дате своей сборки. Гейт проверял не тот код, который деплоится.

Опровергнутая предпосылка issue

package-lock.json … он в .gitignore не попадал — просто не коммитился

Неверно: tradein-mvp/.gitignore:18 содержал frontend/package-lock.json. Лок не мог появиться сам — строка снята в этом PR (заменена комментарием с правилом регенерации).

Что изменилось

файл было стало
frontend/package-lock.json gitignored, отсутствовал tracked, 483 пакета, lockfileVersion 3
frontend/pnpm-lock.yaml 121 КБ мёртвого снимка удалён
frontend/Dockerfile COPY package-lock.json* + npm install COPY package-lock.json + npm ci
ci-tradein.yml npm install, без кэша npm ci + cache: npm
.claude/rules/frontend.md правило только про frontend/ распространено на tradein-mvp/frontend/

12 записей swc-linux в локе → лок, снятый на macOS/arm64, ставится на linux (та же схема, что у соседнего frontend/).

Верификация (локально, до пуша)

  • docker build целиком: deps (npm ci в node:20-alpine) → next build → runner. Образ собран, контейнер поднят, GET / → 307. Это и есть проверка «сборка образа не сломалась».
  • Все четыре шага гейта на новом локе: type-check ✓ · vitest 13 passed ✓ · next lint ✓ (только довоенные преды про unused vars) · check:mera-public-isolation ✓.

Цена

Правишь tradein-mvp/frontend/package.json — регенерируй лок в том же PR, иначе npm ci роняет и гейт, и сборку образа. Правило записано в трёх местах: .gitignore, комментарий в Dockerfile, .claude/rules/frontend.md.

Closes #2770 ## Диагноз: оборванная проводка, не мёртвый код Три вопроса: 1. **Есть ли вызывающий у `pnpm-lock.yaml`?** Нет. `Dockerfile` копировал `package-lock.json*` (файла не было) и ставил `npm install`; `ci-tradein.yml` — тоже `npm install`; строка `pnpm` во всём репозитории встречается ровно один раз — в комментарии самого workflow. 2. **Считает ли кто-то то же самое рядом?** Да: соседний `frontend/` решает ту же задачу (воспроизводимая установка) через tracked `package-lock.json` + `npm ci` — 556 КБ лока, `npm ci --legacy-peer-deps` в Dockerfile. 3. **Выразимо ли задуманное?** Да, и уже выражено рядом. Ответ на (2)+(3) означает: удалять нечего — надо чинить проводку. Поэтому взят вариант 2 из issue, а не 1. **Почему не «просто удалить».** Удаление закрепило бы то, что было по факту: до этого коммита версии зависимостей в CI и в прод-образе выбирались независимо, каждая по дате своей сборки. Гейт проверял не тот код, который деплоится. ## Опровергнутая предпосылка issue > `package-lock.json` … он в .gitignore не попадал — просто не коммитился Неверно: `tradein-mvp/.gitignore:18` содержал `frontend/package-lock.json`. Лок не мог появиться сам — строка снята в этом PR (заменена комментарием с правилом регенерации). ## Что изменилось | файл | было | стало | |---|---|---| | `frontend/package-lock.json` | gitignored, отсутствовал | **tracked**, 483 пакета, lockfileVersion 3 | | `frontend/pnpm-lock.yaml` | 121 КБ мёртвого снимка | удалён | | `frontend/Dockerfile` | `COPY package-lock.json*` + `npm install` | `COPY package-lock.json` + `npm ci` | | `ci-tradein.yml` | `npm install`, без кэша | `npm ci` + `cache: npm` | | `.claude/rules/frontend.md` | правило только про `frontend/` | распространено на `tradein-mvp/frontend/` | 12 записей `swc-linux` в локе → лок, снятый на macOS/arm64, ставится на linux (та же схема, что у соседнего `frontend/`). ## Верификация (локально, до пуша) - **`docker build` целиком**: deps (`npm ci` в node:20-alpine) → `next build` → runner. Образ собран, контейнер поднят, `GET /` → 307. Это и есть проверка «сборка образа не сломалась». - **Все четыре шага гейта на новом локе**: `type-check` ✓ · `vitest` 13 passed ✓ · `next lint` ✓ (только довоенные преды про unused vars) · `check:mera-public-isolation` ✓. ## Цена Правишь `tradein-mvp/frontend/package.json` — регенерируй лок в том же PR, иначе `npm ci` роняет и гейт, и сборку образа. Правило записано в трёх местах: `.gitignore`, комментарий в Dockerfile, `.claude/rules/frontend.md`.
bot-backend added 1 commit 2026-08-07 08:35:18 +00:00
build(tradein/frontend): состав зависимостей перестаёт зависеть от даты сборки (#2770)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 8s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Successful in 44s
CI Trade-In / frontend-checks (pull_request) Successful in 1m1s
CI Trade-In / backend-tests (pull_request) Successful in 3m53s
443de71ded
`pnpm-lock.yaml` лежал в репозитории 121 КБ и не читался НИКЕМ: Dockerfile
копировал `package-lock.json*` (которого не было) и ставил `npm install`,
`ci-tradein.yml` — тоже `npm install`, слова `pnpm` в репозитории больше нет
нигде, кроме комментария в самом workflow. Последняя правка — #2312, и с тех
пор `package.json` уезжал мимо него; #2769 (devDeps под vitest) развёл их
окончательно.

То есть это был не лок, а снимок дерева, которое никто не собирает. Хуже, чем
просто мусор: `pnpm install` из него отработал бы и дал дерево, отличное от
уехавшего в прод-образ, — расхождение обнаружилось бы позже и не там.

Из двух вариантов issue взят второй, потому что задуманное ВЫРАЗИМО и уже
выражено рядом: у соседнего `frontend/` ровно эта схема — tracked
`package-lock.json` + `npm ci`. Первый вариант (просто удалить) закрепил бы
невоспроизводимую установку: до этого коммита версии в CI и в прод-образе
выбирались независимо, каждая по дате своей сборки, и гейт проверял не тот
код, который деплоится.

Что сделано:
  • `tradein-mvp/frontend/package-lock.json` — сгенерирован и TRACKED
    (483 пакета, lockfileVersion 3, 12 записей swc-linux → ставится на linux
    из лока, снятого на macOS, как у соседнего frontend/);
  • `.gitignore` — снята строка `frontend/package-lock.json`. В issue сказано
    «в .gitignore не попадал — просто не коммитился»; это НЕВЕРНО, он там был
    (tradein-mvp/.gitignore:18), поэтому лок и не мог появиться сам;
  • Dockerfile: `npm install` → `npm ci`, `package-lock.json*` → без `*`
    (отсутствие лока обязано ронять сборку, а не молча включать install);
  • ci-tradein.yml: `npm install` → `npm ci` + `cache: npm` в setup-node;
  • .claude/rules/frontend.md — правило «правишь package.json → регенерируй
    лок в том же PR» распространено на tradein-фронт.

Верификация локально:
  • `npm ci` в node:20-alpine внутри `docker build` — образ собран целиком
    (deps → next build → runner), контейнер поднят, `/` отвечает 307;
  • все четыре шага гейта на новом локе: type-check ✓, vitest 13 passed ✓,
    next lint ✓ (только преды, довоенные), mera-public isolation ✓.

Closes #2770
bot-backend merged commit 05bc321728 into main 2026-08-07 09:07:59 +00:00
bot-backend deleted branch chore/dead-code-sweep-aug7 2026-08-07 09:07:59 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2772
No description provided.