food-market/docs/rebrand-all-market-progress.md
nns 466e546ae2
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker Public / Build + push Public (test + latest) (push) Waiting to run
Docker Public / Deploy :test → test.food-market.kz (push) Blocked by required conditions
Docker Web / Build + push Web (push) Waiting to run
Docker Web / Deploy Web on stage (push) Blocked by required conditions
rebrand: кэш-бастинг логотипа (старое лого залипало в SW/кэше)
Причина: SW веб-админки прекэшировал /logo.svg и отдавал stale, CACHE_VERSION не
менялся при ребрендинге; публичный сайт отдавал лого/favicon без Cache-Control.

- sw.js: CACHE_VERSION fm-v2 → am-v3 (+ASSET_VERSION am3); activate чистит старые
  кэши, skipWaiting+clients.claim; прекэш бренд-ассетов версионирован; бренд в
  комментариях → ALL MARKET.
- ?v=am3 на нехэшированных бренд-ассетах: index.html, manifest, Logo.tsx,
  публичный Logo.astro + BaseLayout favicon.
- nginx web: index.html + бренд-ассеты + manifest → no-cache; /assets/* → immutable.
- nginx public: html + лого/favicon → no-cache; /_astro/* → immutable.

Проверено Playwright: старый клиент (SW fm-v2 + лого Food Market) → после выкладки
+ 1 перезагрузки кэш am-v3, fm-v2 удалён, лого ALL MARKET. Заметка на будущее про
очистку API_CACHE при logout — в прогресс-доке.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 19:47:41 +05:00

106 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Ребрендинг Food Market → ALL MARKET — прогресс
Решение владельца 08.10.2026. Поменять **логотипы и отображаемое имя** продукта
(SaaS-система учёта) на **ALL MARKET**. Цвета UI и шрифт интерфейса (Inter) — НЕ менять.
Обязательна возможность быстрого отката.
Брендбук: `~/.fm-watchdog/brand/all-market/` (README + svg/pdf/png). Логотип «all market»
(ручка корзины над «all»), зелёный #0DB70D + графит #4C4F54, шрифт лого Onest (в кривых).
Охранное поле ≥ высоты «a», минимум 120 px по ширине на экране. Файлы НЕ перерисовывать.
## Отображаемое имя
«Food Market» / «food-market» / «FOOD MARKET» → **ALL MARKET** (в тексте — ALL MARKET; лого — файлом).
## План / статус
0. [x] Подготовка к откату: тег `pre-rebrand-all-market` (c8c0be5), docs/rebrand-rollback.md,
deploy/rebrand-rollback.sh (dry-run по умолчанию), проверка отката в worktree (ниже).
1. [x] Ассеты бренда в репозитории (web/public/pos): логотипы, иконки, favicon.
2. [x] Веб-админка: Logo, вход/восстановление, favicon/apple-touch/manifest/PWA-иконки,
<title>, offline, онбординг, SuperAdmin, отправитель писем.
3. [x] Письма (api/Resources/EmailTemplates): шапка-вордмарк + подпись; имя отправителя и строки API.
4. [x] Публичный сайт (Astro): лого, favicon, OG 1200×630 (реальный логотип), title/meta, тексты, Footer/FAQ.
5. [x] Касса (Avalonia): лого в шапке (color/white) + разделитель, заголовок окна, вход,
иконка приложения (.ico), подвал чека «ALL MARKET — система учёта торговли», pos-mockup.
6. [x] Документация docs/*.md пользовательская (imports, simple-mode).
7. [x] Проверка: grep (остатки обоснованы ниже), скриншоты Было/Стало (docs/rebrand-screenshots/),
POS --uitest/smoke OK (82 unit), deploy-stage, проверка отката в worktree (ниже).
full-chain C + menu-walk — против стенда после финального деплоя.
## Безопасность (ревью Mac-Claude) — закрыто
- **Пароль dev-админа утекал в UI.** `LoginPage` префилил e-mail/пароль SuperAdmin и
показывал подсказку «Dev admin: admin@food-market.local / Admin12345!» безусловно.
→ показывается только в `import.meta.env.DEV` на localhost; на стенде/проде поля пустые.
- **Сидер создавал SuperAdmin с известным паролем во ВСЕХ средах.** `DevDataSeeder`
(hosted service, без env-гейта) создавал `admin@food-market.local` с хардкодом
`Admin12345!` — т.е. и на Production. → пароль берётся ТОЛЬКО из секрета
(`Seed:SuperAdminPassword` / env `SEED_SUPERADMIN_PASSWORD`); дефолт — лишь в Development;
на прод/стенде без секрета аккаунт НЕ создаётся (warning). Проброшено в stage-compose.
- **Существующий пароль на стенде** (`Admin12345!`, давал /connect/token→200) сменён
вручную на сложный: POST /api/me/change-password. Новый пароль — в
`~/.fm-watchdog/stage-superadmin-password` (chmod 600). Проверено: старый→400,
новый→200, sentinel/master quick-login→200 (стендовый быстрый вход цел).
- **Другие хардкод-пароли:** `docs/DEVELOPER-GUIDE.md` и `docs/quick-login.md` —
внутренние dev/тест-доки (не пользовательские), оставлены; на прод quick-login выключен.
- **Зелёный UI не менялся:** `--color-brand #00B207` идентичен дорибрендинговому (git-diff пуст).
- **Тост 404 на входе:** StageBanner/QuickLoginBlock пробовали `/api/dev/quick-login/accounts`
через axios → глобальный тост «Не найдено» на проде. → raw fetch, тостов на входе нет.
## Проверка отката (worktree, стенд не трогали)
`git worktree` + `git revert pre-rebrand-all-market..HEAD` → применился чисто; собрались
API и web (0 ошибок); лого вернулось на Food Market (dist/logo.svg aria-label="Food Market",
<title>FOOD MARKET</title>, касса «FOOD MARKET · Касса»). Worktree удалён. Скрин —
`docs/rebrand-screenshots/rollback-logo-foodmarket.png`.
## Что НЕ трогаем (обоснование остаточных «food-market»)
- Домены `*.food-market.kz`, nginx, сертификаты — allmarket.kz ещё не куплен (отдельная задача).
- C#-namespaces `foodmarket.*`, имена csproj/проектов/репо/docker-образов/БД/контейнеров.
- `client_id=food-market-web`, ключи localStorage/cookie — иначе разлогинит всех.
- Бонус-приложение магазина (food-market-app/-ios, back.food-market.kz) — бренд магазина, не продукта.
- Данные организаций («Демо-магазин» и т.п.), в т.ч. демо-орг «FOOD MARKET» в маркетинг-скриншотах.
- Цвета UI, шрифт интерфейса (Inter).
- Имена артефактов кассы (`food-market-pos-*.zip/.AppImage`, exe `foodmarket.Pos`) — завязаны на
AssemblyName (инфраструктура); у кассы ребрендировано видимое: заголовок окна, Name в .desktop, иконка.
- Встроенные продуктовые скриншоты маркетинг-сайта (`public/screenshots/*.png`) — генерируются
`scripts/screenshots.mjs` против ЖИВОЙ админки (сейчас прод); обновятся при выкатке ребрендинга
на прод (прод в этой задаче не трогаем). На стенде ребренд виден вживую.
## Диапазон коммитов для отката
Все коммиты с префиксом `rebrand:` подряд поверх тега `pre-rebrand-all-market`:
**`pre-rebrand-all-market..HEAD`** = `ec7d2dc` … `af00f04` (11 коммитов, см.
`git log --oneline pre-rebrand-all-market..HEAD`). Откат: `deploy/rebrand-rollback.sh --apply`
(или `git revert --no-edit pre-rebrand-all-market..HEAD` + `~/deploy-stage.sh`).
## Итог проверки
- **grep:** видимых «Food Market/FOOD MARKET» в UI/письмах/сайте/кассе не осталось;
остатки — только обоснованные (домены, namespaces, client_id, демо-орг, артефакты, см. выше).
- **Скриншоты Было/Стало:** `docs/rebrand-screenshots/` + index.html (лого, favicon, письмо,
OG, касса вход/продажа, веб-вход, публичная главная; «Было» из тега, «Стало» live).
- **POS:** `--uitest` OK, `--smoke` OK (старт 157мс), 82 unit зелёные.
- **Стенд:** `~/deploy-stage.sh` → OK (test.admin.food-market.kz). Реальный вход: лого ALL MARKET,
без тостов, без префилла/подсказки пароля.
- **menu-walk:** 3/3 passed (demo-admin/keeper/cashier, каждый пункт меню, 0 ошибок/тостов).
- **full-chain C:** 16 ✓ / 0 ✗ — ЗЕЛЁНЫЙ.
- **Откат:** проверен в worktree (revert собрался, лого Food Market вернулось), стенд не трогали.
## Журнал
- 08.10 — старт: прочитан брендбук, составлен план, зафиксированы границы.
- 08.10 — ребрендинг web/api/public/pos/docs (коммиты ec7d2dc…89c5c6d); галерея Было/Стало.
- 08.10 — ревью Mac-Claude: безопасность входа (префилл/подсказка/сидер/ротация пароля стенда),
тост 404 (StageBanner/QuickLoginBlock → fetch), касса (лого крупнее + разделитель, бейдж внутри).
- 08.10 — deploy-stage OK; menu-walk 3/3; full-chain 16/16 ЗЕЛЁНЫЙ; откат проверен в worktree.
- 08.10 — **кэш-бастинг лого** (у владельца в браузере оставалось старое лого из SW/кэша):
- `sw.js`: `CACHE_VERSION fm-v2 → am-v3` + `ASSET_VERSION=am3`; activate удаляет старые кэши,
skipWaiting+clients.claim есть; прекэш бренд-ассетов версионирован; бренд в комментариях → ALL MARKET.
- `?v=am3` на нехэшированных бренд-ассетах во всех ссылках: `index.html`, `manifest.webmanifest`,
`Logo.tsx`, публичный `Logo.astro` + `BaseLayout.astro` favicon.
- nginx web (`deploy/nginx.conf`): `index.html` + бренд-ассеты + `manifest` → `no-cache`; `/assets/*` → immutable.
- nginx public (`src/food-market.public/deploy/nginx.conf`): html + лого/favicon → `no-cache`; `/_astro/*` → immutable.
- Проверка Playwright: старый клиент (SW fm-v2 + лого Food Market) → после выкладки + 1 перезагрузки
кэш `am-v3`, `fm-v2` удалён, лого ALL MARKET. PASS.
- При будущей смене логотипа: bump `CACHE_VERSION` (sw.js) + `?v=` в ссылках (index.html, manifest, Logo.tsx/.astro).
### Заметка на будущее (НЕ в этой задаче)
SW кэширует ответы `GET /api/*` (`API_CACHE`). На ОБЩЕМ компьютере после выхода из аккаунта данные
прошлого пользователя могут остаться в кэше. Предложение: при logout чистить `API_CACHE`
(`caches.delete('am-v3-api')` или через `postMessage` к SW) — отдельной задачей.