feat(tradein): версионирование продукта — единый источник, подвал, PDF, /versions #2824
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2824
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/tradein-versioning"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Зачем
До сих пор «версия» существовала как два независимых декоративных хардкода —
ui-config.ts::version = "v2.0.6"(подвал отчёта на/trade-in/v2) и_REPORT_ENGINE_VERSION = "v2.0.6"(подвал PDF). Ни один не был связан с тем, что реально задеплоено. Заводим настоящее версионирование.Решения владельца продукта
Мера v2.1.0 · a1b2c3d · 10.08.2026.Summary
tradein-mvp/VERSION— единственный источник правды. Оба старых хардкода удалены, чтобы на экране и в отчёте не соседствовали два разных номера.tradein-mvp/CHANGELOG.md— Keep a Changelog на русском, языком продукта, а не коммитов. Заголовок машинно-парсим:## <semver> — <YYYY-MM-DD>.APP_VERSION/BUILD_SHA/BUILD_DATE(backend, читаются в рантайме) иNEXT_PUBLIC_*(frontend, обязательно build-time — иначе не попадут в статику).paths-filterтеперь триггерит пересборку и на изменениеVERSION/CHANGELOG.md, иначе bump версии не доехал бы до образов.GET /api/v1/trade-in/version→{version, sha, built_at}, публичный (точное совпадение пути в_PUBLIC_PATHS, не префикс)./trade-in/versionsрендерит историю изCHANGELOG.mdобычным текстом, безdangerouslySetInnerHTML.Dockerfilebackend: блокARG/ENVперенесён в конец runner-стадии —BUILD_DATEменяется каждый деплой и иначе инвалидировал бы registry-кэш apt/venv/app-слоёв на каждой сборке.Test plan
ruff check/ruff format— чисто; pre-commit зелёный; YAML workflow валиденtsc --noEmit,eslint,npm run build— чисто,/versionsсобирается как статика и реально содержит текст CHANGELOG-m pdf_render→ 3 passed, включая «ровно 4 страницы без пустых листов» (регрессия из42a50cf8не вернулась)printenvвнутри подтвердил ENVCOPY CHANGELOG.md*при отсутствии файла в контексте — сборка не падает/trade-in/v2, страницу/trade-in/versionsи ответ/versionна продеДо сих пор номер версии существовал как два независимых декоративных хардкода («МЕРА v2.0.6» в подвале отчёта и в PDF), не связанных с тем, что реально задеплоено. Заводим настоящее версионирование. - tradein-mvp/VERSION — единственный источник правды (2.1.0). Номер продолжает ряд, который клиент уже видел в отчётах, чтобы не поехал назад. - tradein-mvp/CHANGELOG.md — Keep a Changelog на русском, языком продукта. Заголовок версии машинно-парсим: `## <semver> — <YYYY-MM-DD>`. - Проброс в сборку: build-args → APP_VERSION/BUILD_SHA/BUILD_DATE (backend, рантайм) и NEXT_PUBLIC_* (frontend, build-time — иначе не попадёт в статику). paths-filter теперь триггерит пересборку на изменение VERSION/CHANGELOG. - GET /api/v1/trade-in/version → {version, sha, built_at}, публичный. - Подвал веб-интерфейса и шапка PDF показывают «Мера vX.Y.Z · sha · дата». - Страница /trade-in/versions — история версий из CHANGELOG.md, рендер простым текстом без dangerouslySetInnerHTML. - Удалены оба старых хардкода версии, чтобы на экране и в отчёте не соседствовали два разных номера.