# Правило самопроверки перед выдачей на тест

**Действует на каждый коммит/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 если есть

---

**Применять до каждого «готово, тестируй» сообщения пользователю.**
