Неофициальный open-source чекер для предварительной проверки игр перед отправкой на модерацию в Яндекс Играх.
Один файл debugcheck.js, без runtime-зависимостей. Он подключается после /sdk.js, но до игровых скриптов, анализирует загруженный исходный код и во время запуска наблюдает за SDK-событиями, таймингами, рекламой, локализацией и поведением страницы.
Это независимый инструмент и не является продуктом Яндекса. Результат PASS не гарантирует прохождение модерации. Актуальным источником правил остаётся официальная документация Яндекс Игр.
- 💬 Вопросы, идеи, предложения новых проверок и обсуждение правил: GitHub Discussions
- 🐛 Воспроизводимый баг checker'а: Bug report
- 🧪 Воспроизводимый false positive / некорректный результат проверки: False positive / incorrect check
- 🛠 Хотите прислать исправление: см.
CONTRIBUTING.md
Если вы не уверены, является ли результат багом или вопросом трактовки правила, начните с Discussions. Issues предназначены для конкретных воспроизводимых проблем.
Public v1.1.0 содержит 93 исполняемых проверок. Они разделены на три класса:
- REQ — проверка привязана к опубликованному требованию Яндекс Игр;
- REC — проверка привязана к опубликованной рекомендации;
- HEURISTIC — инженерная эвристика, которая помогает найти риск, но не должна трактоваться как официальный вердикт.
Статические проверки читают index.html, подключённые локальные JS-файлы и CSS. Runtime-проверки наблюдают за фактическим порядком SDK-вызовов и браузерными событиями. Полный каталог: docs/checks.md и checks.csv.
Скопируйте debugcheck.js в тестовую сборку игры и подключите его в <head> после SDK, но до игровых скриптов:
<script src="/sdk.js"></script>
<script src="debugcheck.js"></script>
<script src="game.js"></script>Откройте панель одним из способов:
Ctrl+Shift+2, три раза подряд
или из DevTools/своей debug-кнопки:
YGDebugChecker.open();Для повторной проверки:
YGDebugChecker.refresh();Перед production-релизом удалите <script src="debugcheck.js"></script> и сам файл из релизной сборки.
В examples/orc-castle лежит специально подготовленная небольшая Canvas-игра в вариантах before / after. Это демонстрационный fixture, созданный для наглядной проверки checker'а, а не опубликованная production-игра и не результат аудита случайно выбранного проекта.
Цифры ниже не захардкожены: browser audit действительно запускает оба варианта в Chromium, а PASS / FAIL / WARN / NOT VERIFIED формирует сам checker.
| Вариант | PASS | FAIL | WARN | N/V | SCORE |
|---|---|---|---|---|---|
| Before | 45 | 3 | 12 | 10 | 75% |
| After | 70 | 0 | 0 | 2 | 100% |
before намеренно содержит типовые проблемы интеграции, которые должен обнаружить checker. after показывает исправленный вариант: корректный порядок SDK → checker → game, startup через YaGames.init(), чтение environment.i18n.lang, input gate, Game Ready, optional Gameplay API lifecycle, mobile hardening и sound toggle. В after нет WARN/FAIL. Два пункта остаются NOT VERIFIED: timing первого paint в headless-тесте и Canvas-текст, который нельзя доказать DOM-сканированием. Они не маскируются под предупреждения.
Для GitHub Pages есть отдельная mock-сборка. Production-пример examples/orc-castle/after/index.html mock SDK не содержит.
Подробнее: examples/orc-castle/README.md.
- FAIL используется только для небольшого набора проверок, где сигнал достаточно прямой и был отдельно допущен в public policy checker'а.
- WARN означает, что checker увидел конкретный риск/подозрительный сигнал.
- NOT VERIFIED (N/V) означает, что автоматических доказательств недостаточно. Это не дефект и не снижает score; отдельно показывается coverage.
- N/A означает, что опциональная возможность не обнаружена, например rewarded ads, IAP или лидерборды.
Даже если hard FAIL нет, перед отправкой игры нужно пройти docs/manual-checklist.md.
Первоначальная версия создавалась как внутренний инструмент конкретной студии. Перед публикацией из неё удалены проверки, завязанные на внутренние имена переменных, setLang(), screenshot tooling, локальные pre-submit отчёты и инструменты записи тестовых значений в лидерборды. Также исправлены несколько правил после сверки с актуальной документацией Яндекс Игр. Подробно: docs/audit-2026-08-11.md.
Checker различает четыре состояния результата:
- PASS — проверка получила достаточное доказательство корректности.
- FAIL — обнаружено подтверждённое нарушение для hard-fail правила.
- WARN — обнаружен реальный риск или эвристический сигнал, который стоит проверить.
- NOT VERIFIED — checker не смог автоматически доказать ни корректность, ни проблему. Это не WARN и не влияет на score; состояние отдельно учитывается как покрытие автоматической проверки.
Для локализации environment.i18n.lang теперь подтверждается по фактическому runtime-чтению. Для сложных собственных resolver-функций можно необязательно предоставить checker-контракт:
window.YGDebugCheckerConfig = {
supportedLanguages: ['ru', 'en'],
resolveLanguage: resolveGameLanguage
};Это не требование Яндекс Игр и не нужно для работы игры. Контракт нужен только checker'у, чтобы выполнить resolver на тестовых языках и заменить NOT VERIFIED на доказанный PASS/результат.
Статический анализ не является AST-анализатором и использует сигнатуры/эвристики. Минификация и обфускация могут снижать точность. Для Unity/Godot/WASM большая часть логики недоступна статике, поэтому основная ценность остаётся в runtime-проверках. Checker не может надёжно определить содержательную корректность геймплея, промоматериалов, фактический round-trip сохранений и некоторые бизнес-правила покупок/рекламы.
Подробнее: docs/limitations.md.
На момент аудита 11 августа 2026 года использовались:
- Требования к игре: https://yandex.ru/dev/games/doc/ru/concepts/requirements
- Модерация: https://yandex.ru/dev/games/doc/ru/concepts/moderation
- Game Ready / пункт 1.19: https://yandex.ru/dev/games/doc/ru/requirements/1/19
- Автоопределение языка / пункт 2.14: https://yandex.ru/dev/games/doc/ru/requirements/2/14
- Расположение рекламы / пункт 4.4: https://yandex.ru/dev/games/doc/ru/requirements/4/4
- Сохранение прогресса / пункт 1.9: https://yandex.ru/dev/games/doc/ru/requirements/1/9
Требования платформы меняются. При существенном обновлении документации checker нужно перепроверять.
npm testПолный локальный аудит, включая headless Chromium smoke-test:
npm run auditЕсли Chromium/Chrome не найден, статические тесты всё равно выполняются, а browser smoke-test помечается как пропущенный. В CI браузерный тест обязателен.
Checker не отправляет аналитику и не обращается к внешним сервисам. Для статического анализа он читает только документы и относительные JS/CSS ресурсы текущего origin. Инструменты, которые изменяли данные лидербордов, в public-версии удалены.
MIT. См. LICENSE.
Yandex и Яндекс Игры являются товарными знаками соответствующих правообладателей. Этот репозиторий не является официальным проектом Яндекса и не заявляет аффилированность или одобрение.