---
type: how-to
title: 修复一次应用市场发布失败
summary: "一份针对最常见应用市场发布失败的修复指南：每个错误码都列出了触发它的原因，以及清除它的确切“编辑一处再重试”步骤，无需请我们重新检查任何东西。"
---

当发布或更新弹窗返回一个错误、或者你收到我们关于一次发布失败的一封邮件时，在下面找到你的错误码并照那个修复做。你一把修复推到你的仓库，就再点一次“发布或更新”以立即重新检查，或者等下一次每日索引器运行。

这里列出的每一个失败都是你能在你仓库里修好的东西。如果你没在这里看到你的错误，就到 [完整发布错误参考](/docs/marketplace-game-development/publish-failed-reference) 查那些较少见的码。

## terms_accepted 未设置 [#manifest-error-terms-accepted]

当你的 `caputchin.json` 在顶层没有 `"terms_accepted": true` 时你看到这个。

1. 打开你仓库的 `caputchin.json`。
2. 读 [应用市场提交条款](/legal/submission-terms)。
3. 在清单顶层加 `"terms_accepted": true`。
4. 提交并推送。
5. 再点一次“发布或更新”，或等下一次每日索引运行。

这个值必须是字面量 JSON 布尔 `true`。字符串（`"true"`）、数字（`1`）、或省略这个字段都算未接受。

## 许可证不在批准清单上 [#manifest-error-license]

当 `license` 缺失、畸形、或点名一个在我们 [批准清单](/docs/marketplace-game-development/publish-failed-reference#approved-licenses) 之外的标识符时你看到这个。

1. 从批准清单里挑一个真正涵盖你代码和捆绑资源的 SPDX 标识符。
2. 打开 `caputchin.json` 并在顶层设置 `license` 字段，例如 `"license": "MIT"`。
3. 如果你的代码是双许可的，就用一个 SPDX `OR` 表达式（例如 `"MIT OR Apache-2.0"`）。至少一个分支必须在批准清单上。
4. 如果你的代码是 MIT 但捆绑了 Creative Commons 资源，就用 `AND`（例如 `"MIT AND CC-BY-4.0"`）。每个分支都必须在批准清单上。
5. 提交、推送、重试。

如果你的项目依赖一个不在我们批准清单上的许可证（最常见的是 GPL 家族、AGPL 或 LGPL），唯一的修复是重新许可或移除受影响的组件。我们无法按作者逐一给予例外。

## 我们找不到你的仓库 [#repo-not-found]

当我们的清单拉取返回一个 404 时你看到这个。

常见原因和修复：

- 你的仓库是私有的。把它设为公开，或移除 `caputchin-game` topic 以不再出现在索引里。
- 你的仓库缺 `caputchin-game` GitHub topic。经仓库页面上的 About 区加上它。
- 你的仓库根部没有 `caputchin.json`（或者，对一个集合里的子游戏，leaf 目录处没有 `caputchin.json`）。
- 你输入的仓库 URL 错了。用 `owner/name` 或完整的 `https://github.com/owner/name` URL。

把一个 `caputchin.json` 推到你的仓库，然后重试。

## 清单结构畸形 [#manifest-error-structure]

你看到一个 `manifest-error`，它的详情以一个字段名开头，比如 `entry`、`npm`、`games`、`marketplace.support` 或 `run.modules[0].name`。

那个详情确切告诉你哪个字段错了：

- `entry: entry must be a clean relative path`：你的 `entry` 值含有穿越（`../`）、绝对斜杠、查询字符串或空白。用一个干净的仓库相对路径，比如 `dist/game.js`。
- `npm: npm package name is malformed`：你的 `npm` 字段不是一个有效的 npm 坐标。用 `name` 或 `@scope/name`，只用字母数字 + 连字符 + 点 + 下划线。
- `games[i] must be a relative path inside the repo`：你集合 `games` 数组里的一个子路径逃出了仓库。用像 `packages/leaf-memory` 这样的路径，而不是 `../external` 或 `/abs/path`。
- `run.entry must be a clean relative path`：和 `entry` 同样的卫生规则，应用到可选的拆分 run 入口上。
- `run.modules[i].name`：模块名必须匹配 `[a-zA-Z0-9_-]+\.(wasm|js)$`，且不能是 `entry.js` 或 `artifact.js`。

按那条规则编辑被点名的字段，提交、推送、重试。

## marketplace.author 有一个无效邮件 [#manifest-error-author-email]

当 `marketplace.author.email` 存在但不匹配一个正常的邮件形状（一个 `@`、一个带点的域、无空白）时你看到这个。

1. 打开 `caputchin.json`。
2. 找到 `marketplace.author.email`。
3. 要么把这个值修成一个真实的邮件地址（我们只把它用于发布失败通知），要么把这个字段整个移除。
4. 提交、推送、重试。

如果你不想收到发布失败通知，你也可以把整个 `marketplace.author` 块移除。

## 你的 run 工件非确定性 [#run-not-conforming]

当我们的一致性冒烟跑你游戏的 `run(seed, trace)` 函数、而它没产出一个合规的裁定时你看到这个。

重要：这不是一个致命的发布失败。你的游戏仍在应用市场浏览里被列出，且能被嵌入。它只是显示 **不可回放**，并且在那个确定性问题被修好之前无法给一个站点密钥设关卡。

常见原因：

- 你的模拟读 `Date.now()`、`performance.now()`、`Math.random()` 或其他非确定性的全局量。
- 你的模拟读我们在回放时不提供的外部状态（DOM、网络、存储）。
- 你的模拟依赖在不同运行时之间有差异的浮点算术。

把模拟修成种子和轨迹的一个纯函数，推送、重试。那条确定性规则见 [回放契约](/docs/marketplace-game-development/replay-contract#determinism-is-the-whole-requirement)，并考虑那个可选的 [引擎套件](/docs/marketplace-game-development/engine-kit)，它提供一个确定性的可播种 RNG 和时钟。

## 包拉取失败 [#bundle-fetch-failed]

当由 `entry` 和/或 `npm` 钉住的包 URL 拉取不了、返回一个非 2xx、或超过 12MB 时你看到这个。

- 如果你刚推了一个新版本：CDN 可能还没传播。等一分钟再重试。
- 如果你的包超过 12MB：精简资源、通过 `run` 声明拆分成模块，或把大资源移到一个不同的交付路径。
- 如果你的 `npm` 包还没发布：先发布它；我们拉不到未发布的版本。

## 发布请求太多 [#rate-limited]

当你在过去 60 秒里提交了超过十个请求时，你在手动发布弹窗上看到这个。

等 60 秒再重试。没有办法提高这个限制；它保护这个端点免受滥用。

## 停止通知邮件

如果你想停止收到发布失败邮件，见 [提交条款第 10 节](/legal/submission-terms)。那个收件地址是清单里你的 `marketplace.author.email`；移除或更改它就停掉这些邮件。

## 另见

- [完整发布错误参考](/docs/marketplace-game-development/publish-failed-reference)
- [发布到应用市场](/docs/marketplace-game-development/publish-to-the-marketplace)
- [应用市场提交条款](/legal/submission-terms)
