From 7b874e0195d5c4cc4abf3c0ee97e24b84271d19a Mon Sep 17 00:00:00 2001 From: wasrusgen Date: Mon, 18 May 2026 11:16:27 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC?= =?UTF-8?q?=D0=B0=20=D0=B0=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D1=85=20?= =?UTF-8?q?=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20=E2=80=94=20ROADMA?= =?UTF-8?q?P,=20=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81=D1=8B,=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=B0=D0=BD=D0=B4=D0=B0=20/project:review?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ROADMAP.md — единый роадмап продукта (реализовано / в работе / бэклог) - agents/dev-status.md — состояние кода, долг, следующий шаг - agents/devops-status.md — VPS, блокеры, инфра-бэклог - agents/design-status.md — компоненты, нереализованные экраны - agents/feature-status.md — таблица функционала, приоритизированный бэклог - agents/test-status.md — покрытие, пробелы, следующий шаг - .claude/commands/review.md — мастер-команда: сводный отчёт по всем агентам - Все агенты обновлены: читают и пишут свой status.md в начале/конце работы Co-Authored-By: Claude Sonnet 4.6 --- .claude/commands/design.md | 18 ++++---- .claude/commands/dev.md | 3 +- .claude/commands/devops.md | 10 +++-- .claude/commands/feature.md | 9 ++++ .claude/commands/review.md | 85 +++++++++++++++++++++++++++++++++++++ .claude/commands/test.md | 10 +++-- ROADMAP.md | 83 ++++++++++++++++++++++++++++++++++++ agents/design-status.md | 38 +++++++++++++++++ agents/dev-status.md | 37 ++++++++++++++++ agents/devops-status.md | 47 ++++++++++++++++++++ agents/feature-status.md | 57 +++++++++++++++++++++++++ agents/test-status.md | 44 +++++++++++++++++++ 12 files changed, 425 insertions(+), 16 deletions(-) create mode 100644 .claude/commands/review.md create mode 100644 ROADMAP.md create mode 100644 agents/design-status.md create mode 100644 agents/dev-status.md create mode 100644 agents/devops-status.md create mode 100644 agents/feature-status.md create mode 100644 agents/test-status.md diff --git a/.claude/commands/design.md b/.claude/commands/design.md index 821e110..5e9d29d 100644 --- a/.claude/commands/design.md +++ b/.claude/commands/design.md @@ -72,14 +72,16 @@ color: #F5F5F5; /* ✅ почти белый — невидим на свет ## Процесс работы с дизайном -1. Получить задачу на новый экран или изменение -2. Если нужен прототип → открыть open-design (localhost:17573) -3. Написать/изменить CSS в `styles.css` или `podbor.css` -4. Проверить все 4 темы -5. Запустить CSS-линтер: `python -X utf8 tests/lint_css.py` -6. Поднять версию `?v=` в `index.html` -7. Запустить `/project:ui-check` -8. Коммит только после зелёных проверок +1. **Прочитать `agents/design-status.md`** — понять что запроектировано, что нет +2. Получить задачу на новый экран или изменение +3. Если нужен прототип → открыть open-design (localhost:17573) +4. Написать/изменить CSS в `styles.css` или `podbor.css` +5. Проверить все 4 темы +6. Запустить CSS-линтер: `python -X utf8 tests/lint_css.py` +7. Поднять версию `?v=` в `index.html` +8. Запустить `/project:ui-check` +9. Коммит только после зелёных проверок +10. **Обновить `agents/design-status.md`**: что запроектировано, что нет, следующий шаг ## Компонентная библиотека (существующие классы) ``` diff --git a/.claude/commands/dev.md b/.claude/commands/dev.md index 4ab0fcb..fd65948 100644 --- a/.claude/commands/dev.md +++ b/.claude/commands/dev.md @@ -34,12 +34,13 @@ - Формат буквы: a → b → c → ... в течение одного дня ## Процесс работы -1. Прочитать задачу +1. **Прочитать `agents/dev-status.md`** — понять текущее состояние и бэклог 2. Найти нужные файлы (`Glob`, `Grep`, `Read`) 3. Написать код 4. Поднять версию `?v=` если тронут miniapp 5. Запустить `/project:test` — убедиться что не сломал 6. Закоммитить с понятным сообщением +7. **Обновить `agents/dev-status.md`**: добавить в «Сделано», убрать из бэклога, написать новый «Следующий шаг» ## Чего НЕ делать - Не трогать `deploy/` и docker без `/project:devops` diff --git a/.claude/commands/devops.md b/.claude/commands/devops.md index 0efe963..7e6e77d 100644 --- a/.claude/commands/devops.md +++ b/.claude/commands/devops.md @@ -65,10 +65,12 @@ curl -s https://api.wasrusgen1.pro/healthz - Проверить деплой: вкладка Actions в репозитории ## Процесс деплоя -1. `git push` в master → GitHub Pages обновляется автоматически -2. Для VPS (бот/бэкенд) — запустить SSH-команды выше -3. Проверить: `curl https://api.wasrusgen1.pro/healthz` → должен вернуть 200 -4. Запустить `/project:test` для подтверждения +1. **Прочитать `agents/devops-status.md`** — проверить блокеры и известные проблемы +2. `git push` в master → GitHub Pages обновляется автоматически +3. Для VPS (бот/бэкенд) — запустить SSH-команды выше +4. Проверить: `curl https://api.wasrusgen1.pro/healthz` → должен вернуть 200 +5. Запустить `/project:test` для подтверждения +6. **Обновить `agents/devops-status.md`**: статус блокеров, новые проблемы, следующий шаг ## Мониторинг и диагностика - Если бот не отвечает → проверить логи бота diff --git a/.claude/commands/feature.md b/.claude/commands/feature.md index 45f44be..5c12485 100644 --- a/.claude/commands/feature.md +++ b/.claude/commands/feature.md @@ -70,12 +70,21 @@ if (prefill) { /* применить */ sessionStorage.removeItem("prefillClient - Применить минимальный патч - Не ломать существующий функционал +### Шаг 0 — Контекст +**Прочитать `agents/feature-status.md` и `ROADMAP.md`** — понять что реализовано, что нет, приоритеты. + ### Шаг 3 — Проверка ```bash python -X utf8 tests/test_manager.py # полный тест менеджера python -X utf8 tests/smoke_api.py # smoke +node tests/ui_smoke.js # UI Playwright ``` +### Шаг 4 — Обновление статуса +После реализации **обновить `agents/feature-status.md`** и **`ROADMAP.md`**: +- Переместить функцию из «Бэклог» в «✅ Реализовано» +- Обновить «Следующий шаг» + ## API эндпоинты (существующие) | Эндпоинт | Описание | |---|---| diff --git a/.claude/commands/review.md b/.claude/commands/review.md new file mode 100644 index 0000000..f75af7c --- /dev/null +++ b/.claude/commands/review.md @@ -0,0 +1,85 @@ +# Агент: Ревью продукта + +Ты — координатор. Собираешь полную картину состояния продукта от всех агентов и формируешь план следующего шага. + +## Что делаешь + +### Шаг 1 — Читай статусы всех агентов +``` +agents/dev-status.md +agents/devops-status.md +agents/design-status.md +agents/feature-status.md +agents/test-status.md +ROADMAP.md +``` + +### Шаг 2 — Проверь живое состояние + +**Git: последние изменения** +```bash +git log --oneline -10 +git status +``` + +**VPS: сервисы живы?** +```bash +curl -s https://api.wasrusgen1.pro/healthz +``` + +**Тесты: последний прогон чистый?** +```bash +python -X utf8 tests/smoke_api.py 2>&1 | tail -20 +``` + +### Шаг 3 — Сформируй отчёт + +Выведи строго в этом формате: + +``` +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + РЕВЬЮ ПРОДУКТА — zov-tech [дата] +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + ИНФРАСТРУКТУРА + VPS / API ✅/❌ [статус] + GitHub Pages ✅/❌ [последний деплой] + Drive-доступ ✅/❌ [shipments/arrivals] + + КОД + Последний коммит: [хэш] [сообщение] + Открытый долг: [N пунктов] + + ТЕСТЫ + CSS-линтер ✅/❌ + Smoke API ✅/⚠️/❌ (N/12) + Менеджер ✅/⚠️/❌ (N/19) + UI Playwright ✅/❌ (N/10) + + ФУНКЦИОНАЛ + Реализовано: [N функций из ROADMAP] + В работе: [что сейчас в процессе] + Следующий MVP: [первый незакрытый Приоритет 1] + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + БЛОКЕРЫ (требуют действия Руслана) +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + [список — каждый блокер одной строкой] + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + ПЛАН НА СЛЕДУЮЩИЙ СПРИНТ +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + 1. [задача — агент — оценка] + 2. [задача — агент — оценка] + 3. [задача — агент — оценка] +``` + +### Шаг 4 — Обнови статус-файлы + +Если при проверке обнаружил устаревшие данные в `agents/*.md` — исправь их. +Если ROADMAP не соответствует реальному состоянию — исправь. + +### Шаг 5 — Рекомендация + +Одним предложением: что делать прямо сейчас и какой агент вызвать. +Пример: «Вызови `/project:feature` — экран «Мой статус» готов к реализации, дизайн не нужен.» diff --git a/.claude/commands/test.md b/.claude/commands/test.md index 96545cf..e58da01 100644 --- a/.claude/commands/test.md +++ b/.claude/commands/test.md @@ -1,6 +1,9 @@ # Агент: Тестировщик -Запусти все тесты и выдай сводный отчёт с замечаниями к устранению. +Запусти все тесты, выдай сводный отчёт и обнови статус покрытия. + +## Шаг 0 — Читай статус +Прочитай `agents/test-status.md` — знай что уже покрыто и что пропускается намеренно. ## Шаг 1 — CSS-линтер ```bash @@ -52,5 +55,6 @@ node tests/ui_smoke.js Эти два считать **предупреждением**, не блокирующей ошибкой, пока не расшарен файл в Google Drive. ## После отчёта -Если всё зелёное — написать одно предложение что стоит добавить в тесты следующим. -Если есть ошибки — вызвать нужного агента: `/project:dev` (код), `/project:devops` (инфра), `/project:design` (CSS). +1. **Обновить `agents/test-status.md`**: результаты прогона, актуализировать пробелы в покрытии +2. Если всё зелёное — написать одно предложение что стоит добавить в тесты следующим +3. Если есть ошибки — вызвать нужного агента: `/project:dev` (код), `/project:devops` (инфра), `/project:design` (CSS) diff --git a/ROADMAP.md b/ROADMAP.md new file mode 100644 index 0000000..b1a8246 --- /dev/null +++ b/ROADMAP.md @@ -0,0 +1,83 @@ +# ROADMAP — zov-tech CRM MiniApp +> Обновляется агентами автоматически. Последнее обновление: 2026-05-18 + +--- + +## 🎯 Продуктовая цель +Telegram MiniApp для 112 менеджеров салонов ЗОВ: подбор техники, замеры, сборки, CRM-клиенты. +Привязка менеджеров к куратору через инструмент. Клиентский кабинет — воронка покупки. + +--- + +## ✅ Готово (реализовано) + +### Инфраструктура +- [x] VPS на Docker (FastAPI + aiogram + Caddy) +- [x] GitHub Pages для MiniApp (auto-deploy при push в master) +- [x] Google Sheets как БД +- [x] HMAC-SHA256 аутентификация через Telegram initData +- [x] Pre-push hook: CSS-линтер + UI Playwright блокируют сломанный код +- [x] CI: GitHub Actions запускает тесты при каждом push + +### Модули MiniApp (менеджер/admin) +- [x] Список клиентов + поиск + карточка клиента +- [x] Создание/редактирование клиента +- [x] Замеры: создание, фото, закрытие заявки +- [x] Заявка на замер (назначение замерщику) +- [x] Сборки: создание, список, детальная карточка +- [x] Подбор техники (proposals): создание, варианты, голосование клиента +- [x] Подбор через AI (GigaChat/Claude) +- [x] Приватность клиентских данных (имена/телефоны скрыты визуально) +- [x] 4 темы оформления: Default, Foundry, Boardroom, Atelier + +### Качество +- [x] 15-секундный таймаут на все fetch-запросы (все модули) +- [x] CSS-линтер (запрещённые паттерны + WCAG-контраст) +- [x] Smoke API тесты (12 эндпоинтов) +- [x] Полный тест кабинета менеджера (19 сценариев) +- [x] UI Playwright smoke (10 проверок JS-ошибок) + +--- + +## 🔄 В работе + +| Задача | Агент | Статус | +|--------|-------|--------| +| Доступ сервисного аккаунта к Google Drive (отгрузки/поступления) | devops | ⏳ ждём подтверждения | + +--- + +## 📋 Бэклог (приоритизирован) + +### Приоритет 1 — Завершение MVP менеджера +- [ ] Экран «Мой статус» для менеджера (роль, активность, дата последней сделки) +- [ ] Входящие задачи менеджера (`/api/manager_pending`) — экран уведомлений +- [ ] Отгрузки и поступления склад (после решения Drive) + +### Приоритет 2 — Клиентский кабинет +- [ ] Базовый клиентский экран (сейчас только `#/picker`) +- [ ] История заказов клиента +- [ ] Самозамер (5-шаговая форма для клиента) +- [ ] Калькулятор стоимости кухни + +### Приоритет 3 — Аналитика и управление +- [ ] Дашборд куратора: активность менеджеров, воронка сделок +- [ ] Реестр менеджеров: поле `last_order_date`, 90-дневный контроль активности +- [ ] Метрики: количество замеров, подборов, сборок по менеджеру + +### Приоритет 4 — Монетизация +- [ ] Платёжная интеграция (Telegram Stars / ЮKassa) +- [ ] Статусы подписки менеджеров (бесплатно / платно) + +### Технический долг +- [ ] `Content-Type: application/json` в `_fetchWithTimeout` (все модули) +- [ ] Аудит `app.js` роутера на edge cases +- [ ] Тест карточки клиента в Playwright (нужна фикстура) +- [ ] Staging-окружение (отдельный VPS или Docker Compose override) + +--- + +## 🚫 Не в скоупе (решение принято) +- Нативное мобильное приложение (остаётся MiniApp) +- База знаний, Обучение, FAQ (отдельный продукт) +- Партнёрская комиссия от производителей diff --git a/agents/design-status.md b/agents/design-status.md new file mode 100644 index 0000000..b487ece --- /dev/null +++ b/agents/design-status.md @@ -0,0 +1,38 @@ +# Статус агента: Дизайнер +> Обновляется агентом `/project:design` после каждой задачи. + +**Последнее обновление:** 2026-05-18 + +--- + +## ✅ Сделано +- 4 темы оформления: Default (светлая/тёмная), Foundry, Boardroom, Atelier +- Компонентная библиотека: 15+ классов (client-card, podbor-step, btn-primary и др.) +- CSS-линтер: WCAG-контраст, запрещённые паттерны, версии кэша +- Privacy-режим: имена и телефоны клиентов скрыты (`color: #F5F5F5`) +- Анимации: splash-экран с логотипом, spinner, плавные переходы + +--- + +## ⚠️ Известные проблемы +| Проблема | Файл | Приоритет | +|----------|------|-----------| +| open-design требует ручного запуска (нет autostart) | — | низкий | +| Экраны «Мой статус», «Входящие» — не запроектированы | — | средний | +| Тёмная тема Default не проверялась системно по всем экранам | styles.css | средний | +| Нет адаптации под iPhone SE (320px) | styles.css | низкий | + +--- + +## 📋 Бэклог дизайнера +1. Спроектировать экран «Мой статус» менеджера (данные роли, активность, бейджи) +2. Спроектировать экран «Входящие задачи» (карточки заявок) +3. Аудит тёмной темы Default — пройти по всем экранам вручную +4. Типография: проверить иерархию заголовков на экранах замеров и сборок +5. Добавить empty-state иллюстрации (сейчас только текст «пока нет») + +--- + +## 🔜 Следующий шаг +**Спроектировать экран «Мой статус»** в open-design (localhost:17573). +Данные для экрана: роль, имя менеджера, дата последней сделки, количество клиентов/замеров/сборок. diff --git a/agents/dev-status.md b/agents/dev-status.md new file mode 100644 index 0000000..4c81177 --- /dev/null +++ b/agents/dev-status.md @@ -0,0 +1,37 @@ +# Статус агента: Разработчик +> Обновляется агентом `/project:dev` после каждой задачи. + +**Последнее обновление:** 2026-05-18 +**Последний коммит:** `fix: добавить 15-секундный таймаут fetch во все модули` + +--- + +## ✅ Сделано (последние задачи) +- `escAttr is not defined` — добавлена функция, карточка клиента работает +- `_fetchWithTimeout` (15с AbortController) — внедрён во все 5 модулей: clients, measurements, assembly, proposals, request +- Карточка клиента: убран баг с загрузкой proposals вместо карточки +- Сравнение `client_tg_id` через `String()` — исправлен silent TypeError +- Примечания клиента: кнопка больше не зависает на «Сохраняем...» + +--- + +## ⚠️ Известные проблемы +| Проблема | Файл | Приоритет | +|----------|------|-----------| +| Нет `Content-Type: application/json` в `_fetchWithTimeout` | все модули | низкий (бэкенд прощает) | +| `app.js` роутер не аудирован на edge cases | app.js | средний | +| `measurements.js` — статический fetch `zamer-checklist.md` без таймаута | measurements.js | низкий | + +--- + +## 📋 Бэклог разработчика +1. Добавить `Content-Type: application/json` в `_fetchWithTimeout` (все модули) +2. Аудит `app.js`: неизвестные хэши → 404-экран, а не падение +3. Экран «Мой статус» менеджера (API `/api/me` уже есть) +4. Проверить обработку ошибок в `measurements.js` после рефакторинга fetch + +--- + +## 🔜 Следующий шаг +**Добавить `Content-Type` в `_fetchWithTimeout`** — патч в 5 файлах, 2 минуты работы. +Или: реализовать экран «Мой статус» (приоритет 1 в ROADMAP). diff --git a/agents/devops-status.md b/agents/devops-status.md new file mode 100644 index 0000000..eefa45d --- /dev/null +++ b/agents/devops-status.md @@ -0,0 +1,47 @@ +# Статус агента: DevOps / VPS +> Обновляется агентом `/project:devops` после каждой задачи. + +**Последнее обновление:** 2026-05-18 +**VPS:** `94.241.170.144` | **API:** `https://api.wasrusgen1.pro` + +--- + +## ✅ Сделано +- Docker Compose: bot + backend + caddy — все сервисы работают +- Auto-deploy GitHub Pages через GitHub Actions при push в master +- HTTPS через Caddy — сертификат активен +- Pre-push hook защищает от деплоя сломанного кода + +--- + +## 🔴 Блокеры +| Проблема | Описание | Решение | +|----------|----------|---------| +| Drive 404 для shipments/arrivals | Сервисный аккаунт `zov-backend@zov-sborka.iam.gserviceaccount.com` не имеет доступа к файлу отгрузок | ⏳ Ждём расшаривания файла `1KCJUXjhVR2NWEz9bD0kjTaEADsxF8gI5GMzLwJ2bw84` | + +--- + +## ⚠️ Известные проблемы +| Проблема | Приоритет | +|----------|-----------| +| Нет алертинга при падении сервисов (только ручной мониторинг) | средний | +| Нет staging-окружения — правки идут сразу в прод | средний | +| Логи не ротируются автоматически | низкий | + +--- + +## 📋 Бэклог DevOps +1. ✅ Проверить Drive-доступ после расшаривания файла +2. Настроить алертинг: если `/healthz` падает → уведомление в Telegram +3. Настроить staging (`api-dev.wasrusgen1.pro`) для тестирования без риска прода +4. Автоматическая ротация логов Docker +5. Backup Google Sheets → локальный снэпшот раз в сутки + +--- + +## 🔜 Следующий шаг +**Проверить Drive-доступ** как только придёт подтверждение: +```bash +python -X utf8 tests/smoke_api.py +``` +Ожидаем: `POST /api/shipments` и `POST /api/arrivals` перестают падать с 404. diff --git a/agents/feature-status.md b/agents/feature-status.md new file mode 100644 index 0000000..64da256 --- /dev/null +++ b/agents/feature-status.md @@ -0,0 +1,57 @@ +# Статус агента: Функционал +> Обновляется агентом `/project:feature` после каждой задачи. + +**Последнее обновление:** 2026-05-18 + +--- + +## ✅ Реализованные функции + +### Менеджер / Admin +| Функция | Маршрут | Статус | +|---------|---------|--------| +| Список клиентов + поиск | `#/clients` | ✅ работает | +| Создание клиента | `#/clients/new` | ✅ работает | +| Карточка клиента + примечания | `#/clients/client/{key}` | ✅ работает | +| Заявка на замер | `#/request` | ✅ работает | +| Новый замер + фото | `#/measurements` | ✅ работает | +| Закрытие заявки на замер | `#/measurements?id=...` | ✅ работает | +| Список сборок | `#/assembly` | ✅ работает | +| Создание сборки | `#/assembly/new` | ✅ работает | +| Детальная сборка | `#/assembly/{id}` | ✅ работает | +| Подбор техники (proposals) | `#/picker` | ✅ работает | +| AI-подбор (GigaChat/Claude) | через proposals | ✅ работает | + +### Отсутствует из ТЗ (Приоритет 1 ROADMAP) +| Функция | Маршрут | Статус | +|---------|---------|--------| +| Мой статус менеджера | `#/me` или `#/status` | ❌ не реализован | +| Входящие задачи | `#/inbox` | ❌ не реализован | +| Отгрузки завода | — | ❌ блокер: Drive 404 | +| Поступления склада | — | ❌ блокер: Drive 404 | + +--- + +## ⚠️ Известные проблемы +| Проблема | Приоритет | +|----------|-----------| +| Клиентский кабинет — только `#/picker`, нет полноценного кабинета | высокий | +| Нет экрана 404 для неизвестных хэшей | средний | +| Нет пагинации списка клиентов (сломается при 500+ записях) | средний | + +--- + +## 📋 Бэклог функционала +1. **Экран «Мой статус»** — вызов `/api/me`, показать роль + статистику +2. **Экран «Входящие»** — вызов `/api/manager_pending`, карточки заявок +3. **Клиентский кабинет** — базовый экран для роли `client` +4. **Пагинация / виртуальный скролл** в списке клиентов +5. **Фильтры в замерах** — по дате, по замерщику, по статусу + +--- + +## 🔜 Следующий шаг +**Реализовать экран «Мой статус»** (`#/me`): +- API `/api/me` уже возвращает роль, `first_name`, `username` +- Добавить счётчики клиентов/замеров/сборок (требует нового поля в `/api/me` или отдельного запроса) +- Дизайн-агент проектирует экран, dev-агент реализует diff --git a/agents/test-status.md b/agents/test-status.md new file mode 100644 index 0000000..a903000 --- /dev/null +++ b/agents/test-status.md @@ -0,0 +1,44 @@ +# Статус агента: Тестировщик +> Обновляется агентом `/project:test` после каждого прогона. + +**Последнее обновление:** 2026-05-18 +**Последний прогон:** UI smoke 10/10 ✅ + +--- + +## ✅ Тестовое покрытие + +| Сьют | Команда | Охват | Статус | +|------|---------|-------|--------| +| CSS-линтер | `python -X utf8 tests/lint_css.py` | Запрещённые паттерны, WCAG, версии кэша | ✅ зелёный | +| Smoke API | `python -X utf8 tests/smoke_api.py` | 12 эндпоинтов (без auth) | ⚠️ 2 предупреждения (Drive 404) | +| Кабинет менеджера | `python -X utf8 tests/test_manager.py` | 19 сценариев: auth, CRUD, edge cases | ✅ зелёный* | +| UI Playwright | `node tests/ui_smoke.js` | 10 JS-проверок по экранам | ✅ 10/10 | + +*Кроме shipments/arrivals (Drive блокер) + +--- + +## ⚠️ Пробелы в тестировании +| Что не покрыто | Приоритет | +|----------------|-----------| +| Карточка клиента в Playwright (пропускается — нет тестового клиента) | высокий | +| POST /api/shipments, /api/arrivals (Drive 404) | ждём доступ | +| Экраны «Мой статус», «Входящие» (не реализованы) | после реализации | +| Мобильные размеры (320px, landscape) в Playwright | средний | +| Тёмная тема Default — нет визуальных тестов | низкий | + +--- + +## 📋 Бэклог тестировщика +1. Добавить фикстуру в `ui_smoke.js`: создать тестового клиента через API перед тестом, удалить после +2. Добавить тест карточки клиента: открытие, примечание, быстрые действия +3. Проверить shipments/arrivals после получения Drive-доступа +4. Параметризовать `ui_smoke.js` на разные viewport (iPhone SE 320px, iPad 768px) +5. Добавить скриншот-дифф между релизами (визуальная регрессия) + +--- + +## 🔜 Следующий шаг +**Добавить фикстуру в Playwright**: создать клиента через `/api/client_create` в начале теста → протестировать карточку → удалить клиента через `/api/client_delete`. +Это закроет единственный пропускаемый тест.