SOCOM Legacy Modding
Reference

Manifest reference

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.ts

Every field of the pack manifest, generated from the pack contract.

Status: Format only. A v2 pack is checked against these fields and stored on your device; nothing in the game applies one yet (the pack-framework spec, "Import": the registry refuses apply). Each kind has its own status on Pack kinds.

A v2 pack is a zip whose root holds the manifest s2u-pack.json: a JSON object with the fields below and no others (an unknown field is refused with pack.FIELD_UNKNOWN). Every list on this page is read from the pack contract's code, so it is the checker's own list.

Manifest fields

fieldwhat it is
formatRequired. Always the text s2u-pack: it says the file is a v2 pack manifest.
formatVersionRequired. Always the number 2. Any other value is refused with pack.FORMAT_VERSION.
idRequired. The pack's id: 1 to 64 characters of lower-case a-z, 0-9, dots and hyphens, starting and ending with a letter or digit, with no ... It may not begin with mod., model. or texture.: those prefixes are kept for the earlier formats.
versionRequired. The pack's version, a semantic version such as 1.0.0 (a pre-release such as 1.0.0-beta.1 is allowed here, but not by Thunderstore).
nameRequired. The pack's display name: 1 to 48 printable ASCII characters.
descriptionOptional. A short description: up to 400 printable ASCII characters. It is part of the pack's identity hash, so changing it changes the pack's hash.
targetRequired. The disc revision the pack is for. It must be exactly the build's target (see PACK_TARGET_US below); an earlier spelling is refused and the finding names the canonical one.
contractRequired. A version range, such as ^0.1.1, that the build's engine contract version (ENGINE_CONTRACT_VERSION) must satisfy. Ranges take *, =, >, >=, <, <=, ^ and ~, sets separated by spaces and alternatives by ||. A pack of kind rules must not admit any engine before 0.1.1.
kindsRequired. A list naming each of content, rules and system at most once, and at least one of them: what the pack contains.
sidesRequired. One of client, server or both. The check only tests that it is one of the three; nothing else in the contract reads it. The earlier formats are read as client.
dependenciesRequired, empty when there are none. A list of at most 64 entries, each either {id, range} (another pack, by its id and a version range) or {archive, sha256} (one of your own disc archives, by its path and SHA-256). The same id or archive may not appear twice, and a pack may not depend on itself.
filesRequired, at least one row. Every member of the pack except the manifest itself, one row each (see the files row below). A file in the zip that is not listed is refused, apart from Thunderstore's root files beside the manifest.
intentsRequired. A list of at most 64 entries, each {kind, files}: which members a change is declared to be, and what kind of change it is. Every member must be named by at least one intent.
handlersOptional. A list of at most 32 claims on handler slots the engine owns (see the handlers claim below). No pack code runs: a claim only names a handler the engine already has.

A files row

fieldwhat it is
pathThe member's path inside the pack: relative, forward slashes, at most 240 characters and 16 folders deep, with no .., drive, leading slash, colon, percent sign, control character, hidden (dot-led) or reserved segment. It may not be s2u-pack.json or one of Thunderstore's root files.
sha256The SHA-256 of the member's bytes, as 64 lower-case hex digits. The check hashes the member and refuses it when the hash differs.
sizeThe member's size in bytes, a whole number of 0 or more. The check compares it with the stored size before reading any bytes.
roleWhat the member is: one of the roles below. The path's file type must be one the role allows.

A handlers claim

fieldwhat it is
slotThe engine-owned slot the pack claims, a dotted lower-case name of at most 64 characters such as visual.post. A pack claims a slot at most once.
handlerThe engine handler the pack asks for on that slot, a dotted lower-case name of at most 64 characters. It must be one the build offers for that slot, or the claim is refused with pack.HANDLER_UNKNOWN.
actionsOptional. A list of at most 64 distinct dotted lower-case action names the claim uses; each must be one the handler offers.
optionsOptional. A plain JSON object handed to the handler: at most 4096 bytes of JSON, nested at most 2 deep, finite numbers only, and no __proto__, constructor or prototype key. The contract checks only this shape; the handler checks what is in it.

Kinds

kindwhat it is
contentContent: assets and maps (models, textures, sounds, collision, data, an authored map). The earlier formats are read as content packs. The check sets no rule of its own on this kind.
rulesDeclarative rules for a game mode, in rules-role JSON members: data only, never code. A rules pack's contract must start at 0.1.1 or above, and its members' capabilities must agree with its handlers claims.
systemEngine systems: changes made through claims on engine-owned handler slots (the one such slot today is the full-screen picture pass visual.post). The check sets no rule of its own on this kind.

The earlier formats

An earlier loader's pack has no s2u-pack.json; the contract reads it through an adapter as a v2 content pack.

legacy kindwhat it is
modAn s2u-mod v1 data-override mod. It is read as the pack mod. plus its id, its files as role data under a gameplay-value intent; a version that is not a semantic version is kept as 0.0.0+legacy. plus the old version.
modelThe model pack (glTF models in place of the game's meshes). It is read as model.current version 1.0.0, its files as role mesh under a cosmetic intent.
textureA texture pack for one map. It is read as texture. plus the map's name, version 1.0.0, its files as role texture under a cosmetic intent with their own SHA-256 and sizes, and the map archive as a disc archive dependency when the pack records the archive's SHA-256.

Sides

sidewhat it is
clientThe value client. The check accepts it; the contract gives it no further rule.
serverThe value server. The check accepts it; the contract gives it no further rule.
bothThe value both. The check accepts it; the contract gives it no further rule.

Roles and payload types

A files row's role names what the member is; its path must end in one of the role's file types (case does not matter), or the row is refused with pack.ROLE_MISMATCH. A role that changes play cannot be covered by a cosmetic intent alone.

rolefile typeschanges playwhat it is
mesh.glb, .gltfnoA 3D model in glTF form.
texture.png, .ktx2, .rgbanoAn image.
audio.ogg, .wavnoA sound.
collision.json, .glbyesCollision data, as JSON or a glTF binary model.
gameplay.jsonyesA JSON member of gameplay values.
rules.jsonyesA JSON rules member (a rules spec). It is bounded by PACK_RULES_MEMBER_BYTES_ADAPTATION, read whole once, and must be a UTF-8 JSON object whose capabilities, when present, is a list of {slot, handler, actions?}.
system.jsonnoA JSON member for a system claim.
dataanynoAny other data; any file type.
legacy-manifest.jsonnoAn earlier format's own manifest, kept as a member when the contract reads an earlier pack.

Intents

intentwhat it is
cosmeticThe members change only how the game looks or sounds. A collision, gameplay or rules member cannot be covered by cosmetic alone.
gameplay-valueThe members change values the game already has.
new-behaviourThe members add behaviour the game does not have.

Published values

namevaluewhat it is
PACK_FORMATs2u-packThe manifest's format.
PACK_FORMAT_VERSION2The manifest's formatVersion.
PACK_MANIFEST_FILEs2u-pack.jsonThe manifest's file name at the pack's root.
ENGINE_CONTRACT_VERSION0.1.1The engine contract version this build publishes; a pack's contract range must include it.
PACK_TARGET_USSCUS-97275The disc revision this build targets (the US disc's product code); a pack's target must be exactly this.
RULES_PACK_CONTRACT_FLOOR0.1.1The first engine contract with the rules vocabulary. A rules pack's contract must start at it or above in every || alternative; it stays the same when the build's contract moves on.
THUNDERSTORE_TEAM_PLACEHOLDERTEAM_PLACEHOLDERA stand-in for the Thunderstore team packs would publish under, used in exported dependency pins. It is not a real team: the team is not named yet.

Target aliases

earlier spellingcanonical targetwhat it is
socom2-us-r0001SCUS-97275The s2u-mod v1 spelling of the target. Only the mod adapter accepts it; in a v2 manifest it is refused and the finding names the canonical target.

On this page