# Чек-лист верификации для тестировщиков — rental + mercenary M7d + perf (сессия 2026-06-16) Единая точка входа: подтвердить всё, что нашипано за сессию, и снять baseline-профиль для перф-фаз. Детальные отчёты по каждой теме — в `doc/*_changes.md` (ссылки ниже). ## 0. Деплой (ОДИН РАЗ, перед всем) 1. **Миграция БД №10** `dumps/migrations/10-add-item-expire-time.sql` (колонка `expire_time` на inventory/cart_inventory/storage/guild_storage). `IF NOT EXISTS` → безопасно при повторном `dumps.sh update`. 2. **Пересобрать ОБА сервера вместе** (`make sql`) — в `struct item` добавлено `expire_time` (кросс-серверная структура). Старый map против нового char = рассинхрон. 3. Поднять кластер (login+char+map), `char_ip`/`map_ip` по своей VM (см. память/Doc). 4. На существующих сейвах `expire_time`=0 (всё как раньше — ничего не сломано). --- ## 1. RENTAL (аренда) — `doc/rental_backport_changes.md` - [ ] **Старт map-сервера: 0 `script error`** (98 box-предметов 13915/13951/… парсятся, `rentitem` зарегистрирован). - [ ] Использовать box-предмет (напр. `@item 13915` → use) → выдаётся арендный предмет; приходит сообщение «исчезнет через N мин». - [ ] Дождаться истечения (или короткая аренда через NPC `rentitem ,60`) → предмет авто-удаляется + уведомление. - [ ] **Relog во время аренды** → таймер восстановлен, остаток корректен (персистентность). - [ ] **Bind** (каждое — ЗАПРЕЩЕНО): аренду нельзя в trade / продать NPC / выбросить / в склад (обычный И гилд) / выставить на вендинг. - [ ] Rental-экип можно надеть; rental-usable при use даёт эффект, но НЕ расходуется. - [ ] Две разные аренды одного предмета (разный остаток) не сливаются в стак. ## 2. MERCENARY (наёмник) — `doc/mercenary_m7d_changes.md` + memory **Ядро (призыв/бой/persist):** - [ ] `@item 12153` (Archer-скролл) → use → наёмник призывается рядом, следует за мастером. - [ ] Наёмник авто-агрит ближнего врага, бьёт melee, преследует, держится у мастера, варпается с мастером. - [ ] Relog → наёмник восстанавливается (migration 9, persist), `@merc` показывает статус/убийства/лояльность. - [ ] 50-й килл наёмника → стат-баф (FLEE/ATK/HP/SP/HIT, ~10мин) — **теперь реально повышает стат** (M7d-1). **Скиллы (M7d-2/3a/5/5b) — главное новое:** - [ ] В бою наёмник **чередует melee и атак-скиллы** по классу (BASH/MAGNUM/BOWLINGBASH/DOUBLE/SHOWER/ PIERCE/BRANDISH/SPIRALPIERCE/SHARPSHOOTING/CHARGEARROW). Анимации/урон адекватны. - [ ] В простое у мастера наёмник **поднимает self-бафы** (PARRYING/REFLECTSHIELD/BERSERK/DEFENDER/ AUTOGUARD/QUICKEN/AUTOBERSERK/SIGHT по классу), не перекастывает активные. - [ ] Тюнинг `battle_config merc_skill_rate` (monster.conf, default 30): 0 = только melee; 100 = максимум скиллов. - [ ] **Баланс**: урон merc-скиллов = зеркальный player-скилл (репорт, если перекос). MAGNUM даёт fire-баф. - [ ] Нет крашей при массовом бою наёмников / смене карт / relog. ## 3. PERF — SO_SNDBUF — `doc/perf_optimization_index.md` - [ ] По умолчанию `socket_sndbuf_size: 0` (misc.conf) — поведение не меняется. - [ ] A/B под нагрузкой: `0` vs `262144`. Под `UA_PERF=1` снять профиль обоих; ожидание — меньше EAGAIN-дрейнов в send-worker на WoE-бурсте (sendto/qdisc). ## 4. BASELINE-ПРОФИЛЬ (разблокирует перф-фазы 2/4/5) — `doc/perf_subsystem_optimization_plan.md` - [ ] Сценарий: N ботов в кучу на GvG-карте + наёмники, `mob_ai: 0x20`, `UA_PERF=1`. - [ ] Снять `perf`-профиль игрового потока map (5-10 мин под нагрузкой), приложить к фидбэку. - [ ] Особо отметить долю: `skill_unit_timer`/`path_search_long` (Этап 2), `clif_send`/`sendto`/qdisc (Этап 4/5), `merc_ai`-путь (низкоприоритетный кандидат из сверки). → По этим данным выбираем и мерим высокоценные перф-фазы (2 skill_unit AoE, 4 broadcast-кеши, 5 send-структура). --- ## Откат (если что-то не так) - rental: реверт фаз (колонка `expire_time` безвредна, default 0). - merc-скиллы: `merc_skill_rate: 0` (без пересборки). - SO_SNDBUF: `socket_sndbuf_size: 0` (без пересборки). ## Что сделано за сессию (16 коммитов x64, всё durable) Rental-бекпорт (4 фазы) · Mercenary M7d combat-ядро (5 фаз: статус/офенс/бафы/AI-каст/self-бафы) · сверка перф-плана · перф Этап 0 (харнесс) + Этап 1a (SO_SNDBUF). Перф-фазы 1b/1c/2-7 — спроектированы, ждут baseline. Детали — соответствующие `doc/*_changes.md` и `doc/perf_optimization_index.md`.