---
type: tutorial
title: Опубликуй в маркетплейс
summary: Пометь репозиторий тегом, дай индексатору обнаружить и закрепить его, пойми самопроверку реплея и автоматизируй переопубликацию из CI на каждом релизе.
---

К концу этого руководства твоя игра залистена в маркетплейсе и встраиваема любым пользователем по её id игры. Публикация намеренно мало-церемонна: нет очереди отправки, нет ревью и нет загрузки. Ты помечаешь публичный репозиторий GitHub тегом, и платформа его индексирует.

Это предполагает, что ты построил игру ([Построй игру для маркетплейса](/docs/marketplace-game-development/build-a-marketplace-game)) и написал её [манифест](/docs/marketplace-game-development/the-caputchin-json-manifest).

## 1. Пометь репозиторий GitHub тегом

Добавь тему GitHub `caputchin-game` к своему публичному репозиторию (секция About на странице репозитория). Индексатор запрашивает у GitHub эту тему; этот тег это весь твой opt-in.

Твой id игры **выводится** из координаты репозитория, `owner/repo` (или `owner/repo/<leaf-dir>` для ребёнка [коллекции](/docs/marketplace-game-development/the-caputchin-json-manifest#collections)). Ты его не выбираешь и не объявляешь.

## 2. Подтверди обязательное в манифесте

Три вещи стоят воротами индексации; убедись, что они есть в твоём корневом `caputchin.json`:

1. `"terms_accepted": true` (литеральное булево), подтверждающее [Условия отправки в маркетплейс](/legal/submission-terms).
2. `license` из [одобренного списка](/docs/marketplace-game-development/publish-failed-reference#approved-licenses).
3. Указатель распространения (`entry`, `npm` или оба), чтобы бандл разрешился.

Добавь `marketplace.author.email`, если хочешь [письма о сбое публикации](#get-notified-when-a-publish-fails) (он никогда не показывается публично и является единственным способом их получать).

## 3. Опубликуй или обнови

Два способа приземлиться в индексе:

- **Ежедневный cron** подхватывает помеченные тегом репозитории автоматически.
- **Кнопка «Опубликовать или обновить»** в маркетплейсе запускает пер-репозиторный индексатор синхронно и перенаправляет тебя на твою страницу деталей или показывает точную ошибку валидации. Используй это для первого листинга или сразу после правки манифеста.

Когда он работает, индексатор запрашивает твой манифест, **прибивает бандл к неизменному ref** (опубликованная версия npm или разрешённый коммит SHA), вычисляет хеш целостности SHA-384 и хранит `{ url, integrity }` по ключу твоего id игры. Новые релизы выходят в эфир на следующем прогоне индексации или мгновенно через кнопку.

## 4. Самопроверка реплея

Во время индексации платформа запускает твой [артефакт `run`](/docs/marketplace-game-development/replay-contract) в запечатанном изоляте один раз с детерминированным сидом:

- **Проходит** → твоя игра **воспроизводима**: раунд реального игрока перезапускается на сервере, чтобы прийти к решению, так что она может ставить ворота на ключе сайта.
- **Сбоит** (`run-not-conforming`) → игра показывается как **Не воспроизводима**. Она всё ещё залистена и встраиваема, но только как UX, пока ты не опубликуешь соответствующую версию. Сайты, уже на более ранней воспроизводимой версии, продолжают запускать ровно тот снимок.

Сбойная самопроверка это почти всегда недетерминизм в твоём `run`; [сделай свою симуляцию детерминированной](/docs/marketplace-game-development/publish-failed-fixes#run-not-conforming) и переопубликуй. Запуск `selfCheck` [движкового кита](/docs/marketplace-game-development/engine-kit) локально сначала ловит это до того, как ты запушишь.

## 5. Проверь обнаружение

После успешной публикации страница деталей встраивает твою игру в живое превью с ручкой для каждого объявленного пресета локали, скина и конфигурации. Поиграй там, чтобы подтвердить, что пресеты разрешаются, как ты задумал.

## Получай уведомление, когда публикация сбоит [#get-notified-when-a-publish-fails]

Ежедневный индексатор перепроверяет каждую опубликованную игру. Если переиндексация натыкается на проблему, тебе могут о ней написать, но **только если ты согласился**, задав `marketplace.author.email` в своём [манифесте](/docs/marketplace-game-development/the-caputchin-json-manifest#the-marketplace-block). Без заданного email ты не получаешь уведомлений. Другого канала нет; это единственный сигнал, который ты иначе пропустил бы, потому что ежедневная перепроверка работает без твоего наблюдения.

Шлются два вида письма, соответствующие двум исходам:

| Письмо | Когда | Что оно означает |
|---|---|---|
| «Проверка верификации сбоила для `<game>`» | Переиндексированная версия сбоит самопроверку реплея (`run-not-conforming`) | Игра остаётся залистена и встраиваема, но та версия показывается как **Не воспроизводима** и не может ставить ворота, пока ты не опубликуешь соответствующую. |
| «Мы не смогли опубликовать `<game>`» | Переиндексация натыкается на любой другой сбой (ошибка манифеста, лицензии или бандла) | Та версия **не залистена**, пока ты её не починишь. |

Важные детали:

- **Только ежедневная переиндексация пишет тебе.** Сбой на ручной кнопке «Опубликовать или обновить» показывается тебе в модальном окне прямо тогда, так что письмо за него не шлётся.
- **Дедуплицировано.** Тот же сбой на той же игре пишется один раз, затем подавляется на 30 дней. *Другой* сбой (новый код ошибки или причина) пишется немедленно.
- **Откажись в любой момент**, убрав или поменяв `marketplace.author.email`. Письма также несут указатель отписки в один клик на [Условия отправки](/legal/submission-terms). Ты здесь не аккаунт Caputchin, так что поле манифеста это единственный рычаг.

## 6. Автоматизируй через CI

Поскольку публикация это «тег плюс пуш на неизменный ref», ты можешь вписать её в свой релизный пайплайн, чтобы каждый релиз переиндексировался автоматически. Надёжный шаблон:

1. **Опубликуй бандл на неизменный ref** в CI, npm `publish` (или помеченный тегом релиз GitHub), против которого разрешаются `npm` / `entry` твоего манифеста. Индексатор всегда перерешает на твою последнюю опубликованную версию на следующем прогоне, так что обычный релизный пайплайн уже двигает закрепление.
2. **Поставь релиз воротами на локальную проверку детерминизма.** Запусти `selfCheck` движкового кита (или свой собственный тест реплея) как шаг CI, чтобы недетерминированный `run` валил сборку, а не выходил как не воспроизводимый.
3. **Опционально запусти немедленную переиндексацию**, вызвав «Опубликовать или обновить», а не дожидаясь ежедневного cron, если хочешь, чтобы новая версия была живой в момент завершения CI.

```yaml
# sketch: release job
- run: npm ci
- run: npm test                 # includes your replay selfCheck
- run: npm publish              # advances the immutable ref the indexer pins
# the daily indexer picks up the new version; or hit Publish or update for instant
```

Держи проверку детерминизма **до** публикации, чтобы плохой `run` никогда не достигал маркетплейса как молча не воспроизводимый листинг.

## Чего тебе никогда не надо делать

- Никакой подписи кода, никакой отправки на ревью, никакой загрузки на CDN платформы.
- Никакого соглашения о разделе дохода.
- Никакого выбора id; твоя координата GitHub это id.
- Никакого поля версии; индексатор прибивает ref.

## Если публикация сбоит

Каждая ошибка пути публикации это то, что ты чинишь в своём репозитории и повторяешь. Найди свой код в [Почини сбой публикации](/docs/marketplace-game-development/publish-failed-fixes); полный список кодов это [справочник ошибок публикации](/docs/marketplace-game-development/publish-failed-reference).

## См. также

- [Почини сбой публикации](/docs/marketplace-game-development/publish-failed-fixes): пошаговые исправления по коду ошибки.
- [Манифест caputchin.json](/docs/marketplace-game-development/the-caputchin-json-manifest): поля, которые валидирует индексатор.
- [Контракт реплея](/docs/marketplace-game-development/replay-contract): что запускает самопроверка.
