# FINAL REPORT — Шашки Рояль v1.1.0

**Дата сборки**: 2026-05-21
**Версия**: 1.1.0
**Build**: 20260521
**APK**: `release/shashki-royale-v1.1.0-debug-build-20260521.apk` (17 MB, debug-signed)
**Economy**: Coin v2 (1 Coin = $1 nominal, виртуальная валюта)
**Schema**: v3

---

## Что сделано в этой сессии

### 🔴 P0 — Критический баг: мульти-взятие (двойное/тройное взятие)
**Симптом**: игрок не мог продолжить цепочку. После первого взятия UI не давал кликнуть на следующий ход.

**Корень проблемы**: легальные ходы хранили только финальную точку всей цепочки. Промежуточные хопы не были кликабельны. Backend rules-engine был корректен (27 тестов проходили), баг был чисто в React-стейте.

**Фикс — step-by-step capture chain**:
- `game/rules.ts` → добавлен `toSingleHopMoves()` — конвертит multi-step Move'ы в single-hop UI-Move'ы (уникальный первый хоп).
- `game/gameLogic.ts` → переписан `applyMoveToState()`:
  - применяет один хоп
  - проверяет продолжение через `getContinuationCaptures()`
  - если ещё можно бить → ставит `captureChain` (ход НЕ переключается)
  - если цепочка закончена или была дамка → ход переключается
- `game/types.ts` → `captureChain` теперь объект `{ pieceRow, pieceCol, startRow, startCol, alreadyCaptured }`.
- `pages/LocalGame.tsx` + `pages/OnlineGame.tsx` → `handleCellClick` блокирует выбор других шашек и снятие выделения, пока `captureChain` активен.
- `pages/OnlineGame.tsx` → синк в Supabase откладывается до конца цепочки (один UPDATE games, один INSERT moves).

### 🟠 P1 — UI cleanup
- Убраны блоки "Срубл." (captured count) из `PlayerCard.tsx` и обоих чипов `LocalGame.tsx`.
- Убрана подпись "Рейтинг: NNNN" из `PlayerCard.tsx` и карточек лобби в `StakeLobbyPage.tsx`. Вместо рейтинга — лейбл "Белые"/"Чёрные".

### 🟠 P1 — Авто-имя гостя "Player NNNN"
- `services/profiles.ts` → `generateGuestNickname(playerId)` — стабильный 4-значный суффикс из хэша playerId (одно устройство = одно имя навсегда).
- При создании профиля имя инжектится через RPC `get_or_create_profile`.
- Старые профили с дефолтными "Player" / "Игрок" авто-переименовываются на клиенте.

### 🟠 P1 — "Своя ставка" input
- `pages/StakeLobbyPage.tsx → CreateTableModal`:
  - сохранены быстрые кнопки 1 / 2 / 5 / 10 / 25 / 50 Coin (`data-testid="stake-quick-{fee}"`)
  - добавлен числовой инпут "Своя ставка" (`data-testid="stake-custom-input"`): integers only, min=1, max=баланс
  - breakdown-панель (`data-testid="stake-breakdown"`): Ставка / Банк (×2) / Комиссия 5% / Победитель получит
- `services/stakes.ts` → валидация relaxed с 1..1000 до 1..1_000_000, проверка `Number.isInteger`.

### 🟠 P1 — Статусы хода
Проверены и работают:
- LocalGame: "Ход белых" / "Ход чёрных" / "Взятие обязательно!"
- OnlineGame: "Ваш ход" / "Ход соперника" / "Взятие обязательно!" / "Отправка хода..."

### 🧹 Технический долг
- Удалён dead-code: дубликаты `createStakeGame`/`joinStakeGame`/`fetchStakeTables` со старой валидацией (min=10) из `services/profiles.ts`. Активные версии живут в `services/stakes.ts`.

---

## Какие тесты прошли

### Unit-tests (vitest) — 59/59 ✅

| Файл | Тестов | Покрытие |
|------|--------|----------|
| `game/__tests__/rules.test.ts` | 27 | Правила: man/king ходы, capture chains, mandatory capture, promotion |
| `game/__tests__/gameLogic.test.ts` | 4 | **NEW** — Step-by-step chain: single hop, double capture, mid-chain lock, promotion termination |
| `services/__tests__/profiles.test.ts` | 4 | **NEW** — `generateGuestNickname` стабильность, формат, диапазон |
| `game/__tests__/auth.integration.test.ts` | 24 | Auth flow: signUp / signIn / валидация |

```bash
cd frontend && yarn vitest run
# Test Files  4 passed (4)
# Tests       59 passed (59)
```

### Testing agent v3 — iteration_5 ✅
**Файл**: `test-results/test_reports/iteration_5.json`

Все structural-проверки пройдены:
- Multi-capture фикс верифицирован (unit-тесты + UI smoke).
- "Срубл." и "Рейтинг:" отсутствуют в `/local` и `/stake-lobby`.
- Modal CreateTable содержит 6 quick-buttons + custom input + breakdown с 4 строками.
- Custom input принимает только цифры (`"3.5abc" → "35"`).
- `generateGuestNickname` стабильна (4 unit-теста).

### Production build ✅
- `yarn tsc --noEmit` — clean
- `yarn build` — 614 kB main bundle / 178 kB gzipped
- ESLint clean по всем 9 изменённым файлам

### APK build ✅
- JDK 21 + Android SDK 34 установлены в pod
- `./gradlew assembleDebug --no-daemon` → BUILD SUCCESSFUL
- Размер: 17 MB
- Лог: `test-results/gradle_apk_build.log`

---

## Версия APK

```
shashki-royale-v1.1.0-debug-build-20260521.apk
v1.1.0 · build 20260521 · Coin v2 · schema v3
SDK 34 · debug-signed (не для Google Play)
```

См. `INSTALL_AND_TEST.md` для инструкций установки и `KNOWN_LIMITATIONS.md` для известных ограничений.
