# RUNBOOK — влить lead-region в main (прод-паритет)

**Дата:** 16.06.2026. **Задача:** T1 «влить телефон-каскад lead-region в main».
**Канал:** merge выполняется в терминале владельца (git merge/checkout/stash недоступны под стеной).

## Контекст и проверки (сделано)

Прод (`liderra-test`, `/var/www/liderra/app`) деплоится rsync'ом, не git-checkout. Сверка
прод ↔ ветки по git-blob хешам 4 ключевых файлов:

| Файл | feat HEAD | прод | вывод |
|---|---|---|---|
| LeadRegionResolver.php | `f1ad734d` | `f1ad734d` | == feat |
| DaDataRegionMap.php | `205091d7` | `205091d7` | == feat |
| LeadRouter.php | `762c32a3` | `762c32a3` | == feat |
| RouteSupplierLeadJob.php | `39660d6a` | `4a661d67` | == коммит `1609faee` (deals-city) |

**Вывод:** прод = НЕ feat HEAD, а верх стека доработок. Самая верхняя ветка стека —
**`fix/rossvyaz-osetia`** (`339c5f09`), линейный стек PR-мержей:

```
fix/rossvyaz-osetia (339c5f09)
 ├ osetia: нормализация дефиса (Сев. Осетия — Алания)
 ├ rossvyaz-mapping-tail: нормализация АО/республик/Саха/Кузбасс/ХМАО
 ├ phone-ranges-staging-id: свой id-sequence для повторных импортов
 ├ lead-region-ops-force: force-флаг phone-ranges:import
 ├ rossvyaz-region-mapping: region_normalized → subject_code
 ├ deals-city: backfill + fill «Город» deals.city (1609faee = прод-версия Job)
 ├ [router-gate / tdd-gate коммиты — dev-тулинг tools/, НЕ продукт]
 ├ [12 «Add files via upload» — CSV Россвязи 453k]
 └ feat базовый (14 коммитов lead-region)
```

## Что вливаем / что исключаем

**Вливаем (app/ + db/ + cspell):** 20 app-исходников (Services/Jobs/Models/Commands/Support/config),
миграция `2026_05_31_100000_create_phone_ranges_and_resolution_log.php`, 18 тестов, 2 фикстуры,
`db/schema.sql`, `db/CHANGELOG_schema.md`, `cspell-words.txt`.

**Исключаем:**

- CSV Россвязи (`ABC-3xx.csv`, `ABC-4xx part1/2.csv`, `ABC-8xx.csv`, `DEF-9xx.csv`, `ABC-4xx.zip`) —
  453k строк справочных данных, в репо не тащим; грузятся в `phone_ranges` командой `phone-ranges:import`.
- `.github/workflows/*` (ops-каналы).
- `tools/*` (router-gate / tdd-gate / mcp-classifier / shell-content-rules) — «мозг», ADR-020 →
  репозиторий claude-brain, не продукт. Прод их не крутит (на проде только Laravel-`app/`).
- `docs/observer/STATUS.md` и прочие регенерируемые артефакты.

## Конфликты

main за время расхождения (`618519c7`) изменил из общих файлов фичи **только `cspell-words.txt`**.
Все прочие общие файлы main не трогал → версии из ветки лягут **без конфликтов**. Единственный
ручной шаг — union `cspell-words.txt`.

## Шаги (терминал владельца)

```bash
# 0. На main, дерево чистое — свои правки отложить
git switch main
git stash push -u -- .claude/settings.json CLAUDE.md package.json docs/observer/.pii-counters.json
git status                      # чисто

# 1. Surgical: только код фичи из верха стека (app/ + db/ без конфликтов)
git checkout fix/rossvyaz-osetia -- app db

# 2. cspell-words.txt — union вручную (обе стороны меняли)
git show fix/rossvyaz-osetia:cspell-words.txt   # дописать новые термины DaData/Rossvyaz в main-список

# 3. Ревью застейдженного — особенно схема
git diff --cached --stat
git diff --cached db/schema.sql db/CHANGELOG_schema.md

# 4. Регрессия (бэкенд)
cd app && php -d memory_limit=2G artisan test
cd ..

# 5. Один чистый коммит
git add -A app db cspell-words.txt
git commit -m "feat(region): lead-region cascade to main — deals-city + rossvyaz normalize (prod parity)" \
           -m "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"

# 6. Бэкап в Gitea
git push <gitea-remote> main

# 7. Вернуть отложенные правки
git stash pop
```

## Заметки

1. Миграция `phone_ranges` уедет в main, но прод её уже применил (таблица + запись в `migrations`
   есть) → будущий `php artisan migrate` на проде её пропустит. Безопасно.
2. CSV Россвязи нужны для свежих окружений (заливка `phone-ranges:import`); лежат в Gitea/бэкапе —
   отдельный follow-up, merge не блокируют.
3. После merge main всё ещё разошёлся с origin (348/57) + GitHub suspended → push в Gitea, не GitHub.
4. Прод-эквивалент проверен по 4 файлам; полная сверка app-дерева не делалась (прод = rsync стека).
