Reference
Refusal codes
Status: Format onlyOwned by:
redotcom/docs/specs/2026-10-25-pack-framework.md, redotcom/packages/viewer/src/packs/registry.ts:527-535, redotcom/packages/creator-contracts/src/packs.tsEvery code the pack checker can refuse with, generated from the code.
Status: Format only. These are the findings of the pack check and of the Thunderstore export and checker; a pack that passes is stored, not applied (the pack-framework spec, "Import").
Every finding names its code, and where it helps a repair the field or file it is about, what was expected, what was found and a hint. An error refuses the pack; a note does not, but a skipped check leaves the report incomplete, never a pass.
The pack check (pack.)
| code | when |
|---|---|
pack.MANIFEST_MISSING | The pack has no s2u-pack.json and is not being read through an earlier format's loader. |
pack.MANIFEST_TOO_LARGE | s2u-pack.json is over PACK_MANIFEST_BYTES_ADAPTATION. |
pack.MANIFEST_INVALID | s2u-pack.json is not UTF-8 JSON, or is not a JSON object. |
pack.LEGACY_INVALID | An earlier format's manifest is not in that format's shape, or its own path is not a valid member path. |
pack.FIELD_UNKNOWN | The manifest, or a files row, has a field the format does not list. |
pack.FIELD_INVALID | A field's value breaks its rule: the wrong type, out of its bounds, not one of its allowed values, or a target written in an earlier spelling. Also a stored member whose size is not a byte count. |
pack.FORMAT_VERSION | formatVersion is not 2. |
pack.TARGET_MISMATCH | The pack's target is not the build's disc revision. |
pack.CONTRACT_MISMATCH | The build's engine contract version is outside the pack's contract range. |
pack.PATH_INVALID | A path is empty, uses backslashes, is too long or too deep, or has a control character, colon, percent sign, or an empty, hidden, reserved or unsafe segment. |
pack.PATH_ESCAPE | A path is absolute, names a drive, or leaves the pack with ... |
pack.PATH_COLLISION | Two files or rows are the same path once Unicode-normalised and compared without case. |
pack.EXTERNAL_URI | A path is a URI, or a manifest text holds an address such as https:// or begins with data:, javascript:, file: or a similar scheme. Every byte comes from the pack or your own disc. |
pack.TOO_MANY_FILES | The pack holds, or files lists, more than PACK_FILES_ADAPTATION members. |
pack.TOO_LARGE | The members' sizes in the manifest add up to more than PACK_BYTES_ADAPTATION, or the stored files add up to more than that plus PACK_MANIFEST_BYTES_ADAPTATION. |
pack.LIMIT_EXCEEDED | dependencies, intents or handlers has more entries than its bound. |
pack.MEMBER_TOO_LARGE | One member is over its bound (PACK_MEMBER_BYTES_ADAPTATION, or PACK_RULES_MEMBER_BYTES_ADAPTATION for a rules member). |
pack.MEMBER_INFLATED | A member has more bytes than its declared size. |
pack.MEMBER_TRUNCATED | A member has fewer bytes than its declared size. |
pack.MEMBER_MISSING | A listed member is not in the pack. |
pack.MEMBER_HASH_MISMATCH | A member's bytes do not match the sha256 its row names. |
pack.MEMBER_UNLISTED | A file in the pack is not listed in files. |
pack.ROLE_MISMATCH | A member's file type is not one its role allows. |
pack.INTENT_MISSING | No intent names a member. |
pack.INTENT_MISMATCH | A collision, gameplay or rules member is covered only by a cosmetic intent. |
pack.DUPLICATE_ID | dependencies names the same pack or archive twice. |
pack.DEPENDENCY_MISSING | No available pack with that id is inside the range, or the named disc archive is not present. |
pack.DEPENDENCY_ARCHIVE_MISMATCH | The disc archive is present but its SHA-256 is not the one the pack names. |
pack.DEPENDENCY_CYCLE | The pack depends on itself, directly or through the available packs. |
pack.HANDLER_CONFLICT | Two claims in the pack are on one slot, or the slot is held by another pack and only one pack may hold it. |
pack.HANDLER_UNKNOWN | The build offers no such handler for that slot. |
pack.ACTION_UNKNOWN | The claimed handler has no such action. |
pack.STORE_FILE | A files row names one of Thunderstore's root files. Leave them out of files: they sit at the pack's root outside its identity. |
pack.CONTRACT_FLOOR | A rules pack's contract admits an engine before RULES_PACK_CONTRACT_FLOOR. |
pack.RULES_MEMBER_INVALID | A rules member is not a UTF-8 JSON object, or its capabilities is not a list of {slot, handler, actions?}. |
pack.CAPABILITY_MISMATCH | A rules member's capabilities and the manifest's handlers claims disagree: a capability with no matching claim or action, or a claim on a behaviour. slot that no rules member names. |
pack.CHECK_SKIPPED | A note, not an error: a check could not run because the build gave it nothing to check against (the available packs, your disc archives or the handler list). The report is then incomplete, never a pass. |
The Thunderstore export and checker (store.)
| code | when |
|---|---|
store.TEAM_INVALID | The team name is not 1 to 128 letters, digits and underscores. |
store.NAME_INVALID | The pack's id has no store name. |
store.NAME_COLLISION | Two ids, the pack's own or ones it depends on, would become the same store name. Neither is renamed: one pack has to change its id. |
store.VERSION_INVALID | The pack's version is not strictly Major.Minor.Patch (a pre-release or build part). |
store.DESCRIPTION_TOO_LONG | The store description is over 250 characters. |
store.WEBSITE_INVALID | The website_url given is neither empty nor an http or https address. |
store.DEPENDENCY_UNRESOLVED | No release of a dependency inside its range was given to pin. |
store.ARCHIVE_DEPENDENCY | A note, not an error: a disc archive dependency has no store form and stays in s2u-pack.json. |
store.FILE_MISSING | A required root file is not at the package's root. |
store.MANIFEST_INVALID | The store manifest.json is not a UTF-8 JSON object within the manifest bound, or one of its keys breaks its rule. |
store.MANIFEST_MISMATCH | The store manifest's name or version is not the pack's own. |
store.ICON_INVALID | icon.png is not a PNG of the required size. |