# Правило самопроверки перед выдачей на тест **Действует на каждый коммит/PR в `master`.** ## Чек-лист перед «готово, тестируй» ### 1. Поток end-to-end на бумаге Каждое новое действие пользователя пройти мысленно от UI до Sheets: - ✅ Пользователь нажимает «Сохранить» - ✅ Frontend отправляет POST → правильный endpoint + правильный body - ✅ Backend валидирует → пишет в Sheets с правильным набором колонок - ✅ Backend возвращает ответ → frontend меняет UI (НЕ зависает «Сохраняем...») - ✅ Следующее действие (например «Открыть карточку») находит ровно эту запись ### 2. Ключи и идентификаторы При создании сущности проверить что **возвращаемый ID/key совпадает с тем по которому потом ищется**: - Если backend возвращает `client_key`, а frontend ищет по `name.lower()` — БАГ - Если создаём `Measurement` с `manager_tg_id=A`, а `/api/measurements` фильтрует по `requested_by_tg_id` — БАГ ### 3. Состояния UI После любого POST: - Кнопка «Сохраняем...» должна СБРОСИТЬСЯ (или замениться, или скрыться) - Не должно быть «зависших» загрузчиков - Сообщение об ошибке/успехе должно быть видно - Обработчики новых кнопок должны привязываться к НУЖНОМУ контейнеру (`result.querySelector` ≠ `form.querySelector`) ### 4. Валидация ввода Для каждого поля формы спросить: - Минимальная длина / формат? - Нормализация (телефон в +7XXXXXXXXXX, имя trim'ить)? - Дубликаты (тот же телефон уже есть)? - XSS-эскейпинг при отображении? ### 5. Удаление и редактирование Для каждой создаваемой сущности заложить: - Возможность удалить (с подтверждением) - Возможность отредактировать - Soft-delete (флаг `archived`) предпочтительнее hard-delete ### 6. Нумерация Для бизнес-сущностей (клиент, замер, договор) — **последовательный человекочитаемый номер** в дополнение к UUID. Иначе пользователь не сможет ссылаться на «клиента №123». ### 7. Голосовой ввод При работе с SpeechRecognition: - Финальные транскрипты не должны дублироваться - Промежуточные не должны накапливаться - При повторных запусках записи — продолжение, не сброс ### 8. Деплой и кэш - Bump `v=...` в `index.html` для каждого изменения статики - Дождаться раскатки GH Pages (~30 сек) перед уведомлением о готовности - Backend redeploy: `docker compose build && up -d` ИЛИ `docker cp` + `restart` если Docker Hub rate-limit ### 9. Логи и наблюдение После деплоя — заглянуть в `docker logs zov-backend --tail 20`: - Нет ли `[WARN]` про новые endpoints - При первом тестовом запросе — увидеть его в логах ### 10. Документация Если коммит вводит **новый workflow** — описать его краткое: - В коммит-сообщении - В README или CHANGELOG если есть --- **Применять до каждого «готово, тестируй» сообщения пользователю.**