# LearnSpace Project Memory

- [project_status.md](project_status.md) — Полный список реализованных фич: все страницы, API, таблицы БД, инструменты доски, стек, деплой (апрель 2026)
- [project_classroom_module.md](project_classroom_module.md) — Оригинальный план classroom-модуля (4 фазы, все реализованы)
- [project_whiteboard_roadmap.md](project_whiteboard_roadmap.md) — Roadmap улучшений доски (7 фаз, утверждён 2026-04-11)
- [project_pet_assistant.md](project_pet_assistant.md) — «Квантик-ассистент» РЕАЛИЗОВАН (commit 3f8009c): Ф0/Ф1/«Спроси-FAQ», правиловый движок, reuse 'pet', assistant_seen, на учебнике тоже. НЕ сделано: Ф2 тур, реальная LLM, activeLesson
- [feedback_no_emoji.md](feedback_no_emoji.md) — Запрет эмоджи в коде, только inline SVG `.ic`
- [feedback_sims_admin_sync.md](feedback_sims_admin_sync.md) — При добавлении симуляции в lab.html → сразу обновить ADMIN_SIMS в admin.html
- [project_ct_seeded.md](project_ct_seeded.md) — Список перенесённых сборников ЦТ/ЦЭ (физика 2024 + матем 2024); правило: 1 вариант из сборника, нет повторов
- [project_hardening_2026.md](project_hardening_2026.md) — 8-task security/architecture hardening plan (started 2026-05-06), executed by Sonnet sessions one task at a time
- [reference_textbook_sources.md](reference_textbook_sources.md) — Расположение PDF учебников Беларуси (физика/алгебра/геометрия 7-11) в `G:\Dev\Тесты\Методички\тест_6 класс\Книги\` + структура §-канвы Исаченковой
- [project_stereo3d_improvements.md](project_stereo3d_improvements.md) — Стереометрия 3D: апгрейд 5 фаз (май 2026) + deep-link фигур `openSim('stereo:<figure>')` / `?stereofig=`
- [reference_sqlite_node.md](reference_sqlite_node.md) — БД на встроенном node:sqlite (НЕ better-sqlite3); живая БД backend/data/learnspace.db; Bash ломает кириллический путь
- [reference_textbook_latex_escaping.md](reference_textbook_latex_escaping.md) — Баг формул = ЛИШНИЕ слэши (over-escape), правило чётности, фикс fix_overescaped_latex.js; БД чиста
- [project_content_access.md](project_content_access.md) — Доступ к учебникам/экзаменам/симуляциям/курсам по классам и ученикам (allowlist, ученик > класс), миграции 040/051/052, /api/access; ревью+переработка done, Фаза 3 (HTML-гейт) отложена
- [project_permissions_rework.md](project_permissions_rework.md) — Ролевые права (registry/role_permissions/user_permissions): Phase A+B+C ВСЕ в master (2026-06-03): зависимости, история, группы, массово по классу, пресеты, временные права, произвольные кастомные роли (конструктор). План plans/permissions-rework/
- [project_optics_constructor.md](project_optics_constructor.md) — Конструктор оптических систем (BenchSim) в режиме «Конструктор» оптической скамьи: общий 2D-трассировщик, элементы/призма/дисперсия
- [project_lab_content_engine.md](project_lab_content_engine.md) — Рефактор лаборатории «симуляции как данные» (LabRegistry); фазы 0-3 done, ветка feature/lab-content-engine
- [project_chemistry7_textbook.md](project_chemistry7_textbook.md) — Новый учебник «Химия 7» (4 гл, 26§): план + статус (Phase 0 done), переиспользует движок Химии 8
- [project_concurrent_sessions_branch.md](project_concurrent_sessions_branch.md) — Несколько сессий коммитят в одну ветку → fetch перед работой, не force-push вслепую, add поимённо
- [feedback_verify_edits_applied.md](feedback_verify_edits_applied.md) — После каждого Edit проверять grep -c маркера; не пушить пакет без поштучной верификации (дважды коммитил сломанное)
- [project_dashboard_rebuild.md](project_dashboard_rebuild.md) — План пересборки dashboard.html по скрину (hero: чтение+лаба+питомец, синхрон питомца); редизайн утерян (был некоммичен)
- [project_phys7_status.md](project_phys7_status.md) — Физика 7: контент ВСЕХ 5 глав готов (рендер из phys7_chN_widgets.js); Шпаргалки наполнены (47 шт, commit c6835cf); учебник функционально полный
- [reference_vex_search.md](reference_vex_search.md) — vex установлен+проиндексирован (semantic); когда vex (semantic/pattern/similar/duplicates), когда ast-index (символы/usages); гочи модели/HEAD
- [project_math6_textbook.md](project_math6_textbook.md) — Учебник «Математика 6» (Герасимов 2022): движок math6_engine.js + Math6 svg (numberLine/plane/pie/venn). ВСЕ 6 глав + курсовой финал ГОТОВЫ на master (тесты 17/17, +полировка 20/20). Осталось только: выдать доступ ученикам (/api/access)
- [project_math5_textbook.md](project_math5_textbook.md) — Учебник «Математика 5» (Герасимов 2020) переиспользует движок math6. НАПОЛНЕН ЦЕЛИКОМ: 3 главы, 44 § (Гл.1 Opus-эталон, Гл.2–3 Sonnet), хаб+курсовой финал, тест 12/12, всё на master (последний 5a2a1be). Осталось только: выдать доступ ученикам (/api/access). План: plans/textbooks-5/
- [reference_exam_textbook_links.md](reference_exam_textbook_links.md) — Привязка задач экзамена math9 к § учебников: per-task колонки в exam_tasks + классификатор tag-exam-textbook.js (таксономия gen-exam-textbook-sections.js) + починенный deep-link (textbook-deeplink.js). 98% размечено. Готчи: geometry-8 поглавная нумерация, math5/6 движковые
- [reference_svg_drawer.md](reference_svg_drawer.md) — Векторная SVG-рисовалка: виджет js/svg-draw.js (SvgDraw.mount) + санитайзер js/svg-sanitize.js (UMD, клиент+сервер) + блок урока svg-draw (редактор/превью/lesson.html). Переиспользуемо для флешкарт/фигур генератора
- [reference_quick_lesson.md](reference_quick_lesson.md) — «Быстрый урок»: одиночный урок без курса через скрытый личный курс-контейнер (courses.is_personal, POST /api/lessons/quick, кнопка в theory.html). Каталог скрывает контейнеры от всех кроме владельца
- [reference_student_materials.md](reference_student_materials.md) — «Мои материалы»: ученик сохраняет к себе доску(PNG)/заметку из онлайн-урока (миграция 060 student_materials, /api/materials, Whiteboard.exportBlob, страница /my-materials, кнопки в my-lessons.html). Копия переживает удаление сессии

## Stack
- Node.js/Express backend, SQLite (встроенный **node:sqlite** `DatabaseSync`, НЕ better-sqlite3 — см. [[reference_sqlite_node]])
- Frontend: vanilla JS, `window.LS.*` namespace via /js/api.js
- No bundler — plain HTML/CSS/JS served by Express static
- Репо: https://git.dolgolyov-family.by/maxim.dolgolyov/Learn_System (master)

## Key Paths
- Backend: `backend/src/`
- Frontend pages: `frontend/*.html`
- Shared CSS: `frontend/css/ls.css` (design system)
- JS API: `js/api.js` → `window.LS.*`
- Whiteboard engine: `frontend/js/whiteboard.js` (~3200 строк)
- Server entry: `backend/src/server.js`

## UI Architecture
- Sidebar nav: `.app-layout > .sidebar + .sb-content`
- login.html: split layout `.login-layout > .login-left + .login-right`
- Page transitions: CSS `@view-transition { navigation: auto }`
- Mobile: `.mob-bar` (56px fixed top), sidebar drawer на ≤768px, `/js/mobile.js`
- Notifications dropdown: `left` ставится через `r.right + 8` динамически

## Whiteboard (classroom.html)
- Chalkboard theme: зелёный фон (#2d5a2d), деревянная рамка, chalk-grain
- Tools: pencil (Catmull-Rom), highlighter, laser, eraser, 11 shapes, connector, sticky, text, image, formula (KaTeX), table, coordinate system, number line, compass
- Select tool: move/resize/rotate всех объектов, lasso multi-select, snap guides, copy/paste
- Zoom/Pan: wheel zoom, Space+drag, minimap overlay (bottom-right, при zoom>1)
- Ruler/Protractor: rotation + resize handles, floating props panel
- SSE real-time sync + HTTP polling (since_seq параметр)
- Two-layer canvas: static (_ctx) + dynamic (_dynCtx)
- Multi-page + thumbnail sidebar

## User Roles
- admin: full access
- teacher: classes + board + library + classroom
- student: dashboard + board (только если в классе)

## Icons — КРИТИЧНО
- **⛔ ЗАПРЕТ на эмоджи** — никогда не использовать эмоджи в коде.
- Только inline SVG с классом `.ic` (определён в ls.css).
- На некоторых страницах также Lucide CDN `lucide@0.469.0`.

## Workflow Preferences — КРИТИЧНО
- **⛔ АБСОЛЮТНЫЙ ЗАПРЕТ на Grep tool** — пользователь запретил КАТЕГОРИЧЕСКИ.
- Поиск по коду: `ast-index` (дефолт: символы/usages/callers/outline) + `vex` (semantic/pattern/similar/duplicates) — см. [[reference_vex_search]] / `.claude/rules/search-tools.md`. usages по JS — только ast-index.
- Чтение файлов: ТОЛЬКО `Read` с offset/limit
- Поиск файлов: `Glob` или `ast-index search`
- НЕТ ИСКЛЮЧЕНИЙ. Даже для "быстрой проверки". Даже для верификации.
