Пробник ЦТ по математике 2020, Вариант 1. ⚠️ Новый формат: 32 задания (А1–А20 + В1–В12),
В1 на соответствие, В2 множ.выбор. Машинерия параметризована N_TASKS=32. Источник: чистый
PDF ЦТ 2020.pdf. ВСЕ 32 ответа решены и сверены с официальной таблицей (стр.44, столбец
Вариант 1) — полное совпадение, включая A20=37√13/3, B5=-335, B8=-320, B9=160, B10=577,
B11=-16, B12=336 (сфера через 4 точки куба). Фигурные A9/A11 реконструированы; без авторских
ссылок (политика «все учебники наши»). VARIANT_LABEL 116 -> 'ЦТ-2020'.
DRY-RUN 32/32, self-check и структурный KaTeX — зелёные.
Запись в БД — пользователь: node backend/scripts/seed_ctmath_ct2020_v1.js --apply
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Политика «все учебники наши»: нигде не упоминаются сторонние авторы.
- Миграции (15 файлов): колонка author → 'LearnSpace'; из описаний убран оборот
«по учебнику <автор>:»; авторские фамилии вычищены из комментариев. Покрыты
Арефьева/Пирютко, Казаков, Латотин/Чеботаревский/Горбунова/Цыбулько, Исаченкова,
Жилко/Маркович/Сокольский, Герасимов/Лобанов.
- HTML: physics_9_ch5 («по канве учебника Исаченковой» → «по учебной программе»),
physics_11_hub (hdr-sub с авторами → описание курса), mocks-redesign (карточки-авторы → LearnSpace).
- Генераторы gen_phys9_ch.js/gen_phys11_stubs.js — шаблоны без авторов.
- НОВОЕ: update_textbook_authors.js — идемпотентный апдейтер ЖИВОЙ БД (миграции уже
применены): author→'LearnSpace' у всех 107 учебников + чистка описаний. DRY-RUN по умолч.
⚠️ Живую БД правит ПОЛЬЗОВАТЕЛЬ: node backend/scripts/update_textbook_authors.js --apply
(в БД сейчас author пуст у всех, видимые упоминания были в описаниях «по учебнику …»).
review_geom10/11.js не тронуты — там фамилии как поисковые шаблоны детектора, не атрибуция.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Поле ref в решениях задач (показывается ученику как «Учебник: …») содержало фамилии
авторов чужих учебников (Арефьева, Казаков, Латотин, Герасимов). Заменено на обобщённые
ссылки нашего курса: «Алгебра, 7 класс, гл. 1» и т.п. (фамилии и кавычки-ёлочки убраны).
452 замены в 15 seed_ctmath_*.js. Синтаксис OK, валидация 30/30.
Применённые варианты (112,113) обновятся при повторном --apply (upsert solution_html).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Пробник ЦТ по математике 2019, Вариант 1 (А1–А18 + В1–В12; В1 на соответствие, В2 множ.выбор)
для трека exam-prep ctmath. Источник: чистый PDF ЦТ 2019.pdf. Все 30 решены и сверены: столбец
Вариант 1 в таблице (стр.45) затемнён, но читаемые ячейки совпали; методы B5/B6/B7/B11/B12
перекрёстно подтверждены на Варианте 10 (его задания на стр.43-44, ответы читаемы → 81/56/-1071/
624/540 ровно по таблице). Тяжёлые: B7=-264 (период+нечётность), B11=288, B12=110 (т.Гульдина).
Фигурные A1/A7/A9 разрешены по столбцу 1 (D/2√34/2,4); B1/B2 — данные текстом.
VARIANT_LABEL 115 -> 'ЦТ-2019'. DRY-RUN 30/30, self-check и структурный KaTeX — зелёные.
Запись в БД — пользователь: node backend/scripts/seed_ctmath_ct2019_v1.js --apply
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Пробник ЦТ по математике 2018, Вариант 1 (А1–А18 + В1–В12, В1 на соответствие) для трека
exam-prep ctmath. Источник: чистый PDF ЦТ 2018.pdf. ВСЕ 30 ответов решены и сверены с
официальной таблицей (стр.32, столбец Вариант 1) — полное совпадение, включая B8=-18,
B9=-130 (двугранный угол), B11=32, B12=45 (координатный метод, PT=5/2).
Фигурные/несогласованные (А3 точки, А9 графики→пути, А11 квадраты, В1/В2 функция по узлам,
В8 экв. показательное, В10 множитель (6-x)² по ответу) реконструированы/адаптированы.
VARIANT_LABEL 114 -> 'ЦТ-2018'. DRY-RUN 30/30, self-check и структурный KaTeX — зелёные.
Запись в БД — пользователь: node backend/scripts/seed_ctmath_ct2018_v1.js --apply
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Пробник ЦТ по математике 2016, Вариант 1 (А1–А18 + В1–В12) для трека exam-prep ctmath.
Источник: чистый PDF ЦТ 2016.pdf. ВСЕ 30 ответов решены и сверены с официальной таблицей
(стр.35, столбец Вариант 1) — полное совпадение, включая B5=-22, B9=712, B11=56, B12=724.
Фигурные задания (А2 угол через MN||BC, А3 числа на прямой, А6 таблица, А7 площадь по
координатам, А8 область значений, А11 круговая диаграмма) реконструированы/адаптированы
в самодостаточные авто-проверяемые формы. VARIANT_LABEL 113 -> 'ЦТ-2016'.
DRY-RUN 30/30, self-check и структурный KaTeX — зелёные.
Запись в БД — пользователь: node backend/scripts/seed_ctmath_ct2016_v1.js --apply
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
control-panel.ps1 расширена:
- Бэкап БД [B] (копия learnspace.db+wal/shm с датой в data/backups) и восстановление [R]
(выбор из списка, страховочная копия .pre-restore, авто-стоп/старт сервера).
- Умный статус: health-пинг /api/health (+ms), размер БД, кол-во пользователей, последняя
миграция (db-status.js), версия Node, сводка .env (CLIENT_ORIGIN/JWT/LLM). Кэш в .
- Создать админа [A] → scripts/create-admin.js (bcrypt, upsert role=admin, busy_timeout).
- Сторож [W]: авто-перезапуск при падении (выход по клавише). Логи в backend/logs (не %TEMP%),
[E] ошибки из логов.
Фиксы PS 5.1: порт/путь БД читаются из .env (inline node -e с кавычками 5.1 ломает); db-status
вынесен в файл-скрипт; миграция по filename DESC; UTF-8 BOM, парсинг OK. Меню — лат.+рус. клавиши.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- compose.truenas.yml: готовый host-path compose (build на NAS / или image), env
с JWT_SECRET/CLIENT_ORIGIN, healthcheck start_period 40s (запас на первичные миграции).
- DEPLOY-TRUENAS.md: переписан под реальный кейс (TrueNAS SCALE, сборка образа на NAS,
без Docker на ПК): датасет → код по SMB → docker build → правка JWT/пути →
docker compose up / Custom App → проверка → домен/HTTPS/бэкапы. PC-сборка и CORE — в конце.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- docker-entrypoint.sh: при старте node migrations-runner (идемпотентно) + seed-permissions
только если role_permissions пуста → контейнер поднимается на чистом томе без ручных шагов
(сервер раньше fail-fast без миграций). Dockerfile: ENTRYPOINT через tini + entrypoint,
нормализация CRLF (sed) + chmod, label BQ-System → LearnSpace.
- DEPLOY-TRUENAS.md: пошагово для TrueNAS SCALE (датасет → образ → Custom App compose с host-path
томами и JWT_SECRET → авто-миграции → reverse-proxy/HTTPS/TURN → бэкапы), заметка про CORE.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Чинит 8 «baseline»-падений (теперь 330/330):
- auth (3): контроллер/фронт требуют пароль >=8, а схема роута (minLen:6) и тест
(7-симв. 'pass123') устарели → схема register/profile 6→8, тест-пароли → 8 симв.
(login/duplicate падали как следствие незарегистрированного юзера).
- page (5): jsdom не был установлен → добавлен в devDependencies.
- флакость jsdom-страниц при параллельном прогоне (фикс. wait под нагрузкой CPU) →
npm test с --test-concurrency=1 (детерминированно; в изоляции тесты и так проходят).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Двойной клик по start-server.bat → окно-консоль с шапкой (URL/порт/режим/статус),
авто-применением миграций (идемпотентно), освобождением порта от старого экземпляра,
живыми логами и меню перезапуска при остановке/падении. Флаг -Dev → nodemon
(авто-перезапуск при правках кода), -NoMigrate → без миграций.
ps1 в UTF-8 с BOM (корректная кириллица в PowerShell 5.1).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
my-students.html: колонка «ЦТ» с тумблером у каждого ученика (teacher_students вне
классов). Бэкенд уже поддерживал (canManageStudent включает teacher_students);
статус грузится per-student через LS.prepStudentTracks, переключение —
prepSetStudent/prepUnsetStudent. togglePrep на window (скрипт-модуль). Иконки — SVG.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- flashcards.html: колоды коллекции рендерятся сворачиваемой папкой «Подготовка к ЦТ»
(deckCardHtml вынесен, секции <details> по collection; метки из LS.prepListTracks)
- classes.html: в таблице учеников колонка «ЦТ» с тумблером флага + кнопки «Весь класс → ЦТ»/
«Снять ЦТ» (LS.prepClassStatus/prepSetStudent/prepUnsetStudent/prepSetClass)
Иконки — inline SVG, без эмодзи.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Актуальный формат экзамена: А1–А10 (8 mc + 2 open) + В1–В20 (1 long + 19 open).
Перенабор по PDF сборника РИКЗ; решений в источнике нет — решено вручную,
ВСЕ 30 ответов сверены с официальным ключом (стр.35, столбец Вариант 1).
Адаптации: А1 (точки на прямой) → равные промежутки в тексте; А6 (промежуток
на рисунке) → описан словами. Метка 111 (ЦЭ-2024) в VARIANT_LABEL.
Идемпотентный seed, --apply — пользователь.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Первый из ЦТ-годовых. Формат ЦТ: А1–А18 (18 mc) + В1–В12 (12 open) = 30.
Перенабор по PDF; решений в источнике НЕТ — решено вручную, ответы
сверены с официальным ключом (стр.34 сборника). Адаптации картинок:
А2 (симметричные фигуры, неразборчивы) → MC о симметрии точки; А6
(параллелограмм на сетке) → координаты вершин; А10/А15 — текстом.
Метка 110 (ЦТ-2014) в VARIANT_LABEL. Идемпотентный seed, --apply — пользователь.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
30 заданий А1–А10 + В1–В20, перенабор по PDF РИКЗ.
8 mc + 19 open + 3 long. Геометрия — текстом, А6 (чтение графика)
— inline-SVG в figure_html (кусочно-линейная функция, все 5
утверждений и ответ 134 согласованы). Метка 109 уже в
VARIANT_LABEL. Идемпотентный seed, --apply — пользователь.
Завершает набор РТ-2022/23 (107/108/109).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
30 заданий А1–А10 + В1–В20, перенабор по PDF РИКЗ.
8 mc + 20 open + 2 long. Геометрия — текстом. Адаптации заданий
с картинкой: А1 (термометр) → показание числом; А3 (выбор
прямоугольника) → MC о соотношении сторон; А6 (графики) → список
функций (ответ 145); В1 (диаграмма) → данные таблицей в
figure_html (ответ А6Б4В3). Метка 108 уже в VARIANT_LABEL.
Идемпотентный seed, --apply — пользователь.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
30 заданий А1–А10 + В1–В20, перенабор по PDF РИКЗ.
8 mc + 21 open + 1 long; геометрия — текстом, В1 (чтение
графика) — inline-SVG в figure_html (как у math9). Метка 106
уже в VARIANT_LABEL. Идемпотентный seed, --apply — пользователь.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
30 заданий А1–А10 + В1–В20, перенабор по PDF РИКЗ.
8 mc + 21 open + 1 long; геометрия закодирована текстом.
Идемпотентный seed (upsert), DRY-RUN по умолчанию. Метка 105
уже в VARIANT_LABEL. Запуск с --apply — пользователь.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Идемпотентно: courses.is_published=1 (курс 13) + content_access classу #4
«10Б · Математика» на курс (course:13) и экзамен-модуль (exam:ctmath).
Модель — allowlist (без правил ученики не видят даже опубликованный курс).
Цель класса флагом --class=<id> (деф. 4), сверка имени. DRY-RUN по умолчанию,
запись с --apply (outward-facing, запускает пользователь).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
30 заданий (А1–А10 + В1–В20), перенабрано вручную в KaTeX по PDF РИКЗ
(РТ-1 23/24 В1). Геометрия закодирована текстом — чертежи не нужны.
Идемпотентный upsert, DRY-RUN по умолчанию, запись с --apply.
Верификация: node --check, валидация 30/30, KaTeX-рендер 413/413 сегментов.
+ метки вариантов 104–106 (РТ-2023/24 этап I/II/III) в routes/exam-prep.js.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Системы (7 карт) — методы подстановки/сложения, домножение коэффициентов,
пересечение графиков = система, проверка пары, приём x²−y²=(x+y)(x−y)
(источник: Кедр «Материал по системам»). Текстовые задачи (12 карт) —
проценты, сплавы/растворы, движение, совместная работа (канонические приёмы).
KaTeX inline $…$ (кириллица только вне math), идемпотентно, запись с --apply.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Источники — бесплатные материалы Кедр: «Свойства четырёхугольников»,
«Уравнение окружности», «Шпора по свойствам функций» + базовый набор
формул треугольника. 50 карт (31 + 19), KaTeX inline $…$. Идемпотентно,
DRY-RUN по умолчанию, запись только с --apply.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
48 заданий год-пачек (ЦТ 2017/2021) при оцифровке получили в начале text_html
тег вида «[ЦТ 2017 · A1]» — мусор для ученика в тренажёре. cleanup_ctmath_bank.js
теперь срезает ведущий тег [ЦТ|ЦЭ|РТ|ДРТ YYYY …] (узкий паттерн, не трогает
матскобки внутри $…$, не обнуляет пустой результат). Идемпотентно.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Селект «Вариант» использовал .mk-input (узкий, под число) → подпись
«РТ-2024/25 · этап I» обрезалась. Задал width:auto/min-width:14rem/max-width:100%.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Вместо «Вариант 101/102/103» (технические номера) показываем источник:
«РТ-2024/25 · этап I/II/III». examVariantLabel() в exam-prep.js — единый
источник подписи: listVariants (пикер/dropdown) + variant_label в ответе
mock/:id (строка прохождения и результата). Номера в БД остаются 101+
(нужны для фильтра-диапазона [101;1999] и провенанса). math9 — fallback
«Вариант N» (не затронут). Новые варианты (104+) — дописывать в VARIANT_LABEL.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- exam-prep.js: MOCK_VARIANT_RANGE — для ctmath показываем как пробники
только чистые 30-задачные варианты [101;1999]; год-пачки (variant=год
2011-2024 и 0, до 114 задач) остаются пулом для тренажёра по темам,
но скрыты из пикера/mock-start/просмотра вариантов. math9 (1..80) не затронут
(диапазон только для ctmath).
- mock.js: пикер «По варианту» — выпадающий список реальных вариантов
(через listVariants) вместо number-input 1..N; раньше для ctmath он
предлагал 1..18 и не доходил до 101 → пробник по варианту не запускался.
- cleanup_ctmath_bank.js: идемпотентный скрипт — ретайр битого id=1419
(mc с противоречивым ответом → long), variants_count → 3 (чистых вариантов).
- seed_*: variants_count считается по диапазону [101;1999] (консистентно с роутом).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Чистый 30-задачный пробник Этапа II (другой набор тем, чем Этап I:
обратные тригфункции, логарифмы, производная, стереометрия). По 1 варианту
на Этап (правило «без повторов»). 3 чертежа из PDF (параллельные прямые,
панель из 5 графиков для y=|x|, график функции). KaTeX-рендер 30/30, self-сверка.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Первый чистый 30-задачный вариант-пробник для exam-prep ctmath (А1–А10 + В1–В20),
в отличие от год-пачек (variant=год). Идемпотентный seed (dry-run/--apply),
3 чертежа вырезаны из PDF (хорда/график/L-поле). Проверено: KaTeX-рендер 30/30,
self-сверка ответов через checkAnswerServer.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
В инструменте «∠ рёбер» общий рисовальщик _drawAngleArc всегда чертил дугу,
включая случай 90° — должен быть квадратный маркер прямого угла.
- _drawAngleArc: при |angle−90|<0.5° рисует угловой «квадратик» (p1=center+
n1·r, p3=center+(n1+n2)·r, p2=center+n2·r, r=radius·0.7) вместо дуги.
Подпись «∠ABC = 90.0°» и лучи угла рисуются отдельно в обработчике —
не затронуты. Для не-прямых углов поведение прежнее (дуга).
Верификация: node --check OK; headless-смоук 10/10 (90° → 3-точечный квадрат
с верной геометрией в любой плоскости; 89.6° в допуске → квадрат; 60/88/130°
→ дуга; полный поток _onEdgeAngleClick на угле куба → квадрат); эмодзи/eval/
new Function — 0.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Не было способа убрать само тело со сцены. Добавил тумблер «Фигура» в
начале секции «Отображение»: скрывает грани, рёбра, вершины и подписи тела,
оставляя сетку/оси и ВСЕ построения, точки, сечения и выделения — удобно
работать с конструкциями на «пустом» поле.
- StereoSim: флаг showFigure (деф. true) + toggleFigure(v) — переключает
_figGroup.visible/_labelGroup.visible (флаг переживает _clearGroup, поэтому
фигура остаётся скрытой и после перестроения при смене параметров). При
смене типа фигуры (setFigure) тело снова показывается.
- Панель: st-toggle-row #stg-figure; диспетчер stereoToggleSt('figure');
setStereoFigure возвращает тумблер в «вкл» для новой фигуры.
Верификация: node --check OK; headless-смоук 13/13 (деф. видна; скрытие
прячет fig+labels, но grid/construct/poly/point-группы остаются; перестроение
сохраняет скрытие; обратное включение; setFigure ре-показывает; dispose);
эмодзи/eval/new Function — 0.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
В инструменте «Соединить» подпись длины у каждого отрезка рисовалась всегда.
Добавил переключатель «Длины отрезков» (секция «Инструменты»): прячет только
подписи длин, сами отрезки и точки остаются.
- StereoSim: флаг showConnectionLengths (деф. true), гард в
_rebuildPointVisuals, метод toggleConnectionLengths(on). Предпочтение
переживает смену фигуры (не сбрасывается в setFigure).
- Панель: st-toggle-row #stg-connlen + glue stereoToggleConnLen.
Верификация: node --check OK; headless-смоук 8/8 (деф. вкл, подпись
гейтится флагом, линия/маркеры сохраняются, предпочтение переживает
setFigure); эмодзи/eval/new Function — 0.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Панель за фазы A–C разрослась до ~14 всегда-раскрытых секций (длинный
скролл, тяжело ориентироваться). Сделал её удобнее:
- _stereoInitPanel() (вызов из _openStereo, идемпотентно) оборачивает
контролы каждой секции в .st-acc-body; заголовки .gp-section-title →
кликабельные .st-acc-hdr с шевроном; состояние секций в localStorage.
- Тройку фигурных секций (Многогранники/Правильные/Тела вращения) слил в
одну «Фигуры» (под-метки .st-sublabel). По умолчанию открыты «Фигуры» и
«Параметры», остальное свёрнуто.
- Кнопки «Развернуть всё / Свернуть всё» (stereoAccAll), клавиатура
(Enter/Space на заголовке), role=button/tabindex.
- Только раскладка: ни один контрол/обработчик не изменён (узлы лишь
перемещены в тело секции). Затронуты stereo.js + lab.css.
Верификация: node --check OK; headless DOM-смоук (мини-DOM + реальный
stereo.js в vm) 22/22: 12 сворачиваемых секций, тройка фигур слита (2
под-метки внутри «Фигуры»), пары заголовок→тело, дефолт-открытие,
тоггл+персист, развернуть/свернуть всё, идемпотентная переинициализация,
ни одна строка контролов не потеряна. Эмодзи/eval/new Function — 0.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Фаза B раунда «Конструктор» (умные точки для построений).
B1 — деление отрезка m:n: задаёшь m,n, кликаешь 2 точки A,B → точка делит
AB как AM:MB = m:n (t=m/(m+n)), создаётся как точка-построение M,N,K…
B2 — точка по координатам: поля x/y/z + кнопка → addPointAt.
B3 — перетаскивание построенных точек мышью: drag в плоскости, обращённой
к камере (нормаль фиксируется на старте), приоритет над орбитой; снапшот
истории на старте → undo откатывает весь drag. Непараметрично: downstream-
объекты за перетаскиванием не следуют (параметрический граф — бэклог).
- StereoSim: setDivideMode/setDivideRatio (+ ветка в _onConstructClick),
addPointAt; setDragPointMode/_pickCPointAt/_beginCPointDrag/_rayPlaneHit/
_dragCPointWithRay/_dragCPointAt/_endCPointDrag; pointer-хендлеры
(down=начать drag, move=тащить, up=завершить); сброс в setFigure;
интеграция в _stereoDeactivateTools.
- Панель: блок «Точки» (кнопки Деление/Тащить, поля m:n, поля x,y,z +
«Точка (x,y,z)»); glue stereoDivideMode/DivideRatio/AddCoordPoint/
DragPointMode.
Верификация: node --check OK; headless-смоук 25/25 (деление 1:1/1:2/3:1,
координатная точка + отказ NaN, ray∩plane вкл. parallel/behind, drag begin→
move→end с проверкой позиции и снапшота истории + undo, взаимоисключение
режимов, setFigure-сброс, dispose); эмодзи/eval/new Function — 0.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Фаза C раунда «Конструктор» (C2 покрыта Фазой A, C4 отложена).
C1 — любую построенную плоскость можно показать сечением тела: клик по
плоскости в дереве (нормальный режим) → setSectionPlane: заливка
многоугольника + подписи вершин K,L,M… + площадь и периметр в readout-
панели. Удаление плоскости / очистка / смена фигуры сбрасывают сечение.
C3 — «Натуральная величина» сечения (getTrueShape): многоугольник сечения
разворачивается в свою плоскость (ортонормированный базис от нормали) с
сохранением истинных длин → 2D-SVG мини-панель со штриховкой (pattern),
подписями вершин, длинами сторон и S/P. Появляется автоматически при
активном сечении.
- StereoSim: _sectionPlaneId, setSectionPlane, _activeSectionPolygon,
_sectionVertexLabel, getTrueShape; _drawPlaneObject заливает+подписывает
активное сечение; getReadout добавляет S/P; getConstructions отдаёт
sectionId + per-plane section; pickConstructObject в нормальном режиме
тогглит сечение по плоскости.
- Панель: контейнер #construct-trueshape + подсказка; glue
_stereoUpdateTrueShape (SVG-рендер) вызывается из _stereoUpdateUI; строки
плоскостей в дереве всегда кликабельны, тег «(сечение)».
Верификация: node --check OK; headless-смоук 26/26 (квадрат y=2: S=16,P=16;
readout/дерево/тоггл; true-shape длины K,L,M,N=4, площадь=16; сохранение
длин и площади для прямого И наклонного сечения; 2D-shoelace=S; удаление/
очистка/setFigure сбрасывают сечение; dispose); эмодзи/eval/new Function — 0.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>