feat: maximize sorter demo realism and add safe agent MVP

Wire live classifyItem into continuous playback, add jam/E-stop cases,
presenter controls (seek/speed/hotkeys), quality modes, demo scripts,
audit docs, and a verify-only autonomous agent CLI with hard safety limits.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Даня Архипов
2026-07-15 16:53:35 +00:00
parent e89c728dd2
commit 985f7c327d
40 changed files with 3358 additions and 453 deletions

159
docs/DEMO_RUNBOOK.md Normal file
View File

@@ -0,0 +1,159 @@
# Demo Runbook — OZON Tech Sorter Simulation
**Назначение:** провести живую демонстрацию жюри/заказчику без сюрпризов.
**Дата актуализации:** 2026-07-15
**Публичный URL:** https://arhipovdan.ru/
**Репозиторий:** `/home/coder/arhipovdan/app`
---
## 1. За 30–60 минут до показа
### 1.1. Остановить фоновые помехи
```bash
cd /home/coder/arhipovdan/app
node agent/cli.mjs stop
# убедиться, что Playwright/тяжёлые job не бегут
```
### 1.2. Зелёный baseline
```bash
npm test
npm run build
```
Ожидание: Vitest **153** passed / **16** files; build OK.
### 1.3. Health
```bash
npm run demo:health
```
Проверяет:
- `http://127.0.0.1:3100/` (prod loopback),
- `http://127.0.0.1:3101/` (preview, если поднят),
- `https://arhipovdan.ru/`,
- vitest.
### 1.4. Актуальный билд на том URL, который показываете
| Если показываете | Что сделать |
| ---------------- | ----------- |
| Локальный preview | `npm run demo:start` → http://127.0.0.1:3101/ |
| Публичный сайт | Убедиться, что :3100 отдаёт **новый** `dist` (ручной redeploy). Иначе жюри увидит старую версию. |
> В этой среде может не быть `docker` CLI — redeploy выполняется тем процессом, которым контейнер обычно обновляется на OwlPrime.
---
## 2. Старт одной командой
```bash
cd /home/coder/arhipovdan/app
npm run demo:start
```
Скрипт: при необходимости `npm ci`, `npm run build`, поднимает `vite preview` на **127.0.0.1:3101**.
Остановка:
```bash
npm run demo:stop
# reset: bash scripts/demo-reset.sh
```
---
## 3. Сценарий показа (рекомендуемый тайминг ~6–8 мин)
| Мин | Что делать | Что говорит оператор |
| --: | ---------- | -------------------- |
| 0:00 | Открыть `/`, включить Presentation (P/F) | «Цифровой двойник линии сортировки» |
| 0:20 | Дать continuous playback идти | «Товар едет → измеряется → классифицируется» |
| 1:00 | Указать Proof HUD (DIM, K, reason) | «Решение — правила classifyItem, не просто ролик» |
| 2:00 | Кейсы B → C → D | «Габариты / негабарит / круглое сечение» |
| 3:30 | Кейс c_priority | «C приоритетнее D» |
| 4:00 | Jam | «Затор — поток заморожен» |
| 4:40 | Emergency stop | «E-stop — safety stop» |
| 5:20 | Speed 0.5× на сложном кейсе | «Замедляем для разбора» |
| 5:50 | При необходимости `/details` | «Инженерный FSM и сенсоры» — осторожно: визуал twin другой |
| 6:30 | Q&A | Hotkeys 1–0 для прыжка к кейсу |
---
## 4. Hotkeys оператора
| Клавиша | Действие |
| ------- | -------- |
| Space | Пауза / продолжить |
| N | Следующий кейс |
| B | Предыдущий |
| R | Reset |
| P / F | Presentation / fullscreen |
| E | Журнал событий |
| 1–0 | Быстрый переход по кейсам |
Скорость: **0.5×–2×** в demo controls.
---
## 5. Playlist (10 кейсов) — шпаргалка
Порядок storytelling (см. `demoPlaylist.ts`):
1. Короб → **B**
2. ЛанчБокс → **B**
3. Негабарит → **C**
4. Мелкий item (ручка) → **C** (min dims)
5. Тарелка → **D** (K)
6. Бутылка → **D**
7. Oversized+round → **C** (priority)
8. (edge / доп. кейс по playlist)
9. **Jam**
10. **Emergency stop**
Точные id/SKU — в `src/domain/demoPlaylist.ts`.
---
## 6. Если что-то пошло не так
| Симптом | Действие |
| ------- | -------- |
| Чёрный экран / WebGL | Обновить страницу; проверить `ThreeCapabilityCheck`; снизить нагрузку (не demo на слабом GPU клиента) |
| «Не та» логика на сайте | Сравнить с preview :3101; вероятно устарел prod dist → redeploy |
| Завис после jam | R / следующий кейс; не паниковать — freeze ожидаем |
| Красные тесты утром | Не начинать показ; `npm test`, чинить на feature-ветке |
| Агент что-то пишет | `node agent/cli.mjs stop`; MVP не патчит, но stop обязателен |
| Нет сети к публичному URL | Показать loopback :3100 или preview :3101 |
Откат кода:
```bash
git checkout backup/pre-maximum-demo-realism-20260715
```
---
## 7. Что не обещать жюри
- «Настоящий CV с камеры» — нет, pseudo-CV.
- «Полный physics engine» — нет, кинематика.
- «Агент сам выкатывает в prod» — запрещено.
- «`/` и `/details` — идентичная 3D-сцена» — пока нет.
---
## 8. После показа
```bash
npm run demo:stop
node agent/cli.mjs resume # если нужен ночной dry-run
# или оставить stop до следующего окна обслуживания
```
Собрать feedback → занести в backlog агента / issues; не коммитить секреты.