133 min read

Source: Roblox Creator Hub · CC BY 4.0 · View source · Code samples: MIT Imported 2026-10-03. Formatting adapted for this site.

UGC validation system

The UGC validation system is Roblox's technical mechanism that checks if avatar assets meet platform specifications before you can upload and publish them to the Marketplace. This process ensures that avatar bodies, cosmetics, clothing, and accessories behave consistently across the platform.

The UGC validation system runs each time you:

During this process, the UGC validation system looks at your asset to see if it meets the requirements in validation categories that are specific to its asset type. For a comprehensive list of these requirements, see Body specifications, Dynamic head specifications, Makeup specifications, Rigid accessory specifications, and Layered accessory specifications.

For requirements and upload steps specific to locomotion animations, see Create and publish animation packs.

When an avatar asset passes validation, you can proceed with the Studio upload process by paying the upload fee, submitting the asset for moderation, and selling it on the Marketplace, or the player can proceed to purchase the avatar asset they created within an experience.



Chart of validation system success workflows.



When an avatar asset fails validation, you or the player receive error messages with information on why the avatar asset didn't pass validation. For troubleshooting assistance, the UGC validation has visualization tools with checks that provide asset-specific visual guides on how to fix or improve your asset so that it can pass validation.

Note

Assets that you don't intend to use for the Marketplace, such as those for in-game use only, do not need to pass the validation process. Regardless, the validation process can still be useful for troubleshooting and debugging custom bodies and accessories.

Validation categories

The UGC validation system organizes validation into several high-level categories. For information on these categories and some areas that they validate, review the following table.

Category What it validates
**Schema**
  • The asset's object hierarchy
  • If child types, tags, and attributes are configured correctly
  • If the asset includes any banned scripts
**Mesh geometry**
  • Triangle budgets
  • Bounding box sizes
  • Total surface area limits
  • If the asset is centered at origin and not too thin along any particular axis
  • If the asset's geometry is watertight and without N-gons, vertex colors, or zero-area triangles
**Texture / materials**
  • Max resolution
  • Valid UV maps
  • PBR texture validation for [`SurfaceAppearance`](/docs/surfaceappearance) objects
  • If the asset contains any invalid vertex colors
**Rigging / skinning**
  • Bodies and layered accessories must include skinning data
  • Rigid accessories must not include skinning data
  • Skin weight count must match vertex count
**Inner and outer cages**
  • All body parts must include cages for full-body validation
  • Cage mesh must closely match the render mesh
  • Render mesh must be inside outer cage
  • Cage UVs must match Roblox's provided [cage templates](/docs/roblox-avatar-resources#project-files)
**Attachments**
  • All attachments must have correct naming for their attachment point
  • Position and orientation checks
**Dynamic head**
  • At least 17 FACS poses
  • Cage landmark projection onto the head mesh
  • Facial animation detection: landmarks must move for blink, mouth opening, and happy/sad expressions
**Security / moderation**
  • Asset creator validation, banned class names, proxy attribute anti-spoofing

Validation checks

When an avatar asset fails validation, Studio returns error messages that describe what needs to be fixed. The following table lists validation error messages, how to fix them, and why each check is important.

Error message How to fix Why is this check important? `Animation has a Weight value that is not greater than 0. Please fix the animation.` This error triggers when a [`NumberValue`](/docs/numbervalue) named **Weight** inside the animation hierarchy has a value of zero or below.

To fix it, open your animation asset and set the **Weight** value to a positive number (typically `1.0`). This check ensures that animation weight values are valid for idle animations uploaded to the Marketplace. Weight controls how strongly an animation influences the character, and a zero or negative value would make the animation effectively invisible or behave incorrectly. `All MeshParts must have the same value in their AvatarPartScaleType child. Please verify the values match.` This error fires when two or more [`MeshPart`](/docs/meshpart) instances within the same upload have different **AvatarPartScaleType** values, such as one set to `Classic` and another to `ProportionsNormal`.

To fix it, ensure every [`MeshPart`](/docs/meshpart) in the asset has an identical **AvatarPartScaleType** [`StringValue`](/docs/stringvalue) child. This check validates that the overall bounding box of a body part or full body asset falls within allowed size limits for its [body scale type](/docs/roblox-avatar-character-bodies-specifications#body-scale). Each [`MeshPart`](/docs/meshpart) in a multi-part asset must declare the same **AvatarPartScaleType** so the system knows which size bounds to enforce. `Asset meshes are smaller than the minimum allowed bounding box size on one or more axes. You need to scale up the meshes.` This error triggers when the mesh extents on the X, Y, or Z axis are below the minimum threshold defined for the asset's body scale type.

To fix it, scale up your meshes in your 3D modeling software so the resulting bounding box meets or exceeds the minimum on every axis. This check validates that the overall bounding box of a body part or full body asset falls within allowed size limits for its body scale type. The minimum bounds prevent body parts from being so small they become invisible or break avatar proportions at runtime. `Asset meshes and joints are larger than the maximum allowed bounding box size on one or more axes. You need to scale down the meshes/joints.` This error triggers when the combined extent of meshes and joint positions on the X, Y, or Z axis exceeds the maximum threshold for the asset's body scale type.

To fix it, scale down your meshes and/or reposition joints in your 3D modeling software to fit within the allowed bounding box. This check validates that the overall bounding box of a body part or full body asset falls within allowed size limits for its body scale type. The maximum bounds prevent body parts from being oversized, which would clip through other avatars or environments. `The AvatarPartScaleType value is invalid. Accepted values are Classic, ProportionsSlender, or ProportionsNormal.` This error fires when the **AvatarPartScaleType** [`StringValue`](/docs/stringvalue) inside a [`MeshPart`](/docs/meshpart) contains a value other than `Classic`, `ProportionsSlender`, or `ProportionsNormal`, such as from a typo or custom string.

To fix it, update the [`StringValue`](/docs/stringvalue) to one of the three accepted values. This check validates that the overall bounding box of a body part or full body asset falls within allowed size limits, which requires knowing the asset's [body scale type](/docs/roblox-avatar-character-bodies-specifications#body-scale). The system only recognizes three scale type values that correspond to standard avatar proportions. `Part has a non-zero transparency. Part transparency should always be exactly zero.` This error triggers when a [`MeshPart.Transparency`](/docs/meshpart) property is set to any value other than `0`.

To fix it, set the [`Transparency`](/docs/meshpart) property of all meshes in your asset to exactly `0`. This check ensures that avatar [body parts](/docs/roblox-avatar-character-bodies-specifications#body-parts) are sufficiently visible from all camera angles by rasterizing the combined mesh from six orthographic views and measuring pixel coverage. Roblox requires body parts to be opaque so they render correctly in all lighting conditions and layered accessory scenarios. `Failed to load mesh for a MeshPart. Make sure the mesh exists and try again.` This error triggers when the mesh data for a body part cannot be loaded from the provided render meshes, typically because the [`MeshPart.MeshId`](/docs/meshpart#meshpart-meshid) is missing or points to an invalid asset.

To fix it, re-import your mesh in Studio and verify that the [`MeshId`](/docs/meshpart#meshpart-meshid) references a valid, accessible mesh asset. This check ensures that avatar body parts are sufficiently visible from all camera angles by rasterizing the combined mesh from six orthographic views and measuring pixel coverage. The system must load each mesh's editable mesh data to perform the rasterization-based opacity measurement. `Meshes should not have zero size.` This error triggers when the combined mesh geometry has zero extent, meaning that all vertices collapse to a single point or line.

To fix it, ensure your mesh has actual 3D volume by spreading vertices across all three axes in your 3D modeling software. This check ensures that avatar body parts are sufficiently visible from all camera angles by rasterizing the combined mesh from six orthographic views. After transforming all mesh triangles into world space, the system computes the overall bounding box and checks that it has non-zero volume. `Mesh has no triangles.` This error fires when the combined mesh data contains zero triangle faces, meaning there is no renderable geometry.

To fix it, ensure your mesh has valid polygon data by checking that faces are defined in your 3D file before importing. This check ensures that avatar body parts are sufficiently visible from all camera angles by rasterizing the combined mesh from six orthographic views. The rasterizer needs at least one triangle to project onto the view plane and measure coverage. `Mesh is completely invisible.` This error triggers when a view produces zero opaque pixels, meaning the mesh is entirely invisible from that angle, such as a perfectly flat plane viewed edge-on.

To fix it, add geometry that provides visible surface area from all six cardinal directions: front, back, left, right, top, and bottom. This check ensures that avatar [body parts](/docs/roblox-avatar-character-bodies-specifications#body-parts) are sufficiently visible from all camera angles by rasterizing the combined mesh from six orthographic views. After rasterizing, the system counts opaque pixels to determine what fraction of the view contains visible geometry. `Asset is not opaque enough from a given view direction. Opacity is below the required threshold.` This error triggers when the rasterized pixel coverage from a specific view is below the threshold for that asset type and angle.

To fix it, add more geometry or adjust the mesh shape so it fills more of the silhouette from the failing view direction. This check ensures that avatar body parts are sufficiently visible from all camera angles by rasterizing the combined mesh from six orthographic views: front, back, left, right, top, and bottom. Each view direction has a minimum opacity threshold that must be met so the body part does not appear mostly transparent or hollow. `Could not compute bounds for an attachment. The mesh data may be missing or malformed; please re-import the asset and try again.` This error triggers when the bounds computation for a specific attachment fails, typically because the mesh data is corrupt or not yet loaded.

To fix it, re-import the body part mesh in Studio to regenerate valid mesh data. This check validates that all rig and accessory attachments are positioned within acceptable bounds relative to their parent [`MeshPart`](/docs/meshpart). The system needs to compute the mesh's bounding volume to define the valid region where attachments can be placed. `Could not compute mesh bounds for the asset before checking attachment positions. The mesh data may be missing or malformed; please re-import the asset and try again.` This error triggers when that initial bounds computation fails for the whole asset, usually because one or more meshes lack valid geometry data.

To fix it, re-import all meshes in the asset to ensure they have proper vertex data. This check validates that all rig and accessory attachments are positioned within acceptable bounds relative to their parent [`MeshPart`](/docs/meshpart). Before individual attachments can be checked, the system must calculate per-part mesh bounds and transforms for the entire asset. `Rig attachment must be placed near the joint boundary where this body part connects to an adjacent part. Current position is too far from the connection plane.` This error triggers when a rig attachment (e.g., `LeftElbowRigAttachment`) is positioned too far from the expected connection surface in mesh-normalized space.

To fix it, move the rig attachment closer to the edge where this body part meets its neighbor. This check validates that all rig attachments are positioned within acceptable bounds relative to their parent [`MeshPart`](/docs/meshpart) instance's geometry. Rig attachments define where body parts connect at joints and must sit near the physical boundary between adjacent parts for correct avatar assembly. `Accessory attachment must be placed close to the surface of the mesh. Current position is outside the valid region.` This error triggers when an accessory attachment (e.g., `HatAttachment`) is positioned outside the valid bounding region defined for that attachment type.

To fix it, move the accessory attachment so it sits closer to or on the mesh surface where the accessory should visually attach. This check validates that all accessory [attachments](/docs/roblox-avatar-rigid-accessories-specifications#attachment-points) are positioned within acceptable bounds relative to their parent [`MeshPart`](/docs/meshpart) instance's geometry. Accessory attachments define where hats and accessories snap onto a body part and should sit near the mesh surface for realistic placement. `Attachment is placed at a position outside the valid range. Move it closer to the expected position.` This error triggers when any attachment falls outside its valid bounding region, providing the current position, closest valid position, and the bounding box dimensions.

To fix it, reposition the attachment within the reported bounding box. This check validates that all rig and accessory attachments are positioned within acceptable bounds relative to their parent [`MeshPart`](/docs/meshpart) instance's geometry. Each attachment has a defined valid region in mesh-normalized space that ensures correct avatar joint assembly and accessory placement. `Rig attachments cannot be rotated. Please set the orientation to (0,0,0).` This error triggers when a rig attachment has a non-identity rotation in its [`CFrame`](/docs/cframe).

To fix it, reset the attachment's orientation to (`0`, `0`, `0`) in your 3D modeling software or in Studio before upload. This check validates that attachment orientations on avatar body parts conform to the expected rotational constraints. Rig attachments define joint connection points between body parts and must remain unrotated so the avatar assembles correctly at runtime. `Attachment orientation deviates too far from the expected orientation. Maximum deviation exceeded.` This error triggers when a named attachment's rotation differs from the expected orientation by more than the allowed number of degrees for that specific attachment type.

To fix it, adjust the attachment's orientation to be within the allowed deviation from the recommended rotation shown in the error. This check validates that attachment orientations on avatar body parts conform to the expected rotational constraints. [Non-rig attachments](/docs/roblox-avatar-character-bodies-specifications#attachments), such as `LeftGrip_Att`, have a recommended orientation derived from the body part's geometry, and deviations beyond a per-attachment threshold are rejected. `Instance or its descendants contain Attributes. You need to remove Attributes from the listed instances.` This error triggers when any instance in the uploaded asset (or its associated HSR data) has one or more [custom attributes](/docs/roblox-scripting-attributes) set, excluding the internal GUID attribute used by the system.

To fix it, remove all custom attributes from every instance in your asset hierarchy before uploading. This check ensures that Marketplace assets do not contain custom attributes on any instance in their hierarchy. Attributes are runtime key-value pairs that could carry hidden data or scripts, and are not permitted on published avatar assets for safety and consistency reasons. `Render mesh has zero size on one or more axes. Increase the size of the mesh.` This error triggers when a render mesh's size is effectively zero on the X, Y, or Z axis.

To fix it, open your 3D modeling software, verify the mesh has non-zero dimensions on all axes, and re-export the asset. This check validates that no [body part](/docs/roblox-avatar-character-bodies-specifications#body-parts) mesh has zero extent on any axis, which would cause downstream geometry calculations (bounds, rasterization, collision) to fail or produce undefined results. Every mesh must have measurable volume in all three dimensions to function correctly as part of an avatar. `Mesh failed to load. Make sure the mesh exists and try again.` This error triggers when a mesh (either the render mesh or the cage mesh) cannot be loaded, typically because the [`MeshPart.MeshId`](/docs/meshpart#meshpart-meshid) or [`WrapTarget.CageMeshId`](/docs/wraptarget) references an invalid or inaccessible asset.

To fix it, verify that all mesh references point to valid, uploaded mesh assets and re-import if necessary. This check validates that the render mesh and the [`WrapTarget`](/docs/wraptarget) [outer cage mesh](/docs/roblox-avatar-character-bodies-specifications#outer-cages) for each body part are consistent in size, ensuring layered accessories will deform correctly over the body. The system must load both meshes to compare their extents. `Mesh is more than the maximum allowed difference in size compared to the other mesh. You need to edit the model to adjust its size.` This error triggers when the bounding box corners of the render mesh versus the outer cage mesh differ by more than the allowed threshold.

To fix it, adjust either the render mesh or the cage mesh in your 3D modeling software so their overall extents closely match. This check validates that the render mesh and the [`WrapTarget`](/docs/wraptarget) outer cage mesh for each body part are consistent in size. If the cage and render mesh differ too much, layered accessory deformation will produce visual artifacts like stretching or clipping. `A vertex on the body part's cage mesh is too far from the closest render mesh. Make the cage mesh more closely match the shape and size of the render mesh.` This error triggers when the maximum vertex-to-surface distance between any cage vertex and the closest point on the render mesh exceeds the allowed threshold (measured in studs).

To fix it, reshape your cage mesh to more closely conform to the body's render mesh surface. This check validates that the outer cage mesh for each body part in a full body upload closely follows the shape of the underlying render mesh. The cage defines how a layered accessory wraps around the body, so large gaps between the cage and mesh cause the accessory to float or deform incorrectly. `Body part is skinned to a virtual joint which is not part of the R15plus schema.` This error triggers when a body part's mesh has vertex weights assigned to a bone/joint name that does not appear in the [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy.

To fix it, in your 3D modeling software, remove all skin weights from unauthorized joints and reassign those vertices to the official advanced R15 bone hierarchy. This check validates that each body part mesh is only skinned (weighted) to joints that are part of the official advanced R15 rig hierarchy. Skinning to unauthorized joints could cause unpredictable deformations or exploit avatar rendering. `Bone is too far outside of the MeshPart. Please put it closer to the MeshPart size boundary.` This error triggers when a [`Bone`](/docs/bone) instance's world position (transformed into the [`MeshPart`](/docs/meshpart) instance's local space) exceeds the mesh's half-extents multiplied by the tolerance factor.

To fix it, reposition the bone inside or very near the mesh boundary in your 3D modeling software. This check validates that all [`Bone`](/docs/bone) instances within a body part are positioned within the physical bounds of their parent [`MeshPart`](/docs/meshpart), with a small tolerance multiplier. Bones represent skeletal joints for rigs; if placed far outside the mesh, they would cause extreme deformation artifacts during animation. `Bone has a transform property, but this is not yet enabled for Marketplace uploads. Please reset it to the identity CFrame.` This error triggers when a [`Bone.Transform`](/docs/bone#bone-transform) property is anything other than the identity [`CFrame`](/docs/cframe) (no translation, no rotation).

To fix it, in Studio or your export pipeline, reset the [`Bone.Transform`](/docs/bone#bone-transform) to [`CFrame.Identity`](/docs/cframe) before publishing. This check validates that all [`Bone`](/docs/bone) instances within a body part have valid [`CFrame`](/docs/cframe) properties for Marketplace upload. The [`Bone.Transform`](/docs/bone#bone-transform) property is reserved for runtime animation and must not be pre-set during upload, as it would interfere with the animation system. `Bone is too close to its parent. Adjust the position of the bone slightly.` This error triggers when a child [`Bone`](/docs/bone) instance's position magnitude relative to its parent [`Bone`](/docs/bone) instance is below the minimum joint distance threshold.

To fix it, move the bone slightly further from its parent in your 3D modeling software so they have measurable separation. This check validates that all [`Bone`](/docs/bone) instances within a body part are positioned at valid distances from their parent bones. Bones that are nearly coincident with their parent create numerical instability in [inverse kinematics](/docs/roblox-animation-inverse-kinematics) and [skinning](/docs/roblox-avatar-character-bodies-specifications#skinning) calculations. `Bounding box validation failed due to sparse geometry inflating the asset bounds.` This error triggers when the raster-based analysis detects that a significant portion of the bounding box is empty space not backed by visible mesh geometry.

To fix it, remove any floating vertices, thin protrusions, or disconnected micro-geometry that extends far from the main body of the mesh. This check validates that there are no sparse regions of an asset's bounding box caused by low-visibility geometry that artificially inflate the reported bounds, such as thin spikes or floating vertices. Inflated bounds cause issues with collision detection, thumbnail generation, and layered accessory fitting. `Average distance between outer cage to mesh is too high. Mesh seems to be outside of the outer cage.` This error triggers when the computed average signed distance between the outer cage and the render mesh is negative, indicating the mesh geometry is predominantly outside the cage volume.

To fix it, reshape your outer cage to fully enclose the render mesh, or move the render mesh inward so it sits between the inner and outer cages. This check validates that the render mesh of a layered accessory is properly contained within its [outer cage](/docs/roblox-avatar-layered-accessories-specifications#outer-cage). The outer cage defines the deformation volume for the accessory; if the mesh sits outside the cage, the clothing system cannot properly wrap and deform the item. `Average distance between outer cage and mesh is too high. Make adjustments to the cage to fit the mesh better.` This error triggers when the average cage-to-mesh distance exceeds the configured threshold percentage.

To fix it, bring your outer cage vertices closer to the render mesh surface in your 3D modeling software so the cage more tightly conforms to the accessory shape. This check validates that the render mesh of a layered accessory is properly contained within its outer cage and the cage fits snugly. A large positive average distance means the cage is much bigger than the mesh, which would cause the clothing to appear bloated or float away from the character when deformed. `Too many modified cage UVs are outside the expected body region for this asset type. Move your asset to the correct area of the body.` This error triggers when more than the allowed percentage of modified UVs fall in body regions that should not be modified for this shoe type, such as a left shoe modifying right leg UVs.

To fix it, adjust your cage deformations so they only affect the correct side of the body. This check validates that the modified area of a shoe accessory's outer cage corresponds to the correct body region based on the asset type (left shoe modifies left leg UVs, right shoe modifies right leg UVs). The system compares which cage UVs have been modified against the UV regions that are excluded for the asset type. `The WrapLayer CageMesh (outer mesh) must modify a minimum percentage of cage UVs in the primary body area. Move your asset to the correct area of the body.` This error triggers when fewer than the required percentage of UVs in the primary area have been modified, meaning the shoe isn't actually deforming the foot area enough.

To fix it, ensure your outer cage mesh has visible vertex displacement in the primary foot/shoe region. This check validates that a shoe accessory's outer cage has sufficient modification in its primary body region (e.g., `LeftFoot` for a left shoe). The system measures what percentage of the main area's reference UVs have been displaced in the outer cage. `Failed to execute testing render mesh inside bounding box of outer cage modified area. Make sure both cage meshes and render mesh exist and try again.` This error triggers when the system cannot retrieve the render mesh vertex data needed for the bounds test, typically because the mesh data is missing or failed to load.

To fix it, verify that the **Handle** mesh has a valid mesh asset assigned. This check validates that a shoe accessory's render mesh is physically located within the modified region of its outer cage. The system must compute the bounding box of the modified cage area and then test how many render mesh vertices fall within it. `Too few render mesh vertices are within the modified area of the WrapLayer CageMesh (outer mesh). Move the render mesh to be within the modified area.` This error triggers when fewer than the required percentage of render mesh vertices fall inside the bounding box of the outer cage's modified UV region.

To fix it, reposition your render mesh geometry so it overlaps with where you've modified the outer cage. This check validates that a shoe accessory's render mesh is physically located within the modified region of its outer cage. If the mesh sits outside the area where the cage has been deformed, the clothing system cannot properly wrap the item onto the avatar. `Detected zero-area triangle in UV map of the body part. You need to edit the UV map to fix this issue.` This error triggers when the engine's UV triangle area validation detects one or more triangles with zero area in the cage mesh's UV space.

To fix it, open your cage mesh in a UV editor, identify collapsed triangles, and spread their vertices apart to give each triangle non-zero area. This check validates that the [outer cage mesh](/docs/roblox-avatar-character-bodies-specifications#outer-cages) UV map does not contain degenerate (zero-area) triangles. Zero-area UV triangles indicate collapsed or overlapping vertices in the UV layout, which would cause texture mapping artifacts and break the layered accessory deformation system. `Outer cage should have the required number of unique UVs, but has a different count. Please make sure the mesh has the required number of unique UVs and try again.` This error triggers when the unique UV count in the cage mesh differs from the required count by more than a small tolerance value.

To fix it, re-export your cage mesh from the [official body cage template](/docs/roblox-avatar-resources#project-files) without adding, removing, or merging UV vertices. This check validates that the [`WrapTarget`](/docs/wraptarget) outer cage mesh has exactly the expected number of unique UV coordinates for the body part it represents. Each [body part](/docs/roblox-avatar-character-bodies-specifications#body-parts) has a precise cage topology with a fixed UV count, and deviations indicate the cage was incorrectly modified or replaced. `There are UV values in the cage that do not belong to the template. Please correct the cage UV.` This error triggers when the number of UV values not found in the [official body cage template](/docs/roblox-avatar-resources#project-files) exceeds the allowed threshold for either the inner or outer cage.

To fix it, re-derive your cage from the [official body cage template](/docs/roblox-avatar-resources#project-files) without introducing extra UV points or duplicating existing ones. This check validates that the inner and outer cage meshes of a layered accessory do not contain excessive duplicate UV coordinates that deviate from the [official body cage template](/docs/roblox-avatar-resources#project-files). Extra duplicates indicate manual UV edits that corrupt the cage's ability to properly map clothing deformation. `Found invalid UV value outside [0, 1] range for the body part. You need to edit the UV map to fix this issue.` This error triggers when any UV coordinate in the cage mesh does not match the expected reference values from the [official body cage template](/docs/roblox-avatar-resources#project-files).

To fix it, re-export your cage from the [official body cage template](/docs/roblox-avatar-resources#project-files) or manually correct the UV coordinates so they match the standard layout. This check validates that all UV values in the [`WrapTarget`](/docs/wraptarget) outer cage mesh match the official reference template values for that body part. The cage UV layout must exactly follow the [official body cage template](/docs/roblox-avatar-resources#project-files) so that layered accessories can correctly interpolate deformations. `MeshPart has incorrect CollisionFidelity. Expected it to be the required fidelity value.` This error triggers when any [`MeshPart.CollisionFidelity`](/docs/meshpart) is set to a value other than the expected one (typically Default).

To fix it, in Studio, set each [`MeshPart.CollisionFidelity`](/docs/meshpart) property to the expected value shown in the error message. This check validates that all [`MeshPart`](/docs/meshpart) instances in a body part upload have the correct [`CollisionFidelity`](/docs/meshpart) property value. [`CollisionFidelity`](/docs/meshpart) determines how collision geometry is computed for the part, and Marketplace body parts must use the server-configured default to ensure consistent physics behavior across all avatars. `CurveAnimation hierarchy can only contain MarkerCurve, AnimationRigData, Folder, Vector3Curve, EulerRotationCurve, FloatCurve, and ObjectValue. Please remove any other Instance types.` This error triggers when any descendant instance has a class not in the error message, such as a [`Part`](/docs/part), [`MeshPart`](/docs/meshpart), or other unsupported type.

To fix this, remove all instances from your animation hierarchy that are not one of the allowed types listed in the error message. This check validates that all instances within a [`CurveAnimation`](/docs/curveanimation) are of recognized types that the animation system supports. It iterates through every descendant of the [`CurveAnimation`](/docs/curveanimation) and verifies each one belongs to the list of acceptable classes in the error message. `CurveAnimation contains body part Folder which has an invalid hierarchy: unexpected child or structure issue found.` This error triggers when an unexpected child is found in a [`Folder`](/docs/folder), when curve children are incorrectly structured, when [`FaceControls`](/docs/facecontrols) exceed the maximum allowed count, or when grandchildren appear where they should not.

To fix this, ensure your animation's [`Folder`](/docs/folder) structure matches the expected [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy with only valid sub-folders and curves at each level. This check validates that the bone [`Folder`](/docs/folder) hierarchy within a [`CurveAnimation`](/docs/curveanimation) follows the correct advanced R15 rig hierarchy. It walks the entire tree of body part [`Folder`](/docs/folder) and bone [`Folder`](/docs/folder) instances, verifying that each [`Folder`](/docs/folder) only contains children that are expected for its position in the hierarchy (correct bone names, **Position**/**Rotation** curves, [`FaceControls`](/docs/facecontrols) instances, and child body parts). `CurveAnimation contains HRD/DRD bone folders which are not yet supported. Please remove all bone sub-folders before uploading.` This error triggers when bone [`Folder`](/docs/folder) instances are detected in the animation, or when the upload is attempted from an [in-game creation](/docs/roblox-avatar-in-experience-creation) context where bones are not supported.

To fix this, remove all bone sub- folders from your animation before uploading. This check validates whether the uploading creator has permission to use bone animation features ([`HumanoidRigDescription`](/docs/humanoidrigdescription)/[`DigitsRigDescription`](/docs/digitsrigdescription) bones) in their [`CurveAnimation`](/docs/curveanimation). Bone animations are a gated feature requiring trusted creator status. `Folder in CurveAnimation is not a recognized HRD/DRD bone name. Animation sub-folders must be either valid R15 body parts or recognized bone names.` This error triggers when a [`Folder`](/docs/folder) has animation data but its name does not correspond to any valid [body part](/docs/roblox-avatar-character-bodies-specifications#body-parts) or [bone](/docs/roblox-avatar-character-bodies-specifications#rigging) in the rigging armature (such as `HeadBase`, `Spine`, or `Chest`).

To fix this, rename or remove any animation [`Folder`](/docs/folder) that doesn't use the specified official body part or bone names. This check validates that all folders containing animation tracks within a [`CurveAnimation`](/docs/curveanimation) use recognized bone or body part names from the [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy. It scans every [`Folder`](/docs/folder) descendant that has animation tracks (**Position**/**Rotation** curves) and verifies the [`Folder`](/docs/folder) name matches either a known body part name or a known [`HumanoidRigDescription`](/docs/humanoidrigdescription)/[`DigitsRigDescription`](/docs/digitsrigdescription) bone name. `Bone folder requires its parent bone to also be present in the animation.` This error triggers when a child bone [`Folder`](/docs/folder) is present in the animation but its required parent bone in the skeleton hierarchy is missing.

To fix this, add the missing parent bone [`Folder`](/docs/folder) to your animation, or remove the child bone that requires it. This check validates that the bone hierarchy in a [`CurveAnimation`](/docs/curveanimation) respects parent-child relationships defined in the [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy. When a bone is animated, its parent bone in the skeleton chain must also be present in the animation to maintain a valid kinematic chain. `Bone in CurveAnimation has a Position (translation) track. HRD/DRD bones may only be rotated; position tracks cause joint separation and are not allowed. Please remove the position animation from this bone.` This error triggers when a bone [`Folder`](/docs/folder) contains a **Position** ([`Vector3Curve`](/docs/vector3curve)) track with keyframes, indicating the bone is being moved rather than just rotated.

To fix this, remove the **Position** track from the affected bone [`Folder`](/docs/folder) and animate it using only rotation ([`EulerRotationCurve`](/docs/eulerrotationcurve)). This check validates that bone folders within a [`CurveAnimation`](/docs/curveanimation) only contain rotation data, not positional translation data. [`HumanoidRigDescription`](/docs/humanoidrigdescription)/[`DigitsRigDescription`](/docs/digitsrigdescription) bones in the [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy are designed to rotate around their joints; translating them would cause visible joint separation and broken limb connections. `Bone in CurveAnimation moves too far from its start position. Maximum allowed translation is limited. Please reduce the bone's positional movement.` This error triggers when a bone's **Position** track moves it further than the configured maximum distance threshold (measured in studs from the starting position).

To fix this, reduce the magnitude of positional keyframes on the affected bone so its total translation stays within the allowed limit, or remove the **Position** track entirely and use only rotation. This check validates that bone folders within a [`CurveAnimation`](/docs/curveanimation) do not translate beyond a maximum allowed distance from their rest position. While small positional adjustments may be tolerated, large translations on bones would cause visible joint separation and break avatar proportions. `In CurveAnimation, a body part is below the minimum allowed height from the HumanoidRootPart. Please fix the animation.` This error triggers when any body part drops below the minimum allowed height threshold (measured in studs from the `HumanoidRootPart`), which could indicate the character clipping through the floor or performing an impossible pose.

To fix this, adjust the animation keyframes so that no body part goes below the minimum height at any point during playback. This check validates that all [body parts](/docs/roblox-avatar-character-bodies-specifications#body-parts) in a [`CurveAnimation`](/docs/curveanimation) stay within acceptable spatial bounds relative to the `HumanoidRootPart` throughout the entire animation. It samples every frame at the configured FPS rate and checks each body part's vertical position. `In CurveAnimation, a body part is too far from the HumanoidRootPart. Please fix the animation.` This error triggers when any body part exceeds the maximum allowed distance threshold (measured as magnitude in studs from the `HumanoidRootPart`), which could indicate limbs stretching unrealistically far from the body.

To fix this, adjust the animation keyframes so that no body part moves further than the maximum allowed distance from the `HumanoidRootPart` at any point during playback. This check validates that all body parts in a [`CurveAnimation`](/docs/curveanimation) stay within acceptable spatial bounds relative to the `HumanoidRootPart` throughout the entire animation. It samples every frame and checks each body part's total distance from the root. `Body parts in a CurveAnimation cannot be lower than the minimum height or more than the maximum distance from the HumanoidRootPart. Please fix the animation.` This error triggers as a general bounds violation when either the lowest body part drops below the minimum height threshold or any body part exceeds the maximum distance from root.

To fix this, review your animation to ensure all body parts remain within the allowed spatial envelope around the `HumanoidRootPart` throughout the entire animation duration. This check validates that all body parts in a [`CurveAnimation`](/docs/curveanimation) stay within acceptable spatial bounds relative to the `HumanoidRootPart`. It examines every frame across the entire animation to find the minimum height and maximum distance of any body part. `Failed to load CurveAnimation data. The animation asset may be invalid or inaccessible.` This error triggers when the system fails to fetch or parse the [`CurveAnimation`](/docs/curveanimation) instances or their computed frame data, which can happen if the animation asset is corrupted, improperly formatted, or otherwise inaccessible to the validation system.

To fix this, re-export your animation from the Animation Editor and ensure the file is a valid [`CurveAnimation`](/docs/curveanimation) asset. This check validates that the [`CurveAnimation`](/docs/curveanimation) data and its computed frame data can be successfully loaded before any other animation checks run. It serves as a prerequisite gate for all subsequent curve animation validations. `Referenced Animation is not a CurveAnimation. Please ensure the animation is uploaded correctly.` This error triggers when the animation data loads successfully but contains zero [`CurveAnimation`](/docs/curveanimation) instances, meaning the asset is either empty or uses an older animation format that is not supported.

To fix this, ensure you are exporting your animation as a [`CurveAnimation`](/docs/curveanimation) from the Animation Editor rather than using legacy [`KeyframeSequence`](/docs/keyframesequence) format. This check validates that the submitted asset actually contains [`CurveAnimation`](/docs/curveanimation) data, which is the required format for [emote](/docs/roblox-avatar-emotes-specifications) and animation uploads. It verifies that at least one [`CurveAnimation`](/docs/curveanimation) instance exists in the loaded data. `CurveAnimation contains Curves with invalid numerical data. Please fix the animation.` This error triggers when any value in the computed animation frames is NaN (Not a Number) or infinite, which would cause unpredictable rendering behavior in-game.

To fix this, re-export your animation from the Animation Editor and ensure there are no degenerate keyframes that could produce undefined mathematical results, such as division by zero in interpolation. This check validates that all computed frame data in a [`CurveAnimation`](/docs/curveanimation) contains mathematically valid numbers. It examines every [`CFrame`](/docs/cframe) component and position magnitude across all sampled frames to detect corrupted numerical values. `CurveAnimation has too many descendants. Please reduce the number of descendants.` This error triggers when the total descendant count exceeds the configured maximum allowed limit, which can happen with extremely complex animations that have too many curves, folders, or other elements.

To fix this, simplify your animation by reducing the number of animated tracks, removing unnecessary marker curves, or consolidating animation data. This check validates that the overall structure of a [`CurveAnimation`](/docs/curveanimation) does not exceed complexity limits. It counts the total number of descendant instances within the [`CurveAnimation`](/docs/curveanimation) to ensure performance and memory constraints are respected. `CurveAnimation contains more than one body part or HumanoidRootPart Folder children. Please ensure there is only one child Folder named after a body part or HumanoidRootPart.` This error triggers when more than one such folder is found as a direct child of the [`CurveAnimation`](/docs/curveanimation), creating an ambiguous hierarchy that the animation system cannot resolve.

To fix this, restructure your animation so it has only one root body part [`Folder`](/docs/folder) (typically `HumanoidRootPart`) with all other body parts nested beneath it. This check validates the top-level structure of a [`CurveAnimation`](/docs/curveanimation) to ensure it has a single, unambiguous root for the body part hierarchy. A valid animation must have exactly one child [`Folder`](/docs/folder) whose name matches a recognized body part or `HumanoidRootPart`. `CurveAnimation contains zero body part or HumanoidRootPart Folder children. Please ensure there is one child Folder named after a body part or HumanoidRootPart.` This error triggers when no such [`Folder`](/docs/folder) exists as a direct child of the [`CurveAnimation`](/docs/curveanimation), meaning the animation has no recognizable body structure to animate.

To fix this, ensure your animation contains a root [`Folder`](/docs/folder) named `HumanoidRootPart` (or another valid body part name) that serves as the starting point of the animation hierarchy. This check validates the top-level structure of a [`CurveAnimation`](/docs/curveanimation) to ensure it contains the required body part hierarchy root. Every valid animation must have exactly one child [`Folder`](/docs/folder) whose name matches a recognized body part or `HumanoidRootPart`. `CurveAnimation child MarkerCurves and AnimationRigData cannot have children.` This error triggers when a [`MarkerCurve`](/docs/markercurve) or [`AnimationRigData`](/docs/animationrigdata) that is a direct child of the [`CurveAnimation`](/docs/curveanimation) has one or more children nested beneath it.

To fix this, remove any instances nested inside your [`MarkerCurve`](/docs/markercurve) or [`AnimationRigData`](/docs/animationrigdata) instances so they remain childless. This check validates the top-level structure of a [`CurveAnimation`](/docs/curveanimation) to ensure [`MarkerCurve`](/docs/markercurve) or [`AnimationRigData`](/docs/animationrigdata) instances are leaf nodes with no children. These instance types serve specific purposes (event markers and rig metadata) and are not designed to contain sub-objects. `CurveAnimation contains an unexpected child instance.` This error triggers when a direct child of the [`CurveAnimation`](/docs/curveanimation) is neither a recognized body part [`Folder`](/docs/folder) nor an expected utility instance like [`MarkerCurve`](/docs/markercurve) or [`AnimationRigData`](/docs/animationrigdata).

To fix this, remove any unexpected instances from the top level of your [`CurveAnimation`](/docs/curveanimation), keeping only valid body part folders, [`MarkerCurve`](/docs/markercurve) instances, and [`AnimationRigData`](/docs/animationrigdata) instances. This check validates the top-level structure of a [`CurveAnimation`](/docs/curveanimation) to ensure only expected instance types exist as direct children. Valid direct children are body part folders, [`MarkerCurve`](/docs/markercurve) instances, and [`AnimationRigData`](/docs/animationrigdata) instances. `CurveAnimation contains a body part Folder which has an invalid hierarchy with children that are not allowed or set up incorrectly.` This error triggers when a body part [`Folder`](/docs/folder)'s internal structure does not match the expected hierarchy, such as containing invalid child folders, missing required curves, or having incorrectly named sub-elements.

To fix this, restructure the body part [`Folder`](/docs/folder) to contain only the expected children for that body part according to the [specified body part](/docs/roblox-avatar-character-bodies-specifications#body-parts) hierarchy. This check validates that each body part [`Folder`](/docs/folder) within a [`CurveAnimation`](/docs/curveanimation) follows the expected body part hierarchy. Body part folders must contain only recognized child body parts, **Position**/**Rotation** curves, and [`FaceControls`](/docs/facecontrols) instances in the correct arrangement. `In CurveAnimation, a joint has a rotation angle exceeding the maximum allowed degrees from rest pose. Please fix the animation.` This error triggers when any joint's rotation at any frame exceeds the maximum allowed degrees configured for that specific body part, which prevents unnatural or impossible poses.

To fix this, reduce the rotation of the offending joint at the reported timestamp so it stays within the allowed range for that body part. This check validates that individual joint rotations in a [`CurveAnimation`](/docs/curveanimation) do not exceed per-body-part rotation limits from the rest pose. It samples the rotation at every frame for each animated body part and computes the angle between the animated pose and the rest pose. `CurveAnimation does not contain any joint manipulation.` This error triggers when no tracks in the computed animation data contain either position or rotation information, meaning the animation would produce no visible movement when played.

To fix this, ensure your animation has at least one body part with keyframed position or rotation data that produces visible motion. This check validates that a [`CurveAnimation`](/docs/curveanimation) actually animates something by examining the computed frame data for any position or rotation tracks. An [emote](/docs/roblox-avatar-emotes-specifications) animation must manipulate at least one joint to be considered valid content. `CurveAnimation does not contain any joint manipulation.` This error triggers when no body part [`Folder`](/docs/folder) in the animation hierarchy contains the expected curve pair, indicating the animation structure is incomplete or incorrectly organized.

To fix this, ensure at least one body part [`Folder`](/docs/folder) in your animation contains properly named **Position** ([`Vector3Curve`](/docs/vector3curve)) and **Rotation** ([`EulerRotationCurve`](/docs/eulerrotationcurve)) children. This check validates that a [`CurveAnimation`](/docs/curveanimation) contains recognizable joint manipulation by inspecting the body part [`Folder`](/docs/folder) structure for valid Position and Rotation curve tracks. It looks for at least one body part [`Folder`](/docs/folder) that contains both a [`Vector3Curve`](/docs/vector3curve) instance named **Position** and a [`EulerRotationCurve`](/docs/eulerrotationcurve) instance named **Rotation**. `CurveAnimation must be between the minimum and maximum seconds long. Please fix the animation.` This error triggers when the computed animation length is at or below the minimum length threshold, or exceeds the maximum length threshold.

To fix this, adjust the duration of your animation by adding or removing keyframes so the total length falls within the allowed range. This check validates that a [`CurveAnimation`](/docs/curveanimation) instance's total duration falls within the allowed time range for Marketplace uploads. Animations that are too short may not provide meaningful content, while animations that are too long consume excessive resources. `CurveAnimation does not have Loop enabled. Animations uploaded to the Marketplace must loop. Please enable the Loop property.` This error triggers when a [`CurveAnimation.Loop`](/docs/curveanimation) property is set to `false`, meaning it would play once and stop rather than repeating. Jump animations are exempt from this requirement.

To fix this, enable [`CurveAnimation.Loop`](/docs/curveanimation) in the Animation Editor before exporting. This check validates that [`CurveAnimation`](/docs/curveanimation) objects uploaded as Marketplace animations have their [`Loop`](/docs/curveanimation) property enabled. Marketplace animations are expected to loop seamlessly so they can play continuously during gameplay. `CurveAnimation contains more than the maximum allowed number of MarkerCurves. Please reduce the number of MarkerCurve descendants.` This error triggers when the total count of [`MarkerCurve`](/docs/markercurve) descendants across the entire [`CurveAnimation`](/docs/curveanimation) exceeds the configured maximum limit.

To fix this, reduce the number of [`MarkerCurve`](/docs/markercurve) instances in your animation by consolidating events into fewer curves or removing unnecessary marker tracks. This check validates that a [`CurveAnimation`](/docs/curveanimation) does not contain an excessive number of [`MarkerCurve`](/docs/markercurve) instances, which are used to embed event markers or audio triggers within animations. Too many marker curves increase asset complexity and processing overhead. `CurveAnimation hierarchy contains Scripts, LocalScripts, or ModuleScripts. Please remove them.` This error triggers when any [`Script`](/docs/script), [`LocalScript`](/docs/localscript), or [`ModuleScript`](/docs/modulescript) instance is found anywhere in the [`CurveAnimation`](/docs/curveanimation) descendant tree.

To fix this, remove all script instances from your animation hierarchy before uploading; animations should contain only animation data (curves, folders, markers, and rig data). This check validates that a [`CurveAnimation`](/docs/curveanimation) does not contain any executable code embedded within its hierarchy. Scripts inside animation assets represent a security risk as they could execute arbitrary code when the animation is loaded. `CurveAnimation contains a MarkerCurve with too many Markers. Please fix the animation.` This error triggers when a single [`MarkerCurve`](/docs/markercurve) contains more markers than the calculated maximum, which would indicate either an impossibly complex marker track or corrupted data.

To fix this, reduce the number of markers in the affected [`MarkerCurve`](/docs/markercurve) by removing unnecessary event triggers or consolidating closely- spaced markers. This check validates that the raw keyframe and marker data within a [`CurveAnimation`](/docs/curveanimation) stays within reasonable complexity limits. It examines each [`MarkerCurve`](/docs/markercurve) instance's marker count against a maximum derived from the animation's allowed FPS and duration. `CurveAnimation contains MarkerCurves with invalid Time or Value, or Value is too long. Please fix the animation.` This error triggers when any marker has a missing or non-numeric `Time` value (NaN or infinite), a missing `Value`, or a `Value` string that exceeds the configured maximum character length.

To fix this, inspect your [`MarkerCurve`](/docs/markercurve) instances and ensure all markers have valid timestamps and reasonably-sized value strings. This check validates that all markers within [`MarkerCurve`](/docs/markercurve) instances in a [`CurveAnimation`](/docs/curveanimation) have valid, well-formed data. Each marker must have a valid numeric `Time` property and a `Value` string that does not exceed the maximum allowed length. `CurveAnimation contains Curves with too many keys. Please fix the animation.` This error triggers when any single [`FloatCurve`](/docs/floatcurve) has more keys than the calculated maximum, indicating either an overly dense animation or data corruption.

To fix this, reduce the keyframe density on the affected curves by removing redundant keys, using fewer samples, or simplifying the animation data. This check validates that individual [`FloatCurve`](/docs/floatcurve) instances within a [`CurveAnimation`](/docs/curveanimation) do not have an excessive number of keyframes. The maximum key count is calculated from the animation's allowed FPS rate and maximum duration. `CurveAnimation contains Curves with invalid Time or Value. Please fix the animation.` This error triggers when any key in a [`FloatCurve`](/docs/floatcurve) has a missing, NaN (Not a Number), or infinite `Time` or `Value` property, which would cause undefined interpolation behavior during playback.

To fix this, re-export your animation from the Animation Editor and ensure all keyframes have valid numeric values, or manually remove any corrupted keys. This check validates that all keyframes within [`FloatCurve`](/docs/floatcurve) instances in a [`CurveAnimation`](/docs/curveanimation) have mathematically valid data. Each key must have a properly defined numeric `Time` and `Value` that are not NaN or infinite. `CurveAnimation contains a Curve with keys that are too close together in time for the maximum allowed FPS. Please fix the animation.` This error triggers when two consecutive keys in a [`FloatCurve`](/docs/floatcurve) have timestamps closer together than the minimum allowed interval (derived from the maximum FPS with a tolerance factor).

To fix this, increase the time spacing between closely- placed keyframes, or re-export your animation at a frame rate that does not exceed the platform maximum. This check validates that keyframes within [`FloatCurve`](/docs/floatcurve) instance in a [`CurveAnimation`](/docs/curveanimation) are spaced far enough apart in time to be physically meaningful at the maximum allowed frame rate. Keys that are too close together imply a frame rate exceeding what the system supports. `CurveAnimation contains a Curve with a key that has a negative time. Please fix the animation.` This error triggers when the first key in a [`FloatCurve`](/docs/floatcurve) has a `Time` value less than zero.

To fix this, re-export your animation and ensure it starts at time zero, or manually adjust any keyframes with negative timestamps to begin at zero or later. This check validates that all keyframes within [`FloatCurve`](/docs/floatcurve) instances in a [`CurveAnimation`](/docs/curveanimation) have non-negative timestamps. Animation time should always start at zero or a positive value; negative timestamps indicate corrupted or improperly exported data. `CurveAnimation contains HRD/DRD bones and a body part has a Position (translation) track. When bones are present, no body parts may translate to prevent joint separation. Please remove all Position tracks from body parts.` This error triggers when any body part [`Folder`](/docs/folder) in a bone- containing animation has a **Position** track with keyframes, which would move the body part independently of the bone chain and cause visible disconnection at joints.

To fix this, remove all **Position** tracks from body part folders in your animation and rely on the bone rotation hierarchy for movement. This check validates that when a [`CurveAnimation`](/docs/curveanimation) contains bone folders, no body part folders have positional translation tracks. When bones are used for detailed skeleton animation, body parts must remain at fixed positions to prevent joints from separating. `Body part in CurveAnimation has a Position (translation) track. Animation body parts may only be rotated; position tracks are not allowed. Please remove the Position track from this body part.` This error triggers when a body part [`Folder`](/docs/folder) has a **Position** track with keyframes in an Animation-category upload that does not use bones, indicating the body part is being translated rather than just rotated.

To fix this, remove the **Position** track from the affected body part folder and animate it using only rotation. This check validates that body part folders in an Animation- category [`CurveAnimation`](/docs/curveanimation) do not contain positional translation tracks. For animation pack uploads, body parts should only be rotated to maintain consistent joint connectivity. `Body part in CurveAnimation moves too far from its start position. Maximum allowed translation is limited. Please reduce the body part's positional movement.` This error triggers when a body part's **Position** track moves it further than the configured maximum distance threshold (measured in studs).

To fix this, reduce the magnitude of positional keyframes on the affected body part so its total translation stays within the allowed distance, or remove the **Position** track entirely. This check validates that body part folders in a [`CurveAnimation`](/docs/curveanimation) do not translate beyond a maximum allowed distance from their rest position. While small positional adjustments on body parts may be tolerated, large translations cause joint separation. `CurveAnimation contains positional separation of body parts. Only LowerTorso can change position. All other body parts can only change their orientation. A body part moves more than the allowed distance from its parent. Please fix the animation.` This error triggers when any body part other than `LowerTorso` has a computed position magnitude that exceeds the per-part maximum movement threshold.

To fix this, reduce the positional separation of the offending body part by relying on rotation rather than translation for movement. This check validates that body parts in a [`CurveAnimation`](/docs/curveanimation) do not separate from their parent joints by more than the allowed distance. In the animation system for avatars with [standard R15 rigs](/docs/roblox-avatar-character-bodies-specifications#standard-r15-rigs), only the `LowerTorso` is permitted to change position freely; all other body parts should move primarily through rotation relative to their parent. `CurveAnimation contains more than one AnimationRigData children. Please ensure there is only one AnimationRigData child.` This error triggers when more than one [`AnimationRigData`](/docs/animationrigdata) instance is found as a direct child of the [`CurveAnimation`](/docs/curveanimation), creating ambiguity about which rig definition should be used.

To fix this, remove the extra [`AnimationRigData`](/docs/animationrigdata) instances so only one remains as a child of the [`CurveAnimation`](/docs/curveanimation). This check validates that a [`CurveAnimation`](/docs/curveanimation) contains exactly one [`AnimationRigData`](/docs/animationrigdata) instance, which stores the rig metadata needed for proper playback. [`AnimationRigData`](/docs/animationrigdata) defines how the animation maps to the avatar's skeleton. `CurveAnimation contains zero AnimationRigData children. Please ensure there is one AnimationRigData child.` This error triggers when no [`AnimationRigData`](/docs/animationrigdata) instance is found as a direct child of the [`CurveAnimation`](/docs/curveanimation).

To fix this, ensure your animation is exported from the Animation Editor with rig data included; re-exporting from a properly configured rig should automatically generate the [`AnimationRigData`](/docs/animationrigdata) instance. This check validates that a [`CurveAnimation`](/docs/curveanimation) contains exactly one [`AnimationRigData`](/docs/animationrigdata) instance, which is required metadata for the animation system to correctly map tracks to the avatar's skeleton. Without rig data, the animation cannot be properly applied to an avatar. `AnimationRigData failed internal R15 validation. Please ensure the AnimationRigData is set up correctly.` This error triggers when the [`AnimationRigData`](/docs/animationrigdata) instance fails the engine's `IsValidR15()` check, indicating the rig metadata is malformed, incomplete, or does not match the expected [standard R15 rig](/docs/roblox-avatar-character-bodies-specifications#standard-r15-rigs) hierarchy.

To fix this, re-export your animation from a properly configured **standard R15 rig** in the Animation Editor to regenerate valid rig data. This check validates that the [`AnimationRigData`](/docs/animationrigdata) within a [`CurveAnimation`](/docs/curveanimation) passes the engine's internal standard R15 rig validation. The rig data must correctly describe a valid standard avatar skeleton for the animation to play back properly. `AnimationRigData failed R15+ internal validation. Please ensure the AnimationRigData is set up correctly for bone animations.` This error triggers when the [`AnimationRigData`](/docs/animationrigdata) instance fails the engine's `IsValidR15Plus()` check in an animation that contains bone folders, indicating the rig metadata does not properly describe the extended [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy.

To fix this, re-export your animation from a properly configured **advanced R15 rig** that includes the [`HumanoidRigDescription`](/docs/humanoidrigdescription)/[`DigitsRigDescription`](/docs/digitsrigdescription) bone definitions. This check validates that the [`AnimationRigData`](/docs/animationrigdata) within a bone-containing [`CurveAnimation`](/docs/curveanimation) passes the engine's internal advanced R15 rig validation. Bone animations require rig data that includes the extended skeleton definition beyond the standard R15 rig. `In CurveAnimation, a body part is rotating too fast. The rotation speed exceeds the maximum allowed degrees per second. Please fix the animation.` This error triggers when the rotation delta between two consecutive frames for any body part exceeds the per-frame rotation limit derived from the maximum allowed degrees-per-second speed.

To fix this, smooth out the rotation curves for the offending body part to reduce the angular velocity at the reported timestamp. This check validates that the angular rotation speed of [body parts](/docs/roblox-avatar-character-bodies-specifications#body-parts) in a [`CurveAnimation`](/docs/curveanimation) does not exceed a maximum degrees-per- second threshold. Excessively fast rotations appear unnatural and can cause visual glitches or exploitable spinning behavior. `In CurveAnimation, a body part is moving at a speed exceeding the maximum allowed studs per second. Please fix the animation.` This error triggers when the positional change between two consecutive frames for any body part exceeds the per-frame movement limit, which is calculated from the maximum allowed speed at the animation's sampling rate.

To fix this, reduce the movement speed of the offending body part at the reported timestamp by adjusting keyframes to create smoother, slower transitions. This check validates that the linear movement speed of body parts in a [`CurveAnimation`](/docs/curveanimation) does not exceed a maximum studs- per-second threshold. Excessively fast movement can appear unnatural, break physics interactions, or enable exploitative gameplay. `Body part in CurveAnimation moves more than the maximum allowed studs between frames. Please fix the animation.` This error triggers when the positional difference between consecutive frames for any body part exceeds the maximum allowed movement distance per frame.

To fix this, reduce the movement distance of the offending body part between frames by adding intermediate keyframes or reducing the total displacement. This check validates that the linear movement speed of body parts in a [`CurveAnimation`](/docs/curveanimation) does not exceed frame-to-frame movement limits. This is the legacy version of the speed check that reports the violation as a per-frame distance rather than a per- second speed. `Instances within the animation have CollectionService tags, but Marketplace assets cannot have any tags.` This error triggers when any child or descendant of the [`CurveAnimation`](/docs/curveanimation) (excluding the [`CurveAnimation`](/docs/curveanimation) instance itself) has one or more [`CollectionService`](/docs/collectionservice) tags applied to it.

To fix this, remove all tags from every instance within your animation hierarchy before uploading using [`CollectionService: RemoveTag()`](/docs/collectionservice) or by clearing tags in Studio's properties panel. This check validates that instances within a [`CurveAnimation`](/docs/curveanimation) do not have [`CollectionService`](/docs/collectionservice) tags attached to them. Tags on Marketplace assets could be used to interfere with game systems that rely on [`CollectionService`](/docs/collectionservice) for gameplay logic. `CurveAnimation can only contain a single timestamp tag. Please remove all other tags.` This error triggers when the [`CurveAnimation`](/docs/curveanimation) has more than one tag, or has a single tag that is not a pure numeric string (timestamp).

To fix this, remove all [`CollectionService`](/docs/collectionservice) tags from the [`CurveAnimation`](/docs/curveanimation) instance, or ensure only one tag remains and it is a valid numeric timestamp. This check validates that the [`CurveAnimation`](/docs/curveanimation) instance itself only has tags that follow the allowed pattern. The only permitted tag on a [`CurveAnimation`](/docs/curveanimation) is a single numeric timestamp (up to 30 digits) used for versioning. `Failed to fetch moderation results. Make sure all assets are owned by the current user.` This error fires when the system cannot retrieve moderation results for the referenced assets, typically due to a network or service issue.

To fix this, verify that all embedded assets are published and owned by your account, then retry the upload. This check ensures that all referenced sub-assets (meshes, textures, images) within your upload have passed content moderation and are owned by authorized creators. It queries moderation status for every content ID found in the asset tree. `Asset(s) failed to pass moderation.` This error triggers when one or more referenced assets have been flagged, are still pending review, or have been rejected by the moderation system.

To fix this, you must replace the flagged asset IDs with moderation-approved assets before the upload can succeed. This check ensures that all referenced sub-assets (meshes, textures, images) within your upload have passed content moderation and are owned by authorized creators. It queries moderation status for every content ID found in the asset tree. `Asset is not owned by an authorized creator.` This error fires when a referenced asset (mesh or texture) belongs to a different user or group than the one performing the upload.

To fix this, replace the asset with one you own or have [publishing rights](/docs/roblox-projects-assets-privacy) to. This check ensures that all referenced sub-assets (meshes, textures, images) within your upload have passed content moderation and are owned by authorized creators. It verifies ownership of every embedded content ID against the uploading creator's account or group. `Upload of model has too many children assets (Meshes, Textures, etc.) and cannot be processed as is. You need to rearrange the model.` This error fires when your model references more meshes, textures, or other content IDs than the system can process in one batch.

To fix this, simplify your model by reducing the number of unique referenced assets or splitting the upload into smaller pieces. This check ensures that all referenced sub-assets (meshes, textures, images) within your upload have passed content moderation and are owned by authorized creators. There is a maximum number of distinct asset references that can be validated in a single upload. `Could not parse ContentId. Make sure you are using a valid URL with a valid ID and try again.` This error triggers when a content ID field contains text that cannot be parsed into a valid asset URL format.

To fix this, ensure the field uses the correct `rbxassetid://` format or a valid HTTP asset URL with a numeric asset ID. This check verifies that every content ID field ([`MeshId`](/docs/meshpart#meshpart-meshid), [`TextureID`](/docs/meshpart#meshpart-textureid), etc.) in your asset tree contains a properly formatted, parseable reference. Empty optional fields are acceptable, but any non-empty field must resolve to a valid asset ID. `Field cannot be empty. Make sure a valid asset is assigned and try again.` This error fires when a required content field (such as [`MeshId`](/docs/meshpart#meshpart-meshid) on a [`MeshPart`](/docs/meshpart)) is left empty.

To fix this, assign a valid mesh or texture asset to the empty field before attempting to publish. This check verifies that every content ID field ([`MeshId`](/docs/meshpart#meshpart-meshid), [`TextureID`](/docs/meshpart#meshpart-textureid), etc.) in your asset tree contains a properly formatted, parseable reference. Required fields must have a valid asset assigned before upload. `Asset referenced does not exist or is not loadable. Replace it with a valid asset id.` This error fires when the system attempts to load a referenced asset and it either does not exist on the platform or cannot be accessed.

To fix this, replace the asset ID with a valid, published asset that exists and is accessible to your account. This check verifies that every content ID field ([`MeshId`](/docs/meshpart#meshpart-meshid), [`TextureID`](/docs/meshpart#meshpart-textureid), etc.) in your asset tree contains a properly formatted, parseable reference and that the referenced assets actually exist and can be loaded. `Head mesh is missing required FACS controls.` This error fires when one or more of the required Facial Action Coding System (FACS) control poses are completely absent from the head mesh data.

To fix this, add the missing blend shapes to your head mesh in your 3D modeling software and ensure each [required control](/docs/roblox-avatar-dynamic-heads-specifications#facs-poses) name matches the expected FACS naming convention. This check validates that your dynamic head mesh contains all 17 required FACS controls and that those controls are actively deforming the mesh. `Head mesh has inactive FACS controls.` This error fires when FACS controls exist in the mesh data but do not produce any measurable vertex displacement when driven to their full value.

To fix this, adjust the blend shapes in your 3D modeling software so that each control creates visible facial movement when activated. This check validates that your dynamic head mesh contains all 17 required FACS controls and that those controls are actively deforming the mesh. Controls must produce visible mesh deformation when activated. `Failed validation for dynamic head due to missing FACS information. You need to provide FACS controls for at least 17 poses.` This error fires when the head mesh either contains no FACS data at all or has fewer than the minimum 17 [required pose targets](/docs/roblox-avatar-dynamic-heads-specifications#facs-poses).

To fix this, you must author the head mesh with all required FACS blend shapes in your 3D modeling software before exporting. This check validates that the dynamic head mesh contains valid FACS format data with at least 17 required facial poses. `This asset uses emissive maps which are only available to creators in the Trusted Creator Program. Please remove all emissive map content or join the program before uploading.` This error fires when your asset contains an emissive texture map but your account does not have the required permission.

To fix this, remove all emissive map textures from your [`SurfaceAppearance`](/docs/surfaceappearance) instance. This check determines whether the uploading creator has permission to use emissive (glow) maps on their asset. Emissive maps allow parts of a mesh to appear self-lit, but this feature is restricted to members of the Trusted Creator Program. `To upload an asset to Roblox, you must select exactly 1 instance and the associated upload type.` This error fires when the upload contains zero or more than one root instance selected for publishing.

To fix this, select exactly one instance (the root of your asset) and ensure the correct upload type is chosen before attempting to publish. This check validates that the uploaded asset has a correct top-level structure matching the expected schema for its asset type, including the right root class, name, and required children. It runs as the first gate before any other validation. `Uploaded asset should be a specific class but is a different class.` This error fires when the root instance is a different class than expected, such as when you upload a [`Part`](/docs/part) when a [`MeshPart`](/docs/meshpart) is required.

To fix this, change the root instance to the correct class type, or verify you selected the right instance and upload type. This check validates that the uploaded asset has a correct top-level structure matching the expected schema for its asset type, including the right root class, name, and required children. The root instance must be the correct Roblox class for the chosen upload category. `Uploaded asset should be named correctly but has an unexpected name.` This error fires when the root instance name does not match what the schema requires for this asset type.

To fix this, rename the root instance to the expected name as defined by the asset type specification, such as 'Head' for dynamic heads. This check validates that the uploaded asset has a correct top-level structure matching the expected schema for its asset type, including the right root class, name, and required children. Certain asset types require a specific name on the root instance. `Could not find a required child instance inside the asset.` This error fires when a required child is missing from the instance tree, such as a [`WrapLayer`](/docs/wraplayer), [`Attachment`](/docs/attachment), or specific [`MeshPart`](/docs/meshpart).

To fix this, add the missing instance of the specified class and name as a child of the indicated parent. This check validates that the uploaded asset has a correct top-level structure matching the expected schema for its asset type, including the right root class, name, and required children. Each asset type has a defined set of required child instances that must exist. `Instances not part of the approved schema should be removed.` This error fires when your asset contains extra descendants that are not part of the approved structure for this asset type.

To fix this, remove all instances listed in the error message that do not belong to the expected asset schema. This check validates that the uploaded asset has a correct top-level structure matching the expected schema for its asset type, including the right root class, name, and required children. Only instances defined in the schema are permitted in the asset tree. `A child body part cannot extend above its parent part. Adjust how the parts are put together by moving the rig attachment.` This error fires when a child body part's bounding box extends higher than its parent part's bounding box at their connection point.

To fix this, move the rig attachment that connects these parts to reposition the child part lower, or adjust the mesh geometry so it stays within the vertical extent of the parent. This check ensures that connected body parts in a character body upload maintain proper vertical ordering so that child parts do not extend above their parent parts. This prevents body parts from visually clipping through each other during animation. `A parent body part cannot extend below its child part. Adjust how the parts are put together by moving the rig attachment.` This error fires when a parent body part's bounding box extends lower than its child part's bounding box at their connection point.

To fix this, move the rig attachment that connects these parts to reposition the parent part higher, or adjust the mesh geometry so the parent stays above the child at the joint. This check ensures that connected body parts in a character body upload maintain proper vertical ordering so that parent parts do not extend below their child parts. This prevents body parts from visually clipping through each other during animation. `FACS was detected shrinking your head, but altering the head size is against Marketplace policy for facial animations.` This error fires when one or more [FACS poses](/docs/roblox-avatar-dynamic-heads-specifications#facs-poses) cause the head mesh to shrink below the minimum allowed percentage of its original size (default: 95%).

To fix this, adjust your facial blend shapes so they only move facial features without reducing the overall head volume. This check ensures that FACS poses on a dynamic head do not significantly alter the overall head size. The head mesh must remain consistent in scale across all FACS pose combinations to prevent abuse or visual glitches. `FACS was detected expanding your head, but altering the head size is against Marketplace policy for facial animations.` This error fires when one or more FACS poses cause the head mesh to expand above the maximum allowed percentage of its original size (default: 120%).

To fix this, adjust your facial blend shapes so they only move facial features without increasing the overall head volume. This check ensures that FACS poses on a dynamic head do not significantly alter the overall head size. The head mesh must remain consistent in scale across all FACS pose combinations to prevent abuse or visual glitches. `Failed to validate facial animation joint bounds, please try again later.` This error fires when the validation system itself encounters an error while attempting to compute joint distance metrics, rather than indicating a content problem.

To fix this, retry the upload; if it persists, ensure the head mesh FACS data is not corrupted. This check validates that FACS-driven joint transforms on a dynamic head stay within acceptable distance bounds, preventing joints from being pushed unreasonably far outside the head during facial animations. It measures both direct (single-pose) and accumulated (combined-pose) joint displacement. `Head facial animation results in joints being moved substantially outside of the head. Please edit your facial animations and try again.` This error fires when a single facial animation pose (such as `JawDrop` or `LeftEyeClosed`) moves a joint too far from its rest position relative to the head size.

To fix this, reduce the intensity of the specific FACS control listed so the affected joints stay closer to the head surface. This check validates that FACS-driven joint transforms on a dynamic head stay within acceptable distance bounds, preventing joints from being pushed unreasonably far outside the head during facial animations. It measures the maximum displacement any single FACS action causes on any joint. `Head facial animations can be combined to extend a joint far outside the head. Please edit your facial animations and try again.` This error fires when the additive effect of multiple facial animation poses pushes a specific joint beyond the maximum allowed distance from its rest position.

To fix this, reduce the displacement magnitude across multiple FACS controls that affect the named joint so their combined effect stays within bounds. This check validates that FACS-driven joint transforms on a dynamic head stay within acceptable distance bounds, preventing joints from being pushed unreasonably far outside the head during facial animations. It measures the worst-case accumulated displacement when multiple FACS poses are combined. `Head MeshPart has facial animations for a joint which cannot be used in FACS. Please rename this joint then reimport your head.` This error fires when the head mesh's FACS data references a joint name that is reserved for the body skeleton (such as the standardized [rigging](/docs/roblox-avatar-character-bodies-specifications#rigging) joint names or allowed [skinning transfer](/docs/roblox-avatar-automatic-skinning-transfer) names).

To fix this, rename the conflicting joint in your 3D modeling software to a non-reserved name and re-export the head. This check ensures that FACS data on a dynamic head does not drive joints that belong to the [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy or skinning transfer schema. FACS should only animate facial-specific joints, not body rig joints. `Missing HSR data. Please try again.` This error fires when a [`BaseWrap`](/docs/basewrap) instance in your asset reports that its Hidden Surface Removal (HSR) data is not ready, meaning the pre-processing step was not completed before upload.

To fix this, regenerate the asset using the [Accessory Fitting Tool](/docs/roblox-avatar-accessory-fitting-tool), which will trigger HSR computation, then try uploading again. This check validates that all [`WrapLayer`](/docs/wraplayer) and [`BaseWrap`](/docs/basewrap) instances in your asset have their HSR data fully generated. HSR data allows the engine to efficiently hide parts of the body mesh that are occluded by layered accessories. `WrapLayer HSR asset does not have exactly 1 HiddenSurfaceRemovalAsset root.` This error fires when the loaded Hidden Surface Removal (HSR) asset does not contain exactly one [`HiddenSurfaceRemovalAsset`](/docs/hiddensurfaceremovalasset) instance at its root, indicating a malformed or corrupted HSR asset.

To fix this, regenerate the HSR data using the [Accessory Fitting Tool](/docs/roblox-avatar-accessory-fitting-tool), then try uploading again. This check validates that the HSR assets linked to each [`WrapLayer`](/docs/wraplayer) have the correct internal structure and that their mesh IDs match the associated clothing mesh. HSR assets enable efficient body-mesh occlusion under layered accessories. `WrapLayer HSR asset has children under the HiddenSurfaceRemovalAsset root Instance.` This error fires when the [`HiddenSurfaceRemovalAsset`](/docs/hiddensurfaceremovalasset) root has child instances underneath it, which is not permitted by the expected structure.

To fix this, regenerate the Hidden Surface Removal (HSR) data using the [Accessory Fitting Tool](/docs/roblox-avatar-accessory-fitting-tool) to produce a correctly-structured HSR asset, then try uploading again This check validates that the Hidden Surface Removal (HSR) assets linked to each [`WrapLayer`](/docs/wraplayer) have the correct internal structure and that their mesh IDs match the associated layered accessory mesh. The HSR asset must be a leaf node with no descendants. `WrapLayer requires an HSRAssetId to be set.` This error fires when a [`WrapLayer.HSRAssetId`](/docs/wraplayer) property is empty during a backend publish operation, meaning no Hidden Surface Removal (HSR) data has been associated with the layered accessory layer.

To fix this, generate HSR data using the [Accessory Fitting Tool](/docs/roblox-avatar-accessory-fitting-tool) before publishing. This check validates that the HSR assets linked to each [`WrapLayer`](/docs/wraplayer) have the correct internal structure and that their mesh IDs match the associated clothing mesh. On server-side (backend) uploads, the HSR asset reference must be populated. `WrapLayer has an HSRAssetId with an invalid URL.` This error fires when the [`WrapLayer.HSRAssetId`](/docs/wraplayer) property contains a string that cannot be parsed into a valid asset ID.

To fix this, regenerate the Hidden Surface Removal (HSR) data with the [Accessory Fitting Tool](/docs/roblox-avatar-accessory-fitting-tool) to ensure a properly formatted asset reference is assigned. This check validates that the HSR assets linked to each [`WrapLayer`](/docs/wraplayer) have the correct internal structure and that their mesh IDs match the associated clothing mesh. The [`WrapLayer.HSRAssetId`](/docs/wraplayer) field must contain a valid, parseable asset URL. `Error occurred while validating HSR Mesh Ids.` This error fires when the engine encounters an error while attempting to compare the Hidden Surface Removal (HSR) mesh IDs with the [`WrapLayer`](/docs/wraplayer) mesh IDs, rather than indicating a mismatch.

To fix this, retry the upload; if the issue persists, regenerate the HSR data using the [Accessory Fitting Tool](/docs/roblox-avatar-accessory-fitting-tool). This check validates that the HSR assets linked to each [`WrapLayer`](/docs/wraplayer) have the correct internal structure and that their mesh IDs match the associated clothing mesh. The engine performs a mesh ID comparison to ensure the HSR data corresponds to the current clothing mesh. `Invalid HSR data detected. Please re-generate the asset using the Accessory Fitting Tool and try again.` This error fires when the mesh IDs embedded in the Hidden Surface Removal (HSR) asset do not match the mesh IDs of the current [`WrapLayer`](/docs/wraplayer), meaning the HSR data is stale or was generated from a different version of the mesh.

To fix this, re-run the [Accessory Fitting Tool](/docs/roblox-avatar-accessory-fitting-tool) on the current mesh to regenerate matching HSR data. This check validates that the HSR assets linked to each [`WrapLayer`](/docs/wraplayer) have the correct internal structure and that their mesh IDs match the associated clothing mesh. The HSR data must have been generated from the exact same mesh currently on the [`WrapLayer`](/docs/wraplayer). `Found Bone, but you must use HumanoidRigDescription to use Bones.` This error fires when [`Bone`](/docs/bone) instances exist inside a [`MeshPart`](/docs/meshpart) that does not have a [`HumanoidRigDescription`](/docs/humanoidrigdescription) child, meaning the bones cannot be properly interpreted by the animation system.

To fix this, either add a correctly configured [`HumanoidRigDescription`](/docs/humanoidrigdescription) to the [`MeshPart`](/docs/meshpart), or remove the [`Bone`](/docs/bone) instances. This check validates that the bone hierarchy within each [`MeshPart`](/docs/meshpart) of an avatar body or dynamic head conforms to the [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy and is correctly registered in the [`HumanoidRigDescription`](/docs/humanoidrigdescription). Any [`Bone`](/docs/bone) instances require an associated [`HumanoidRigDescription`](/docs/humanoidrigdescription) to define how the skeleton is structured. `You cannot include a DigitsRigDescription without a HumanoidRigDescription.` This error fires when a [`DigitsRigDescription`](/docs/digitsrigdescription) exists on a [`MeshPart`](/docs/meshpart) that has no [`HumanoidRigDescription`](/docs/humanoidrigdescription).

To fix this, add a [`HumanoidRigDescription`](/docs/humanoidrigdescription) to the same [`MeshPart`](/docs/meshpart), or remove the [`DigitsRigDescription`](/docs/digitsrigdescription) if finger articulation is not needed. This check validates that the bone hierarchy within each [`MeshPart`](/docs/meshpart) of an avatar body or dynamic head conforms to the [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy and is correctly registered in the [`HumanoidRigDescription`](/docs/humanoidrigdescription). A [`DigitsRigDescription`](/docs/digitsrigdescription) requires an accompanying [`HumanoidRigDescription`](/docs/humanoidrigdescription) as the primary rig definition. `Instance is in a bone tree but not part of the defined R15plus schema.` This error fires when an instance (bone or other object) exists in the bone hierarchy but its name and class combination is not recognized by the [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy.

To fix this, remove or rename the instance to match one of the allowed bone/attachment names in the advanced R15 rig hierarchy. This check validates that the bone hierarchy within each [`MeshPart`](/docs/meshpart) of an avatar body or dynamic head conforms to the [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy and is correctly registered in the [`HumanoidRigDescription`](/docs/humanoidrigdescription). Every instance that appears as a descendant of a [`Bone`](/docs/bone) must be defined in the expected advanced R15 rig hierarchy. `Instance shows up more than once, but may only exist once within a bone hierarchy.` This error fires when two or more instances share the same name within a single [`MeshPart`](/docs/meshpart) instance's bone tree, creating ambiguity in the rig definition.

To fix this, remove or rename the duplicate instances so each bone name appears exactly once in the hierarchy. This check validates that the bone hierarchy within each [`MeshPart`](/docs/meshpart) of an avatar body or dynamic head conforms to the [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy and is correctly registered in the [`HumanoidRigDescription`](/docs/humanoidrigdescription). Each named bone or attachment must appear exactly once in the hierarchy. `Bone is allowed, but you must map it explicitly in the HumanoidRigDescription or DigitsRigDescription.` This error fires when a bone has a valid schema name and exists in the hierarchy, but is not mapped in the [`HumanoidRigDescription`](/docs/humanoidrigdescription) or [`DigitsRigDescription`](/docs/digitsrigdescription).

To fix this, update the [`HumanoidRigDescription`](/docs/humanoidrigdescription)/[`DigitsRigDescription`](/docs/digitsrigdescription) to link to this bone instance using the correct joint label. This check validates that the bone hierarchy within each [`MeshPart`](/docs/meshpart) of an avatar body or dynamic head conforms to the [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy and is correctly registered in the [`HumanoidRigDescription`](/docs/humanoidrigdescription). Each [`Bone`](/docs/bone) instance must be explicitly linked in the [`HumanoidRigDescription`](/docs/humanoidrigdescription) or [`DigitsRigDescription`](/docs/digitsrigdescription) so the animation system knows how to drive it. `Instance is underneath the wrong parent based on the existing bone hierarchy.` This error fires when an instance is parented to the wrong bone or attachment relative to what the [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy expects given the other bones present.

To fix this, reparent the instance to the correct parent as indicated in the error message. This check validates that the bone hierarchy within each [`MeshPart`](/docs/meshpart) of an avatar body or dynamic head conforms to the [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy and is correctly registered in the [`HumanoidRigDescription`](/docs/humanoidrigdescription). The parent-child relationships between bones and attachments must follow the schema-defined hierarchy. `Failed to load texture field for Decal. Make sure TextureContent exists and is valid and try again.` This error fires when a specific texture field on the [`Decal`](/docs/decal) instance cannot be loaded, such as [`ColorMap`](/docs/decal#decal-colormap) abd[`MetalnessMap`](/docs/decal#decal-metalnessmap).

To fix this, verify that the [`Decal.TextureContent`](/docs/decal#decal-texturecontent) property references a valid, uploaded texture asset and that the asset has not been deleted or corrupted. This check validates that all texture maps on a makeup decal can be successfully loaded and read by the system. Makeup assets rely on texture data to render correctly on the avatar's face, so every referenced texture field must point to accessible, valid content. `Failed to load texture data. Make sure the texture exists and try again.` This error fires when the system locates the texture but cannot extract its pixel dimensions or contents.

To fix this, re-upload the texture asset or ensure it was not corrupted during export from your image editor. This check validates that the pixel data of a makeup decal texture can be read after the texture reference is resolved. Even if a texture asset exists, its underlying image data must be readable so the system can verify resolution and UV coverage. `Texture resolution is higher than the maximum supported size for that texture field.` This error fires when a texture's width or height exceeds the per- field maximum, such as 1024x1024 for [`Decal.ColorMap`](/docs/decal#decal-colormap).

To fix this, resize the texture in your image editor to fit within the stated limit before re-uploading. This check validates that each texture map on a makeup decal does not exceed the maximum allowed pixel dimensions. Oversized textures consume excessive memory and bandwidth, degrading performance for all users. `No ColorMap found for Decal. Makeup Decals are required to have a valid ColorMap.` This error fires when the [`Decal`](/docs/decal) instance has no valid [`ColorMap`](/docs/decal#decal-colormap) content set.

To fix this, add a [`ColorMap`](/docs/decal#decal-colormap) texture to your makeup decal asset before uploading. This check validates that every makeup decal has a [`ColorMap`](/docs/decal#decal-colormap) texture assigned. The [`ColorMap`](/docs/decal#decal-colormap) is the primary visual layer that defines what the makeup looks like on the avatar's face, so it is mandatory for all makeup assets. `Opaque area of ColorMap does not fall within the allowed UV area for this asset type.` This error fires when too many opaque pixels exist outside the allowed UV bounding area.

To fix this, adjust your texture so that all visible content falls within the permitted zone for your makeup type. This check validates that the visible (opaque) pixels of a makeup [`ColorMap`](/docs/decal#decal-colormap) are positioned within the designated UV region for the makeup type. Each makeup category (lip, eye, face) has a defined include zone on the UV map, and content must stay within it to render correctly. `Opaque pixels in ColorMap were found within a restricted UV area for this asset type.` This error fires when too many opaque pixels are detected inside a restricted bounding area.

To fix this, edit your texture to remove or make transparent any content that overlaps with the excluded region for your makeup type. This check validates that the visible (opaque) pixels of a makeup [`ColorMap`](/docs/decal#decal-colormap) do not intrude into restricted UV zones. Certain regions of the UV map are designated as exclusion zones to prevent makeup from rendering in inappropriate areas of the face. `Instances have an invalid material. Only approved materials are allowed.` This error fires when a [`MeshPart`](/docs/meshpart) or other [`BasePart`](/docs/basepart) uses a material not in the allowed set.

To fix this, change the material of the flagged part to one of the accepted values (such as `Plastic`, `SmoothPlastic`, etc.) in your 3D modeling tool or Studio properties. This check validates that all [`BasePart`](/docs/basepart) instances in the asset use only materials from the approved list. Restricting materials ensures visual consistency across the platform and prevents use of materials that may not render correctly in all contexts. `Position is outside of bounds.` This error fires when the **Handle** mesh's position or the computed bounds center exceeds the valid coordinate range.

To fix this, reset the position of your accessory in your modeling tool so it is near the origin before exporting. This check validates that the accessory mesh and its attachment are positioned within a reasonable coordinate range in world space. Extreme positions (beyond 10,000 studs on any axis) indicate a malformed or corrupted asset that would not render correctly. `Mesh scale is too small.` This error fires when any axis of the mesh scale falls below the minimum allowed value.

To fix this, increase the scale of your mesh in your 3D modeling software or verify that the [`MeshPart`](/docs/meshpart) size is set correctly before re-uploading. This check validates that the accessory's render mesh scale meets the minimum threshold on all axes. Meshes scaled to near-zero are effectively invisible and likely indicate an export error or misconfigured asset. `Mesh scale is too large.` This error fires when any axis of the mesh scale exceeds the maximum allowed value.

To fix this, reduce the mesh scale in your 3D modeling software or adjust the [`MeshPart`](/docs/meshpart) size in Studio to stay within the permitted range. This check validates that the accessory's render mesh scale does not exceed the maximum threshold on any axis. Excessively large mesh scales can cause rendering issues, physics instability, and unfair gameplay advantages. `Mesh has size larger than the maximum allowed bounding size for its accessory type.` This error fires when one or more mesh vertices extend beyond the permitted bounding box.

To fix this, reduce the overall size of your mesh or reposition it closer to the attachment point in your modeling tool. This check validates that all vertices of the accessory's render mesh fit within the maximum bounding box defined for that attachment point. Each accessory type has a specific allowable volume to prevent oversized items that clip through the environment or other avatars. `Mesh data is not centered. Please reimport with the Roblox 3D importer and ensure there is no loose geometry.` This error fires when the bounding box center of the mesh exceeds the acceptable distance from the origin.

To fix this, re-center your mesh at the origin in your 3D modeling software and remove any stray geometry before re-exporting. This check validates that the geometric center of the accessory mesh is near the origin (center of its bounding box). An off-center mesh indicates the instance was not properly aligned before export, which causes it to appear offset when worn. `Mesh failed to load. Make sure the mesh exists and try again.` This error fires when the mesh data cannot be loaded from the [`MeshId`](/docs/meshpart#meshpart-meshid) reference.

To fix this, verify that the [`MeshPart`](/docs/meshpart) has a valid [`MeshId`](/docs/meshpart#meshpart-meshid) pointing to an uploaded, accessible mesh asset and re-upload if needed. This check validates that the render mesh for a [body part](/docs/roblox-avatar-character-bodies-specifications#body-parts) can be loaded successfully for size verification. The system needs to read the actual mesh geometry to compute its true dimensions and compare against the stored [`MeshPart.MeshSize`](/docs/meshpart) property. `Calculated mesh size does not match the MeshSize property value.` This error fires when the computed mesh extents differ from the [`MeshPart.MeshSize`](/docs/meshpart) value.

To fix this, re-import the mesh through the [Importer](/docs/roblox-studio-importer), which automatically computes the correct [`MeshPart.MeshSize`](/docs/meshpart) rather than setting it manually. This check validates that the [`MeshPart.MeshSize`](/docs/meshpart) property stored on a [`MeshPart`](/docs/meshpart) accurately reflects the actual computed dimensions of its mesh geometry. A mismatch indicates the mesh was modified after the property was set, or the property was manually altered, which can cause incorrect physics and rendering behavior. `A required attachment must exist exactly once within the body part's descendants.` This error fires when a required attachment is missing or appears more than once (or as the wrong class) within a [`MeshPart`](/docs/meshpart) instance's descendants.

To fix this, add the missing attachment to the correct body part in Studio with the [exact expected name](/docs/roblox-avatar-character-bodies-specifications#attachments) and ensure it is a [`Attachment`](/docs/attachment) instance. This check validates that each body part mesh contains all required joint and rig attachments defined in the [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy. These attachments are necessary for the avatar rig to assemble correctly and for animations and accessories to attach at the proper points. `A joint property is set in the HRD/DRD outside the acceptable range.` This error fires when a joint's size or range value in the [`HumanoidRigDescription`](/docs/humanoidrigdescription) or [`DigitsRigDescription`](/docs/digitsrigdescription) exceeds the permitted minimum or maximum.

To fix this, adjust the specified property value in your rig description to fall within the allowed range shown in the error message. This check validates that all numeric properties on the [`HumanoidRigDescription`](/docs/humanoidrigdescription) and [`DigitsRigDescription`](/docs/digitsrigdescription) fall within acceptable bounds. These properties control joint size, range of motion, and origin offset for the [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) skeleton. `HumanoidRigDescription has an originOffset outside of bounds. OriginOffset must have no rotation and be within acceptable limits.` This error fires when the `LowerTorso` [`HumanoidRigDescription.OriginOffset`](/docs/humanoidrigdescription#humanoidrigdescription-originoffset) has a non-identity rotation or its vertical position is outside the allowed Y range.

To fix this, reset the [`OriginOffset`](/docs/humanoidrigdescription#humanoidrigdescription-originoffset) rotation to identity and ensure the Y position stays within the permitted bounds. This check validates that all numeric properties on the [`HumanoidRigDescription`](/docs/humanoidrigdescription) and [`DigitsRigDescription`](/docs/digitsrigdescription) fall within acceptable bounds. The [`OriginOffset`](/docs/humanoidrigdescription#humanoidrigdescription-originoffset) on the `LowerTorso`'s [`HumanoidRigDescription`](/docs/humanoidrigdescription) defines the avatar's ground-level offset and must stay within vertical limits with no rotation. `HRD property is referenced by the instance but is not part of the contained joint list for that MeshPart.` This error fires when the [`HumanoidRigDescription`](/docs/humanoidrigdescription) references a joint that the engine reports is not contained within the current [`MeshPart`](/docs/meshpart), which can happen if the [`HumanoidRigDescription`](/docs/humanoidrigdescription) is at the wrong level of the hierarchy or if joints are misconfigured.

To fix this, ensure each [`HumanoidRigDescription`](/docs/humanoidrigdescription) is placed on the correct [`MeshPart`](/docs/meshpart) that actually contains its referenced joints. This check validates that all numeric properties on the [`HumanoidRigDescription`](/docs/humanoidrigdescription) and [`DigitsRigDescription`](/docs/digitsrigdescription) fall within acceptable bounds. Each joint referenced in the [`HumanoidRigDescription`](/docs/humanoidrigdescription) must belong to the set of joints contained by the [`MeshPart`](/docs/meshpart) it lives under. `A standard R15 joint rig attachment is not connected to the HRD.` This error fires when a [standard R15 rig](/docs/roblox-avatar-character-bodies-specifications#standard-r15-rigs) joint's rig attachment exists on a [`MeshPart`](/docs/meshpart) but the [`HumanoidRigDescription`](/docs/humanoidrigdescription) does not link to it, often because the [`HumanoidRigDescription`](/docs/humanoidrigdescription) is configured for [`Motor6D`](/docs/motor6d) joints instead of `Class.AttachmentConstraint` joints.

To fix this, update your [`HumanoidRigDescription`](/docs/humanoidrigdescription) to link to the correct rig attachment instance. This check validates that all numeric properties on the [`HumanoidRigDescription`](/docs/humanoidrigdescription) and [`DigitsRigDescription`](/docs/digitsrigdescription) fall within acceptable bounds and that standard R15 rig joints are properly linked. Each body part that has a rig attachment must have that attachment correctly referenced by the [`HumanoidRigDescription`](/docs/humanoidrigdescription). `Optional joint is incorrectly mapped in the HRD. It must be mapped to the correct bone.` This error fires when an optional joint in the [`HumanoidRigDescription`](/docs/humanoidrigdescription) points to an instance that does not match the expected bone name, indicating a wiring error in the rig description.

To fix this, update the [`HumanoidRigDescription`](/docs/humanoidrigdescription) joint mapping to point to the correctly-named [`Bone`](/docs/bone) instance. This check validates that all numeric properties on the [`HumanoidRigDescription`](/docs/humanoidrigdescription) and [`DigitsRigDescription`](/docs/digitsrigdescription) fall within acceptable bounds and that joint mappings point to the correct instances. Optional joints that are present must be mapped to a [`Bone`](/docs/bone) with the matching name. `A joint has a range set in the HRD where the minimum is larger than the maximum, which is not a valid range.` This error fires when any component of a joint's minimum range vector exceeds the corresponding component of its maximum range vector.

To fix this, fix the [`HumanoidRigDescription`](/docs/humanoidrigdescription) range values so that `rangeMin` is less than or equal to `rangeMax` on all three axes. This check validates that all numeric properties on the [`HumanoidRigDescription`](/docs/humanoidrigdescription) and [`DigitsRigDescription`](/docs/digitsrigdescription) fall within acceptable bounds. Joint range values define limits of motion, so the minimum must be less than or equal to the maximum on each axis. `DigitsRigDescription side property does not match the body part it is placed on.` This error fires when a [`DigitsRigDescription.Side`](/docs/digitsrigdescription#digitsrigdescription-side) property does not match the hand part it is placed on.

To fix this, change the `Side` property to match the [`MeshPart`](/docs/meshpart) name. A [`DigitsRigDescription`](/docs/digitsrigdescription) on a `LeftHand` must have [`Side`](/docs/digitsrigdescription#digitsrigdescription-side) set to `Left`, and `RightHand` must have [`Side`](/docs/digitsrigdescription#digitsrigdescription-side) set to `Right`. This check validates that all numeric properties on the [`HumanoidRigDescription`](/docs/humanoidrigdescription) and [`DigitsRigDescription`](/docs/digitsrigdescription) fall within acceptable bounds and that [`DigitsRigDescription`](/docs/digitsrigdescription) instances are configured for the correct hand. `MeshPart mesh size is smaller than the minimum allowed individual part size. Scale up the mesh.` This error fires when one axis of a mesh's scaled mesh size falls below the minimum threshold (default: 0.05 studs). The affected part is too small to render or interact with properly.

To fix this, scale up the mesh in your 3D modeling software so all axes meet the minimum size requirement. This check validates that each individual [`MeshPart`](/docs/meshpart) in an avatar or dynamic head upload has physical dimensions (width, height, depth) that fall within acceptable size thresholds. Each axis of each part is checked independently against minimum and maximum bounds. `MeshPart mesh size is larger than the maximum allowed individual part size. Scale down the mesh.` This error fires when one axis of a mesh's scaled mesh size exceeds the maximum threshold (default: 4.0 studs). The affected part is too large for the avatar system.

To fix this, scale down the mesh in your 3D modeling software so all axes stay within the maximum size limit. This check validates that each individual [`MeshPart`](/docs/meshpart) in an avatar or dynamic head has physical dimensions (width, height, depth) that fall within acceptable size thresholds. Each axis of each part is checked independently against minimum and maximum bounds. `Instance has a name that is reserved and cannot be used in Marketplace assets.` This error fires when the root instance or any descendant has a name that matches a reserved/banned name list.

To fix this, rename the affected instance to something that does not conflict with Roblox reserved names. This check scans all instances in your asset tree for names and class types that are not permitted in Marketplace uploads. Certain instance names are reserved by the Roblox engine for internal use and cannot appear in user-uploaded content. `Instance is of a type which is not allowed in Marketplace assets.` This error fires when a descendant instance is of a class type that appears on the banned list.

To fix this, remove the offending instance entirely, as its class type cannot be included in Marketplace assets regardless of its content. This check scans all instances in your asset tree for names and class types that are not permitted in Marketplace uploads. Certain instance classes (such as [`Scripts`](/docs/script) or other restricted types) are prohibited in Marketplace content for security and compatibility reasons. `Instance named JointRotation is reserved for attachments that are children of an attachment.` This error fires when an instance named `JointRotation` exists but is not a [`Attachment`](/docs/attachment) or its parent is not a [`Attachment`](/docs/attachment).

To fix this, ensure any instance named `JointRotation` is of [`Attachment`](/docs/attachment) and is a direct child of a rig attachment (e.g., `LeftShoulderRigAttachment` or `RightShoulderRigAttachment`). This check validates that `JointRotation` attachment instances in an avatar or dynamic head conform to the [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy requirements for joint rotation overrides. `JointRotation` must be a [`Attachment`](/docs/attachment) parented to another [`Attachment`](/docs/attachment). `Instance has a JointRotation child, but this is not part of the allowed R15plus schema.` This error fires when a `JointRotation` attachment is parented to an attachment that is not on the allowed list (`LeftShoulderRigAttachment` and `RightShoulderRigAttachment`).

To fix this, move or remove the `JointRotation` from the unsupported parent attachment. This check validates that `JointRotation` attachment instances in an avatar or dynamic head conform to the [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy requirements for joint rotation overrides. `JointRotation` children are only permitted on specific recognized rig attachments. `A rig attachment cannot have more than 1 JointRotation child.` This error fires when a single rig attachment has two or more `JointRotation` children.

To fix this, remove the extra `JointRotation` instances so that only one remains per parent attachment. This check validates that `JointRotation` attachment instances in an avatar or dynamic head conform to the [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy requirements for joint rotation overrides. Each allowed parent attachment may contain at most one `JointRotation` child. `JointRotation has been rotated, but Marketplace uploads may not adjust this instance yet. Please reset orientation.` This error fires when the `JointRotation` attachment's orientation deviates more than the allowed threshold (default: 1 degree) from the expected rotation for this asset type and parent.

To fix this, reset the `JointRotation` [`CFrame`](/docs/cframe) orientation to the expected value shown in the error message. This check validates that `JointRotation` attachment instances in an avatar or dynamic head conform to the [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy requirements for joint rotation overrides. For specific asset types, the `JointRotation` orientation must match a predefined expected value. `JointRotation has been moved, but Marketplace uploads may not adjust this instance yet. Please reset position.` This error fires when the `JointRotation` attachment's position deviates more than the allowed threshold from the zero vector.

To fix this, reset the `JointRotation` [`CFrame`](/docs/cframe) position to (`0`, `0`, `0`) relative to its parent attachment. This check validates that `JointRotation` attachment instances in an avatar or dynamic head conform to the [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy requirements for joint rotation overrides. `JointRotation` attachments must remain at the origin position of their parent attachment. `Detected too many coplanar triangles intersecting in the model mesh. Edit the mesh to reduce coplanar triangle intersections.` This error fires when the percentage of coplanar intersecting triangles exceeds the allowed maximum.

To fix this, clean up overlapping faces in your 3D modeling software by merging coincident vertices, removing duplicate faces, or adjusting geometry so triangles do not occupy the same plane. This check validates that a render mesh does not have an excessive number of coplanar intersecting triangles. Coplanar intersections (overlapping flat triangles in the same plane) cause Z- fighting visual artifacts, degrade rendering performance, and indicate poor mesh topology. `Instances have tags but Marketplace assets cannot have any tags.` This error fires when one or more instances in the asset tree have tags.

To fix this, remove all tags from every instance in your asset before uploading. This check validates that no instances in the asset hierarchy, including hidden surface removal assets, have [`CollectionService`](/docs/collectionservice) tags assigned to them. Tags on Marketplace assets could be exploited to interfere with game systems that use tag-based logic, creating security and gameplay integrity risks. `Failed to calculate asset CFrame. Make sure the character is in I pose, A pose, or T pose, and the parts are not all in the same position.` This error fires when the pose calculation fails entirely, usually because body parts are stacked at the same coordinates or attachments are missing.

To fix this, ensure your avatar's body parts are arranged in a valid I, A, or T pose with proper spatial separation between limbs. This check validates that the system can compute the orientation and position of an arm or leg body part to verify it is posed correctly. The [`CFrame`](/docs/cframe) calculation requires the parts to be spatially distinct and properly assembled. `Body part is pointing along the world Z vector. Make sure the character is in I pose, A pose, or T pose.` This error fires when the Y-axis projection of the limb onto the XY plane has zero length.

To fix this, rotate the body part so it points outward or downward (consistent with I, A, or T pose) rather than forward along the Z axis. This check validates that arm and leg body parts are not oriented straight along the Z axis (pointing forward or backward). A limb aligned with the Z axis cannot be properly evaluated for its rest pose angle and indicates the model was exported with incorrect orientation. `Body part is at too steep an angle from the X,Y plane. Make sure the character is in I pose, A pose, or T pose.` This error fires when the limb's angle away from the XY plane exceeds the allowed threshold.

To fix this, adjust the rotation of the affected arm or leg in your 3D modeling software so it lies closer to the horizontal plane in your rest pose. This check validates that arm and leg body parts do not tilt too far out of the horizontal XY plane. Limbs in a standard rest pose should be roughly parallel to the ground plane, with only minor deviation allowed (default: 20 degrees). `Body part angle on the X,Y plane is outside the acceptable range. Make sure the character is in I pose, A pose, or T pose.` This error fires when the limb's angle from the X axis on the XY plane is outside the acceptable minimum and maximum range for its type.

To fix this, adjust the limb rotation in your 3D modeling software to match a standard I, A, or T pose orientation. This check validates that the projected angle of an arm or leg on the XY plane falls within the expected range for that limb type. Arms should extend roughly outward (between I pose and T pose angles) and legs should point roughly downward. `Instance has invalid properties that may contain NaN/Inf values or strings that are too long.` This error fires when the engine's property validation detects problematic values on an instance.

To fix this, inspect the flagged instance's properties in Studio and reset any that show unusual values. Re-import the asset if properties were corrupted during export. This check validates that all property values on every instance in the asset are numerically valid and within reasonable size limits. Properties containing NaN (Not a Number), infinity, or excessively long strings can crash clients, corrupt save data, or be used for exploits. `A required property was not found on the instance.` This error fires when a property that should exist on a given class cannot be read from the instance.

To fix this, ensure you are using the correct instance class and that your Studio version is up to date, then re-export the asset. This check validates that all instances in the asset have the properties expected for their class according to the validation schema. Missing properties can indicate an incompatible engine version, a corrupted instance, or an incorrect class being used. `A property value on the instance is invalid or outside the expected range.` This error fires when a property value fails a comparison test, such as being too large, not equal to the expected value, or not in the allowed list.

To fix this, check the flagged property on the indicated instance and set it to the expected value as specified in the error details. This check validates that properties on asset instances hold values that meet the required constraints, such as exact match, range bounds, or allowed set. Incorrect property values can cause visual glitches, physics problems, or incompatibility with the avatar system. `Rigid accessory has skinning data which is not supported. Ensure bones are not imported with the mesh.` This error fires when the **Handle** mesh of a rigid accessory contains one or more bones.

To fix this, remove all armature/skeleton data from your mesh in your 3D modeling software before exporting, or export without the skeleton option enabled. This check validates that rigid accessories do not contain any skinning or bone data in their mesh. Rigid accessories attach to the avatar at a fixed point and should not deform, so the presence of bones indicates an incorrect export configuration. `The AvatarPartScaleType value is invalid. Accepted values are Classic, ProportionsSlender, or ProportionsNormal.` This error fires when an **AvatarPartScaleType** [`StringValue`](/docs/stringvalue) has a value other than `Classic`, `ProportionsSlender`, or `ProportionsNormal`.

To fix this, change the `Value` property of the **AvatarPartScaleType** instance to one of the three accepted strings. This check validates that any **AvatarPartScaleType** [`StringValue`](/docs/stringvalue) instances in the asset contain one of the three recognized scale types. The scale type controls how the body part scales with avatar proportions sliders and must be a recognized value for the system to function correctly. `To upload an asset to Roblox, you must select exactly 1 instance and the associated upload type.` This error fires when the upload input contains anything other than exactly one instance.

To fix this, select only a single root instance (the top-level [`Accessory`](/docs/accessory), [`MeshPart`](/docs/meshpart), or other asset root) before initiating the upload process. This check validates that exactly one root instance has been provided for upload when the asset type does not use the [standard R15 rig](/docs/roblox-avatar-character-bodies-specifications#standard-r15-rigs) [`Folder`](/docs/folder) structure. Submitting zero or multiple instances would create ambiguity about which instance to publish. `Upload format does not match expected folder structure. Please try again or file a bug report.` This error fires when the upload does not contain all three required folders, when R6 has unexpected children, or when the [`Folder`](/docs/folder) contents do not match.

To fix this, ensure your body part export follows the [standard R15 rig](/docs/roblox-avatar-character-bodies-specifications#standard-r15-rigs) [`Folder`](/docs/folder) [template](/docs/roblox-avatar-resources#project-files) with matching `R15ArtistIntent` and `R15Fixed` content. This check validates that body part uploads using the [standard R15 rig](/docs/roblox-avatar-character-bodies-specifications#standard-r15-rigs) [`Folder`](/docs/folder) structure contain exactly three properly named folders (`R15ArtistIntent`, `R15Fixed`, and `R6`) with the correct hierarchy. This structure is required for body parts that support multiple avatar scale configurations. `SurfaceAppearance has an invalid AlphaMode. Expected Overlay.` This error fires when a [`SurfaceAppearance`](/docs/surfaceappearance) instance uses any [`AlphaMode`](/docs/surfaceappearance#surfaceappearance-alphamode) other than `Overlay`, such as `Transparency`.

To fix this, change the [`AlphaMode`](/docs/surfaceappearance#surfaceappearance-alphamode) to `Overlay` in Studio's Properties window. This check validates that [`SurfaceAppearance`](/docs/surfaceappearance) instances on rigid accessories have their [`AlphaMode`](/docs/surfaceappearance#surfaceappearance-alphamode) set to `Overlay`. The `Overlay` alpha mode is required to ensure consistent transparency handling and prevent visual artifacts on accessories. `Your layered clothing deforms beyond the acceptable size when placed on an avatar.` This error fires when the layered accessory mesh, after the engine simulates draping it on the body, produces a bounding box larger than the configured maximum for its attachment type.

To fix this, reduce the overall size of your clothing mesh or adjust the [outer cage](/docs/roblox-avatar-layered-accessories-specifications#outer-cage) so the garment conforms more tightly to the body when deformed. This check measures the post-deformation size of the layered accessory after it has been fitted onto a reference avatar body, ensuring the deformed garment does not exceed the maximum allowed dimensions. Oversized deformed clothing can cause rendering and clipping issues. `Handle contains a skinning transfer joint, which is only allowed when WrapLayer.AutoSkin is set to EnabledOverride.` This error fires when the **Handle** mesh contains a [skinning transfer](/docs/roblox-avatar-automatic-skinning-transfer#special-skinning-transfer-joints) joint, such as `RBX_Leader` or `RBX_Follower`, but the [`WrapLayer.AutoSkin`](/docs/wraplayer#wraplayer-autoskin) property is not set to `EnabledOverride`.

To fix this, set [`AutoSkin`](/docs/wraplayer#wraplayer-autoskin) to `EnabledOverride` to enable skinning transfer, or remove the transfer joints from the mesh. This check validates that the skinning (bone weighting) on a layered accessory handle mesh follows the allowed [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy, including correct use of skinning transfer joints for specialized accessory types. Transfer joints enable automatic skin-weight transfer for items like eyelashes. `Handle is skinned to a joint which is not part of the allowed schema. Only standard R15 joints and skinning transfer joints are permitted.` This error fires when the **Handle** mesh contains a bone/joint that is neither a [standard R15 rig](/docs/roblox-avatar-character-bodies-specifications#standard-r15-rigs) joint nor an allowed [skinning transfer](/docs/roblox-avatar-automatic-skinning-transfer#special-skinning-transfer-joints) joint.

To fix this, remove the unrecognized joint from your mesh's skinning data in your 3D modeling software, keeping only [standard R15 rig](/docs/roblox-avatar-character-bodies-specifications#standard-r15-rigs) joints and allowed skinning transfer joints. This check validates that the skinning on a layered accessory **Handle** mesh follows the allowed [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy, including correct use of [skinning transfer](/docs/roblox-avatar-automatic-skinning-transfer#special-skinning-transfer-joints) joints for specialized accessory types. Only recognized joint names are permitted in the mesh bone data. `Vertices skinned to transfer joints must be fully weighted.` This error fires when one or more vertices that are skinned to a transfer joint like have less than full weight assigned to it, meaning other joints share influence on those vertices.

To fix this, in your 3D modeling softwarre, ensure all vertices assigned to transfer joints have their weight fully normalized to those joints alone. This check validates that the skinning on a layered accessory **Handle** mesh follows the allowed [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy, including correct use of [skinning transfer](/docs/roblox-avatar-automatic-skinning-transfer#special-skinning-transfer-joints) joints for specialized accessory types. Vertices assigned to transfer joints must have 100% of their weight on those joints. `This asset type must use skinning transfer. Please set WrapLayer. AutoSkin to EnabledOverride.` This error fires when an eyebrow or eyelash accessory does not have [`WrapLayer.AutoSkin`](/docs/wraplayer#wraplayer-autoskin) set to `EnabledOverride`, which is mandatory for these types to properly follow facial deformation.

To fix this, set the [`AutoSkin`](/docs/wraplayer#wraplayer-autoskin) property to `EnabledOverride`. This check validates that the skinning on a layered accessory **Handle** mesh follows the allowed [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy, including correct use of [skinning transfer](/docs/roblox-avatar-automatic-skinning-transfer#special-skinning-transfer-joints) joints for specialized accessory types. Certain accessory types are required to use the skinning transfer system, such as eyebrows and eyelashes. `This asset type must use skinning transfer, but is missing a required transfer joint.` This error fires when an eyebrow or eyelash accessory is missing one of the required skinning transfer joints from its mesh bone data, such as `RBX_Leader` or `RBX_Follower`.

To fix this, add the missing transfer joint to your mesh's skeleton and properly weight the relevant vertices to it. This check validates that the skinning on a layered accessory **Handle** mesh follows the allowed [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy, including correct use of [skinning transfer](/docs/roblox-avatar-automatic-skinning-transfer#special-skinning-transfer-joints) joints for specialized accessory types. Eyebrow and eyelash accessories must contain all required skinning transfer joints. `Handle is skinned to a standard body joint, but this asset type must only use skinning transfer joints.` This error fires when an eyebrow or eyelash accessory has vertices weighted to [standard R15 rig](/docs/roblox-avatar-character-bodies-specifications#standard-r15-rigs) joints, such as `Head` or `Neck`, instead of exclusively using the required transfer joints.

To fix this, re-skin your mesh so all vertices are weighted only to the allowed skinning transfer joints listed in the error. This check validates that the skinning on a layered accessory **Handle** mesh follows the allowed [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy, including correct use of [skinning transfer](/docs/roblox-avatar-automatic-skinning-transfer#special-skinning-transfer-joints) joints for specialized accessory types. Eyebrow and eyelash accessories must be exclusively skinned to transfer joints, not [standard R15 rig](/docs/roblox-avatar-character-bodies-specifications#standard-r15-rigs) joints. `Accessory does not have a Handle. Cannot validate layered clothing out of bounds.` This error fires when the layered accessory is missing its **Handle** mesh entirely, which means the clothing cannot be validated or rendered.

To fix this, add a **Handle** mesh as a child of your [`Accessory`](/docs/accessory) root instance containing the clothing mesh. This check validates that the layered accessory, when deformed and placed on an avatar, stays within the engine's render bounds to prevent visual artifacts and performance issues. The accessory must have the standard structure including a **Handle** mesh child. `Accessory does not have a WrapLayer. Cannot validate layered clothing out of bounds.` This error fires when the accessory's **Handle** mesh does not contain a [`WrapLayer`](/docs/wraplayer) child instance.

To fix this, add a [`WrapLayer`](/docs/wraplayer) to the **Handle** mesh using the [Accessory Fitting Tool](/docs/roblox-avatar-accessory-fitting-tool), which defines the inner and outer [cage meshes](/docs/roblox-avatar-layered-accessories-specifications#cage-meshes) for body-conforming deformation. This check validates that the layered accessory, when deformed and placed on an avatar, stays within the engine's render bounds to prevent visual artifacts and performance issues. The **Handle** mesh must contain a [`WrapLayer`](/docs/wraplayer) that defines how the clothing deforms over the body. `Accessory has a non-zero MaxSize.` This error fires when the [`WrapLayer.MaxSize`](/docs/wraplayer) property is set to a non-zero vector, which could override the expected render bounds behavior.

To fix this, set [`MaxSize`](/docs/wraplayer) to (`0`, `0`, `0`) in the Properties window before uploading. This check validates that the layered accessory, when deformed and placed on an avatar, stays within the engine's render bounds to prevent visual artifacts and performance issues. The [`WrapLayer.MaxSize`](/docs/wraplayer) property must be zero to ensure the engine uses its standard sizing calculation. `Accessory has a non-zero Offset.` This error fires when the [`WrapLayer.Offset`](/docs/wraplayer) property is set to a non-zero vector, which would shift the clothing's deformation origin away from its expected position.

To fix this, set [`Offset`](/docs/wraplayer) to (`0`, `0`, `0`) in the Properties window before uploading. This check validates that the layered accessory, when deformed and placed on an avatar, stays within the engine's render bounds to prevent visual artifacts and performance issues. The [`WrapLayer.Offset`](/docs/wraplayer) property must be zero to ensure the clothing deforms from its natural position. `Layered clothing validation failed. When deformed, layered clothing becomes too large.` This error fires when your layered accessory, after being deformed onto a reference avatar body by the engine, extends beyond the maximum render bounds.

To fix this, reduce the size of your [outer cage](/docs/roblox-avatar-layered-accessories-specifications#outer-cage) mesh or make the clothing geometry conform more closely to the body to keep it within bounds when deformed. This check validates that the layered accessory, when deformed and placed on an avatar, stays within the engine's render bounds to prevent visual artifacts and performance issues. The engine simulates the clothing on a body and checks whether the result exceeds rendering limits. `Engine feature for layered clothing out-of-bounds validation is not enabled.` This error fires when the required engine feature (`EngineUGCValidationLCOOB`) is not enabled in the current environment, preventing the bounds check from executing. This is typically a temporary platform state;

To fix this, retry your upload later or contact support if this persists. This check validates that the layered accessory, when deformed and placed on an avatar, stays within the engine's render bounds to prevent visual artifacts and performance issues. This validation requires a specific engine feature to be active in order to run. `Eyelash has vertices skinned to RBX_Leader that are too far away from the eye landmarks on the inner cage.` This error fires when vertices skinned to `RBX_Leader` are located too far from the eye landmark positions defined on the inner cage UV reference, meaning the eyelash geometry will not deform correctly with eye movement.

To fix this, reposition the `RBX_Leader` instance's weighted vertices in your 3D modeling software to be closer to the eye area of the inner cage. This check validates that eyelash accessory vertices weighted to the `RBX_Leader` [skinning transfer](/docs/roblox-avatar-automatic-skinning-transfer#special-skinning-transfer-joints) joint are positioned near the eye region of the [inner cage](/docs/roblox-avatar-layered-accessories-specifications#inner-cage) mesh. The `RBX_Leader` joint controls eye-tracking deformation, so weighted vertices must be close to the actual eye landmarks. `Hip rig attachment position is out of the allowed range. Please fix the Attachment.` This error fires when the hip rig attachment on a leg part is positioned too far inward (toward the center), which would cause the leg to overlap with the opposite leg when the avatar is assembled.

To fix this, move the hip rig attachment outward (away from center) so the leg connects at an appropriate offset from the body midline. This check ensures that left and right leg [body parts](/docs/roblox-avatar-character-bodies-specifications#body-parts) are properly separated from each other so they do not overlap when assembled on an avatar. It validates both the hip attachment positions and the physical bounding boxes of the legs. `Could not compute leg bounds. Please ensure all body part meshes are valid and try again.` This error fires when the system cannot calculate the bounding box geometry for the leg meshes, typically due to missing or corrupt mesh data.

To fix this, ensure all leg-related `Class.MeshParts`, such as `UpperLeg`, `LowerLeg`, and `Foot`, have valid mesh data assigned and retry the upload. This check ensures that left and right leg body parts are properly separated from each other so they do not overlap when assembled on an avatar. For full body uploads, it computes combined bounding boxes for each complete leg to measure overlap. `The legs overlap on the x axis. Please adjust the legs to reduce overlap.` This error fires when the left and right legs overlap more than the allowed percentage of their width on the x-axis.

To fix this, adjust the leg meshes or hip attachment positions so the legs have adequate separation between them; either slim the leg meshes or move the hip attachments further apart. This check ensures that left and right leg body parts are properly separated from each other so they do not overlap when assembled on an avatar. For full body uploads, it computes the x-axis overlap between the combined left leg bounding box and the combined right leg bounding box. `Failed to load texture for SurfaceAppearance. Make sure the texture exists and try again.` This error fires when a texture that needs opacity checking cannot be loaded from the [`SurfaceAppearance`](/docs/surfaceappearance) instance.

To fix this, verify that the [`ColorMap`](/docs/surfaceappearance#surfaceappearance-colormap) and [`NormalMap`](/docs/surfaceappearance#surfaceappearance-normalmap) fields reference valid, uploaded texture assets and that they have not been deleted or corrupted. This check validates that the [`ColorMap`](/docs/surfaceappearance#surfaceappearance-colormap) and [`NormalMap`](/docs/surfaceappearance#surfaceappearance-normalmap) textures on a rigid accessory's [`SurfaceAppearance`](/docs/surfaceappearance) instance can be loaded for opacity verification. These textures must be readable so the system can confirm they are fully opaque as required. `Texture is not fully opaque. Please use an opaque texture.` This error fires when any pixel in [`SurfaceAppearance.ColorMap`](/docs/surfaceappearance#surfaceappearance-colormap) or [`SurfaceAppearance.NormalMap`](/docs/surfaceappearance#surfaceappearance-normalmap) has an alpha value below `255`.

To fix this, edit the texture in your image editor to remove all transparency (set alpha to 100% everywhere) and re-upload. This check validates that the [`ColorMap`](/docs/surfaceappearance#surfaceappearance-colormap) and [`NormalMap`](/docs/surfaceappearance#surfaceappearance-normalmap) textures on a rigid accessory's [`SurfaceAppearance`](/docs/surfaceappearance) instance are completely opaque (no transparent or semi-transparent pixels). Transparency in these base textures can cause rendering inconsistencies and unexpected visual results on rigid accessories. `TextureID and SurfaceAppearance are both defined on a MeshPart. Publishing will only use SurfaceAppearance.` This error fires when a [`MeshPart`](/docs/meshpart) has a non-empty [`TextureID`](/docs/meshpart#meshpart-textureid) property and also has a [`SurfaceAppearance`](/docs/surfaceappearance) child instance.

To fix this, remove either the [`TextureID`](/docs/meshpart#meshpart-textureid) value or the [`SurfaceAppearance`](/docs/surfaceappearance) child to use a single, consistent texturing approach. This check validates that a [`MeshPart`](/docs/meshpart) does not simultaneously define both a [`TextureID`](/docs/meshpart#meshpart-textureid) (legacy texturing) and a [`SurfaceAppearance`](/docs/surfaceappearance) child. Having both creates ambiguity about which texture system takes precedence and may produce unexpected visual results. `MeshPart has an empty TextureID and no child SurfaceAppearance instance. You need to define at least one.` This error fires when a [`MeshPart`](/docs/meshpart) has an empty [`TextureID`](/docs/meshpart#meshpart-textureid) and no [`SurfaceAppearance`](/docs/surfaceappearance) child.

To fix this, add either a valid [`TextureID`](/docs/meshpart#meshpart-textureid) to the [`MeshPart`](/docs/meshpart) or add a [`SurfaceAppearance`](/docs/surfaceappearance) child with appropriate PBR [texture maps](/docs/roblox-art-modeling-surface-appearance#texture-maps). This check validates that every [`MeshPart`](/docs/meshpart) in the asset has at least one form of texturing defined, either a [`TextureID`](/docs/meshpart#meshpart-textureid) or a [`SurfaceAppearance`](/docs/surfaceappearance) child. A [`MeshPart`](/docs/meshpart) with neither will render with no texture, appearing as a solid untextured surface which is not acceptable for published assets. `Failed to load texture data for SurfaceAppearance map. Make sure the texture exists and try again.` This error fires when the system cannot retrieve the image size for a specific texture map on the [`SurfaceAppearance`](/docs/surfaceappearance) instance.

To fix this, verify that all texture map fields reference valid, accessible texture assets and re-upload any missing textures. This check validates that the individual PBR [texture maps](/docs/roblox-art-modeling-surface-appearance#texture-maps) on a [`SurfaceAppearance`](/docs/surfaceappearance) instance can be loaded for resolution verification. The system must read each texture to check its dimensions against per-map size limits. `Texture resolution is higher than the maximum supported size for that SurfaceAppearance map field.` This error fires when a texture map's width or height exceeds its specific limit.

To fix this, resize the texture in your image editor to meet the per-field maximum before re-uploading. This check validates that each PBR [texture map](/docs/roblox-art-modeling-surface-appearance#texture-maps) on a [`SurfaceAppearance`](/docs/surfaceappearance) instance does not exceed its per-field maximum resolution. Different maps have different limits to balance quality with performance; for example, [`ColorMap`](/docs/surfaceappearance#surfaceappearance-colormap) allows up to 1024px, while [`NormalMap`](/docs/surfaceappearance#surfaceappearance-normalmap)/[`MetalnessMap`](/docs/surfaceappearance#surfaceappearance-metalnessmap)/[`RoughnessMap`](/docs/surfaceappearance#surfaceappearance-roughnessmap) allow 256px. `The total surface area of the model mesh exceeds the maximum allowed. Reduce the number and/or size of triangles.` This error fires when the computed surface area of a mesh exceeds the configured threshold.

To fix this, simplify your mesh by reducing triangle count, shrinking oversized faces, or removing interior/hidden geometry that inflates the total surface area. This check validates that the total geometric surface area of a render mesh stays within the allowed maximum. Excessive surface area relative to the bounding volume indicates overly complex or inefficient geometry that wastes rendering resources. `SurfaceAppearance has a TexturePack property with an invalid URL. Please fix the URL.` This error fires when a [`SurfaceAppearance`](/docs/surfaceappearance) has a [`TexturePack`](/docs/surfaceappearance) field with a malformed or empty URL.

To fix this, regenerate the [`SurfaceAppearance.TexturePack`](/docs/surfaceappearance) using the [Accessory Fitting Tool](/docs/roblox-avatar-accessory-fitting-tool) or Studio's publishing workflow to obtain a valid URL. This check validates that the [`TexturePack`](/docs/surfaceappearance) URL property on each [`SurfaceAppearance`](/docs/surfaceappearance) instance points to a valid, accessible texture pack asset. TexturePacks provide compressed texture bundles for efficient delivery, and an invalid URL means the runtime cannot load the optimized textures. `Failed to download TexturePack for SurfaceAppearance.` This error fires when the system cannot download the [`SurfaceAppearance.TexturePack`](/docs/surfaceappearance) asset from the provided URL. This may be a transient network issue;

To fix this, try uploading again. If the error persists, regenerate the [`SurfaceAppearance.TexturePack`](/docs/surfaceappearance) using the [Accessory Fitting Tool](/docs/roblox-avatar-accessory-fitting-tool). This check validates that the [`SurfaceAppearance.TexturePack`](/docs/surfaceappearance) referenced by a [`SurfaceAppearance`](/docs/surfaceappearance) can be successfully downloaded and read. Network issues or deleted assets can prevent the pack from loading, blocking the consistency verification. `The textures in SurfaceAppearance do not match those in its TexturePack. Please fix the TexturePack.` This error fires when the engine detects texture content differences between the [`SurfaceAppearance`](/docs/surfaceappearance) maps and the [`SurfaceAppearance.TexturePack`](/docs/surfaceappearance).

To fix this, regenerate the [`SurfaceAppearance.TexturePack`](/docs/surfaceappearance) from the current [`SurfaceAppearance`](/docs/surfaceappearance) textures using the [Accessory Fitting Tool](/docs/roblox-avatar-accessory-fitting-tool). This check validates that the individual [texture maps](/docs/roblox-art-modeling-surface-appearance#texture-maps) on a [`SurfaceAppearance`](/docs/surfaceappearance) instance are identical to those stored in its associated [`TexturePack`](/docs/surfaceappearance). A mismatch means the packed version is stale or was generated from different source textures, causing visual discrepancies between quality levels. `Failed to load texture data. Make sure the texture exists and try again.` This error fires when a texture asset cannot be loaded or its size cannot be determined.

To fix this, verify that the [`MeshPart.TextureID`](/docs/meshpart#meshpart-textureid) or [`SurfaceAppearance`](/docs/surfaceappearance) texture map fields reference valid, uploaded texture assets and re-upload any missing textures. This check validates that textures referenced by [body part](/docs/roblox-avatar-character-bodies-specifications#body-parts) [`MeshPart`](/docs/meshpart) instances and their [`SurfaceAppearance`](/docs/surfaceappearance) instances can be loaded for resolution verification. The system must read the image data to check pixel dimensions against the allowed maximum for each asset type and texture field. `Texture resolution is higher than the maximum supported size for that field.` This error fires when a texture's width or height exceeds the configured limit for that asset type and texture field.

To fix this, resize the texture in your image editor to fit within the maximum allowed resolution before re-uploading. This check validates that all textures on body parts and accessories do not exceed the maximum allowed pixel dimensions for their specific field and asset type. Oversized textures increase memory usage and download times, impacting performance for all players. `Invalid target asset for thumbnail generation. Expected it to be the Handle.` This error fires when the `ThumbnailCameraTarget` [`ObjectValue`](/docs/objectvalue) references an instance other than the **Handle** mesh.

To fix this, set the `ThumbnailCameraTarget` [`ObjectValue`](/docs/objectvalue) to point to the **Handle** mesh of your accessory in Studio. This check validates that the `ThumbnailCameraTarget` in a `ThumbnailConfiguration` points to the accessory's **Handle** part. The thumbnail system uses this reference to frame the camera correctly for the Marketplace preview image. `Asset is positioned outside the thumbnail camera view. Reposition the asset at the center of the camera view.` This error fires when the engine determines that the mesh geometry does not intersect with the thumbnail camera's viewing frustum.

To fix this, adjust the `ThumbnailCameraValue` [`CFrame`](/docs/cframe) or reposition your mesh so it is centered within the camera's field of view. This check validates that the accessory's render mesh is visible within the thumbnail camera frustum defined by the `ThumbnailConfiguration`. If the mesh falls outside the camera view, the Marketplace thumbnail will appear empty or cut off. `Joint TposeAdjustment deviates too much from the recommended orientation.` This error fires when a joint's `TposeAdjustment` rotation differs from the expected orientation by more than the allowed threshold (typically 30 degrees).

To fix this, reduce the rotation offset on the flagged joint to stay within the permitted range. This check validates that the T-pose adjustment rotation on each joint defined in a [`HumanoidRigDescription`](/docs/humanoidrigdescription) stays within acceptable angular deviation from the expected orientation. T-pose adjustments fine-tune how the avatar's limbs align in rest pose, but excessive rotation breaks animation retargeting and causes visual artifacts. `Joint TposeAdjustment position is outside of acceptable bounds.` This error fires when a joint's `TposeAdjustment` position exceeds the computed threshold (a percentage of the body part's mesh dimensions).

To fix this, reduce the positional offset on the flagged joint to keep it within the acceptable bounds relative to the body part size. This check validates that the T-pose adjustment translation on each joint defined in a [`HumanoidRigDescription`](/docs/humanoidrigdescription) stays within a position offset proportional to the body part size. Large positional offsets disconnect the visual rig from the animation skeleton, causing limbs to appear detached or misaligned. `Detected zero-area triangle in model mesh. Edit the mesh to remove zero-area triangles.` This error fires when the engine's triangle area validation detects one or more degenerate triangles.

To fix this, open your mesh in a 3D modeling software, select degenerate faces (those with collapsed edges or coincident vertices), and delete or repair them. This check validates that no triangles in the render mesh or outer cage mesh have zero geometric area. Zero-area (degenerate) triangles are invisible faces that waste polygon budget, can cause shading errors, and indicate topology problems in the mesh. `Model mesh triangle count is higher than the maximum supported value. Retopologize the model and try again.` This error fires when a mesh's triangle count exceeds the per-mesh maximum (typically the hat triangle limit).

To fix this, retopologize your model in your 3D modeling software using decimation or manual edge loop reduction to bring the count below the limit. This check validates that each individual render mesh in an accessory does not exceed the maximum [triangle count](/docs/roblox-avatar-rigid-accessories-specifications#geometry-and-budgets) allowed for accessories. Keeping triangle counts within budget ensures consistent performance across all devices and prevents any single item from consuming disproportionate rendering resources. `Total mesh triangle count for the body part exceeds the maximum supported number. Retopologize to reduce triangle count.` This error fires when the summed triangle count of all meshes in the body part exceeds the asset-type-specific maximum (with a small tolerance).

To fix this, reduce overall mesh complexity by retopologizing in your 3D modeling software until the total fits within the budget for your body part type. This check validates that the combined [triangle count](/docs/roblox-avatar-character-bodies-specifications#triangle-budgets) across all render meshes in a body part does not exceed the maximum allowed for that asset type. Different body parts have different budgets based on their visual importance and screen coverage. `Invalid vertex color found in mesh. Vertex color map must be all white (with no transparency for body parts).` This error fires when the engine's vertex color validation detects non-white or (for body parts) non-opaque vertex color values.

To fix this, reset all vertex colors to white (RGB `1`, `1`, `1`) in your 3D modeling software before exporting. For body parts, also ensure alpha is set to `1.0`. This check validates that all vertex colors in render meshes are set to white and, for body parts, fully opaque. Non-white vertex colors can tint the mesh appearance in unintended ways, and transparent vertex colors on body parts can make portions of the avatar invisible. `The maximum vertex density has been exceeded. Reduce the number of vertices that are very close to each other.` This error fires when the engine detects too many vertices packed into a localized region of the mesh.

To fix this, spread out clustered vertices or reduce local polygon density in your 3D modeling software by merging nearby vertices or simplifying the topology. This check validates that the spatial vertex density of a layered accessory mesh does not exceed the allowed threshold. Extremely dense clusters of vertices in a small area waste polygon budget without adding visual detail and can cause deformation artifacts when the clothing conforms to the body. `Cage mesh has too many vertices that are too close to each other. Edit to reduce coincident vertices.` This error fires when the percentage of similar vertices exceeds the allowed threshold.

To fix this, edit your cage meshes in your 3D modeling software to ensure vertices are spatially distributed and not collapsed together, so each vertex contributes to a distinct cage shape. This check validates that the inner and outer [cage meshes](/docs/roblox-avatar-layered-accessories-specifications#cage-meshes) of layered accessories do not have an excessive percentage of coincident or near-coincident vertices. High vertex similarity in cages indicates the mesh was not properly sculpted, which prevents the clothing deformation system from working correctly. `No ReferenceCageContent provided for the WrapTextureTransfer.` This error fires when [`WrapTextureTransfer.ReferenceCageMeshContent`](/docs/wraptexturetransfer#wraptexturetransfer-referencecagemeshcontent) is empty or has no URI.

To fix this, assign a valid cage mesh asset to the [`WrapTextureTransfer.ReferenceCageMeshContent`](/docs/wraptexturetransfer#wraptexturetransfer-referencecagemeshcontent) in your makeup asset. This check validates that the [`WrapTextureTransfer`](/docs/wraptexturetransfer) instance on a makeup decal has a [`ReferenceCageMeshContent`](/docs/wraptexturetransfer#wraptexturetransfer-referencecagemeshcontent) property pointing to a valid cage mesh. The reference cage defines the UV mapping surface that the makeup texture wraps onto, and without it the system cannot verify UV correctness. `Failed to load ReferenceCageContent for the WrapTextureTransfer.` This error fires when the referenced cage mesh asset exists but cannot be loaded, possibly because it's corrupted, deleted, or inaccessible.

To fix this, re-upload the cage mesh asset or verify that the [`WrapTextureTransfer.ReferenceCageMeshContent`](/docs/wraptexturetransfer#wraptexturetransfer-referencecagemeshcontent) points to a valid, accessible mesh asset. This check validates that the reference cage mesh specified in [`WrapTextureTransfer.ReferenceCageMeshContent`](/docs/wraptexturetransfer#wraptexturetransfer-referencecagemeshcontent) can be successfully loaded and converted to an editable mesh. The cage data is needed to validate UV mappings for makeup texture placement. `Failed to load UVs for the WrapTextureTransfer cage. Make sure the UV map exists and try again.` This error fires when the system cannot extract UV values from the loaded cage mesh.

To fix this, ensure the cage mesh was exported with valid UV coordinates and that the mesh file is not corrupted. Re-export from your 3D modeling software if needed. This check validates that the UV coordinates can be read from the reference cage mesh for comparison against the expected template values. UV data is essential for verifying that the makeup texture will map correctly onto the avatar's face. `Found invalid UV value for the cage. Edit the UV map to fix this issue.` This error fires when the cage mesh UV values do not match the required reference UV template.

To fix this, replace the cage mesh with one that uses the standard head cage UV layout, or re-export from the [official cage template](/docs/roblox-avatar-makeup#template-heads). This check validates that the UV coordinates in the reference cage mesh match the expected [template](/docs/roblox-avatar-makeup#template-heads) values defined for the head cage. Correct UVs ensure that makeup textures align properly with facial features when applied to any avatar head. `WrapTextureTransfer UVMinBound does not match the required value.` This error fires when the [`WrapTextureTransfer.UVMinBound`](/docs/wraptexturetransfer#wraptexturetransfer-uvminbound) property differs from the required value.

To fix this, set [`WrapTextureTransfer.UVMinBound`](/docs/wraptexturetransfer#wraptexturetransfer-uvminbound) to the exact required coordinates (these are fixed values defined by the makeup system specification). This check validates that the [`WrapTextureTransfer.UVMinBound`](/docs/wraptexturetransfer#wraptexturetransfer-uvminbound) property matches the expected minimum UV coordinate for makeup assets. This bound defines the lower corner of the UV space used for texture mapping and must be exact for proper alignment. `WrapTextureTransfer UVMaxBound does not match the required value.` This error fires when the [`WrapTextureTransfer.UVMaxBound`](/docs/wraptexturetransfer#wraptexturetransfer-uvmaxbound) property differs from the required value.

To fix this, set [`WrapTextureTransfer.UVMaxBound`](/docs/wraptexturetransfer#wraptexturetransfer-uvmaxbound) to the exact required coordinates (these are fixed values defined by the makeup system specification). This check validates that the [`WrapTextureTransfer.UVMaxBound`](/docs/wraptexturetransfer#wraptexturetransfer-uvmaxbound) property matches the expected maximum UV coordinate for makeup assets. This bound defines the upper corner of the UV space and must be exact for the texture to map correctly across the full face area. `Animation is too short ({duration} seconds). Emote animations must be longer than {minLength} seconds.` This error triggers when the animation duration falls at or below the configured minimum length threshold, currently sourced from the `FString` flag.

To fix it, extend your animation timeline so the total duration exceeds the minimum required seconds. This check measures the duration of emote animations to ensure they meet minimum length requirements for a good player experience. Emotes that are too short feel abrupt and fail to convey meaningful expression. `Animation is too long ({duration} seconds). Emote animations must be at most {maxLength} seconds long.` This error triggers when the animation duration exceeds the configured maximum length threshold.

To fix it, trim your animation timeline so the total duration does not exceed the maximum allowed seconds. This check measures the duration of emote animations to ensure they stay within the maximum allowed length for Marketplace content. Excessively long emotes disrupt gameplay flow and consume excessive resources. `Your body contains small disconnected mesh components (mesh islands). Please remove floating geometry and ensure all mesh parts are properly connected.` This error triggers when the ML-based mesh island score falls below the minimum threshold (default `92`), indicating the model has identified significant disconnected components that should not be present.

To fix it, inspect each [body part](/docs/roblox-avatar-character-bodies-specifications#body-parts) mesh for small floating pieces of geometry and either delete them or merge them into the main mesh body. This check uses a machine learning model to detect problematic disconnected mesh components in [character body](/docs/roblox-avatar-character-bodies) avatars. Small floating geometry fragments degrade visual quality, waste polygon budget, and can cause physics/collision issues. `Asset quality: {partName} has {num_disconnected_components} disconnected components, which exceeds the maximum of {max_disconnected_components}.` This error triggers when any [`MeshPart`](/docs/meshpart) has more disconnected components than the allowed maximum (default `10`).

To fix it, merge small floating pieces into the main mesh or delete unnecessary disconnected geometry until the component count is within limits. This check counts the number of fully disconnected mesh components in each [`MeshPart`](/docs/meshpart) and enforces a hard maximum. Too many disconnected components indicate the mesh contains excessive floating geometry that increases complexity without visual benefit. `Asset quality: {partName} has {num_small_volume_islands} small disconnected islands out of {num_disconnected_components} components (score: {score}).` This error or warning triggers when the mesh island volume score falls below `100`, indicating the presence of small disconnected components relative to the main mesh body.

To fix it, identify and remove tiny floating mesh fragments that do not contribute to the intended asset shape. This check evaluates the volume distribution of disconnected mesh components, identifying small volume islands that are likely debris or artifacts rather than intentional geometry. Small volume islands waste polygon budget and can cause visual noise or physics issues. `Asset quality: {partName} mesh is not watertight ({boundary_edges_percent}% boundary edges).` This error or warning triggers when any [`MeshPart`](/docs/meshpart) has boundary edges present, excluding `Head` parts which intentionally have eye/mouth openings.

To fix it, lose all open edges in your mesh by filling holes, merging border vertices, or capping open areas so the mesh forms a complete closed surface. This check evaluates whether the mesh is watertight, meaning it has no boundary edges or open holes in its surface. Watertight meshes are required for correct physics simulation, cage-based deformation, and consistent rendering without visible gaps.

Visualization checks

The UGC validation system includes optional visualization tools with checks to help you identify, understand, diagnose, and fix avatar assets that aren't yet ready to be on the Marketplace. When active, the visualization checks provide information on validation errors for non-compliant assets, and quality assessments for compliant assets that could use improvement.

<img src="https://prod.docsiteassets.roblox.com/assets/avatar/validation-system/Validation-Icons.png" width="85%" />

Red icons provide information on what areas are failing validation and yellow warnings indicate areas of improvement.

<img src="https://prod.docsiteassets.roblox.com/assets/avatar/validation-system/Goblin-Validation.png" width="100%" />

When you select an error or warning, visual elements display in the viewport to help you understand the error or warning.

To access the UGC validation system's visualization tools, you must first enable the beta feature. To enable and use the optional visualization checks:

  1. In Studio, navigate to File > Beta Features.

  2. Enable Visualizing UGC Validation.

  3. Restart Studio, then in the mezzanine, click the plus icon to add a custom tab. A new tab displays.

    Button to add custom tab indicated in Studio's mezzanine.
  4. In your custom tab, click the Add tools button. The Add Tools pop-up window displays.

    Button to add new tool to a custom tab in Studio's toolbar.
  5. Enable UGC Validation to add it to your toolbar, then close the window.

  6. Navigate back to your custom tab and select the UGC Validation button to run the plugin. A UGC Validation window displays.

  7. In the Explorer window, select a character body, dynamic head, rigid accessory, or layered accessory, then navigate back to the UGC Validation window and click the Run validation button. A pop-up window displays.

  8. In the pop-up window:

    1. Confirm the asset type of the avatar asset that you selected. For example, if you selected a AccessoryType.Pants layered accessory, use the drop-down menu to select PantsAccessory.

    2. Click the Run validation button.

The validation service will run in the background and report back results in the UGC Validation window as a combination of errors and/or warnings, and an asset quality score that measures your asset's technical quality, including its mesh, UVs, and textures. Scores range from 0 to 100, with higher scores meaning higher technical quality. Scores help identify high-definition assets and support Marketplace discovery, but low scores alone don't prevent you from publishing to the Marketplace.

Measure_Cage_Distance_Head

Measure_Cage_Distance_Head is a validation check that scores how closely the avatar head's outer cage hugs the head mesh, checking that the cage neither floats too far from the mesh nor sinks inside it.

Error message How to fix Why is this check important? `Head cage is too far from Head mesh. Maximum distance between head cage and mesh is {max_sdf}, which is above allowed threshold {max_sdf_threshold}.` This error triggers when the maximum distance from any cage vertex to the mesh surface exceeds the allowed threshold (default `0.60` units).

To fix it, adjust your [head outer cage](/docs/roblox-avatar-dynamic-heads-specifications#outer-cage) vertices so they sit closer to the head mesh surface without large gaps. This check measures the spatial distance between the [head outer cage](/docs/roblox-avatar-dynamic-heads-specifications#outer-cage) and the [head render mesh](/docs/roblox-avatar-character-bodies-specifications#body-parts) using signed distance fields (SDF). The cage must wrap closely around the mesh for layered accessories to deform correctly on the head. For more information on caging dynamic heads, see [Dynamic head caging best practices](/docs/roblox-avatar-dynamic-heads-caging-best-practices). `Head cage intersects with head mesh. {negtiveSDFPercent}% of head cage vertices are inside head mesh.` This error triggers when the percentage of cage vertices with negative signed distance (inside the mesh) exceeds the allowed threshold (default `30%`).

To fix it, move intruding cage vertices outward so they sit on or outside the head mesh surface. This check detects cage vertices that penetrate inside the head mesh rather than wrapping around it. Cage vertices inside the mesh cause layered accessories to clip through the head during deformation. For more information on caging dynamic heads, see [Dynamic head caging best practices](/docs/roblox-avatar-dynamic-heads-caging-best-practices). `Asset quality warning: Head cage distance score is {score}. Max distance between head cage and mesh is {max_distance}, {negative_sdf_percent}% of head cage vertices are inside head mesh.` This warning triggers when the cage distance score is below `100`, indicating the cage could be better fitted to the mesh.

To address it, review the reported max distance and penetration percentage to identify areas where the cage needs tightening or outward adjustment. This check evaluates the overall quality of head cage-to-mesh alignment and produces a composite score. Good cage alignment ensures that layered accessories deform naturally on dynamic heads without gaps or clipping.

Measure_Cage_Mesh_Distance

Measure_Cage_Mesh_Distance is a validation check that scores how closely the layered accessory's outer cage tracks the rendered mesh, flagging when a cage drifts too far away or pushes inside the mesh.

Error message How to fix Why is this check important? `Outer cage is too far from the render mesh. Maximum distance between outer cage and mesh is {max_sdf}, which is above allowed threshold {max_sdf_threshold}.` This error triggers when the maximum distance from any outer cage vertex to the mesh surface exceeds the allowed threshold (default `0.60` units).

To fix it, reshape your outer cage so all vertices remain within the allowed distance from the layered accessory mesh. This check measures the spatial distance between the [outer cage](/docs/roblox-avatar-layered-accessories-specifications#outer-cage) and the render mesh for layered accessories. The outer cage defines where clothing layers sit on the avatar, so it must closely follow the accessory mesh. `Outer cage intersects with the render mesh. {negtiveSDFPercent}% of outer cage vertices are inside render mesh.` This error triggers when the percentage of cage vertices with negative signed distance exceeds the allowed threshold (default `30%`).

To fix it, pull intruding outer cage vertices outward so they wrap around the render mesh rather than cutting through it. This check detects [outer cage](/docs/roblox-avatar-layered-accessories-specifications#outer-cage) vertices that have penetrated inside the layered accessory render mesh. Cage vertices inside the mesh cause visual clipping when other clothing layers are worn over the accessory. `Asset quality warning: Cage-to-mesh distance score is {score}. Max distance between outer cage and mesh is {max_distance}, {negative_sdf_percent}% of outer cage vertices are inside render mesh.` This warning triggers when the cage distance score is below `100`, meaning the cage fit could be improved.

To address it, review the max distance and penetration metrics to identify which cage areas need adjustment for better mesh coverage. This check evaluates the overall quality of cage-to-mesh alignment for layered accessories and produces a composite score. Proper cage alignment ensures that additional clothing layers deform correctly when worn over the accessory.

Measure_Cage_Mesh_Distance_Avatar

Measure_Cage_Mesh_Distance_Avatar is a validation check that scores how closely the full body outer cage follows the body mesh, flagging when a cage floats too far off the surface or intersects it.

Error message How to fix Why is this check important? `Body cage is too far from the body mesh. Maximum distance between body cage and mesh is {max_sdf}, which is above allowed threshold {max_sdf_threshold}.` This error triggers when the maximum distance from any body cage vertex to the mesh surface exceeds the allowed threshold (default `0.60` units).

To fix it, reshape the body cage vertices to follow the body mesh contours more closely. This check measures the spatial distance between the [body cage](/docs/roblox-avatar-character-bodies-specifications#outer-cages) and the [body render mesh](/docs/roblox-avatar-character-bodies-specifications#body-parts) for full body avatar bundles. The body cage defines the deformation volume for all layered accessories, so it must closely envelop the body mesh. `Body cage intersects with the body mesh. {negtiveSDFPercent}% of body cage vertices are inside the body mesh.` This error triggers when the percentage of cage vertices with negative signed distance exceeds the allowed threshold (default `30%`).

To fix it, move the intruding cage vertices outward so the cage fully wraps around the body mesh without intersecting it. This check detects [body cage](/docs/roblox-avatar-character-bodies-specifications#outer-cages) vertices that have penetrated inside the avatar [body mesh](/docs/roblox-avatar-character-bodies-specifications#body-parts). Interior cage vertices cause layered accessories to clip through the body during deformation and animation. `Asset quality warning: Body cage distance score is {score}. Max distance between body cage and mesh is {max_distance}, {negative_sdf_percent}% of body cage vertices are inside the body mesh.` This warning triggers when the body cage distance score is below `100`, indicating the cage could be better fitted.

To address it, review the distance and penetration metrics per [body part](/docs/roblox-avatar-character-bodies-specifications#body-parts) to identify areas needing cage adjustment. This check evaluates the overall quality of body cage-to-mesh alignment for full body bundles and produces a composite score. Proper cage fit across all [body parts](/docs/roblox-avatar-character-bodies-specifications#body-parts) ensures layered accessories deform uniformly without visible gaps or penetration.

Measure_Cage_Relevancy

Measure_Cage_Relevancy is a validation check that scores how much of the outer cage you moved actually sits over the accessory, so cage edits stay where the garment needs them.

Error message How to fix Why is this check important? `The outer cage has too many irrelevant modified vertices. {outer_cage_face_irrelevant_percent}% of the modified outer cage vertices do not cover the accessory.` This error triggers when fewer than `40%` of cage face modifications are relevant to the accessory, meaning that over `60%` of edits are irrelevant.

To fix it, reset cage vertices that are far from your layered accessory back to default and only modify vertices directly covering the accessory area. This check measures what percentage of [outer cage](/docs/roblox-avatar-layered-accessories-specifications#outer-cage) vertex modifications actually correspond to the layered accessory shape versus unnecessary edits elsewhere on the cage. Irrelevant cage edits waste deformation budget and can cause unexpected clothing behavior in areas far from the accessory. `Asset quality warning: Cage relevancy score is {score}. {irrelevant_percent}% of the modified outer cage vertices do not cover the accessory.` This warning triggers when the cage relevancy score is below `100`, meaning some cage edits are not directly serving the layered accessory's shape.

To address it, consider reducing cage modifications in areas far from your accessory geometry. This check evaluates how well the [outer cage](/docs/roblox-avatar-layered-accessories-specifications#outer-cage) modifications target the actual layered accessory region and produces a relevancy score. Focused cage edits produce better layered accessory behavior because only the relevant area deforms for the accessory.

Measure_Cage_UV

Measure_Cage_UV is a validation check that checks whether the inner and outer cage UVs match the layered accessory template; UVs that don't match the layered accessory template break how the asset wraps over the body.

Error message How to fix Why is this check important? `There are {incorrect_uv_count} UV values in cage {cage_name} that are incorrect or do not belong to the template. Please correct the cage UV.` This error triggers when the number of incorrect UV values in a cage exceeds the allowed threshold (default `100` incorrect UVs).

To fix it, re-export your cage from the [template file](/docs/roblox-avatar-resources#project-files) without modifying its UV layout, or correct any stray UV values back to template coordinates. This check validates that UV coordinates on inner and [outer cage meshes](/docs/roblox-avatar-layered-accessories-specifications#cage-meshes) match the expected [template](/docs/roblox-avatar-resources#project-files) values for layered accessories. Cage UVs must precisely match the template for the deformation system to correctly map layered accessory textures and vertices between layers. `Asset quality warning: Cage UV score is {score} for {cage_name}. Incorrect UV count: {incorrect_uv_count}.` This warning triggers when the cage UV score is below `100`, indicating some UV values deviate from the expected [template](/docs/roblox-avatar-resources#project-files).

To address it, review the flagged cage and verify its UV coordinates match the original template without unintended modifications. This check evaluates the accuracy of cage UV coordinates against the [template](/docs/roblox-avatar-resources#project-files) and produces a quality score per cage. Correct cage UVs are essential for the layered accessory system to properly transfer deformation data between cages.

Measure_Cage_UV_Avatar

Measure_Cage_UV_Avatar is a validation check that checks that each body part has a cage that keeps its UVs on the standard template; wrong cage UVs distort how layered accessories wraps over the body.

Error message How to fix Why is this check important? `There are {incorrect_uv_count} UV values in cage {cage_name} that are incorrect or do not belong to the template. Please correct the cage UV.` This error triggers when any [body part cage](/docs/roblox-avatar-character-bodies-specifications#outer-cages) has more incorrect UV values than the per-part threshold (default `7` incorrect UVs).

To fix it, re-export the affected body part cage from a [standard R15 rig template](/docs/roblox-avatar-resources#project-files) without altering its UV layout. This check validates that UV coordinates on body part cages match the expected [standard R15 rig template](/docs/roblox-avatar-resources#project-files) values across all body parts in a full body bundle. Each body part cage must preserve template UVs for the deformation system to correctly map clothing across the entire avatar. `Asset quality warning: Cage UV score is {score} for {cage_name}. Incorrect UV count: {incorrect_uv_count}.` This warning triggers when any body part cage UV score is below `100`, indicating template UV deviations.

To address it, check the reported body part cage and verify its UV coordinates match the [standard R15 rig template](/docs/roblox-avatar-resources#project-files) precisely. This check evaluates the accuracy of cage UV coordinates across all body part cages in a full body bundle against the [standard R15 rig template](/docs/roblox-avatar-resources#project-files). Correct UVs on every body part cage ensure that layered accessories map correctly across the full avatar without seams or distortion.

Measure_Degen_Triangles

Measure_Degen_Triangles is a validation check that scores each mesh part for degenerate triangles (faces with zero or near-zero area); degenerate triangles add no surface and can break rendering.

Error message How to fix Why is this check important? `Asset quality: {partName} has {degenerate_triangle_percent}% degenerate triangles (score: {score}).` This warning triggers when any mesh part contains degenerate triangles that lower its score below `100`.

To address it, remove zero-area faces in your 3D modeling software by merging overlapping vertices or deleting collapsed triangles. This check measures the percentage of degenerate (zero-area or near-zero-area) triangles in each mesh part. Degenerate triangles add polygon count without contributing visible surface area, waste rendering resources, and can cause shading artifacts or physics issues.

Measure_Dynamic_Head

Measure_Dynamic_Head is a validation check that verifies whether a dynamic head is animatable. Dynamic heads that are animatable have a head cage, FACS data, aligned landmarks, and can close their eyes, open their mouth, and express emotions.

Error message How to fix Why is this check important? `Cannot detect left eye close expression for the dynamic head. Please adjust cage landmarks for the left eye to match where the left eye on the head and make sure it can be closed.` This error triggers when the left eye close metric falls below the minimum quality threshold, meaning the system cannot detect proper eyelid closure.

To fix it, adjust the [cage landmarks](/docs/roblox-avatar-dynamic-heads-specifications#facial-landmarks) around the left eye so they align with the mesh eye geometry, and allow the eyelid vertices to move into a fully closed position. This check verifies that the dynamic head can perform the `LeftEyeClosed` [facial expression](/docs/roblox-avatar-dynamic-heads-facs-poses-reference#lefteyeclosed) using Facial Action Coding System blendshapes. Dynamic heads must demonstrate functional facial expressions for avatar communication and emotes. `Cannot detect right eye close expression for the dynamic head. Please adjust cage landmarks for the right eye to match where the right eye on the head and make sure it can be closed.` This error triggers when the right eye close metric falls below the minimum quality threshold, meaning the system cannot detect proper eyelid closure.

To fix it, adjust the [cage landmarks](/docs/roblox-avatar-dynamic-heads-specifications#facial-landmarks) around the right eye so they align with the mesh eye geometry and allow the eyelid vertices to move into a fully closed position. This check verifies that the dynamic head can perform the `RightEyeClosed` [facial expression](/docs/roblox-avatar-dynamic-heads-facs-poses-reference#righteyeclosed) using Facial Action Coding System blendshapes. Dynamic heads must demonstrate functional facial expressions for proper avatar animation and communication. `Cannot detect mouth open expression for the dynamic head. Please adjust cage landmarks for mouth to match where the mouth on the head and make sure it can open.` This error triggers when the mouth open metric falls below the minimum quality threshold, meaning the system cannot detect proper jaw/lip separation.

To fix it, adjust the [cage landmarks](/docs/roblox-avatar-dynamic-heads-specifications#facial-landmarks) around the mouth so they align with the mesh mouth geometry and allow the jaw vertices to move into an open position. This check verifies that the dynamic head can perform [facial expressions](/docs/roblox-avatar-dynamic-heads-specifications#facs-poses) for opening the mouth using Facial Action Coding System blendshapes. A working mouth open is fundamental for speech animation and emote expressions on avatar heads. `Cannot detect smile expression for the dynamic head. Please adjust cage landmarks for the mouth to match where the mouth on the head and make sure it can show smile expression.` This error triggers when the happiness/smile metric falls below the minimum quality threshold, meaning the system cannot detect a recognizable smile shape.

To fix it, adjust the [cage landmarks](/docs/roblox-avatar-dynamic-heads-specifications#facial-landmarks) around the mouth corners so they can pull upward and outward into a clear smile position. This check verifies that the dynamic head can display a smile expression using Facial Action Coding System blendshapes, such as `LeftLipCornerPuller` and `RightLipCornerPuller`. Emotional expressions like smiling are essential for social interaction and emotes in games. `Cannot detect frown expression for the dynamic head. Please adjust cage landmarks for the mouth to match where the mouth on the head and make sure it can show frown expression.` This error triggers when the sadness/frown metric falls below the minimum quality threshold, meaning the system cannot detect a recognizable frown shape.

To fix it, adjust the [cage landmarks](/docs/roblox-avatar-dynamic-heads-specifications#facial-landmarks) around the mouth corners so they can pull downward into a clear frown position. This check verifies that the dynamic head can display a frown expression using Facial Action Coding System blendshapes, such as `LeftLipCornerDown` and `RightLipCornerDown`. Emotional expressions like frowning provide important emotional range for avatar communication. `Dynamic heads on the Marketplace must be properly caged so that the eyes and mouth vertices on the cage line up with the mesh vertices. Please improve your caging and its alignment with the mesh.` This error triggers when the Asset Quality Service detects invalid landmarks, indicating the cage control points for eyes and mouth do not correspond to their mesh counterparts.

To fix it, [realign the cage](/docs/roblox-avatar-dynamic-heads-caging-best-practices#enclose-the-cage) so that eye and mouth landmark vertices sit precisely on the matching mesh surface points. This check verifies that the [cage landmark](/docs/roblox-avatar-dynamic-heads-specifications#facial-landmarks) positions align correctly with the corresponding mesh vertices on the dynamic head. Proper landmark alignment is required for the Facial Action Coding System to drive facial expressions accurately by mapping cage deformations to mesh vertices. `Dynamic heads on the Marketplace must be animated, but this head has no FACS data.` This error triggers when the Asset Quality Service reports `NO_FACS`, meaning no facial animation control data was found in the head asset.

To fix it, ensure your dynamic head includes properly configured FACS blendshape data following the Roblox dynamic head template. This check verifies that the dynamic head contains Facial Action Coding System data needed to drive facial expressions. Without FACS data, the head cannot animate expressions like blinking, smiling, or talking, which are required for dynamic heads on the Marketplace. `Dynamic heads on the Marketplace have no Head cages. Please create Head cage for the dynamic head.` This error triggers when the Asset Quality Service reports `MISSING_CAGE_INFO`, meaning no cage geometry was found in the head asset.

To fix it, create and include a properly structured [inner and outer cage](/docs/roblox-avatar-dynamic-heads-specifications#outer-cage) for the head that conforms to the head cage template. This check verifies that the dynamic head asset includes the required head cage mesh used for facial deformation and layered accessory support. The head cage is essential for mapping FACS expressions and enabling clothing to layer properly on the head. `Asset quality warning: Dynamic head expression score is {score}.` This warning triggers when the dynamic head expression score is below `100`, meaning one or more expressions could be improved even though they pass the minimum threshold.

To address it, review which individual expression metrics are scoring lowest and refine those cage landmark positions. This check evaluates the overall expression quality of the dynamic head across all measured facial metrics and produces a composite score. A high score indicates the head can clearly perform all [required facial expressions](/docs/roblox-avatar-dynamic-heads-specifications#facs-poses).

Measure_Joint_Number

Measure_Joint_Number is a validation check that scores the body rig's joint setup against the expected configuration. The body rig's joint setup includes the joint counts in the left and right hands for advanced R15 rigs.

Error message How to fix Why is this check important? `Asset quality: joint configuration scored {score} (joints: {joint_number}, left hand: {left_hand_joint_number}, right hand: {right_hand_joint_number}).` This warning triggers when the joint configuration score is below `100`, indicating the skeleton has a non-standard joint count or asymmetric hand joint distribution.

To address it, review your rig to ensure it follows the expected [advanced R15 rig](/docs/roblox-avatar-character-bodies-specifications#advanced-r15-rigs) hierarchy with symmetric hand joints. This check evaluates the skeletal joint configuration of a full body avatar bundle, measuring total joint count and hand joint distribution. Proper joint counts ensure the avatar can animate correctly with standard Roblox animations and support features like finger tracking.

Measure_Mesh_Manifold

Measure_Mesh_Manifold is a validation check that scores each mesh part for manifold integrity, catching holes, non-manifold edges, and similar topology problems in the geometry.

Error message How to fix Why is this check important? `Asset quality: {partName} has mesh manifold issues (score: {score}).` This warning triggers when any [`MeshPart`](/docs/meshpart) has manifold issues that lower its score below `100`.

To address it, resolve non-manifold edges in your 3D modeling software by removing internal faces, splitting T-junctions, and ensuring all edges connect exactly two polygons. This check evaluates whether the mesh is manifold, meaning every edge is shared by exactly two faces and the surface has a consistent, well-defined inside and outside. Non-manifold geometry (T-junctions, internal faces, edges shared by 3+ faces) causes rendering artifacts, physics simulation errors, and problems with cage-based deformation.

Measure_Mesh_Outside_OuterCage

Measure_Mesh_Outside_OuterCage is a validation check that scores how much of an accessory's render mesh stays between its cages; a mesh that pokes outside the outer cage deforms badly when worn.

Error message How to fix Why is this check important? `{mesh_outside_outer_cage_percent}% of mesh vertices for the accessory are outside its outer cage. Make adjustments to have more of the accessory placed between the cages.` This error triggers when the percentage of mesh vertices outside the [outer cage](/docs/roblox-avatar-layered-accessories-specifications#outer-cage) exceeds the allowed threshold (default `65%`).

To fix it, either expand your outer cage to encompass more of the mesh, or reduce the mesh geometry that extends beyond the cage boundary. This check measures what percentage of the layered accessory render mesh vertices lie outside the outer cage boundary. The outer cage defines the maximum volume for the accessory; vertices outside it will not deform correctly with layered accessories and may clip through other layers. `Asset quality warning: Mesh containment score is {score}. {mesh_outside_outer_cage_percent}% of mesh vertices are outside the outer cage.` This warning triggers when the mesh containment score is below `100`, indicating some mesh vertices extend beyond the [outer cage](/docs/roblox-avatar-layered-accessories-specifications#outer-cage) even if not enough to fail validation.

To address it, consider expanding the outer cage or trimming mesh geometry that protrudes beyond the cage boundary. This check evaluates how well the layered accessory mesh is contained within its outer cage and produces a containment score. Full containment ensures proper deformation behavior when multiple clothing layers interact.

Measure_Texture_Complexity

Measure_Texture_Complexity is a validation check that scores each texture for visual complexity, flagging flat or near-empty textures that add little detail to the asset.

Error message How to fix Why is this check important? `Asset quality: texture {textureName} has low complexity (score: {score}).` This warning triggers when any texture on the asset scores below `100` for complexity, suggesting it lacks sufficient detail or variation.

To address it, consider adding more visual detail, variation, or hand-painted elements to your textures to improve their quality score. This check evaluates the visual complexity and detail level of textures applied to the asset. Low-complexity textures, such as solid colors, minimal detail, or procedural noise with no meaningful content, indicate the asset may not meet Marketplace quality expectations for visual appeal.

Measure_Texture_Resolution

Measure_Texture_Resolution is a validation check that scores each texture by its pixel dimensions, rewarding resolution high enough to keep the asset sharp on the body.

Error message How to fix Why is this check important? `Asset quality: texture {textureName} has resolution {texture_width}x{texture_height} (score: {score}).` This warning triggers when any texture on the asset has a resolution that scores below `100`, indicating it may be too low resolution or an unusual size for its intended use.

To address it, consider using higher resolution textures that match the expected dimensions for your asset category, typically `1024`x`1024` or `512`x`512`. This check evaluates whether textures are at an appropriate resolution for the asset size and type. Textures that are too small appear blurry and pixelated when viewed in-game, while the system also flags unusual or non-standard resolutions.

Measure_Triangle_Intersection

Measure_Triangle_Intersection is a validation check that scores each mesh part for self-intersecting triangles in which faces pass through one another and create overlapping geometry.

Error message How to fix Why is this check important? `Asset quality: {partName} has {intersecting_tri_face_percent}% intersecting triangle faces (score: {score}).` This warning triggers when any [`MeshPart`](/docs/meshpart) contains intersecting triangles that lower its score below `100`.

To address it, identify overlapping faces in your 3D modeling software and resolve them by repositioning vertices, removing duplicate geometry, or restructuring the mesh topology to eliminate penetrations. This check measures the percentage of triangle faces that intersect (overlap/penetrate) other triangles within the same mesh part. Self-intersecting triangles cause z-fighting artifacts, incorrect normals, and problems with physics collision and cage-based deformation.

Measure_UV_Bound

Measure_UV_Bound is a validation check that measures how many of a mesh's UV vertices fall outside the 0-1 texture space; it reports a score but never blocks upload.

Error message How to fix Why is this check important? `Asset quality: {partName} has {uv_outside_bound_vert_percent}% UV vertices outside bounds (score: {score}).` This warning triggers when any [`MeshPart`](/docs/meshpart) has UV vertices outside bounds that lower its score below `100`.

To address it, ensure all UV islands are packed within the `0`-`1` UV space in your UV editor, and reposition any vertices that extend beyond the texture boundary. This check measures the percentage of UV vertices that fall outside the standard `0`-`1` UV space bounds. UV coordinates outside the `0`-`1` range cause texture tiling, stretching, or incorrect mapping that produces visual artifacts on the asset.

Measure_Vertex_Similarity

Measure_Vertex_Similarity is a validation check that measures the share of near-duplicate vertices in a mesh; it reports a score but never blocks upload.

Error message How to fix Why is this check important? `Asset quality: {partName} has {similar_vertex_percent}% similar vertices (score: {score}).` This warning triggers when any [`MeshPart`](/docs/meshpart) has similar vertices that lower its score below `100`.

To address it, merge overlapping vertices in your 3D modeling software using a merge-by-distance operation to consolidate redundant points into single vertices. This check measures the percentage of vertices that are nearly identical (overlapping or extremely close together) within each [`MeshPart`](/docs/meshpart). High vertex similarity indicates redundant geometry where multiple vertices occupy the same position, wasting polygon budget and potentially causing rendering artifacts like z-fighting.