---
type: tutorial
title: Сделай пользовательскую игру способной ставить ворота
summary: Загрузи headless-артефакт реплея для своей самостоятельно размещённой игры, чтобы сервер мог перевывести вердикт, шаг, который даёт пользовательской игре удовлетворять игровые ворота.
---

[Самостоятельно размещённая игра](/docs/custom-game-development/self-hosted-game) работает и проверяет, как только ты наводишь на неё `game-src`. Но чтобы использовать её как [игровые ворота](/docs/site-keys/games), где посетитель должен её пройти, чтобы пройти, Caputchin должен уметь перевывести результат сам, а не доверять браузеру. Для этого и нужен **артефакт реплея**. К концу этого руководства твоя пользовательская игра станет годной для ворот.

Это выигрыш от детерминизма: поскольку твоя игра записывает [трассу](/docs/custom-game-development/self-hosted-game) и выводит всё из сида, сервер может запустить headless-копию твоей логики против того же сида и трассы и прийти к тому же вердикту независимо.

## Что такое артефакт реплея

Артефакт это маленький, самодостаточный JavaScript-бандл только твоей **игровой логики**, без рендеринга, без DOM и без сети. Сервер загружает его в изолированную песочницу и запускает, чтобы произвести вердикт из `(seed, trace)`. Это не твоя играбельная игра; это headless-судья твоей играбельной игры.

Требуются два свойства:

- **Самодостаточный.** Он не может импортировать ничего, что изолят не разрешит; собери всё внутрь. Загрузка ограничена 2 MB, что намного выше типичного бандла логики.
- **Детерминированный и согласный с живой игрой.** При том же сиде и трассе, которую испустила твоя живая игра, он должен прийти к тому же вердикту, что заявила живая игра. Если они расходятся, реальные игроки получают ложные отказы.

## 1. Зарегистрируй пользовательскую игру

Если ты ещё не сделал этого, зарегистрируй игру в панели, чтобы у неё были id и место, где держать артефакт. На странице **Игры** ключа сайта (или команды) используй ввод **Пользовательская игра** в панели **Добавить игру**: введи свой id и кликни **Определить**. Смотри [пользовательские игры](/docs/game-customization/custom-games) для этого шага и [схему, которую ты определяешь](/docs/custom-game-development/dashboard-schema).

## 2. Загрузи артефакт

На вкладке **Настройки** зарегистрированной игры загрузи бандл реплея. Он отправляется как один файл; Caputchin хеширует его содержимое (повторная загрузка тех же байтов это no-op) и сразу запускает **самопроверку**.

## 3. Самопроверка

Самопроверка запускает твой загруженный артефакт в изоляте реплея против синтетического сида (и твоего закоммиченного образца трассы, если ты его предоставишь) и записывает, произвёл ли он чистый вердикт:

- **Проходит** → установка становится годной для ворот. Значок **Не воспроизводима** очищается, и ты теперь можешь включить [требование игры](/docs/site-keys/games) с этой игрой в пуле.
- **Сбоит** → артефакт всё ещё хранится (так что ты можешь осмотреть ошибку), но установка остаётся негодной для ворот. Почини логику и перезагрузи.

Сбойная самопроверка это система, говорящая тебе, что headless-судья не согласен сам с собой или не смог запуститься; это ровно то расхождение, которое вызвало бы ложные отказы в продакшене, пойманное до того, как любой посетитель на него наткнётся.

## 4. Включи ворота

Как только самопроверка проходит, игра в [пуле ворот](/docs/site-keys/games) ключа. Включи **Требовать игру** на странице Безопасность ключа (или потолок принудительной игры команды), и Caputchin будет отдавать твою пользовательскую игру, брать трассу игрока и перезапускать твой артефакт на сервере, чтобы решить каждую проверку.

## Держим эти двое в синхроне

Живая игра (загружаемая через `game-src`) и артефакт реплея это две сборки одной логики. Когда ты меняешь что-либо, что влияет на исход, пересобери и перезагрузи артефакт, чтобы эти двое всё ещё совпадали. Если они расходятся, самопроверка или продакшен-реплей начнёт отвергать реальные победы. Сборка обоих из одного общего модуля логики это надёжный способ держать их идентичными.

## См. также

- [Построй самостоятельно размещённую игру](/docs/custom-game-development/self-hosted-game): производство трассы, которую реплеит этот артефакт.
- [Игры и игровые ворота](/docs/site-keys/games): включение ворот и требование воспроизводимости.
- [Пользовательские игры](/docs/game-customization/custom-games): регистрация и значок Не-воспроизводима.
- [Справочник схемы панели](/docs/custom-game-development/dashboard-schema): поля, которые игра читает из контекста своей фабрики.
