Files
Learn_System/plans/quantik-game/phase-6-leaderboard-live.md
T
Maxim Dolgolyov 4b5c8077d3 @
feat(quantik-game): фаза 0 — слой целей в движке (goal/HUD/result)

Декларативный блок goal в спеке SimForge (булево SimExpr-условие победы),
вычисляемый каждый кадр: фиксация результата (победа/время/попытки/звёзды),
callback onGoal, HUD-оверлей (цель/звёзды/подсказка/баннер, inline SVG).
API инстанса: onGoal/getResult/resetResult. Серверный validateSpec
пропускает goal/game (длина выражений + escape текста, без исполнения).
Аддитивно: спека без goal ведёт себя как раньше. Смоук 40/40; npm test
238 pass/8 baseline; lint:routes 0. План фичи (7 фаз) + CONTEXT.

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

3.3 KiB

Phase 6: Класс-лидерборд / живая гонка (classroom SSE)

Status: Not Started Parent plan: 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