Files
Learn_System/plans/quantik-game/phase-6-leaderboard-live.md
T
Maxim Dolgolyov 69df2f8190 @
chore(quantik-game): полировка по финальному ревью + security-review

Финальное ревью: READY TO MERGE (0 блокеров). Security: SECURE (0 critical).
Применены дешёвые фиксы из ревью:
- validateSpec: блок game{} санитизируется ПОИМЁННО (chapter/subject →
  sanitizeText, order/par_ms/unlockStars → проверка типа, неизвестные ключи
  отбрасываются) — закрыт латентный хранимый XSS (раньше clean.game=spec.game).
- quantik.html: @media (prefers-reduced-motion) делает анимации мгновенными
  (не выключает — иначе forwards-появление узлов оставило бы их скрытыми).
- progress-logic.js: фикс комментария isUnlocked (сумма звёзд по ВСЕМ уровням
  с меньшим глобальным order, а не «той же главы»).
План: Ф6 (лидерборд/гонка) удалена (Amendment 1, решение пользователя);
финальные гейты отмечены; deferred-бэклог зафиксирован.
Затронутые тесты 45/45; lint:routes 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@
2026-06-14 17:00:13 +03:00

47 lines
3.6 KiB
Markdown

# Phase 6: Класс-лидерборд / живая гонка (classroom SSE)
> **REMOVED (Amendment 1, 2026-06-14)** — фаза не реализуется по решению пользователя.
> Архивный subplan. `game_progress.level_id` (TEXT) уже готов под лидерборд, если фичу вернут.
**Status:** ❌ Removed
**Parent plan:** [PLAN.md](./PLAN.md)
**Domain:** fullstack
## Objective
Соревновательный слой: лидерборды по уровню/классу и опциональная **живая гонка** в онлайн-уроке
(реюз classroom SSE + моста `sim_state`/`apply_sim_state` из Ф7 sim-builder).
## Tasks
- [ ] Task 1: API лидерборда: `GET /api/game/leaderboard?level_id=...&scope=class|global` — топ по
времени/звёздам. Источник — `game_progress` (best per user). Доступ: класс — только своему классу.
- [ ] Task 2: UI лидерборда: на экране уровня/победы и на карте — топ класса (имена/время/звёзды),
позиция игрока. Inline SVG-медали, без эмодзи.
- [ ] Task 3: Живая гонка (опц.): учитель в classroom запускает уровень классу; ученики решают
одновременно; прогресс/финиши транслируются через существующий SSE-relay. Реюз iframe-конвейера
`/lab?embed=...` НЕ требуется — гонка может жить на `/quantik` с гоночной комнатой по classId.
- [ ] Task 4: Сервер: relay результатов гонки (минимальный, поверх существующего SSE), без новых
тяжёлых таблиц — эфемерное состояние гонки в памяти/коротком хранилище.
- [ ] Task 5: Тесты: лидерборд отдаёт корректный топ и режет чужой класс; submit обновляет позицию;
смоук UI.
## Files to Modify/Create
- `backend/src/controllers/gameController.js`, `routes/game.js` — leaderboard (+ гонка-relay).
- `frontend/js/game/quantik-game.js` / `map.js` — UI лидерборда + гоночная комната.
- (опц.) интеграция кнопки запуска гонки в classroom.html (аддитивно, как Ф7 sim-builder).
- тест(ы).
## Acceptance Criteria
- Лидерборд по классу/глобально корректен и изолирован по классу; позиция игрока видна.
- Живая гонка (если включена) синхронит финиши классу через SSE; закрытие чистое.
- Без эмодзи/eval; existing функционал цел; тесты зелёные; lint baseline 0.
## Notes
- Реюз durable-уведомлений `pushNotif` для приглашения в гонку; эфемерный прогресс — через SSE.
- classroom.html — большой; искать через vex по DOM-id, точечный Read (ast-index не индексит inline-script).
## Review Checklist
- [ ] Все задачи; изоляция по классу; аддитивность classroom; без эмодзи/eval; тесты зелёные
## Handoff to Next Phase
<!-- Финальная фаза — далее комплексное ревью и мерж в feature/sim-builder. -->