Закрыты хвосты (kb/quickstart, дубль H1 в cash-with-scales, 100k, перенос «₸/мес»), передеплой на test; живой grep по /kb/* и /blog/* — чисто. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
16 KiB
Исправления публичного сайта test.food-market.kz — круг 2 (11.10.2026)
Деплой: только тестовый сайт через ~/.fm-watchdog/deploy-public-test.sh
(commit 6f229eb, статус OK). Прод, gateway nginx, прод-БД — не трогались.
Образ отката: 192.168.1.193:5001/food-market-public:test-pre-site-fixes-2
(создан из текущего :test ДО деплоя). Откат: перетегировать его в :test и
docker compose up -d public на prod-vm.
Автопроверка (Playwright, как человек): 44/44 — см. index.html (desktop 1440
@2x + mobile 390 @3x, 13 скриншотов), сырые данные — verify.json.
Уточнение поручения владельца по брендам (важно)
Было два сообщения владельца. Итоговая (уточнённая) трактовка, по которой сделано:
- Убрать со всего сайта — ТОЛЬКО чужие СИСТЕМЫ УЧЁТА рознцы (конкуренты):
«МойСклад» / «Мой склад» / MoySklad, «1С» / 1C. Grep по
dist: 0 вхождений вне/legal/*(в/legal/*их и нет — проверено). - Платёжные системы, банки, маркетплейсы (Kaspi Pay, Kaspi Magazin, Halyk,
Jusan, Forte, Wildberries, Ozon, Visa, Mastercard) — НЕ чужие системы учёта,
удалять не требовалось. Оставлены только как честная пометка «в разработке»
на
/integrationsи главной (без дат и обещаний), нигде — как готовая функция. - Промежуточное (ошибочно расширенное) удаление Kaspi/маркетплейсов со страницы
/integrationsоткатил — вернул их в блок «В разработке» в прежнем виде (Kaspi Pay, Kaspi Magazin, Ozon, Wildberries; ОФД РК). - Из KB/блога/FAQ обещания уже подключённых способов оплаты/интеграций всё равно убраны — но по причине «этого нет в продукте», а не «чужой бренд».
Где Kaspi/маркетплейсы остались (проверено): /integrations (блок «В разработке»)
и главная (FAQ — «в планах, сроков не называем»). Больше нигде.
Сделано — по пунктам круга 2
1. Оставшиеся «ложные обещания» / честность текстов
/kb/pos-setup— касса для Windows и Linux; вход = адрес сервера + логин- PIN (не «ключ организации»); установка «скоро»; принтеры «58/80 мм (ESC/POS)».
/blog/quick-start— убран дубль# H1; «Импорт через API» → «Импорт из других систем учёта — в разработке»; шаги установки .msi/ключ → сервер+логин+PIN; меню лояльности/маркетинга → «раздел «Акции и скидки»», «лояльность — в расширенном режиме»; обложка — скриншот продукта (не чужое стоковое фото)./blog/launch— убран дубль H1; «триал» → «честный бесплатный период»; «Касса для Windows» → «Windows и Linux … приложение — скоро»; маркетплейсы/оплаты → «в разработке» (без дат); «все возможности CRM/лояльность/…» → «без доплат за модули»./kb/faq— бэкапы «каждые 24 ч» → «регулярные»; «TLS 1.3» → «TLS» (без версии); формулировка про ЗРК смягчена до «в соответствии с законодательством РК»; импорт — файлы Excel/CSV, из других систем «в разработке»; «триал» → «бесплатный период» (унифицировано); «с SLA» убрано.- Унификация «триал» → «бесплатный период» по сайту (og.mjs тоже). В
/legal/*термин «Триал» оставлен как есть (юр. документы не трогаем). - og-картинки перегенерированы (
node scripts/og.mjs): без чужих систем учёта; касса «Windows и Linux»; «90 дней бесплатно».
2. React #418 (hydration mismatch) на /signup
SignupForm.tsx: ?plan= и параметры конфигуратора теперь читаются в useEffect
после гидрации, поэтому первый клиентский рендер совпадает с SSR-разметкой.
Проверка консоли на /, /pricing, /signup?plan=business&… и /signup?plan=business
— ошибок нет, #418 отсутствует (8/8 авто-проверок).
3. /signup без параметров конфигуратора
plan=businessбез параметров → выбран «Бизнес» с дефолтной конфигурацией 1/1/1/5 = 10 000 ₸ (показана карточка «Ваша конфигурация»). ✓ проверено.plan=network→ «Сеть»; неизвестный план → «Старт». ✓- Клик по плитке тарифа обновляет URL (
history.replaceState). - Плитка «Старт»: «5 000 ₸» → «5 000 ₸/мес»; цены плиток без переноса.
4. Типографика KB/блога
.prose-md(h2/h3, списки, таблицы, ссылки, код, цитаты) вынесена вglobal.css— грузится на всех страницах;/kb/*больше не плоский текст (раньше стиль был только на странице блога). ✓ проверено (h2,ul liв.prose-md).- Блог: убран дублирующий
<h1>(в теле статей) — на странице ровно один H1. ✓
5. Мелочи
- sitemap.xml — канонические URL со слэшем (убраны 301), добавлены статьи KB и блога. ✓
- Footer «Status» → «Статус».
/changelog— убран внутренний жаргон (Phase N, SuperAdmin, retention period, tenant, inline, Read-only/Edit-mode) → человеческие формулировки; заголовок «Что нового». ✓/pricing— на конструкторе «Бизнес» бейдж «Популярный» (как на главной)- «90 дней бесплатно»; у «Старт» убран ложный пункт «Импорт из других систем».
- Шапка ~1050px: десктоп-меню переведено на
xl(до 1280px — гамбургер), CTA без переноса → на ~1050px и на мобильном меню/кнопка не ломаются в 2 строки. ✓ - Инлайн-ссылки в тексте — увеличенная зона нажатия (padding без сдвига вёрстки).
- Эмодзи-фолбэк-стек в
body(чтобы эмодзи не были квадратами там, где нет цветного emoji-шрифта).
6. Не трогал
/legal/* и контакты-плейсхолдеры («[НАЗВАНИЕ ТОО]», «[БИН]», «+7 (___)») — без
изменений. Бренд ALL MARKET, цвета, шрифты — без изменений.
Дополнение по тесту на Android (Firefox 157) — сделано
- Мобильное меню + кнопка «Назад» Android. При открытии панели кладём запись
в историю (
pushState), закрываем поpopstate→ системная «Назад» закрывает меню, а не уводит со страницы. Esc/тап-вне/крестик остались. ✓ проверено (m-after-back.png— после «Назад» панель закрыта, остались на/). - Состав мобильной панели. Добавлены «Интеграции» (в основную навигацию) и внизу панели вторичные ссылки «Статус» и «Что нового» (раньше были только в футере). ✓
- «Настроить тариф» (главная) →
/pricing#configuratorсо скроллом к конструктору (у блокаid="configurator"+scroll-mt-20). ✓ якорь есть. - Ползунки конструктора на тач. Крупная ручка (28px),
touch-action: pan-yна инпуте (вертикальный свайп скроллит страницу, а не двигает значение), и кнопки «−/+» у каждого значения (менять без перетаскивания). ✓ проверено. /kb/billing. Проверено по кодуsrc/food-market.*: биллинг/подписки в продукте нет (в вебе явная заглушка «до Phase 4 «Подписки»»; единственная сущностьSubscription— этоWebPushSubscription, push-уведомления). Поэтому убраны несуществующие: «Настройки → Подписка → История» (скачивание счетов/чеков), e-mail-напоминания, баннер в админке, формула кредита при понижении, SLA для «Сеть». Переписано честно: оплата на раннем доступе — вручную через поддержку, онлайн-оплата и личный кабинет «в разработке». Цены «тг» → «₸». ✓/status. Убраны фиктивные зелёные «● Работает» (мониторинга нет) — честная страница «в разработке» + контакты для инцидентов (реальный/healthне подключал: это требует серверной части, вне правки статического сайта). ✓
Решения, требующие внимания владельца
- Контракт API регистрации. Форма отправляет
plan, а для «Бизнес» ещё иshops/cashes/warehouses/employees(вперёд-совместимо). Текущий серверный контрактSignupInputпринимает толькоplan— конфигурация конструктора на бэкенде пока игнорируется. Нужно решение: принимать ли её на сервере (тогда — отдельная задача по API) или оставить как сейчас. - Оборудование на
/integrations. В «Уже работает» вернул конкретику «весы CAS, Масса-К и совместимые» (это производители весов, не системы учёта, — под уточнённое поручение не попадают). Если хотите — заменю на нейтральное «популярные протоколы». - Юр. документы / реквизиты. В
/legal/*чужих систем учёта и брендов нет — список пуст, ничего выносить не требуется. Плейсхолдеры реквизитов не трогал.
Проверка (как в задаче)
| Критерий | Результат |
|---|---|
Консоль чистая на /, /pricing, /signup (вариации), React #418 нет |
✓ |
plan=business без параметров → «Бизнес» 10 000 (1/1/1/5) |
✓ |
dist/живой сайт: 0 «МойСклад/Мой склад/moysklad/1С/1C» вне /legal/* |
✓ |
Kaspi/маркетплейсы — только «в разработке» на /integrations и главной |
✓ |
| Унификация «бесплатный период»; «тг» → «₸» в KB | ✓ |
| Типографика KB (h2/списки) + один H1 в блоге | ✓ |
| sitemap — канонические URL со слэшем + KB/блог | ✓ |
| Моб.: «Назад» закрывает меню; состав панели; ползунки −/+ | ✓ |
/status без фиктивного статуса; /changelog без жаргона; /kb/billing честный |
✓ |
Итог авто-проверки: 44/44.
Догоняющие правки (сверка с канонической редакцией задачи)
При повторной сверке с полным списком задачи закрыты оставшиеся хвосты
(commit 28cc6a7, передеплой на test — OK):
/kb/quickstart(отдельный файл от блога — его пропускал ранее): убраны.msi, «ключ организации», «импорт по API-токену» → импорт из файла Excel/CSV, из других систем «в разработке»; касса Windows и Linux «скоро», вход по адресу сервера + логин + PIN./blog/cash-with-scales— убран дублирующий<h1>в теле (теперь во всех трёх статьях блога ровно один H1 — проверено вdist).- «до 100 000 товаров» (kb/faq + og) — в коде точного лимита нет (есть только
RequestSizeLimit(20MB)на эндпоинте импорта), поэтому заменено на нейтральное «большие каталоги — тысячи позиций». - Кнопка «Выбрать конфигурацию» — цена «₸/мес» больше не переносится
(
whitespace-nowrap). - Инлайн-ссылки «офертой»/«политикой» в форме регистрации — увеличенная зона
нажатия (
py-1) без изменения вида.
ОС кассы — проверено по коду: food-market.pos.csproj → TargetFramework net8.0 (не net8.0-windows) + Avalonia (кроссплатформенный UI) → сборка под
Windows и Linux реальна, формулировка на сайте честна (приложение для
скачивания — «скоро»).
Живой grep (curl) по всем страницам /kb/* и /blog/*: нет .msi,
API-токен, ОКП, Kaspi Magazin, Wildberries, Ozon, TLS 1.3,
100 000, триал, SIN EXCEPCION. Обложка /blog/quick-start =
/screenshots/catalog.webp (скриншот продукта, без чужого фото).