NewsGame · Proof of concept · ТЗ для разработчика

Пять игр к новостям пяти регионов

Сохранить локально пять реальных новостных страниц, сделать к каждой короткую HTML5-игру и встроить её одной вставкой кода. Цель — показать, что игра живёт в изолированном iframe и не ломает сайт издателя.

Дата: 29.09.2026Этап: технический PoCРегионы: US · СНГ · IN · CN · EU

01Что нужно сделать

  1. Сохранить локально пять страниц новостей из таблицы ниже.
  2. Сделать по каждой новости короткую HTML5-игру на 1–3 минуты.
  3. Сделать общий loader-скрипт виджета и встроить его в каждую сохранённую страницу одной вставкой после текста статьи.
  4. Поднять локальный стенд, где страницы и игры отдаются с разных origin, и проверить критерии приёмки из раздела 7.

02Выбранные новости

РегионПлощадкаНовостьДатаЯзык
СШАSpace.comScientists find youngest exoplanet on record — a 'newborn' named Elias09.2026en
СНГ (Россия)КоммерсантъГреф назвал причину отставания российских ИИ-моделей от китайских23.09.2026ru
ИндияESPNcricinfoKuldeep reels West Indies in, Gill and Kohli tons knock them out27.09.2026en
КитайChina DailyChina's science month draws billions with theme of innovation29.09.2026zh-CN + en
ЕвропаRTÉ NewsIrish young scientist wins European award28.09.2026en

Критерии выбора: новость не старше недели, без трагедий, медицины как предмета игры, выборов и конфликтов; в тексте есть конкретные факты и цифры для игровой механики.

Если страница недоступна, закрыта paywall или не сохраняется корректно, возьмите другую новость на той же площадке по тем же критериям и согласуйте замену до начала работы над игрой.

03Игры

Сверка фактов. Каждый факт, который использует игра, лежит в game.json с цитатой и ссылкой на статью. Факты ниже собраны по публикациям. Перед вёрсткой сверьте каждую цифру с сохранённой страницей; при расхождении прав текст статьи.
us

Рождение планеты

Space.com
Механика
Аркада на одной кнопке или касании. Молодая планета внутри протопланетного диска собирает газ и пыль и уворачивается от выбросов звезды. Цель — набрать массу Юпитера за 60 секунд.
Факты
Elias 2-24 b моложе 1 млн лет; около 450 световых лет от Земли; масса сопоставима с Юпитером; прежним рекордсменам больше 5 млн лет; примерно в 5000 раз моложе Земли.
Финал
Счёт, одна строка «что вы узнали», кнопка «Вернуться к статье».
cis

ИИ-гонка: верю / не верю

Коммерсантъ
Механика
6–8 карточек с утверждениями. Свайп влево или вправо (на desktop — стрелки или кнопки): верно ли утверждение по статье. После ответа — короткое пояснение с цитатой.
Факты
По оценке Германа Грефа («ГигаКонф 2026») российские ИИ-модели отстают от китайских примерно на полгода; главная причина — доступ к вычислительным мощностям; китайские модели, по его словам, настолько же отстают от американских; в 2026 году пользователи облачных платформ чаще выбирали Qwen и DeepSeek.
Тон
Нейтральный, только технологии. Без политических оценок; формулировки «по словам Грефа», а не как установленный факт.
in

Догони 296

ESPNcricinfo
Механика
Отбивание мяча по таймингу: от точности зависит 0, 1, 2, 4, 6 ранов или аут. Набрать 296 за ограниченное число мячей при 10 калитках. Партия — 2–3 минуты.
Факты
Вест-Индия — 295/7, Джастин Гривз — 101; Индия выиграла с разницей 8 калиток за 50 мячей до конца; Кохли — 139* (88 мячей), Гилл — 110; игрок матча — Кульдип Ядав (4/40); стадион Greenfield, Тируванантапурам.
Ограничение
Недорогие Android-телефоны и медленная сеть: начальная загрузка не больше 250 KB gzip.
cn

Угадай число · 猜数字

China Daily
Механика
Факт с пропущенным числом, игрок двигает ползунок, очки за близость к ответу. 6–8 раундов.
Факты
Около 360 000 научно-популярных мероприятий; 2 млн учёных и инженеров; 1 988 научных музеев на конец 2025 года; 204 музея на уровне волостей; 2,25 млн популяризаторов науки; 17 % граждан 18–69 лет с научной грамотностью (2025).
Внимание
Цифру «10 billion» посещений не использовать, пока не проверена точная формулировка в оригинале.
Локализация
Основной язык zh-CN, дополнительный en. Никаких запросов к Google Fonts, Google CDN и другим западным сервисам. Шрифты системные: "PingFang SC", "Microsoft YaHei", sans-serif.
eu

Юный учёный: собери проект

RTÉ News
Механика
Memory на 12 карт: пары «область науки ↔ проект или факт о EUCYS». После сбора всех пар — карточка итогов.
Факты
EUCYS 2026 прошёл 22–27 сентября в Киле; больше 140 участников; Аойвинн Дейли (Ирландия) получила Special Jury Award for Youth за проект с ИИ для диагностики опухолей мозга; вышла в финал Regeneron ISEF 2027.
Тон
Игра про конкурс и науку, без медицинских утверждений сверх статьи.
Приватность
По умолчанию без cookies и localStorage (GDPR/ePrivacy).

04Сохранение и встраивание

Сохранение страницы

  1. Откройте новость в Chrome или Firefox. Закройте cookie-баннер, не принимая рекламные cookies.
  2. Сохраните страницу одним HTML-файлом через расширение SingleFile. Если вёрстка ломается, используйте «Сохранить как → Веб-страница полностью». Для статичных страниц подойдёт wget:
    wget -E -H -k -K -p -e robots=off <url>
  3. Положите результат в pages/<region>/index.html, где region — us, cis, in, cn или eu.
  4. Удалите рекламные, аналитические и трекинговые скрипты (GTM, рекламные SDK, пиксели), чтобы стенд не слал события на реальные сайты. Вёрстку и стили оставьте. Список удалённого запишите в pages/<region>/NOTES.md.
  5. Добавьте в <head> строку <meta name="robots" content="noindex">.
  6. Сделайте скриншот исходной страницы: pages/<region>/before.png.
Только для внутреннего демо. Права на контент страниц принадлежат изданиям. Локальные копии не публикуйте и не кладите в открытый репозиторий.

Встраивание

Сразу после последнего абзаца статьи, до комментариев и рекомендаций, вставьте только этот фрагмент:

<div class="news-game"
     data-placement="article-end"
     data-article-id="us-elias-2-24b"
     data-lang="en"></div>
<script async src="http://localhost:8081/widget/v1.js" data-site="demo-us"></script>
Регионdata-article-iddata-langdata-site
usus-elias-2-24bendemo-us
ciscis-gref-ai-racerudemo-cis
inin-ind-wi-odi1endemo-in
cncn-science-monthzh-CNdemo-cn
eueu-eucys-2026endemo-eu

Других правок в HTML страницы для работы виджета быть не должно: так мы проверяем тезис «одна вставка, без изменений CMS».

05Технические требования

Структура репозитория

pages/<region>/index.html   копии страниц        (origin A: localhost:8080)
widget/v1.js                loader               (origin B: localhost:8081)
games/<article-id>/         игры                 (origin B: localhost:8081)
  index.html
  game.json                 контент и факты с источниками
  assets/
catalog.json                article-id → игра, язык, срок актуальности, enabled

Страницы и игры отдаются с разных origin, чтобы изоляция iframe проверялась по-настоящему. Оба сервера поднимаются одной командой (npm run dev или аналог).

Loader — widget/v1.js

  • Vanilla JS без зависимостей, не больше 30 KB gzip (цель — меньше 10 KB). Подключается с async и не блокирует рендер.
  • Находит все .news-game, читает data-атрибуты и запрашивает catalog.json. Если игры нет, она просрочена или выключена, контейнер остаётся скрытым без сдвига вёрстки.
  • Показывает компактный тизер «Сыграть по теме» на языке data-lang, когда блок подходит к области просмотра (IntersectionObserver). Iframe создаётся только по клику.
  • Iframe: sandbox="allow-scripts" без allow-same-origin, allow-top-navigation и allow-popups; loading="lazy", referrerpolicy="no-referrer", title. Каждое дополнительное разрешение обосновать в README.
  • Высота iframe меняется по сообщению resize, максимум 90vh; ширина — 100 % контейнера.
  • Стили изолированы через Shadow DOM или префикс. Loader не трогает глобальные стили, window, историю и URL, не перехватывает скролл.
  • При ошибке сети, таймауте 5 с или сообщении error блок сворачивается, в консоль пишется одно предупреждение, других эффектов нет.
  • Kill switch: enabled: false у игры или сайта в catalog.json скрывает блок.

Протокол postMessage v1

{ ns: "newsgame", v: 1,
  type: "ready" | "resize" | "start" | "complete" | "error" | "exit",
  gameId: "us-elias-2-24b",
  sessionId: "<случайный uuid на запуск>",
  payload: {} }
  • Loader принимает сообщения только от origin игр и только от своего iframe.contentWindow; неизвестные ns, v и type игнорирует.
  • Игра шлёт сообщения только в parent с явным targetOrigin, который получает параметром URL и сверяет с allowlist. От страницы принимает только pause и resume.
  • События (запрос конфигурации, видимость, запуск, завершение, результат, ошибка, выход) loader выводит в console.table и отправляет на POST localhost:8081/events (можно писать в JSON-файл). Ответы пользователя и персональные данные не собираются. Флаг preview=1 помечает события как тестовые.

Игры

  • HTML5 + vanilla JS/TS, при необходимости Canvas. Тяжёлые движки — только по согласованию и в рамках бюджета.
  • Начальная загрузка не больше 500 KB gzip (Индия — не больше 250 KB). Внешних запросов нет, все ресурсы локальные.
  • Тексты и факты берутся из game.json, в код не прописываются:
    { "id": "...", "text": "...",
      "quote": "<дословная цитата из статьи>",
      "source": "<URL статьи>" }
  • Адаптивность от 320 px до desktop; управление касанием, мышью и клавиатурой.
  • Видимый focus, aria-label, контраст WCAG AA, масштабирование текста до 200 %, prefers-reduced-motion; звук выключен по умолчанию, игра работает без звука.
  • Пауза, перезапуск и всегда видимая кнопка «Вернуться к статье», которая отправляет exit.
  • Без регистрации, cookies, localStorage и персональных данных. Игра работает, даже если storage недоступен.
  • Отдельные экраны загрузки и ошибки; ошибка отправляет error.

Браузеры

Последние стабильные Chrome, Safari (iOS и macOS), Firefox, Edge, Chrome на Android. Для Китая дополнительно WeChat in-app browser или эмуляция мобильного Chrome с заблокированными Google-доменами.

06Что сдать

  1. Репозиторий по структуре выше и README: запуск, что удалено со страниц, обоснование sandbox/allow, известные ограничения.
  2. Пять локальных страниц со встроенным виджетом и пять игр.
  3. Скриншоты before.png и after.png для каждой страницы (desktop и mobile) и короткое видео прохождения каждой игры.
  4. Отчёт Lighthouse (mobile) по каждой странице до и после вставки виджета: LCP, CLS, TBT.
  5. Таблица сверки фактов: факт → цитата → ссылка → статус «проверено».

07Критерии приёмки

  • В HTML каждой страницы добавлен только фрагмент из раздела 4, других правок для работы виджета нет.
  • Если остановить сервер :8081, страницы открываются без ошибок в вёрстке, а блок игры не виден.
  • Если выставить enabled: false в catalog.json, блок исчезает без правки страниц.
  • Игра загружается только после клика, в iframe с другого origin; из игры нет доступа к parent.document.
  • CLS страницы после вставки вырос не больше чем на 0,01; loader не даёт long task дольше 50 мс.
  • Каждая игра проходится за 1–3 минуты на телефоне и на desktop, работает с клавиатуры, без звука и при prefers-reduced-motion.
  • Все события из протокола видны в логе с sessionId и gameId; персональные данные не собираются.
  • Все факты в играх совпадают с текстом статей; у каждого есть цитата и ссылка.
  • Игра для Китая не делает ни одного запроса за пределы localhost.

08Вопросы до старта

Пришлите ответы до начала работы:

  • Оценка сроков по каждой игре и по loader отдельно.
  • Нужна ли русская локализация интерфейса игр для внутреннего показа (контент игр — на языке статьи).
  • Какие ограничения нашлись при сохранении конкретных страниц: paywall, SPA-вёрстка, ленивые изображения.