---
type: reference
title: 发布错误参考
summary: 应用市场发布路径能发出的每一个错误码，带触发条件和到哪里找修复。
---

应用市场发布路径能返回的每一个错误码，带触发条件和到修复的链接。一步步的修复，见 [修复一次发布失败](/docs/marketplace-game-development/publish-failed-fixes)。

## 错误码

| 码 | 触发 | 修复 |
|---|---|---|
| `invalid-repo` | 你在发布弹窗里输入的仓库字段无法解析为 `owner/name`。仅手动发布 | 用 `owner/name` 或完整的 `https://github.com/owner/name` URL |
| `repo-not-found` | 我们的清单拉取返回一个 404。你的仓库是私有的、缺失的、缺 `caputchin-game` topic、或在预期路径处没有 `caputchin.json` | [把仓库设为公开 + 加上 topic + 推一个清单](/docs/marketplace-game-development/publish-failed-fixes#repo-not-found) |
| `manifest-error` | 你的 `caputchin.json` 没通过校验。详情字符串点名那个具体字段。见 [manifest-error 子码](#manifest-error-sub-codes) | 修详情点名的那个字段 |
| `bundle-fetch-failed` | 由 `entry` 和/或 `npm` 钉住的包 URL 拉取不了、返回一个非 2xx、或超过 12MB | [核实包 URL 和大小](/docs/marketplace-game-development/publish-failed-fixes#bundle-fetch-failed) |
| `run-not-conforming` | 可选的 `run` 工件的冒烟检查（带一个确定性的种子跑一次）没返回一个合规的裁定。你的游戏仍被列出，只是显示不可回放且无法设关卡 | [让你的模拟确定性](/docs/marketplace-game-development/publish-failed-fixes#run-not-conforming) |
| `rate-limited` | 过去 60 秒里来自你 IP 的发布请求太多 | 等 60 秒再重试 |

## manifest-error 子码 [#manifest-error-sub-codes]

当你收到一个 `manifest-error` 时，详情字符串以那个失败的字段开头。用这张表找到对的修复。

| 详情里的字段 | 含义 | 修复 |
|---|---|---|
| `terms_accepted` | 字段缺失或不是字面量 JSON 布尔 `true` | [读了提交条款之后把它设为 `true`](/docs/marketplace-game-development/publish-failed-fixes#manifest-error-terms-accepted) |
| `license` | 缺失、畸形、或点名一个批准清单之外的 SPDX 标识符 | [从批准清单里挑一个标识符](/docs/marketplace-game-development/publish-failed-fixes#manifest-error-license) |
| `(root)` | 这个 JSON 文件没解析为一个对象（你有一个顶层数组、字符串或 null） | 把它裹进 `{ ... }` |
| `marketplace` | `marketplace` 块存在但不是一个对象 | 要么把它做成一个对象，要么移除它（仅自托管的游戏省略这个块） |
| `marketplace.name` / `description` / `preview` | 字段不是一个字符串 | 字符串化或移除 |
| `marketplace.author` | 块存在但不是一个对象 | 用 `{ name?, url?, email? }` 形状 |
| `marketplace.author.name` / `url` | 子字段不是一个字符串 | 字符串化或移除 |
| `marketplace.author.email` | 不是一个字符串 或 没通过邮件形状检查 | [修这个地址或移除这个字段](/docs/marketplace-game-development/publish-failed-fixes#manifest-error-author-email) |
| `entry` | 单一游戏既没有 `entry` 也没有 `npm`，或这个值含有穿越（`../`）、绝对斜杠、Windows 分隔符、查询字符串或空白 | 提供一个干净的相对路径 |
| `npm` | 不是一个字符串，或没通过 npm-name 正则 | 用一个有效的 npm 包名 |
| `entry/npm+games` | 在同一层级同时声明了 `entry`/`npm` 和 `games` | 挑一个：单一游戏用 `entry`/`npm`；集合包装器用 `games` |
| `entry/npm` | 单一游戏两个都没有 | 加一个 |
| `games` | 不是一个数组、含有非字符串条目、含有穿越/绝对路径、或含有 `.` / `./`（那会自引用仓库根） | 修这个数组 |
| `games[i]` | 一个具体的子路径无效 | 修那个条目 |
| `run` / `run.entry` / `run.modules[i].*` | 可选的拆分 run 声明畸形 | [按模式修](/docs/marketplace-game-development/publish-failed-fixes#manifest-error-structure) |

## 批准的许可证 [#approved-licenses]

只有 `license` 字段求值为这个清单上一个 SPDX 标识符的 `caputchin.json` 清单通过许可证关卡。具有约束力的版本见 [应用市场提交条款第 4 节](/legal/submission-terms)。

### 宽松代码许可证

| SPDX ID | 名称 |
|---|---|
| `MIT` | MIT License |
| `MIT-0` | MIT No Attribution |
| `Apache-2.0` | Apache License 2.0 |
| `BSD-2-Clause` | BSD 2-Clause "Simplified" |
| `BSD-3-Clause` | BSD 3-Clause "New" / "Revised" |
| `0BSD` | BSD Zero Clause |
| `ISC` | ISC License |
| `Zlib` | zlib License |
| `Unlicense` | The Unlicense (public-domain dedication) |
| `BSL-1.0` | Boost Software License 1.0 |
| `NCSA` | University of Illinois / NCSA Open Source License |
| `PostgreSQL` | PostgreSQL License |
| `Python-2.0` | Python License 2.0 |
| `PHP-3.01` | PHP License 3.01 |
| `Ruby` | Ruby License |
| `TCL` | Tcl/Tk License |
| `MS-PL` | Microsoft Public License |
| `AFL-3.0` | Academic Free License 3.0 |
| `MulanPSL-2.0` | Mulan Permissive Software License v2 |
| `WTFPL` | Do What The Fuck You Want To Public License |

### 文件范围弱 copyleft

| SPDX ID | 名称 |
|---|---|
| `MPL-2.0` | Mozilla Public License 2.0 |
| `MS-RL` | Microsoft Reciprocal License |

### 资源许可证（游戏里捆绑的美术、音频、字体）

| SPDX ID | 名称 |
|---|---|
| `CC0-1.0` | Creative Commons Zero v1.0 |
| `CC-BY-3.0` | Creative Commons Attribution 3.0 |
| `CC-BY-4.0` | Creative Commons Attribution 4.0 |
| `OFL-1.1` | SIL Open Font License 1.1 |

### SPDX 表达式规则

- `MIT`：光秃秃的标识符；必须出现在上面。
- `MIT OR Apache-2.0`：一个 `OR` 的任一分支必须出现在上面。
- `MIT AND CC-BY-4.0`：一个 `AND` 的每个分支必须出现在上面。
- `Apache-2.0 WITH LLVM-exception`：`WITH` 子句不被接受。
- `LGPL-2.1+`：`+`（或更新）后缀不被接受。

### 为什么一些许可证被排除

| 类别 | 例子 | 为什么 |
|---|---|---|
| 强 copyleft | `GPL-*`、`AGPL-*` | 病毒式；`AGPL` 第 13 条的网络触发尤其尖锐，因为我们就是那个网络宿主。（`GPL-2.0-only` 只对由 Caputchin 发布的第一方游戏被接受，不对第三方提交。） |
| 带捆绑歧义的库 copyleft | `LGPL-*` | “传递这个库”对 JavaScript 和 WebAssembly 包读起来含义不明 |
| 资源上的相同方式共享 | `CC-BY-SA-*`、`CC-BY-NC-*`、`CC-BY-ND-*` | 相同方式共享会污染嵌入站点的集成；`NC` 排除了商业部署 |
| 源可得（非 OSI） | `BUSL-1.1`、`SSPL-1.0`、`Elastic-2.0` | 使用领域限制、再分发限制，或两者 |

注意 `BSL-1.0`（Boost Software License）是宽松的且被接受；`BUSL-1.1`（Business Source License）不是。解析器逐字对着 SPDX 规范字符串比较，所以两者绝不冲突。

## 另见

- [修复一次发布失败](/docs/marketplace-game-development/publish-failed-fixes)
- [caputchin.json 清单](/docs/marketplace-game-development/the-caputchin-json-manifest)：这些错误所校验的那些字段。
- [应用市场提交条款](/legal/submission-terms)（第 10 节讲通知退出）
