- Favicon: 🚀 emoji via inline SVG data URI, both sokoban.html and php/index.php
- api.php: mb_substr() -> substr() (mbstring not enabled on the server)
- api.php: MariaDB rejects LIMIT directly inside NOT IN(...) (error 1235) —
wrap the top-5 subquery in an extra derived-table SELECT
Verified live against the deployed MySQL/MariaDB DB: whoami, set_name,
submit (insert + dedup + trim-to-5), top all round-trip correctly.
- php/: MySQL-backed (via config.php, gitignored) top-5 solutions per
level, cookie identity with rename, server-side progress for "Продолжить"
- Menu screens: Играть / Продолжить / Предыстория / Настройки, plus
placeholder start/end screens for a future intro/outro
- Lore screen: EXO:GRID backstory text (6 epochs, no gameplay changes yet)
- levels.js/solver.js copied in as-is
- sokoban.html: canvas game, entrance/exit door mechanic (level completes
by walking to the exit after all boxes are placed, not an alert popup),
solution search UI (modal with timer, cancel, "Решение найдено!" button)
- solver.js: A* with binary heap, true-distance heuristic, static
deadlock cells, freeze-deadlock detection, tunnel macro-moves,
chunked step() API for non-blocking search in the UI
- localStorage-backed solution leaderboard per level (fewest moves wins),
fed by both solver finds and manual player completions; G replays the
best recorded solution
- BACKLOG.md: known follow-ups (dead files, room/corral pruning, undo, etc.)