---
type: reference
title: Publish errors reference
summary: Every error code the marketplace publish path can emit, with the trigger and where to find the fix.
---

Every error code the marketplace publish path can return, with the trigger and the link to the fix. For step-by-step fixes, see [Fix a publish failure](/docs/marketplace-game-development/publish-failed-fixes).

## Error codes

| Code | Trigger | Fix |
|---|---|---|
| `invalid-repo` | The repository field you entered in the publish modal does not parse as `owner/name`. Manual publish only | Use `owner/name` or the full `https://github.com/owner/name` URL |
| `repo-not-found` | Our manifest fetch returned a 404. Your repository is private, missing, lacks the `caputchin-game` topic, or has no `caputchin.json` at the expected path | [Make the repository public + add the topic + push a manifest](/docs/marketplace-game-development/publish-failed-fixes#repo-not-found) |
| `manifest-error` | Your `caputchin.json` failed validation. The detail string names the specific field. See [manifest-error sub-codes](#manifest-error-sub-codes) | Fix the field the detail names |
| `bundle-fetch-failed` | The bundle URL pinned by `entry` and/or `npm` could not be fetched, returned a non-2xx, or exceeds 12MB | [Verify the bundle URL and size](/docs/marketplace-game-development/publish-failed-fixes#bundle-fetch-failed) |
| `run-not-conforming` | The optional `run` artifact's smoke check (run once with a deterministic seed) did not return a conforming verdict. Your game is still listed, just shows Not replayable and cannot gate | [Make your simulation deterministic](/docs/marketplace-game-development/publish-failed-fixes#run-not-conforming) |
| `rate-limited` | Too many publish requests from your IP in the last 60 seconds | Wait 60 seconds and retry |

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

When you receive a `manifest-error`, the detail string starts with the failing field. Use this table to find the right fix.

| Field in detail | Meaning | Fix |
|---|---|---|
| `terms_accepted` | The field is missing or not the literal JSON boolean `true` | [Set it to `true` after reading the Submission Terms](/docs/marketplace-game-development/publish-failed-fixes#manifest-error-terms-accepted) |
| `license` | Missing, malformed, or names an SPDX identifier outside the approved list | [Pick an identifier from the approved list](/docs/marketplace-game-development/publish-failed-fixes#manifest-error-license) |
| `(root)` | The JSON file does not parse as an object (you have a top-level array, string, or null) | Wrap it in `{ ... }` |
| `marketplace` | The `marketplace` block is present but not an object | Either make it an object or remove it (self-hosted-only games omit the block) |
| `marketplace.name` / `description` / `preview` | The field is not a string | Stringify or remove |
| `marketplace.author` | The block is present but not an object | Use the `{ name?, url?, email? }` shape |
| `marketplace.author.name` / `url` | The subfield is not a string | Stringify or remove |
| `marketplace.author.email` | Not a string OR fails the email-shape check | [Fix the address or remove the field](/docs/marketplace-game-development/publish-failed-fixes#manifest-error-author-email) |
| `entry` | Single game has no `entry` and no `npm`, or the value contains traversal (`../`), absolute slashes, Windows separators, query strings, or whitespace | Provide a clean relative path |
| `npm` | Not a string, or fails the npm-name regex | Use a valid npm package name |
| `entry/npm+games` | Both `entry`/`npm` and `games` declared at the same level | Pick one: single games use `entry`/`npm`; collection wrappers use `games` |
| `entry/npm` | Single game has neither | Add one |
| `games` | Not an array, contains non-string entries, contains traversal/absolute paths, or contains `.` / `./` (which would self-reference the repo root) | Fix the array |
| `games[i]` | A specific child path is invalid | Fix that entry |
| `run` / `run.entry` / `run.modules[i].*` | The optional split-run declaration is malformed | [Fix per the schema](/docs/marketplace-game-development/publish-failed-fixes#manifest-error-structure) |

## Approved licenses [#approved-licenses]

Only `caputchin.json` manifests whose `license` field evaluates to an SPDX identifier on this list pass the licensing gate. See [Marketplace Submission Terms section 4](/legal/submission-terms) for the binding version.

### Permissive code licenses

| SPDX ID | Name |
|---|---|
| `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 |

### File-scope weak copyleft

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

### Asset licenses (art, audio, fonts bundled in the game)

| SPDX ID | Name |
|---|---|
| `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 expression rules

- `MIT`: bare identifier; must appear above.
- `MIT OR Apache-2.0`: any branch of an `OR` must appear above.
- `MIT AND CC-BY-4.0`: every branch of an `AND` must appear above.
- `Apache-2.0 WITH LLVM-exception`: `WITH` clauses are not accepted.
- `LGPL-2.1+`: the `+` (or-later) suffix is not accepted.

### Why some licenses are excluded

| Category | Examples | Why |
|---|---|---|
| Strong copyleft | `GPL-*`, `AGPL-*` | Viral; `AGPL` §13 network trigger is acute since we are the network host. (`GPL-2.0-only` is accepted only for first-party games published by Caputchin, not for third-party submissions.) |
| Library copyleft with bundling ambiguity | `LGPL-*` | "Convey the library" reads ambiguously for JavaScript and WebAssembly bundles |
| Share-alike on assets | `CC-BY-SA-*`, `CC-BY-NC-*`, `CC-BY-ND-*` | Share-alike contaminates the embedding site's integration; `NC` rules out commercial deployment |
| Source-available (not OSI) | `BUSL-1.1`, `SSPL-1.0`, `Elastic-2.0` | Field-of-use restrictions, redistribution restrictions, or both |

Note `BSL-1.0` (Boost Software License) is permissive and accepted; `BUSL-1.1` (Business Source License) is not. The parser compares against the SPDX canonical string verbatim, so the two never collide.

## See also

- [Fix a publish failure](/docs/marketplace-game-development/publish-failed-fixes)
- [The caputchin.json manifest](/docs/marketplace-game-development/the-caputchin-json-manifest): the fields these errors validate.
- [Marketplace Submission Terms](/legal/submission-terms) (Section 10 covers notification opt-out)
