Текст доклада
¶1Коллеги, я хочу рассказать про игру, которую мы сделали для последнего занятия математического кружка. Я один из её соавторов. У нас было примерно сорок школьников девятого–одиннадцатого классов, пять преподавателей и сто десять минут — с половины седьмого до восьми двадцати. Школьники заходили на сайт со своих телефонов, получали восемь задач, а в конце мы наградили первые три места, поели сладостей и пиццы и разошлись.
¶2Снаружи это выглядело как обычный математический турнир: логин, список задач, поле для ответа, таблица результатов. Но через несколько минут дети начали ходить между столами, звать друг друга по именам, иногда просто кричать через всю комнату: «Кто такой-то?» Человек находился, они сразу открывали телефоны и начинали обсуждать задачи. Появились устойчивые группы, которые сидели и решали вместе, а к ним всё время подходили новые люди.
¶3Мы не проводили исследование. Я не могу сказать, что после этой игры школьники стали друзьями или лучше выучили математику. Мы этого не измеряли. Но один вечер наблюдали очень много общения вокруг задач, в том числе между теми, кто до этого почти не разговаривал. Сейчас объясню правило, которое это запустило.
¶4Если вы представили постоянные команды, в которых все решают одно условие, это не наша игра. Здесь нужно удержать сразу три масштаба: одну маленькую команду, одного участника на протяжении всех восьми номеров и всю комнату.
¶5Начнём с маленькой команды. Допустим, на третьем номере Аня объединена с Борисом. У Ани своя задача, например по геометрии. У Бориса — другая, например по комбинаторике. Обычно условия у партнёров различались, хотя код не даёт абсолютной гарантии: команды и задачи распределяются отдельно, а возможные совпадения преподаватель может увидеть в служебной таблице.
¶6У третьего номера один общий замок. Он зачтётся Ане и Борису только тогда, когда правильно решены обе личные задачи. Аня может закончить первой, но общего зачёта ещё не будет. Борис может закончить первым — результат тот же. Надпись «Зачтено» появится у обоих только после того, как готовы все участники этой команды. Обычно это пара, но при неудобном числе присутствующих последняя команда могла оказаться тройкой. Тогда замок закрывают уже три личных решения.
¶7Самая важная деталь — что именно видит школьник. На телефоне у него есть условие, имя партнёра и поле для ответа. После отправки сайт подтверждает, что ответ принят, но не сообщает, правильный ли он. Если Аня уже решила свою задачу, а Борис ещё нет, экран Ани выглядит так же, как если бы она ошиблась сама. Единственный явный положительный сигнал — общий статус «Зачтено». Главная причина была технически простой: мы не хотели, чтобы сайт мгновенной реакцией позволял перебирать ответы.
¶8У преподавателя картина другая. В секретной таблице видно, кто лично решил задачу, кто уже пробовал, но пока ошибается, и сколько было попыток. Есть отдельная таблица общих зачётов, по которой строится рейтинг. То есть в один и тот же момент Аня видит незачтённый номер и не знает причины, а преподаватель видит: у Ани всё готово, ждём Бориса.
¶9Теперь второй масштаб — один школьник на протяжении всей игры. Для каждого из восьми номеров команда строится заново. Партнёр Ани в первом номере не обязан быть её партнёром во втором, третьем или восьмом. В коде для каждого номера перебирается до тридцати случайных разбиений и выбирается то, где меньше повторных встреч. Если находится вариант вообще без повторов, перебор заканчивается раньше. Это не обещание восьми уникальных партнёров при любых исходных данных, а способ уменьшить число повторов.
¶10Третий масштаб — вся комната. На каждом номере примерно сорок человек заново разбиваются примерно на двадцать маленьких команд. Потом линии стираются и рисуются снова. Поэтому у школьника не просто восемь задач. Рядом с каждой задачей написано имя человека, от которого зависит общий зачёт именно этого номера. Имя становится не подписью в интерфейсе, а практической задачей: человека надо найти.
¶11У этой защиты от перебора появился дополнительный игровой эффект. Если твоя часть готова, а общий зачёт не появился, ты всё равно не знаешь, где проблема. Логичный следующий шаг — найти партнёра, спросить, как у него дела, вместе перепроверить оба решения или помочь с тем, что не получается. Такая неопределённость подталкивала детей к разговору, хотя, конечно, могла и раздражать того, кто всё сделал правильно. В следующем запуске можно проверить вариант, где личный статус сообщается приватно, а общий зачёт всё равно зависит от команды. Но тогда защиту от перебора придётся обеспечить иначе — например, ограничением попыток или заданиями, ответ к которым трудно подобрать. Это уже немного другая игра.
¶12Самое спорное правило состояло в том, что человеческая помощь была разрешена полностью. Можно было подсказать идею, объяснить решение, продиктовать вычисления или вообще решить задачу за партнёра. Мы не считали это лазейкой. Мы и не задумывали восемь независимых контрольных работ.
¶13Представим, что сильная участница решила свою задачу, а её партнёр застрял. Пока он не справится, общий номер не закроется. Поэтому помочь ему — нормальная игровая стратегия. Из-за этого вокруг сильных ребят образовывались рабочие группы, но не только они получали выгоду: один и тот же человек в разных номерах был связан с разными партнёрами и ходил между группами.
¶14Цена у такого решения понятная. Итоговый счёт показывает число совместно закрытых номеров. Он не показывает, сколько задач человек способен решить самостоятельно. Если сильный участник полностью сделал задачу слабому, рейтинг этого не различает. Для нашей версии это было нормально: мы считали командное завершение, а не измеряли личное освоение программы кружка. Если преподавателю важна именно самостоятельность, правило надо менять, а не надеяться, что та же таблица внезапно начнёт измерять другое.
¶15Например, можно сохранить полную помощь, но после зачёта случайно просить владельца задачи объяснить ключевую идею. Тогда сильному выгодно не только получить ответ за партнёра, но и добиться, чтобы тот понял ход. Можно считать личные решения, а за закрытие всей команды давать дополнительный балл. Можно последние два номера провести без помощи и вынести их в отдельный личный зачёт. Можно назначить в паре решающего и критика: один предлагает решение, второй должен найти слабое место или задать содержательный вопрос. Это не косметические режимы, а разные правила с разными стимулами.
¶16Теперь неудобная часть — нейросети. По правилам интернет и любые подсказки оттуда были запрещены, но некоторые школьники всё равно ими пользовались. Мы замечали подозрительно быстрые ответы; примерно пять случаев показались мне такими. Человека приглашали к преподавателю и просили решить ту же задачу ещё раз. Обычно он уже не справлялся. В проведённой версии это могло закончиться исключением. Чтобы не сломать игру остальным, номера исключённого организационно считались решёнными для его партнёров.
¶17Сейчас я бы не выдавал эту процедуру за надёжную проверку нейросетей. Если помощь другого школьника разрешена полностью, неспособность решить задачу самостоятельно не доказывает нарушение: за ребёнка мог совершенно законно решить партнёр. Быстрый ответ тоже ничего не доказывает. Наша проверка ставила под вопрос происхождение решения, но не определяла его источник.
¶18Для следующей игры нужен заранее объявленный порядок: преподаватель смотрит на процесс, может попросить показать записи или промежуточные шаги, задаёт короткий вопрос о ключевой идее, а спорный случай при необходимости смотрит второй преподаватель. И до игры нужно честно решить, что мы проверяем. Если человек имеет право полностью решить за тебя, а нейросеть — нет, граница проходит по источнику помощи, а не по владению решением. Это трудная для контроля граница. Другой честный вариант — изменить само правило и включить объяснение в зачёт.
¶19Вторая реальная проблема оказалась у организаторов: банк задач. Мы подготовили около трёхсот задач примерно за двадцать часов. Брали задачи из источников, использовали нейросети для генерации и нескольких проходов проверки, потом смотрели их людьми. И всё равно в банке остались настоящие математические ошибки.
¶20Переданная база позже прошла отдельный аудит: это поздний разбор, а не то, что команда знала в день игры. База не изменялась — её разбирали ровно в том виде, в каком передали. Проверено 301 запись: у 298 сохранённый ответ подтвердился в рамках этого аудита, 1 записанный ответ оказался неверным, ещё 2 условия оказались неоднозначными. Кроме того, есть 1 запись, где ответ правильный, но в записанном тексте решения есть дефект формулировки. Отдельно про полноту: у 235 нет записанного решения, у 213 нет ссылки на источник. Это не значит, что все они неправильные: пустое поле — проблема проверяемости, а не доказательство математической ошибки. Но когда во время рейтинговой игры ребёнок спорит с ответом, отсутствие решения и источника резко усложняет преподавателю жизнь. И честное ограничение: 298 подтверждений — это итог данного аудита, а не гарантия, что банк безупречен.
¶21Из этого я бы сделал очень практичный вывод. Для рейтинговой части нужен не самый большой банк, а небольшой полностью проверенный набор: условие, ответ, полное решение, источник, независимая проверка вторым человеком, пробный прогон и финальная вычитка. Остальные задачи можно оставить для тренировки и резерва. И нужен заранее понятный порядок на случай дефекта: спорную задачу останавливаем, проверяем и не штрафуем ребёнка за ошибку организаторов.
¶22Сейчас в проекте уже есть более серьёзная работа с банком, которой в таком виде на мероприятии ещё не было. Есть роль редактора: другой человек может открыть задачу и предложить изменение. Администратор видит правку и комментарий, принимает её или отклоняет; сохраняется история. Есть отметки проверки и задачи на доработку. Показываю это не как продукт, который всем надо внедрить, а как напоминание: триста задач — уже маленький редакционный проект. Одного JSON-файла и фразы «нейросеть всё проверила» для него мало.
¶23Основную игру при этом можно повторить вообще без сайта. Для небольшой пробы возьмите, например, двадцать участников и три коротких номера. Заранее сделайте три разных разбиения на пары, стараясь уменьшить повторы. На карточке каждого участника напишите номер, личную задачу и имя партнёра. У преподавателя пусть будет закрытая таблица личных решений и отдельная таблица общего зачёта. Номер закрывается, когда решены обе личные задачи. До старта объявите, какая помощь разрешена и что именно попадёт в рейтинг. Этого достаточно, чтобы проверить механику.
¶24Сайт автоматизирует то же самое: раздаёт задачи, показывает партнёров, проверяет ответы, собирает общий счёт и даёт преподавателям служебную картину. Код проекта у нас сохранился, и его можно менять. Поэтому, если базовая механика подходит, не обязательно программировать всё с нуля: можно взять основу и с помощью нейросети переделать ротацию, обратную связь или подсчёт баллов. Но сначала всё равно придётся решить педагогический вопрос — какое поведение мы хотим сделать выгодным.
¶25Если цель — чтобы незнакомые участники больше пересекались, оставляем частую смену партнёров и полную помощь. Если важнее личное понимание, добавляем объяснение владельцем задачи. Если нужен более привычный турнир, разделяем личный результат и командный бонус. Если хочется содержательного спора, вводим роли решающего и критика. Основа одна, но игры получаются разные.
¶26Поэтому перед запуском я бы ответил на четыре вопроса. С кем участники должны встретиться? Какая помощь разрешена? Что именно означает балл? И что человек узнаёт сразу после отправки ответа? Ответы на эти четыре вопроса влияют на поведение сильнее, чем цвет интерфейса, количество анимаций или название мероприятия.
¶27Если совсем коротко, наш опыт такой. Смена команд по каждому номеру, личные задачи и общий замок действительно дали школьникам причины искать друг друга и разговаривать о математике — это мы видели. Но рейтинг измерял совместное завершение, а не личные знания; проверка происхождения решения оказалась неоднозначной; большой банк потребовал гораздо более строгой редакционной работы. Я бы повторил эту игру, но уже с меньшим проверенным набором задач, заранее объявленной процедурой спорных случаев и осознанно выбранным правилом обратной связи.
¶28И мне было бы интересно не убедить вас повторить именно нашу версию, а узнать, какое одно правило вы поменяли бы первым: помощь, обратную связь, подсчёт или ротацию партнёров.
Лаборатория механики
Видит школьник
- Условие своей задачи и имя партнёра по номеру.
- Поле для ответа и подтверждение «ответ принят» — без оценки правильности.
- Единственный положительный сигнал — общее «Зачтено» после закрытия команды.
Видит преподаватель
- Кто лично решил задачу, кто пробовал и ошибается, сколько было попыток.
- Общие зачёты команд, по которым строится рейтинг.
- Возможные совпадения условий — по служебной таблице назначений.
Сайт намеренно не сообщает школьнику, правильный ли его ответ: мгновенная реакция позволила бы перебирать варианты. Правда о личных попытках — только у преподавателя. Источники: ¶5, ¶7–8.
Три масштаба синтетическая реконструкция
Двух школьников недостаточно, чтобы понять игру, — но с команды начинается каждый номер. Переключатели ниже моделируют служебную картину: так состояния видит преподаватель. Школьник видит только замок.
Тройка появляется только как последняя команда при неудобном числе присутствующих (¶6).
Один момент — два информационных поля синтетическая реконструкция
Геометрия: вписанный квадрат
Ответ отправлен — сайт подтверждает приём.
Экран одинаков и при решённой, и при нерешённой личной задаче: правильность не показывается никому из игроков. До закрытия команды явного сигнала нет; после — появляется единственное положительное «Зачтено» (¶6–7).
Storyboard · 12 сцен
- 10:00–1:20
Один реальный вечер: 40 школьников, 5 преподавателей, телефоны, 8 задач
Показываем: Настоящий мобильный экран входа и короткий фрагмент исходных правил
Зачем: Сразу установить масштаб и реальность события, не делать титульный слайд-питч
- 21:20–2:30
Дети ходят по залу и кричат имена
Показываем: Чётко подписанная реконструкция зала из наблюдений автора: имя → поиск → разговор о задаче
Зачем: Сначала показать наблюдаемое поведение, потом объяснять механику; не изображать это как измеренную дружбу
EVT-04 - 32:30–6:20
Механика в трёх масштабах
Показываем: Интерактивная схема: пара/редкая тройка → один участник через 8 номеров → все 40 человек в выбранном номере
Зачем: Двух школьников недостаточно; слушатель должен увидеть, как локальный замок превращается в движение всей комнаты
INT-01 - 46:20–8:00
Один момент глазами ученика и преподавателя
Показываем: Слева реальный мобильный экран «ещё не зачтено», справа секретная таблица: личная задача уже решена, партнёр ещё нет
Зачем: Точно ответить на вопрос, знает ли ученик о своём правильном решении: нет. Исходная причина — защита от перебора; необходимость искать партнёра стала дополнительным игровым эффектом
- 58:00–10:00
Полная человеческая помощь — намеренное правило
Показываем: Реальная пара задач и общий замок; переключатель показывает, как решение за партнёра закрывает номер
Зачем: Объяснить, почему это фича проведённой версии и почему счёт не измеряет личное знание
UI-05INT-03 - 610:00–11:00
Возвращение в зал: устойчивые группы и новые участники вокруг них
Показываем: Небольшая схема перемещений на основе воспоминаний, без выдуманной фотографии
Зачем: Связать правило с тем, что организаторы действительно наблюдали, не заявляя причинность сильнее фактов
EVT-04Та же реконструкция зала, что в сцене 2, но с акцентом на устойчивые группы. - 711:00–13:00
Подозрительно быстрые ответы и граница проверки
Показываем: Разбор одного случая: одинаковый быстрый ответ мог прийти от разрешённой помощи человека или запрещённой нейросети
Зачем: Показать, почему повторное решение ставит вопрос об авторстве, но не является AI-детектором
Скриншотов нет: разбор одного случая строится как синтетическая схема. - 813:00–15:40
Банк из 301 задачи и поздний аудит переданной базы
Показываем: Настоящий интерфейс банка + «вскрытие» одной записи: условие, ответ, решение, источник; одна компактная строка аудита: 301 проверена / 298 подтверждено / 1 неверный ответ / 2 неоднозначных условия / 235 без решения / 213 без источника
Зачем: Развести математические ошибки и пробелы проверяемости; числа позднего аудита поддерживают рассказ одной строкой, а не KPI-стеной, и не выдаются за знание команды в день игры
UI-09INT-04 - 915:40–16:50
- 1016:50–18:00
Как повторить базовую версию без разработки
Показываем: Бумажная таблица трёх разбиений, карточки задач, закрытая личная таблица и общий зачёт
Зачем: Дать слушателю воспроизводимый минимальный рецепт; сайт здесь лишь автоматизация
Бумажный рецепт: карточки и две таблицы; скриншоты сайта не нужны. - 1118:00–19:30
Несколько игр на одной основе
Показываем: Конструктор правил: ротация, помощь, обратная связь, счёт, объяснение; рядом меняется ожидаемое выгодное поведение
Зачем: Помочь преподавателям придумать свой вариант, а не просто скопировать наш
INT-06 - 1219:30–20:00
Спокойный вывод и вопрос залу
Показываем: Возврат к реальному списку восьми номеров и один вопрос: «Что вы поменяли бы первым?»
Зачем: Закончить разговором, а не рекламным лозунгом
Доказательства: реальные скриншоты
Все скриншоты сделаны на синтетическом изолированном прогоне с замороженным исходником игры. Реальных школьников и их ответов в кадре нет.
Экраны ученика
Экраны администратора
Редактирование и проверка
Аудит банка задач
Математические ошибки
Настоящие ошибки в банке были — и до, и во время игры. Сколько их и кого они затронули, не фиксировалось, поэтому цифр здесь нет и не будет до ручной разметки владельца (¶19–20).
Пробелы проверяемости
235 записей без решения и 213 без источника — задокументированные пустые поля. Пустое поле не доказывает ошибку, но в момент спора об ответе резко усложняет жизнь преподавателю (¶20).
Контракт агрегатного JSON заготовка · плейсхолдеры
{
"$schema": "mathgame/bank-aggregate/draft-1",
"generatedAt": "<дата генерации агрегата>",
"totals": {
"tasks": 301,
"withoutSolution": 235,
"withoutSource": 213,
"audit": {
"answersConfirmed": 298,
"wrongStoredAnswer": 1,
"ambiguousStatements": 2,
"solutionTextDefects": 1,
"unverified": 0
}
},
"auditCaveat": "298 подтверждений — итог позднего аудита переданной базы: это не гарантия безошибочности банка и не замена редакционной проверки. Банк не изменялся.",
"records": [
{
"id": "<идентификатор записи>",
"statement": "<условие задачи>",
"answer": "<ожидаемый ответ>",
"solution": "<полное решение или null>",
"source": "<ссылка на источник или null>",
"flags": ["missing-solution", "missing-source", "math-error?", "ambiguous?", "solution-defect?"]
}
],
"correctionQueue": {
"ownerGated": true,
"items": [
{
"recordId": "<идентификатор записи>",
"proposal": "<суть исправления>",
"status": "pending-owner | accepted | rejected"
}
]
}
}Очередь исправлений только владелец
Ставить записи в очередь может только владелец банка. Пока агрегат не получен, очередь пуста; формат записи — пример:
<идентификатор записи из агрегата><что именно предлагается исправить>pending-ownerТехнический аудит · чтение для владельца
Инженерные дефекты в этом приложении не предъявляются как педагогические слабости доклада. Читалка разделяет два разговора: что случилось на занятии и что стоит починить в коде.
Пример разведения: отсутствие автоматического обновления ученического экрана отмечено советом моделей как рабочая деталь, а не как недостаток методики.
Ориентир
Границы: исходный продукт аудитом не изменялся — разбирали замороженный исходник в том виде, в каком он передан. Этот раздел не предназначен для доклада. Источник — audit-input/TECHNICAL-AUDIT-SUMMARY.json (схема mathgame-technical-audit-summary/v1, дата 2026-08-22).
Списки Qwen и Kimi сверены: 9 «высоких» находок Qwen и 7 приоритетных находок Kimi (P1/P2) разобраны и согласованы в этом перечне. Формальное принятие агрегата провайдерским бегунком не заявляется: его терминальный поток был остановлен защитой от вывода секретов, хотя оба записанных артефакта независимо прошли один и тот же сканер секретов и все файловые проверки.
Показано 18 из 57 · дорожка: до события
AGG-A1высокаядо событияОшибочная отправка после правильной откатывает готовность: статус решения немонотонный
Каноническое название (англ., дословно)Non-monotonic SolveStatus: wrong submission after a correct one revokes readiness
AGG-S1высокаядо событияВход не ограничен по частоте и не блокирует после неудачных попыток — ни в API, ни в административной панели
Каноническое название (англ., дословно)No rate limiting or lockout on login (API and Django admin)
AGG-S2высокаядо событияSECRET_KEY: при отсутствии значения подставляется публичный дефолт — проверка только предупреждает, запуск не останавливается
Каноническое название (англ., дословно)SECRET_KEY fail-open public default; detection-only, never fail-closed
AGG-O1высокаядо событияНаполнение демо-данных разрушительно вне одноразовой базы и запускается визуальным каркасом безусловно
Каноническое название (англ., дословно)seed_visual_demo destructive outside a disposable DB; runs unconditionally in the visual test harness
AGG-B1высокаядо событияNaN и бесконечность принимаются как корректный числовой ответ
Каноническое название (англ., дословно)Non-finite numbers (NaN, Infinity) accepted as valid number answers
AGG-B2высокаядо событияНормализация разделителей портит записи: {1,2} сохраняется как {1.2}, [1,2,3] как [1, 2.3]
Каноническое название (англ., дословно)Separator normalization corrupts real_set ({1,2} stored as {1.2}, [1,2,3] as [1, 2.3])
AGG-B3высокаядо событияПолная замена при импорте включена по умолчанию, а интерфейс подставляет данные из отфильтрованного вида
Каноническое название (англ., дословно)replace_all defaults to true and UI prefills the import payload from the filtered view
AGG-B4высокаядо событияПеред стартом игры нет проверки банка на корректность: предупреждения о качестве приходят после и носят информационный характер
Каноническое название (англ., дословно)No correctness/review gate before game start; quality warnings are post-commit and informational
AGG-B5высокаядо событияИмпорт задач не атомарен: частичный сбой оставляет полубанк и осиротевшие темы
Каноническое название (англ., дословно)Problem import is non-atomic; partial failure leaves a partial bank and orphan topics
AGG-A13средняядо событияЖдущий партнёр не видит закрытие команды, пока сам не отправит ответ или не обновит страницу
Каноническое название (англ., дословно)Idle teammate does not see a union close until own submit or reload (no polling)
AGG-A14средняядо событияНет сквозного теста критичного пути игры: старт, отправка, командный зачёт, финиш
Каноническое название (англ., дословно)No game-critical end-to-end coverage (start, submit, team credit, end)
AGG-S3средняядо событияПоставляемый .env.example выключает безопасные cookie при выключенном DEBUG
Каноническое название (англ., дословно)Shipped .env.example disables secure cookies while DEBUG=False
AGG-S4средняядо событияПри создании пользователя без пароля подставляется зашитый в коде пароль по умолчанию
Каноническое название (англ., дословно)Hardcoded default password on user create when password omitted
AGG-O2средняядо событияdeploy.sh собирает фронтенд, не устанавливая его зависимости
Каноническое название (англ., дословно)deploy.sh builds the frontend without installing frontend dependencies
AGG-O3средняядо событияРелизные проверки отвязаны от пути деплоя: выкатка возможна без них
Каноническое название (англ., дословно)Release checks disconnected from the deploy path
AGG-O4средняядо событияЗависимости не закреплены версиями и пересчитываются заново на каждом деплое
Каноническое название (англ., дословно)Dependencies unpinned and re-resolved on every deploy
AGG-O5средняядо событияПеред миграциями не создаётся резервная копия; порядка восстановления и отката нет
Каноническое название (англ., дословно)No backup before migrate; no backup/restore/rollback runbook
AGG-O6средняядо событияРабота под примерно 40 одновременными клиентами не проверена: SQLite, запись сессии на каждый запрос, нагрузочных тестов нет
Каноническое название (англ., дословно)Concurrency capacity for ~40 simultaneous clients unproven (SQLite, per-request session writes, no load test)
Сейчас показана дорожка «до ближайшего события». Остальное тоже доступно в переключателе выше: ещё 25 находок — «скоро ради надёжности» и 14 — «по решению владельца: продукт и политика».
Что уже хорошо
12 подтверждённых защит из канонического списка аудита. Они снимают часть тревог, но не отменяют риски из перечня выше.
- Личная правильность скрыта от игроков до командного зачёта: на все отправки — ровное «принято», игроку виден только флаг командного зачёта (защита от перебора, намеренно; подтверждено обеими моделями).
- Полная взаимопомощь в команде, включая решение за партнёра, — намеренное правило продукта; слабостью она нигде не помечается.
- Атомарный старт игры: смена сессии, назначения, статусы решений, команды, составы и флаг активной игры записываются одной транзакцией.
- Условия назначенных задач не меняются под активной сессией: защиты от правок при идущей игре плюс снимок при старте.
- Предпросмотр старта считает полное распределение, не записывая ничего в базу (проверено тестом).
- Распределение и команды покрыты тестами с фиксированным зерном: разные задачи у одного участника, границы размера команды, минимизация повторных пар (лучший из 30 вариантов).
- Роли проверяются на сервере на каждом административном эндпоинте; данные игроков ограничены своими объектами (без доступа к чужим по идентификатору); повышения привилегий через массовое назначение полей нет.
- Базовая защита сессий и CSRF: ротация ключа сессии при входе, HttpOnly и SameSite=Lax cookie, защищённые по умолчанию вне режима отладки, CSRF на всех изменяющих эндпоинтах кроме входа, обобщённые ошибки входа, защищённый аварийный выключатель сессий.
- Самодиагностика безопасности при старте плюс закрытый тестом эндпоинт здоровья с проверкой базы, статистикой и предупреждениями.
- deploy.sh работает в строгом режиме (set -euo pipefail), миграции выполняются до перезапуска; браузерные тесты падают при любой ошибке консоли, неудачном запросе или 4xx/5xx.
- Серверные тесты 74/74 зелёные (данные интеграционного прогона, переданы Kimi); миграции 0001–0012 линейны и полны, миграционных рисков не найдено; в производном дереве зависимостей ноль уведомлений об уязвимостях.
- Намеренная редакционная политика сохранена: мягкое устаревание legacy_text, отметки проверки «по совести» с машинной проверкой только валидности, каноническая семантика real_set, оценка вариантов по идентификатору без утечки правильного.
Вопросы, которые аудит оставляет владельцу (8)
- Разделение задач у партнёров по команде (инвариант 3) — жёсткое правило или обычный ожидаемый результат? (AGG-A2)
- Каков порядок удаления участника посреди игры; допустимо ли удаление мимо продукта; возвращается ли историческое правило считать задачи исключённого решёнными? (AGG-A3, AGG-A11, AGG-A12)
- Есть ли приемлемый бюджет попыток на игрока в номере, или неограниченный перебор принимается, пока обратная связь скрыта? (AGG-A5)
- Требовать ли отметку проверки или контроль качества банка перед стартом игры, или принятой политикой остаётся ручная проверка до игры? (AGG-B4)
- Приемлемо ли одобрение одним администратором, включая контент, сгенерированный моделями? (AGG-B15)
- Заметки-задачи редактора принадлежат автору проблемы или общие по замыслу? (AGG-S9)
- Если банк слишком мал, чтобы гарантировать разные задачи партнёрам: отказывать в старте, предупреждать или допускать?
- Показывать ли игрокам таблицу результатов или итоговый экран (страница моих результатов существует, но не отображается)?
Пакет Kimi Slides · готовность
| Сцена | Рассказ | Активы | Готовность |
|---|---|---|---|
| 10:00–1:20 | Один реальный вечер: 40 школьников, 5 преподавателей, телефоны, 8 задач | активы в наличии | |
| 21:20–2:30 | Дети ходят по залу и кричат имена | EVT-04 | активы в наличии |
| 32:30–6:20 | Механика в трёх масштабах | INT-01 | активы в наличии |
| 46:20–8:00 | Один момент глазами ученика и преподавателя | нужен fixture | |
| 58:00–10:00 | Полная человеческая помощь — намеренное правило | UI-05INT-03 | материалы в плане |
| 610:00–11:00 | Возвращение в зал: устойчивые группы и новые участники вокруг нихТа же реконструкция зала, что в сцене 2, но с акцентом на устойчивые группы. | EVT-04 | активы в наличии |
| 711:00–13:00 | Подозрительно быстрые ответы и граница проверкиСкриншотов нет: разбор одного случая строится как синтетическая схема. | скриншоты не нужны | без скриншотов |
| 813:00–15:40 | Банк из 301 задачи и поздний аудит переданной базы | UI-09INT-04 | нужен fixture |
| 915:40–16:50 | Как проект теперь позволяет проверять задачи нескольким людям | материалы в плане | |
| 1016:50–18:00 | Как повторить базовую версию без разработкиБумажный рецепт: карточки и две таблицы; скриншоты сайта не нужны. | скриншоты не нужны | без скриншотов |
| 1118:00–19:30 | Несколько игр на одной основе | INT-06 | материалы в плане |
| 1219:30–20:00 | Спокойный вывод и вопрос залу | нужен fixture |
Реестр материалов и статусы (полный список)
Аутентичные захваты интерфейса
- UI-01Login on a phoneестьestablish that students actually joined from phoneslogged out, 390×844
- UI-02Player list with eight slotsнужен fixtureshow that partner names are part of every numbered taskplayer, active synthetic session, 390×844
- UI-03One neutral task cardнужен fixturebaseline before answerplayer has not solved personally, team open
- UI-04Own answer correct but team openнужен fixtureprove that the player still sees no personal correctness stateplayer's private status solved; partner unfinished
- UI-05Team creditedестьshow the only positive status visible to the playerunion closed; green Зачтено; input disabled
- UI-06Team scoreboardестьshow what determines rankingadmin, active synthetic session
- UI-07Secret personal-progress tableестьcontrast teacher information with player informationadmin, revealed table, mixed solved/attempted/empty cells
- UI-08Assignment tableнужен fixtureshow separate problem distribution and overlap detectionadmin, eight slots, varied task topics and no/known overlaps
- UI-09Bank list/editorнужен fixturemake the bank concrete rather than saying JSONадмин, банк 1280×720: первые карточки задач с условием, темой, автором, форматом ответа/ответом и статусами проверки; у одной карточки предупреждение об ожидающей правке редактора
- UI-10Editor proposalестьshow that other people can inspect and propose correctionseditor, pending change with comment and diff
- UI-11Admin review queueестьshow human review and role separationадмин, очередь проверки с фильтром «ожидают»: первое ожидающее предложение с контекстом диффа
- UI-12Review marks / task workпланshow that the current repository treats task quality as an editorial workfloweditor/admin, review status or to-do items
Доказательства события от организатора
- EVT-01Original rules messageестьpreserve the exact shared-credit and no-internet rules
- EVT-02Existing MathGame login screenshotестьuse only as historical visual evidence if clean recapture differs materially
- EVT-03Event factsестьsimple factual strip: about 40 students, grades 9–11, five teachers, 110 minutes, eight slots
- EVT-04Room behaviorестьno fake photograph; labelled reconstruction with short observed phrases
Синтетические пояснения
- INT-01Three-scale mechanic explorerестьteam / one participant across eight slots / whole room — reading aid, not projector
- INT-02Same moment, two information viewsестьplayer versus teacher: private solved state versus public team credit
- INT-03Credit lockпланsmall circuit for pair and triple teams
- INT-04Bank autopsyпланopen one authentic-shaped problem record and reveal fields in reading order
- INT-05Failure laboratoryпланfive scenario buttons applying to the same small session
- INT-06Rule-variant constructorпланteacher-controlled settings producing named variants and expected behavior
Совет моделей
Полный независимый черновик и исходный storyboard; принят как структурная основа.
Полный независимый черновик; маршрут завершён с PASS и механически зафиксирован в отдельной ветке.
Полный независимый черновик записан, но процесс завис до обязательного финального паспорта. Содержимое использовано после ручной проверки, формальный PASS не приписывается.
Принято
- Открывать рассказ реальной картиной зала, а не общим тезисом о методике.
- Сначала исправить ложную модель «постоянная команда с одинаковой задачей».
- Объяснять механику на трёх связанных масштабах: команда, участник через восемь номеров, вся комната.
- Сопоставить один момент глазами ученика и преподавателя.
- Называть полную человеческую помощь намеренным правилом и прямо ограничить смысл рейтинга совместным завершением.
- Отделить проверку происхождения решения от недоказуемого «AI-детектора».
- Развести математические ошибки банка и отсутствие решения/источника.
- Дать бумажный минимальный рецепт и несколько вариантов, которые меняют стимулы.
- Закончить спокойным вопросом залу, а не призывом купить или внедрить систему.
Исправлено при интеграции
- Формулировки о тройке привязаны к фактическому числу присутствующих, которое может не делиться на размер команды, а не к ошибочной фразе о том, что 40 не делится на 2.
- Алгоритм только уменьшает повторные пары; утверждение о математической неизбежности повторов для 40 участников и 8 номеров отброшено как ложное.
- Историческая проверка использовала ту же задачу, не «похожую».
- «Мы измеряли общение» заменено на честное «мы наблюдали общение».
- Техническое отсутствие автоматического обновления ученического экрана не вынесено в педагогические слабости доклада.
Отклонено
- «Карантин задачи, если ответ пришёл слишком быстро»: скорость участника не является признаком дефекта задачи и не доказывает AI.
- Обещания уникальных партнёров, гарантированно разных задач, роста знаний или долговременной дружбы.
- Риторика питча, лозунги и попытка представить проект готовым универсальным продуктом.
- Варианты правил, которые меняют только оформление или неясно влияют на стимулы.
- Формулировка «измеряйте общение»: на мероприятии не было инструмента измерения, только наблюдение.
Оставлено владельцу
- Показывать ли участнику приватный личный статус в следующем запуске.
- Насколько подробно рассказывать историческую процедуру исключения.
- Какие два варианта правил разбирать подробно в короткой версии.
- Нужен ли исследовательский контекст в устном тексте; текущая версия оставляет его в материалах, а не делает центром доклада.