Asset Rules (Generated)

This note is generated. Do not edit it

It is written by tools/sync-vault.mjs in the bubbly-asset-rules repo, from the
JSON that Blender, Unity and the Asset Editor actually enforce. Editing it here changes
nothing and will be overwritten. To change a rule, change the rule.

Other pages transclude this one

![[Asset Rules (Generated)#Type prefixes]] embeds a section. If you move or rename
this note, every one of those embeds breaks.

Generated file

Written by tools/generate-docs.mjs from the JSON in rules/.
Edits here are overwritten. Change the rule, not the table.

Asset Rules

Rules version 1.5.0, schema 1.

Every rule below is enforced by the Blender add-on, the Unity postprocessor and the
Bubbly Asset Editor, all reading this one source. A rule is changed once.

Naming

Parts are joined with _. Names are at most 96 characters.

Token order

Type_Category_SubCategory_Set_SetNum_Descriptor_Descriptor2_Descriptor3_Num_Action_Var_Version_RoleSuffix

Token Required Accepts
Type yes SM, T, M, SMM, VFX, SMA, AU, P, SC, CAM, LGT, VOL, SYS, DA
Category yes Character, Effect, Kit, Prop
SubCategory optional PascalCase
Set optional PascalCase, paired with SetNum
SetNum optional /^\d{2}$/
Descriptor yes PascalCase
Descriptor2 optional PascalCase
Descriptor3 optional PascalCase
Num yes /^\d{2}$/
Action optional PascalCase, defined per type
Var optional /^\d{2}$/
Version optional /^V\d+$/
RoleSuffix optional defined per type

Type prefixes

Prefix Meaning Applies to Note
SM_ 3D Model model Meshes carry SM_ so they are never mistaken for the prefab that usually accompanies them.
T_ Texture or Sprite texture
M_ Material (Unity) material Named for the texture set it is built from, not for the mesh it lands on. See rules/material.json.
SMM_ Material (.fbx/.blend) material Authored in Blender; replaced in Unity by a proper M_ material.
VFX_ Visual Effect vfx
SMA_ Static Mesh Animation animation
AU_ Audio Clip audio
P_ Prefab prefab A prefab wrapping one model carries that model's name with SM swapped for P. See rules/prefab.json.
SC_ Scene scene SC[Level][Layer]; see the Scene Structure doc.
CAM_ Camera sceneObject
LGT_ Light sceneObject
VOL_ Volume sceneObject
SYS_ System sceneObject An important, mostly singleton system such as a dialogue system.
DA_ Data Asset data NOT in Naming Conventions.md. Added so .bgasset ids can follow the same pattern; rename or remove if the studio picks a different prefix.

Per-type overrides

Where a type needs something the single pattern cannot say.

SM_: 3D Model

Token Required Accepts
RoleSuffix optional PascalCase

Regex: ^SM_(?:Character|Effect|Kit|Prop)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?_(?:\d{2})(?:_(?:\d{2}))?(?:_(?:V\d+))?(?:_(?:[A-Z][A-Za-z0-9]*))?$

SMM_: Material (.fbx/.blend)

Token Required Accepts
$note optional any part
RoleSuffix yes PascalCase

Regex: ^SMM_(?:Character|Effect|Kit|Prop)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?_(?:\d{2})(?:_(?:\d{2}))?(?:_(?:V\d+))?_(?:[A-Z][A-Za-z0-9]*)$

M_: Material (Unity)

Token Required Accepts
$note optional any part
Category yes Sprite, Effect, Mask, Trim, Cutout, Surface
RoleSuffix optional PascalCase

Regex: ^M_(?:Sprite|Effect|Mask|Trim|Cutout|Surface)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?_(?:\d{2})(?:_(?:\d{2}))?(?:_(?:V\d+))?(?:_(?:[A-Z][A-Za-z0-9]*))?$

P_: Prefab

Token Required Accepts
$note optional any part
Category yes Character, Effect, Kit, Prop, UI, System, Gameplay, Audio
RoleSuffix optional PascalCase

Regex: ^P_(?:Character|Effect|Kit|Prop|UI|System|Gameplay|Audio)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?_(?:\d{2})(?:_(?:\d{2}))?(?:_(?:V\d+))?(?:_(?:[A-Z][A-Za-z0-9]*))?$

T_: Texture or Sprite

Token Required Accepts
$roleNote optional any part
Category yes Sprite, Effect, Mask, Trim, Cutout, Surface
RoleSuffix optional Albedo, Roughness, Normal, AO, Metallic, Emissive, Height, Damage, EdgeMask, Packed, Flipbook, Noise, Gradient, Distortion, MotionVector

Regex: ^T_(?:Sprite|Effect|Mask|Trim|Cutout|Surface)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?_(?:\d{2})(?:_(?:\d{2}))?(?:_(?:V\d+))?(?:_(?:Albedo|Roughness|Normal|AO|Metallic|Emissive|Height|Damage|EdgeMask|Packed|Flipbook|Noise|Gradient|Distortion|MotionVector))?$

SMA_: Static Mesh Animation

Token Required Accepts
Action optional PascalCase

Regex: ^SMA_(?:Character|Effect|Kit|Prop)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?_(?:\d{2})(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?(?:_(?:V\d+))?$

VFX_: Visual Effect

Token Required Accepts
Action optional PascalCase

Regex: ^VFX_(?:Character|Effect|Kit|Prop)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?_(?:\d{2})(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?(?:_(?:V\d+))?$

AU_: Audio Clip

Token Required Accepts
Category yes SFX, Music, Ambience, VoiceOver, UI
Action optional PascalCase

Regex: ^AU_(?:SFX|Music|Ambience|VoiceOver|UI)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?_(?:\d{2})(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?(?:_(?:V\d+))?$

SC_: Scene

Token order: Type_Descriptor_RoleSuffix

Token Required Accepts
$layerNote optional any part
RoleSuffix optional Base, Environment, Gameplay, Lighting, Audio, UI

Regex: ^SC_(?:[A-Z][A-Za-z0-9]*)(?:_(?:Base|Environment|Gameplay|Lighting|Audio|UI))?$

CAM_: Camera

Token order: Type_Descriptor_Descriptor2_Descriptor3_Num

Token Required Accepts
Num optional /^\d{2}$/

Regex: ^CAM_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?$

LGT_: Light

Token order: Type_Descriptor_Descriptor2_Descriptor3_Num

Token Required Accepts
Num optional /^\d{2}$/

Regex: ^LGT_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?$

VOL_: Volume

Token order: Type_Descriptor_Descriptor2_Descriptor3_Num

Token Required Accepts
Num optional /^\d{2}$/

Regex: ^VOL_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?$

SYS_: System

Token order: Type_Descriptor_Descriptor2_Descriptor3_Num

Token Required Accepts
Num optional /^\d{2}$/

Regex: ^SYS_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?$

DA_: Data Asset

Token Required Accepts
Category yes Achievement, Action, Audio, Brain, Character, Condition, Craft, Goal, Item, Narrative, Progression, Quest, Taxonomy, Thought, UI, World
Action optional PascalCase
RoleSuffix optional PascalCase

Regex: ^DA_(?:Achievement|Action|Audio|Brain|Character|Condition|Craft|Goal|Item|Narrative|Progression|Quest|Taxonomy|Thought|UI|World)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?_(?:[A-Z][A-Za-z0-9]*)(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:[A-Z][A-Za-z0-9]*))?_(?:\d{2})(?:_(?:[A-Z][A-Za-z0-9]*))?(?:_(?:\d{2}))?(?:_(?:V\d+))?(?:_(?:[A-Z][A-Za-z0-9]*))?$

Categories

Model categories

Character · Effect · Kit · Prop

Texture categories

Sprite · Effect · Mask · Trim · Cutout · Surface

Prefab categories

Character · Effect · Kit · Prop · UI · System · Gameplay · Audio

Audio categories

SFX · Music · Ambience · VoiceOver · UI

Data categories

Achievement · Action · Audio · Brain · Character · Condition · Craft · Goal · Item · Narrative · Progression · Quest · Taxonomy · Thought · UI · World

Examples

Name Reads as
SM_Prop_OldTable_01 Type=SM, Category=Prop, Descriptor=OldTable, Num=01
SM_Prop_Plant_01 Type=SM, Category=Prop, Descriptor=Plant, Num=01
T_Surface_Tree_01 Type=T, Category=Surface, Descriptor=Tree, Num=01
SM_Kit_House_01_Basement_01 Type=SM, Category=Kit, Set=House, SetNum=01, Descriptor=Basement, Num=01
T_Surface_WoodPlanks_01_Albedo Type=T, Category=Surface, Descriptor=WoodPlanks, Num=01, RoleSuffix=Albedo
T_Surface_OldChair_01_EdgeMask Type=T, Category=Surface, Descriptor=OldChair, Num=01, RoleSuffix=EdgeMask
T_Mask_OldChair_01_EdgeMask Type=T, Category=Mask, Descriptor=OldChair, Num=01, RoleSuffix=EdgeMask
SM_Prop_Kitchen_Mixer_01 Type=SM, Category=Prop, SubCategory=Kitchen, Descriptor=Mixer, Num=01
SMM_Prop_Kitchen_Mixer_01_Handle Type=SMM, Category=Prop, SubCategory=Kitchen, Descriptor=Mixer, Num=01, RoleSuffix=Handle
SMA_Kit_FrontDoor_01_Open Type=SMA, Category=Kit, Descriptor=FrontDoor, Num=01, Action=Open

Naming rule ids

Id Meaning Severity
NAM001 Name does not match the naming grammar warning
NAM002 Unknown type prefix warning
NAM003 Token value is not in its allowed list warning
NAM004 Token does not match its required format warning
NAM005 Required token is missing warning
NAM006 Name has more segments than the grammar allows warning
NAM007 Name contains spaces or unsafe characters warning
NAM009 Name is longer than the maximum length warning

What goes in which category

Id Rule Severity Value
CAT001 Asset is not in the category the decision ladder puts it in info
CAT002 Texture is not in the category the texture ladder puts it in info
CAT003 Kit asset does not carry a Set and SetNum warning

The decision ladder

Applies to model and prefab categories. Read top to bottom and stop at the first yes.

# Ask Then it is
1 Does it deform? Is it skinned to a skeleton, or worn by something that is? Character
2 Is it geometry for an effect rather than an object? Does it only make sense with a particle system, VFX graph or decal projector driving it? Effect
3 Is it a piece of a modular set? Does it snap to the grid and connect to its siblings? Kit
4 Anything still here. Prop

Tiebreakers

  • Two answers still standing: take the one HIGHER on the ladder. Each step up asks more of the mesh than the step below it, so stopping early never asks less of an asset than it should.
  • Kit is a yes/no question and the answer is about the SET, not the piece. A wall built to tile against the other walls of AbandonedTavern is Kit. The same wall modelled once, for one building, connecting to nothing, is a Prop.
  • One mesh, one category. If a thing genuinely needs to be two, it is two meshes. The wall segment that is part of a kit and the one-off feature wall are not the same asset with a placement question.
  • A Kit piece carries a Set and a SetNum and no SubCategory, and that is what puts it in Kit/. A name with no Set is not a Kit piece, whatever it depicts (see CAT003).
  • Held items are Props. Swords, pans, brooms and lanterns are Props with a SubCategory that says what they are for. Where the hand goes is a socket on the prefab, set up in Unity, and it is not a property of the mesh.

Model categories in detail

Character

Anything rigged and animated as a creature or a person, plus everything skinned onto one.

  • Test. Does it deform when it moves? Does it have a skeleton with .L/.R bones?
  • Includes. Player characters · NPCs · Creatures · Body parts and heads · Hair · Clothing · Armour · Anything skinned to a character rig
  • Not. A rigid thing a character holds is a Prop, even though a hand is touching it. The line is skinning: a Character part deforms with bones, a held Prop is parented to a socket and stays rigid.
  • Authoring. vertexDensityTier character, pivot world origin, feet at Y=0

Effect

A mesh that exists to be rendered by an effect system rather than to be an object in the world.

  • Test. Does it only make sense with a particle system, VFX graph or decal projector driving it?
  • Includes. Particle meshes · Trail and ribbon geometry · Beam and cone shells · Flipbook cards and billboard planes · Decal meshes · Force-field and shield shells · Splash and impact sheets
  • Not. The effect asset itself is VFX, not SM. Effect covers only the meshes an effect needs. A puddle that is part of the level is a Prop; the splash that lands in it is Effect.
  • Authoring. vertexDensityTier mobile, pivot at the emission point

Kit

A piece of a modular set. It snaps to the grid, it connects to its siblings, and it is never the only one of its kind.

  • Test. Is it part of a set of pieces designed to tile and connect? Does it snap to grid.primary or grid.sub, with flat connecting faces?
  • Includes. Walls, floors, ceilings and roof sections of a kit · Stairs, ramps and railings that tile along a run · Doors and windows that fill a grid opening · Pillars, beams and trim runs · The panels, inserts, trim and corner pieces one split element is made of · Fence and wall runs · Pipe, cable and ducting runs · Built-in counters and cabinetry that snap to a wall segment · Road and bridge segments · Roof slopes, ridges, hips, valleys, verges and dormers · Gable walls, which are walls and belong with the wall pieces · Balcony slabs, balustrades and the corbels under them
  • Not. A one-off building modelled whole, a landmark, a statue, a tree, a cliff. None of those tile against anything, none of them snap, and putting them in Kit means Kit/ holds a set of one.
  • Authoring. vertexDensityTier environment, pivotClasses wall, floor, ceiling, fence, door, insert, trim, corner, hatch, roof, gable, stair, balcony

Prop

A standalone object. Everything that is not skinned, not driven by an effect system, and not a piece of a modular set.

  • Test. Is it its own thing rather than a piece of something else?
  • Includes. Furniture · Containers and crates · Clutter and tableware · Books and paper · Signage and pictures · Appliances and machines · Debris · Collectibles and pickups · Vehicles · Weapons, hand tools, utensils and anything else a character holds · Trees and plants · Cliffs, boulders and rock formations · Street lamps, hydrants, benches · One-off buildings and landmarks that are not built from a kit
  • Not. A piece that tiles against its siblings is Kit. Something skinned to a rig is Character.
  • Authoring. vertexDensityTier prop, pivot bottom-center

Prefab-only categories

UI

Anything that lives under a Canvas: screens, panels, widgets, HUD elements, popups, list rows.

  • Test. Does it need a RectTransform to make sense?

System

A scene-persistent manager or service. Usually one per concern, usually a singleton, usually living in SC_Systems.

  • Test. Would having two of it in the scene be a bug?

Gameplay

Placeable logic with no art of its own: triggers, spawners, checkpoints, waypoints, interaction volumes, patrol nodes.

  • Test. Is it invisible at runtime and placed by a designer?

Audio

An emitter, an ambience zone, or a music trigger, wrapped so a designer can place it.

  • Test. Is the only thing it does make sound?

Settled edge cases

Thing Category Why
Vase, bowl, jug on a surface Prop The question that started the rewrite. Nothing skins it, no effect drives it, and it is not a piece of a set, so it falls to step 4. Bottom-center, and done.
Sword, axe, any weapon Prop Held or decorative, it is the same mesh with the same pivot. The hand attaches to a socket on the prefab, so the decision that used to cost a re-pivot now costs nothing.
Kitchen knife, rolling pin, frying pan Prop Same. SubCategory Utensil if it helps the folder; the category never depended on whether a character picks it up.
Broom, shovel, wrench Prop Same again. There is no longer a category that these could be arguing with.
Car, cart, drivable vehicle Prop It stands on the ground and it is not a piece of a set. If it is skinned to a rig and animated as a creature would be, the ladder catches it at step 1 and it is a Character instead.
Car as a piece of a wrecked-street kit Kit The exception that proves the test: if it ships as one of a set of street pieces that tile and snap together, it is Kit and it is named for the Set.
Wall, floor, ceiling, roof section of a set Kit The core case. Snaps to grid, connects to siblings, takes its pivot from mesh.pivots.byClass.
Door, window, shutter, hatch Kit Fills a grid.doorOpening and has a pivot class already. A door that opens is still a kit piece.
Cornice, string course, plinth, sill Kit A trim run, which the includes list already covered before anyone had a word for what it trims. Pivot class trim, and it is a separate asset from the panel it sits on because MSH013 will not let a projecting profile share a connecting face.
Corner pier, quoin, pilaster Kit Resolves where two runs meet, which is the one job no panel can do. Pivot class corner.
Window that does not open Kit Settled 2026-09-21, and it used to have no right answer: door gave it a hinge it has not got and prop gave it a bottom-center pivot that will not drop into an opening. Pivot class insert, on the OPENING's bottom-left.
Trapdoor, floor hatch, cellar door Kit A door in a FLOOR, and the case door gets wrong twice: it turns about a horizontal edge rather than a vertical one, and its top face finishes flush with the walking surface rather than standing on it. Pivot class hatch, and the opening it fills is grid.hatchOpening, which is square so it can be dropped in rotated.
Shutter, louvre, grille over a window Kit It closes over an opening rather than filling one, and it ships with the window it belongs to. insert if it sits in the reveal, prop if it is hung on the face and a level designer places it freely.
Roof slope, ridge, hip, valley, verge Kit The roof equivalent of wall, corner and trim, and all of one kit at one pitch. Pivot class roof for the slopes; a ridge or a verge is a run along an edge, so it is trim.
Gable wall Kit A WALL, not a roof piece, and the likeliest gap in a pitched-roof kit: its top edge has to be grid.roofPitch or the verge stands off it. Pivot class gable, which exists to say that and is the one class MSH017 deliberately cannot check.
Dormer Kit A little building standing out of a slope: cheeks, a front and a roof of its own. Ships as an assembly of Kit pieces, or as one piece where the kit only has the one.
Chimney Kit If the kit has stacks that tile up and cap, they are Kit pieces. A one-off chimney modelled whole for one landmark is a Prop, like any other one-off.
Balcony slab Kit A floor that projects. Pivot class balcony: the floor pivot, because its walking surface still has to land at storey level, and exempt from MSH015 because standing out of the facade is the whole point. How far out is grid.balconyDepth.
Balustrade, handrail run Kit Pivot class fence, which is what a balustrade is: a run that tiles along its length at bottom-left. There is deliberately no railing class, because it would be a second name for this one.
Corbel or bracket under a balcony Kit It projects from the wall and repeats along the run, which is trim in everything but name. Pivot class trim.
Stair flight, ladder, ramp Kit Traversal geometry measured against grid.stairRiser, grid.stairGoing and grid.stepHeight. Pivot class stair, which tiles along a DIAGONAL rather than an axis, so the seam check has no axis for it and says so.
Facade assembled from panels, trim and inserts Kit The PARTS are Kit assets. The assembly is a prefab with its own Descriptor and no mesh of its own (PRF001 exempts it by name), so there is no category question to answer twice.
Staircase, ladder, ramp Kit Traversal geometry measured against grid.stairRiser, grid.stairGoing and grid.stepHeight, tiling along a run.
Fence, railing, gate Kit Already a pivot class. Tiles along a run, so it is a kit piece even when the kit is only fences.
Pipes, cables, ducting runs Kit Authored as tiling runs against the grid, not as objects.
Built-in counter or cabinetry Kit Snaps to the wall segment, ships with the room kit. The freestanding version of the same thing is a Prop, and it is a second mesh.
One-off building, landmark, statue Prop Modelled whole, tiles against nothing, snaps to nothing. It used to be Environment and it is not a Kit, so it is a Prop, and being large it declares its own vertexDensity tier.
Tree, world-scale foliage Prop Nature at level scale is still a standalone object. SubCategory Nature, and declare the environment tier. MSH007's default would give a tree four times the density it should have.
Cliff face, boulder formation Prop Same. It is terrain-shaped, but nothing about it tiles or snaps. Declare the architecture tier for anything at that size.
Fist-sized rock Prop Also a Prop, and this is the point: the old ladder split these two and the new one does not need to.
Potted plant Prop Stands on a surface, ships on its own.
Street lamp, hydrant, bolted bench Prop Fixed street furniture used to be Environment on the strength of being bolted down. Bolted down is not a modular set, so it is a Prop, unless it genuinely ships as part of a street kit. Then it is Kit and named for the Set.
Loose indoor bench or stool Prop Was always a Prop and still is.
Water body in a level Prop Unless it is a set of tiling water pieces, which would be Kit. However it is shaded does not enter into it.
Splash, ripple, spray Effect Geometry a VFX graph drives. Step 2.
Painting, rug, curtain Prop Dressing attached to architecture is still dressing. It carries no structural load and no snap.
Hanging shop sign Prop Unless it ships as a piece of a building kit, in which case it is Kit and named for the Set.
Wall-mounted torch or sconce Prop It hangs on the wall; it is not a piece the wall is built from. The carried version is the same mesh and the same category now, which is one fewer asset than this row used to require.
Coin, key, collectible pickup Prop Nothing above claims it.
Worn backpack, hat, cloak Character Skinned to the rig it is worn on. Deforms, therefore Character.
First-person arms Character A rig with no body is still a rig.
Bread, cake, food on a shelf Prop Set dressing, and it stays one mesh even when a character is animated holding it.
Decal mesh (blood, grime, poster geo) Effect Geometry a projector drives. The texture on it is Cutout, not Surface.
Trim-sheet-textured kit piece Kit The texture category does not decide the model category. A TTrim sheet on an SMKit piece is the normal case.

Which texture category

Id Rule Severity Value
CAT002 Texture is not in the category the texture ladder puts it in info

Read top to bottom and stop at the first yes.

# Ask Then it is
1 Is it drawn in screen space, like UI, an icon, or a 2D element with no world surface behind it? Sprite
2 Is it read by a particle system or a VFX graph rather than by a surface shader? Effect
3 Does it carry no colour of its own? Is it a mask or a lookup a shader reads OVER another texture? Mask
4 Is it one sheet a whole kit maps bands of, rather than a texture for one object? Trim
5 Does alpha cut its silhouette? Would it read as a rectangle without it? Cutout
6 Anything still here. Surface
  • Two answers still standing: take the one HIGHER on the ladder, the same as for models.
  • The texture category does not follow the model category and never has. A TTrim sheet on an SMKit piece is the normal case, and a Prop can carry a Cutout.
  • A map's ROLE is not its category. Albedo, Normal, Roughness and the rest are the RoleSuffix. Every category ships the maps it needs, and T_Surface_Wallpaper_01_Normal is a Surface texture whose role is Normal.
  • Ask what reads it, not what it shows. The same painted leaf is Cutout on a foliage card, Effect as a flipbook frame in a leaf-fall effect, and Mask if a shader only ever samples one channel of it.

Sprite

Anything drawn in screen space: UI, icons, frames, crosshairs, 2D art.

  • Test. Is it scaled to a rect on screen rather than mapped to a surface in the world?
  • Includes. Buttons and panels · Icons · Frames and borders · Crosshairs and reticles · 2D art and portraits
  • Authoring. texelDensity exempt, maxResolution 2048

Effect

A texture a particle system or VFX graph reads: flipbooks, noise fields, gradients, distortion and motion vectors.

  • Test. Is it sampled by an effect graph rather than by a surface shader?
  • Includes. Flipbook sheets · Noise fields · Colour ramps and gradients · Distortion offsets · Motion vectors · Soft particle sprites
  • Authoring. texelDensity exempt, maxResolution 2048, requirePowerOfTwo true

Mask

A texture with no colour of its own, read over another one: damage, edge wear, RGB tint masks, blend masks.

  • Test. Does a shader read a CHANNEL of it to modulate something else, rather than showing it?
  • Includes. Damage and wear masks · Edge masks · RGB tint masks (see texture.rgbMask) · Blend and vertex-blend masks · Opacity masks read separately from a surface
  • Not. A packed PBR texture is not a Mask. It is part of a surface and ships as TSurface_01_Packed. Mask is for a map read on its own, over a material it is not part of.
  • Authoring. requiredMaps none, sRGB false

Trim

One sheet a whole modular set shares, laid out in strips that pieces map bands of.

  • Test. Do several different meshes map different bands of this one sheet?
  • Authoring. texelDensity trim, sharedPerSet true

Cutout

A surface whose silhouette is cut by alpha. Without the alpha it reads as a rectangle.

  • Test. Is the shape of the thing in the alpha channel rather than in the mesh?
  • Includes. Leaf and foliage atlases · Grass and fern cards · Ivy and vine sheets · Chain-link, grating and lattice · Torn paper, netting, lace · Cobwebs
  • Not. A leaf sheet a particle system drives is Effect, because step 2 caught it first. A leaf texture a shader only samples one channel of is Mask.
  • Authoring. texelDensity as declared, requiredMaps Albedo, Roughness, Normal, alpha opacity only

Surface

An ordinary opaque surface. The default, and the one every other category is defined against.

  • Test. Anything the five questions above did not claim.
  • Includes. Tiling material surfaces: brick, plaster, grain, cobblestone · Baked object textures for a single mesh · Anything opaque, mapped to geometry, read by a surface shader
  • Authoring. texelDensity by tier, requiredMaps Albedo, Roughness, Normal

Settled texture edge cases

Thing Category Why
Leaf atlas, foliage card, grass card Cutout Alpha cuts the silhouette. Step 5 before step 6, so it is never Surface.
Falling-leaf flipbook for a particle system Effect Step 2 catches it before the alpha question is asked. What reads it decides.
Bark, tree trunk surface Surface Opaque. The silhouette is the mesh's.
Leaf colour-variation mask Mask No colour of its own; a shader samples a channel of it over the albedo.
Smoke, fire, spark sheet Effect Read by a VFX graph. TEX008 owns its grid.
Noise field, gradient ramp, distortion map Effect Same reason. The role suffix says which, the category says who reads it.
Kit-wide strip sheet Trim Several meshes map bands of one sheet. Named for the Set.
Baked texture for one prop Surface An ordinary surface that happens to be unique to one mesh. T_Surface_OldChair_01_Albedo.
Packed metallic/AO/detail/roughness map Surface Part of a surface, not a mask over one. Its role suffix is Packed.
Rust, grime, damage overlay Mask Read over a base material. T_Mask_Rust_01 over a steel material, never T_Surface_Rust_01 standing alone.
UI button, icon, frame, crosshair Sprite Screen space. Lives in Exported/Images/UI, not in the texture roots.
Decal texture (blood, poster, grime patch) Cutout A projector needs the alpha to know where the decal stops. The MESH it projects onto is the Effect category; the texture is not.
Chain-link fence, grating, lattice Cutout The holes are in the alpha, not in the geometry.
Skybox, cubemap Surface Nothing above claims it, and step 6 is the catch-all. It declares its own resolution; the density formula does not apply and nothing pretends it does.

Which class a kit piece is

Id Rule Severity Value
MSH018 Piece is named for a thing the class ladder puts in a different class info

What does it have to line up with, and what happens at its two ends? Every class below is an answer to that one question and to nothing else. The names read like a taxonomy of building parts and are not one. corner and a roof's hip are the same class because they do the same job, and floor and balcony are different classes although they are the same shape.

The class ladder

Read top to bottom and stop at the first yes. The last column is the near miss each step must not swallow.

# Ask Then it is But not
1 Does it move, turning about a HORIZONTAL edge, like a trapdoor, a cellar flap or a deck hatch? hatch a lid you pick up and carry, which is a prop.
2 Does it move, turning about a VERTICAL edge, like a door, a gate or a shutter that swings? door a fixed panel across an opening, which never moves and belongs to the step below.
3 Does it fill an opening some other piece cut, and stay put, like a fixed window, a grille, a louvre or a roof light? insert a window hung on the face of a wall rather than set into it, which lines up with nothing and is a prop.
4 Is it a band that runs along a seam or an edge and stands PROUD of the surface behind it, like a plinth, a string course, a cornice, a sill, a ridge, a verge or a gutter? trim a pilaster, which stands proud but runs UP a bay rather than along a seam. That is still the wall face, and it is a wall.
5 Does it resolve a junction, the point where two runs meet or where two slopes do? corner a quoin course painted on a flat panel, which is a texture and not a piece.
6 Is it a SLOPED plane carrying the roof covering? roof the capping along the top of it, which runs along a seam and is trim.
7 Is it the wall that CLOSES the end of a pitched roof, rising to a point under the slopes? gable a parapet, which continues up past the roof line and hides it rather than closing it.
8 Do you climb it? Does it rise as it runs? stair a landing, which is level and is a floor.
9 Is it walked on, and does it PROJECT past the wall below it? balcony a loggia, which is cut INTO the building behind the wall face. Nothing projects, so it is a floor.
10 Is it walked on and level? floor the underside of the storey above, which is the next step.
11 Is it overhead and level, a surface seen from below and from nowhere else? ceiling a soffit under an eave, which runs along an edge and is trim.
12 Is it a free-standing run with nothing above it, like a fence, a railing, a balustrade, a parapet or a yard wall? fence a balustrade modelled in one piece with the slab under it. Split them: the slab is a balcony and the guard is a fence.
13 Anything still here that stands on the grid and carries a storey. wall anything above, which is why this step is last.

Every class, and the words that mean it

The words are what a Part or a Variant is checked against. Each one belongs to exactly one class; a word that honestly belongs to two is an edge case below.

Class Is Pivot Words
wall The flat field of the facade: what fills a cell of the grid and carries the storey above. bottom-left Wall, Panel, Pier, Pilaster, Arch, Jamb, Reveal, Lintel, Keystone, Bay
gable The triangular wall that closes the end of a pitched roof. bottom-left Gable
floor A level surface you walk on, inside the footprint. top-left Floor, Deck, Landing, Loggia
ceiling A level surface overhead: the underside of the storey above. bottom-left Ceiling
fence A free-standing run that tiles along itself and carries nothing. bottom-left Fence, Railing, Balustrade, Baluster, Handrail, Parapet
door A moving panel on a vertical hinge. bottom-hinge Door, DoorLeaf, Gate
hatch A moving panel on a horizontal hinge, set into a floor or a roof. top-hinge Hatch, Trapdoor
insert Anything that fills an opening another piece cut, and stays put. opening-bottom-left Window, Casement, Sash, Mullion, Transom, Louvre, Grille, RoofLight
trim A band running along a seam or an edge, standing proud of the surface behind it. wall-plane-bottom-left Trim, Cornice, StringCourse, Plinth, Sill, Threshold, Fascia, Soffit, Gutter, Flashing, Ridge, Verge, Eave, Corbel, Bracket
corner The piece that resolves a junction. One per junction, and it never tiles. bottom-left Corner, Quoin, Hip, Valley, Newel
roof A sloped plane carrying the covering. bottom-left Roof, Slope
stair A run you climb, rising as it goes. bottom-left Stair, Step, Tread, Riser
balcony A platform projecting past the wall below it. top-left Balcony, Cantilever
prop Not a kit piece at all. Nothing snaps to it and nothing tiles against it. bottom-center

Settled class edge cases

Thing Class Why
Shutter insert, or prop Set into the reveal and closing over the opening it is an insert, like everything else that fills one. Hung on the face of the wall and placed by eye, it lines up with nothing and is a prop. The two are modelled differently, so decide before you build rather than after.
Dormer an assembly, not one class A little building standing out of a slope: two cheeks, a front, a roof of its own and usually a window. Each of those is a piece in its own class. It ships as a prefab of Kit pieces, not as one mesh wearing one class.
Chimney an assembly, or a prop A stack that crosses the roof plane is an assembly. The shaft is a wall run and the cap is trim. A short decorative one that sits on a slope and connects to nothing is a prop.
Column wall, or prop Standing in a run and carrying the storey above it is a wall: it fills a cell of the grid the way a pier does. Freestanding in a courtyard with nothing bearing on it, it is a prop.
Storey, Bay neither, they are units A bay is one vertical division of a facade and a storey is one horizontal division. They are how a facade is COUNTED, not things you model. A piece named Bay_01 is the wall panel that fills one.
A balustrade with its slab two pieces Modelled together they cannot be mixed, and the balcony you have is the only balcony you will ever have. The slab is a balcony and the guard is a fence, and every kit that gets this right gets three balconies out of two meshes.
Threshold trim It runs along a seam (the one at the bottom of a doorway) and stands proud of the floor either side. Being walked over does not make it a floor, any more than a plinth being touched makes it a wall.

Size words, worked out

A bare word is about the axis the piece tiles on. Compound it with Length, Width, Height, Turn to claim another.

Word Fraction On a 4 m segment
Full 1/1 4.00 m
Double 2/1 8.00 m
ThreeQuarter 3/4 3.00 m
Half 1/2 2.00 m
Quarter 1/4 1.00 m

Turn words, worked out

A different list, because the legal fractions depend on what they are a fraction of. Every one is a unit fraction: N pieces of a 1/N turn close a circle for any N, and nothing else closes at all.

Word Fraction Degrees Pieces to close a circle
FullTurn 1/1 360 1
HalfTurn 1/2 180 2
ThirdTurn 1/3 120 3
QuarterTurn 1/4 90 4
SixthTurn 1/6 60 6
EighthTurn 1/8 45 8
TwelfthTurn 1/12 30 12
SixteenthTurn 1/16 22.5 16

Categories we have removed

These fail NAM003 like any unknown word. They are listed so the report can name the replacement instead of leaving you to pick one.

Was Use Removed Why
Tool Prop 2026-09-12 Tool only ever meant 'authored around the grip'. The grip is a socket set up on the prefab in Unity, so the category carried no consequence a mesh could be checked against. It also forced a decision (is this sword decoration, or is it held?) at the moment it was least knowable. A held item is a Prop, with Weapon, Utensil or whatever else as its SubCategory.
Environment Kit or Prop 2026-09-12 Environment was doing two jobs: modular kit pieces, which snap to the grid and take a pivot from their class, and world-scale one-offs, which do neither. Kit took the first job, because 'is this a piece of a modular set?' has one answer. Everything else (trees, cliffs, one-off buildings, street furniture) is a Prop, and declares a lower vertexDensity tier if it is large. See mesh.vertexDensity.$worldScaleNote.
SURF Surface 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).
CUTOUT Cutout 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).
TRIM Trim 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).
MASK Mask 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).
SPRITE Sprite 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).
FX Effect 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).
MUS Music 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).
AMB Ambience 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).
VO VoiceOver 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).
ACH Achievement 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).
ACTION Action 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).
AUDIO Audio 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).
BRAIN Brain 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).
CHAR Character 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).
COND Condition 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).
CRAFT Craft 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).
GOAL Goal 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).
ITEM Item 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).
NARR Narrative 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).
PROG Progression 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).
QUEST Quest 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).
TAX Taxonomy 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).
THOUGHT Thought 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).
WORLD World 2026-10-13 One spelling for every category list: capitalised words, like the model categories. The ALL-CAPS codes were mixed up with them (SM_PROP_Chair_01).

The words we use

Id Rule Severity Value
LEX001 Descriptor does not use the studio word for the thing it names info
LEX002 Name uses a word the vocabulary replaces warning

Vocabulary conventions

  • One word per thing. Where two words mean the same thing, this file picks one; the other is in replaces and reports.
  • Name the surface, not the material, on a texture. Grain says what you are looking at; Wood says what it is made of, and everything from a plank to a stump is made of wood.
  • Name the thing, not the shot. Grain and not GrainCloseUp, Brick and not BrickWallTexture. The type prefix already says it is a texture and the folder already says where it lives.
  • Singular unless the mesh really is several. Brick for a brick texture; Beams is fair on a ceiling piece that carries four of them.
  • British English, matching the rest of this repo: Render not Stucco, Timber not Lumber. Both of those are entries in replaces, because a convention nothing checks is only a preference, and this list only claims the ones that are backed.
  • A word not in this file is not wrong. It is only wrong once someone else has named the same thing differently. That is the moment to add both here and pick one.

Wood

The example that started this file. A tree has an outside and an inside, they look nothing alike, and Wood is the word that refuses to say which one you meant.

A log with its cut end, a sawn plank and a stump, labelled Bark, Grain and EndGrain

Word Means Not
Bark The outside of a tree, living or felled. Rough, fibrous, wrapping around trunks, branches, logs, and the raw edge of a live-edge slab. Not the inside. A log shows Bark on its sides and EndGrain where it was cut.
Grain The inside of the tree, exposed by a cut. Every sawn face: planks, floorboards, crate sides, beams, a table top. Not a species or a stain. Oak and pine are both Grain; which one is the material's business.
EndGrain The face cut ACROSS the rings: the end of a plank, the top of a stump, a chopping block. Reads as rings or open pores, never as long lines. Not the same map as Grain rotated. It absorbs differently, it wears differently, and it is a separate texture.
Plank One long sawn board used as a surface piece: cladding, flooring, boardwalks, crate sides.
Beam Structural timber, roughly square in section, spanning something and carrying load.
Timber Sawn wood in general, where the piece is not specifically a Plank or a Beam.
Log A whole trunk section with the bark still on it.
Stump The cut base left in the ground: Bark round the sides, EndGrain on top.
Branch A limb off a trunk. See also Twig.
Twig Anything thin enough to snap by hand.
Plywood A laminated sheet. Striped edge, uniform face, no rings.
Charred Burnt wood: cracked into a black alligator-skin surface.

Ground, paving and stone

Three laid surfaces that get used for each other, and then the three sizes of rock, the other word that covers too much to be useful.

Four ground surfaces side by side, labelled Tile, Cobblestone, Flagstone and Gravel

Word Means Not
Tile Regular manufactured units in a repeating grid, thin even joints, flat faces and sharp edges. Floors and walls, mostly indoors.
Cobblestone Stone units set into a street or a yard, rounded and water-worn or cut into blocks. Either way the joints are wide and the surface is not flat. Not a Tile. The units vary, the joints are visible, and nothing about it is machined.
Flagstone Large flat slabs with an irregular outline and thin joints, laid as a paved surface.
Gravel Loose stones small enough to shift underfoot. Not bonded to anything.
Rubble Broken pieces of masonry and stone. Debris on a surface, not a surface.
Dirt Bare compacted earth. See also Mud.
Mud Dirt wet enough to hold a footprint.
Paving The group word for a laid ground surface. Fine in a folder name; on an asset, use the specific one.
Pavement The raised footpath beside a road. British sense only. The American 'road surface' meaning is not used here.
Stone The material, cut or natural, as a surface. Not a wall built of it, which is Stonework.
Boulder A single rock big enough to be its own object, sitting on the ground. Always a Prop; a large one declares the environment vertex-density tier. See the category guide.
Cliff A rock face at landscape scale, part of the terrain rather than sitting on it.

Walls

Units, the stuff between them, and the coat over the top. The last one is where Render and Stucco get used for each other.

Four wall surfaces side by side, labelled Brick, Block, Stonework and Render

Word Means Not
Brick Fired clay units, regular size, laid in courses with mortar joints.
Block Larger regular units, concrete or breeze. Coarser face, fewer joints.
Concrete Poured or precast, with no units and no joints except the ones cast in. Board-marked where the formwork left its grain. Not a Block, which is concrete made into units and laid like brick.
Stonework A wall built of stone, cut or uncut, with the joints visible.
Mortar The joint material between units. A texture and a mask, never a mesh.
Render The smooth coat over masonry, painted or bare. Hides the units underneath. Not the verb. A rendered image is a render too, which is why this word only ever appears in an asset name meaning the wall coat.
Plaster The interior coat. Smoother and thinner than Render.
Cladding An outer skin hung over structure: timber, metal or tile.

Wall parts

Walls above says what a wall is MADE OF. This says what a wall is made UP OF, which is a different question and had no words at all until pieces started being split. Roofs has had Ridge, Eave, Gutter and Flashing since the file was written, so a roof could already name its parts and a wall could not. Expect the collisions to be Cornice/StringCourse/Plinth, which are one shape at three heights, and Pier/Pilaster/Column, which are three shapes doing one job.

A two-storey facade with each part labelled, and a plan showing Pier, Pilaster and Column

Word Means Not
Panel The flat field of wall between the openings and the trim. The piece that fills a cell of the grid and carries no projection. Not the whole wall. Once a wall is split, Panel is one part of it and not a synonym for it.
Bay One vertical division of a facade: the strip from the ground to the roof containing one column of openings. The unit a facade is counted in. A five-bay frontage has five of them. Not a bay window, which projects outward and is a shape. This word is a division, and it is the one meant unless the name says Window.
Storey One horizontal division: one floor level of a building, measured to the next floor above. Not spelled Story. British English like the rest of this file, and here it also keeps the word clear of narrative content, which has a Story of its own.
Pier A vertical mass of wall carrying load, full depth, usually between two openings. Structural. Not a Pilaster. A pier is as deep as the wall; a pilaster is stuck on the front of it.
Pilaster A flat vertical strip standing slightly proud of the wall face, reading as a column without being one. Decorative. Not a Pier. Nothing rests on a pilaster.
Column A freestanding round vertical support, with something actually bearing on it. Not either of the two above. Round and standing on its own, or it is a Pier or a Pilaster.
Cornice The projecting horizontal band that CROWNS a wall, at the very top, where the roof meets it. Not any projecting band. Height is what separates the three: Cornice at the top, StringCourse in the middle, Plinth at the bottom.
StringCourse A horizontal band running across the middle of a facade, usually marking a floor level inside. The one that covers the seam between two storeys. Not a Cornice. It is the same profile at a different height doing a different job, and calling both Cornice loses which one a piece is.
Plinth The band at the BASE of a wall where it meets the ground, usually heavier and often a different material.
Sill The projecting ledge under a window, shedding water away from the wall below.
Lintel The flat structural member spanning the TOP of an opening. Not an Arch, which spans the same gap curved. Which one it is changes the piece, so the word has to say.
Arch A curved span over an opening, built of wedge units or cut as one.
Keystone The wedge at the crown of an arch, usually larger and often carved.
Jamb The vertical SIDE of an opening.
Reveal The returned depth of an opening: the surface between the wall face and the window or door set back in it. What makes a wall read as thick rather than as a plane with a hole.
Parapet Wall continuing UP past the roof line, hiding the roof from the street.
Quoin The dressed stones at a building's corner, alternating long and short.

Roofs

Its own group rather than a corner of Walls, because the three coverings are the ones that all become 'roof tiles' in conversation and the difference is in the unit, not the material.

Four roof coverings side by side, each drawn with its eave edge below its face, labelled Shingle, Slate, RoofTile and Thatch

Word Means Not
Shingle Overlapping WOOD units, split or sawn. Rectangular, widths vary, the bottom edge weathers ragged.
Slate Thin split STONE units. Flat, dark, rectangular, and the most uniform of the three. Not a slate-coloured tile. The word names what it is made of, and it is the one covering where that is true.
RoofTile Moulded clay or concrete units, curved or ridged, so the covering reads as waves rather than as a flat plane. Not a Tile. A floor Tile and a RoofTile share a word and nothing else, so the roof one carries the qualifier.
Thatch Bundled straw or reed, laid thick. No units at all, just a continuous mass with a deep rounded edge.

Roof parts

Ridge, Eave, Flashing and Gutter were in Roofs from the day that group was written, which made Roofs two lists wearing one name: four coverings and four parts. They are here now, with the words a pitched roof needs that nothing had. Same split as Walls and Wall parts, for the same reason. Expect the collisions to be Ridge/Hip/Valley, which are three lines where two slopes meet and differ only in which way the water goes, and Eave/Verge, which are the two edges of the same roof.

Word Means Not
Pitch The angle of a slope, in degrees from horizontal. The number every piece of one roof shares. Not a covering or a shape. A 40-degree roof can be Slate or Thatch and is the same pitch either way.
Ridge The horizontal line along the top where two slopes meet, and the capping units that sit on it.
Hip An external corner where two slopes meet and run DOWN together, sloping from ridge to eave. Not a Ridge, which is level, or a Valley, which is the same line turned inside out.
Valley The internal angle where two slopes meet and water runs down BETWEEN them. Not a Hip. Same geometry, opposite sign, and the wrong one leaks in the fiction and reads wrong on screen.
Eave The overhanging lower edge of a roof, level, where its thickness is visible from the ground.
Verge The sloping edge at a GABLE end, where the roof finishes over the wall. Not an Eave. An eave is the level bottom edge and a verge is the raking side one; a roof has both and they need different pieces.
Fascia The board closing the eave, which the gutter hangs from.
Soffit The underside of an overhang, seen from below and from nowhere else.
Gutter The channel along the eave that carries water off.
Flashing The metal strip sealing a junction, roof to wall or roof to chimney.
Dormer A window standing out of a roof slope, with cheeks and a little roof of its own.
RoofLight A window lying IN the plane of the slope, with nothing standing out. Not a Dormer, which projects. The two look nothing alike from the street and cost very different amounts of geometry.
Chimney The stack, from where it leaves the roof to its cap.
Gable The wall that closes the end of a pitched roof, rising to a point under the slopes. Not part of the roof. It is a WALL, it is built with the wall, and its top edge has to be the roof own pitch or the verge stands off it.

Openings

Wall parts names the hole: Jamb, Lintel, Sill, Reveal. This names what fills it, and how the filling is divided. The pairs that actually get swapped are Casement/Sash, which open completely differently, and Mullion/Transom, which are the same bar in two directions.

Word Means Not
DoorLeaf One moving panel of a door, gate or shutter. A double door is two leaves and usually two meshes. Not a Leaf, which grows on a plant and is in Nature. Same word, nothing else in common, so this one carries the qualifier, exactly as RoofTile does against Tile.
Casement A window hinged at the side, opening like a small door.
Sash A window that SLIDES, usually one pane past another vertically. Not a Casement. Neither one opens the way the other does, and a kit that mixes them without meaning to looks like two buildings.
Mullion The VERTICAL bar dividing one opening into lights.
Transom The HORIZONTAL bar doing the same job. Not a Mullion. One word each, because a window named for the wrong one cannot be found by anybody looking for the other.
Shutter A hinged panel over the OUTSIDE of a window, closing over it rather than filling it.
Trapdoor A door in a FLOOR: horizontal, hinged on one edge, walked over when it is shut.
Hatch The group word for a small covered opening anywhere: floor, wall, roof or vehicle. Not always a Trapdoor. Every trapdoor is a hatch; a serving hatch in a wall is not a trapdoor.
Threshold The piece across the bottom of a doorway that you step over.
Louvre A run of angled slats you can see through at one angle and not another. A vent, a shutter or a whole window.

Balconies and railings

A balcony is an assembly rather than a piece, and almost every word in it names a part somebody would otherwise call a railing. Balustrade/Baluster/Handrail are three parts of one thing, and Corbel/Bracket are the two ways of holding it up.

Word Means Not
Balcony A platform PROJECTING from a wall, guarded, reached from inside the building.
Loggia A covered gallery cut INTO the building behind the wall face. Not a Balcony. One sticks out and one is carved in, and they are built from completely different pieces.
Balustrade The whole guarding assembly along an edge: the balusters and the handrail on top of them.
Baluster One of the short posts in a balustrade.
Handrail The rail along the top, at hand height. Not the Balustrade. The handrail is the part you touch; the balustrade is everything holding it up.
Newel The heavier post at the end of a run, or where a stair turns.
Railing The group word for a guard along an edge, where the parts are not worth naming. Fine on a folder; on a piece, use the specific one.
Corbel A block projecting from a wall to carry something above it. Stepped or moulded, and structural in the fiction.
Bracket A shaped support under a projection, usually lighter and more decorative than a Corbel.
Cantilever A slab carried at one end only, with nothing under its far edge. Describes how it is held up, not what it is.

Metal

Name the metal where it reads as one, and keep the corrosion separate from the thing corroding.

Word Means Not
Steel Grey structural metal. The default where nothing says otherwise.
Iron Cast or wrought. Darker, heavier, usually older than Steel in the fiction.
Copper The metal. Weathered green is Patina over it, not a separate metal.
Brass Yellow alloy for fittings, handles, instruments.
Rust The corrosion, as a map or a mask over a base metal. Not a metal. T_Mask_Rust_01 over a Steel material, not T_Surface_Rust_01 standing alone.
Patina The green or brown weathering on copper and bronze. Same relationship to the metal as Rust.
Plate Thick flat metal, often riveted or bolted.
Sheet Thin metal, often corrugated or folded.
Grate A grid you WALK ON, like floor grating or a drain cover.
Grille A grid you LOOK THROUGH, like a vent, a radiator front or a speaker cover.
Mesh Woven or welded wire. Not a 3D mesh. Unambiguous in an asset name, because the type prefix already said SM_.

Fabric

Weave first, garment second. A texture is almost always the weave.

Word Means Not
Cloth The generic woven surface, where the weave is what reads and the material does not matter.
Canvas Heavy plain weave for sacks, awnings, tarpaulins.
Linen Fine irregular weave with visible slubs.
Velvet Pile fabric, the one that changes value with the viewing angle.
Rug A loose floor covering with edges you can see.
Carpet Fitted floor covering, wall to wall, no visible edge.
Curtain Hangs over a window.
Drape Heavier cloth hung over anything else: furniture, a doorway, a body.

Nature

The growing things, and the two words that get used for the mass and for one of it.

Word Means Not
Foliage The mass of leaves on a plant, as a card or an atlas.
Leaf One leaf, as a mesh or as a cutout on its own.
Grass The ground cover, whether card, mesh or terrain layer.
Moss Soft green growth ON another surface. A mask or an overlay, rarely a surface of its own.
Lichen Flat crusty growth on stone and bark. Same relationship as Moss.
Ivy Climbing growth with its own stems, placed as geometry over a wall.
Root Below-ground growth, or the visible flare where a trunk meets the ground.
Vine A hanging or trailing stem with no wall behind it.

Hair

Hair is authored as cards (flat strips carrying a clump of hair in their alpha), except where it is painted into the skin instead. These are the words for the parts of that, and they are the descriptors a hair asset name is built from. The scalp end of a card is spoken of as its root, but Root is already taken above for the part of a plant, and a word cannot mean two things in one vocabulary. In a name, use Scalp.

A head in profile labelled Fringe, Brows, Lashes, Stubble and Beard, with one Card called out of the hair and enlarged beside it to show its Clump, its Scalp end and its Tip; below, a Groom of Strands, and Ponytail, Braid and Bun seen from behind

Word Means Not
Card One flat strip of geometry carrying a clump of hair in its alpha. The unit hair is built from and the unit every budget counts.
Clump The painted group of hairs a single card shows. A clump is what is in the texture; a Card is the geometry showing it.
Strand One hair. What a groom is made of before it becomes cards, and what Sisir styles.
Groom The strand-level source a hairstyle is built as, before any cards exist. The thing that is kept and re-baked from. See also Card, Strand.
Scalp The surface hair grows from, and the end of a card that sits against it. Not the head mesh itself. A scalp is the region hair is planted on.
Tip The free end of a card or a strand. The end that moves most.
Fringe Hair falling forward over the forehead.
Ponytail Hair gathered and bound at one point, hanging free below it.
Braid Hair plaited into a rope. Stiff along its whole length, which is why it is the usual reason a card is pinned.
Bun Hair gathered and coiled against the head.
Beard Facial hair on the jaw and chin, as cards.
Brows Eyebrows, as cards or painted.
Lashes Eyelashes, always as cards.
Stubble Very short facial or body hair, painted into the skin texture and never carded.

Words we have replaced

Reported as LEX002. A name is checked only once it PARSES: an unreadable name was already reported by its NAM rule, and a second row for the same file is how a report gets skimmed. Every token except Type and Category is checked. Those two are closed lists NAM003 already owns; everything else is a word an author chose. Each token value is split on PascalCase boundaries and each word looked up whole, so WoodPlanks hits Wood and Woodland hits nothing.

Instead of Say Because On
Wood Bark, Grain, Plank on a surface, Wood does not say which surface, and the outside of a tree and a sawn face share nothing T_, M_, SMM_
Cobble Cobblestone a shortening. One word for it, so a search for either finds all of it every type
Cobbles Cobblestone same word, pluralised every type
Tiles Tile a tile texture is one tile that repeats T_, M_, SMM_
Bricks Brick same T_, M_, SMM_
Cobblestones Cobblestone same. Cobble and Cobbles were already here and this one is the sibling that slipped past them T_, M_, SMM_
Flagstones Flagstone same T_, M_, SMM_
Slates Slate same T_, M_, SMM_
Shingles Shingle same T_, M_, SMM_
Rock Stone, Boulder, Cliff Rock covers a pebble, a prop and a landscape, and those are three different assets in three different categories every type
Lumber Timber British English, like the rest of this repo every type
Stucco Render same reason every type
Cement Concrete, Mortar, Render cement is the powder in the bag. Nothing in a level is made of it every type
Burnt Charred one word for it, and Burned exists too every type
Burned Charred same every type
Grill Grille, Grate a grill cooks. Grille is the one you look through, Grate is the one you stand on every type
Moulding Cornice, StringCourse, Plinth, Sill Moulding is the profile, not the piece. Every one of the four is a moulding, so the word names none of them, and which one it is decides where on the wall it goes every type
Molding Cornice, StringCourse, Plinth, Sill same, and the American spelling as well every type
Windowsill Sill the only sills we have are window sills, and the name has already said Window if it needed to every type
Banister Balustrade, Handrail it names the whole assembly to some people and the rail on top to others, which is the one thing a word must not do here every type
Bannister Balustrade, Handrail same, and the doubled n as well every type
Chimneystack Chimney a shortening of nothing. The stack IS the chimney above the roof, and one word finds both every type
Story Storey British English. Narrative content keeps Story, which is why this is scoped to meshes SM_, P_, SMM_

Every word, alphabetically

151 words. Anything not here is not wrong. It is only wrong once someone else has named the same thing differently.

Word Where
Arch in Wall parts
Balcony in Balconies and railings
Baluster in Balconies and railings
Balustrade in Balconies and railings
Banister replaced, say Balustrade, Handrail
Bannister replaced, say Balustrade, Handrail
Bark in Wood
Bay in Wall parts
Beam in Wood
Beard in Hair
Block in Walls
Boulder in Ground, paving and stone
Bracket in Balconies and railings
Braid in Hair
Branch in Wood
Brass in Metal
Brick in Walls
Bricks replaced, say Brick
Brows in Hair
Bun in Hair
Burned replaced, say Charred
Burnt replaced, say Charred
Cantilever in Balconies and railings
Canvas in Fabric
Card in Hair
Carpet in Fabric
Casement in Openings
Cement replaced, say Concrete, Mortar, Render
Charred in Wood
Chimney in Roof parts
Chimneystack replaced, say Chimney
Cladding in Walls
Cliff in Ground, paving and stone
Cloth in Fabric
Clump in Hair
Cobble replaced, say Cobblestone
Cobbles replaced, say Cobblestone
Cobblestone in Ground, paving and stone
Cobblestones replaced, say Cobblestone
Column in Wall parts
Concrete in Walls
Copper in Metal
Corbel in Balconies and railings
Cornice in Wall parts
Curtain in Fabric
Dirt in Ground, paving and stone
DoorLeaf in Openings
Dormer in Roof parts
Drape in Fabric
Eave in Roof parts
EndGrain in Wood
Fascia in Roof parts
Flagstone in Ground, paving and stone
Flagstones replaced, say Flagstone
Flashing in Roof parts
Foliage in Nature
Fringe in Hair
Gable in Roof parts
Grain in Wood
Grass in Nature
Grate in Metal
Gravel in Ground, paving and stone
Grill replaced, say Grille, Grate
Grille in Metal
Groom in Hair
Gutter in Roof parts
Handrail in Balconies and railings
Hatch in Openings
Hip in Roof parts
Iron in Metal
Ivy in Nature
Jamb in Wall parts
Keystone in Wall parts
Lashes in Hair
Leaf in Nature
Lichen in Nature
Linen in Fabric
Lintel in Wall parts
Log in Wood
Loggia in Balconies and railings
Louvre in Openings
Lumber replaced, say Timber
Mesh in Metal
Molding replaced, say Cornice, StringCourse, Plinth, Sill
Mortar in Walls
Moss in Nature
Moulding replaced, say Cornice, StringCourse, Plinth, Sill
Mud in Ground, paving and stone
Mullion in Openings
Newel in Balconies and railings
Panel in Wall parts
Parapet in Wall parts
Patina in Metal
Pavement in Ground, paving and stone
Paving in Ground, paving and stone
Pier in Wall parts
Pilaster in Wall parts
Pitch in Roof parts
Plank in Wood
Plaster in Walls
Plate in Metal
Plinth in Wall parts
Plywood in Wood
Ponytail in Hair
Quoin in Wall parts
Railing in Balconies and railings
Render in Walls
Reveal in Wall parts
Ridge in Roof parts
Rock replaced, say Stone, Boulder, Cliff
RoofLight in Roof parts
RoofTile in Roofs
Root in Nature
Rubble in Ground, paving and stone
Rug in Fabric
Rust in Metal
Sash in Openings
Scalp in Hair
Sheet in Metal
Shingle in Roofs
Shingles replaced, say Shingle
Shutter in Openings
Sill in Wall parts
Slate in Roofs
Slates replaced, say Slate
Soffit in Roof parts
Steel in Metal
Stone in Ground, paving and stone
Stonework in Walls
Storey in Wall parts
Story replaced, say Storey
Strand in Hair
StringCourse in Wall parts
Stubble in Hair
Stucco replaced, say Render
Stump in Wood
Thatch in Roofs
Threshold in Openings
Tile in Ground, paving and stone
Tiles replaced, say Tile
Timber in Wood
Tip in Hair
Transom in Openings
Trapdoor in Openings
Twig in Wood
Valley in Roof parts
Velvet in Fabric
Verge in Roof parts
Vine in Nature
Windowsill replaced, say Sill
Wood replaced, say Bark, Grain, Plank

Meshes

Id Rule Severity Value
MSH001 Collection must have exactly one root object error true
MSH002 Object scale must be applied error true
MSH003 Every mesh must have a material error true
MSH004 Material slots must not be empty warning true
MSH005 Every mesh must have a UV map error true
MSH006 UV map must actually be unwrapped, not collapsed error true
MSH007 Mesh exceeds its vertices-per-square-metre budget error
MSH008 Mesh exceeds its triangle budget warning
MSH009 Pivot is not in the position required for this asset class warning
MSH010 UV channel is used for something other than its assigned purpose warning
MSH011 Shape key does not follow Category_Region_Action info
MSH012 Symmetric bone does not use the .L / .R suffix warning
MSH013 Face that connects to another modular piece is not flat warning true
MSH014 Model import scale is not the value the export settings expect warning 1
MSH015 Piece does not fit the grid cell it occupies warning true
MSH016 Trim projects further from the wall plane than the grid allows warning true
MSH017 Roof piece is not built at the kit pitch warning true
MSH019 Size word in the name does not match the piece it is on warning true
MSH020 Curved piece disagrees with its family about the radius, or with the turn its name claims warning true
MSH021 Name says something about size that no check can read warning true
MSH022 Hair card vertex data does not follow the channel contract warning true
MSH023 Wall thickness is not behind the face the piece is placed by warning true
MSH024 Kit piece belongs to a different kit than the file it is in warning true

vertexDensity (verts/m2)

tiers

Key Value
character 40000
prop 10000
environment 2500
mobile 1000
architecture 400

byCategory

Key Value
Character character
Effect mobile
Kit environment
Prop prop

Default: prop

triBudgets

Key Value
smallProp 1500
kitPiece 3000
largeProp 6000
hero 25000

Default: smallProp

pivots

Key Value
prop bottom-center
wall bottom-left
fence bottom-left
floor top-left
ceiling bottom-left
door bottom-hinge
insert opening-bottom-left
trim wall-plane-bottom-left
corner bottom-left
hatch top-hinge
roof bottom-left
gable bottom-left
stair bottom-left
balcony top-left

Tolerance: 0.001

wallDepth

Key Value
appliesToClasses wall, fence, gable, corner
exemptWhenTurning true

Tolerance: 0.001

uvChannels

Key Value
0 Texture
1 Overlay
2 Overlay

settings

Key Value
maxChannels 3

hairCards

tiers

Key Value
hero 320
standard 160
background 60

byCategory

Key Value
Character standard

assignments

Key Value
R root to tip along this card, 0 at the scalp
G per-card random, flat across the card
B stiffness, 0 free to 1 pinned
A reserved

settings

Key Value
attribute HairData
domain POINT
dataType FLOAT_COLOR
space sRGB
maxOverdrawLayers 4
minExtent 0.01
requireNormalTransfer true

Default: standard
Tolerance: 0.002

shapeKeys

Key Value
symmetrySuffixes _L, _R

Format: Category_Region_Action

bones

Key Value
symmetrySuffixes .L, .R

gridFootprint

Key Value
measureFrom wallPlane
exemptClasses prop, trim, balcony, roof
exemptWhenTurning true

Tolerance: 0.001

trimProjection

Key Value
appliesToClasses trim
maxFrom grid.trimProjectionMax

sizeWords

Key Value
fractions Full: 1/1; Double: 2/1; ThreeQuarter: 3/4; Half: 1/2; Quarter: 1/4
notChecked Large, Small, Long, Short, Tall, Tiny, Wide, Narrow
axisWords Length: tiling; Width: across; Height: up; Turn: around
turnFractions Full: 1/1; Half: 1/2; Third: 1/3; Quarter: 1/4; Sixth: 1/6; Eighth: 1/8; Twelfth: 1/12; Sixteenth: 1/16
appliesToCategories Kit
measureFrom moduleCell

Tolerance: 0.001

sizeNames

Key Value
appliesToCategories Kit
cases twice: Two descriptors read as a size. The parser takes the LAST one and the other is silently part of the variant, so the name says one thing to a person and another to every tool.; notLast: The size word is not the last descriptor. It still parses (the last descriptor that reads as a size wins), but the coverage matrix splits a variant from its size by taking the word off the END, so Wall_Half_Interior lists a variant called HalfInterior with no size at all, beside a Wall_Interior_Half that lists Interior at Half.; axisAlone: An axis word with no fraction in front of it. Turn is not a size; QuarterTurn is. The same goes for Length, Width and Height.; unknownAxis: A fraction compounded with a word no axis list names, like HalfDepth. It reads as a size to a person and as an ordinary variant to the parser, which is the worst of both. Only reported when the tail starts with a capital, because the grammar is PascalCase and Halfpipe is one word rather than two.; miscased: A size word spelled with a capital missing: Quarterturn, Threequarter. It passes the PascalCase format and matches no word in the vocabulary, so nothing reads it as a size at all.

kitFileSet

Key Value
appliesToCategories Kit

curves

Key Value
appliesToCategories Kit
measureFrom vertices
wholeTurn 360
turnTolerance 1
radiusTolerance 0.05
minimumTurn 1

roofPitch

Key Value
appliesToClasses roof
measureFrom boundingBox
toleranceFrom grid.roofPitchTolerance

Textures

Id Rule Severity Value
TEX001 Texel density is outside the tolerance for its tier warning
TEX002 Texture exceeds the maximum resolution warning 4096
TEX003 Texture dimensions must be powers of two warning true
TEX004 Import settings do not match the ones required for this map type warning
TEX005 Material is missing one of the standard maps info Albedo, Roughness, Normal
TEX006 Overlay texture has no fully transparent margin on its right edge warning 0.05
TEX007 Trim sheet does not follow the trim sheet layout warning
TEX008 Effect texture does not follow the flipbook or effect-map conventions warning
TEX009 Hair atlas does not follow the hair atlas layout warning true

texelDensity (px/m)

tiers

Key Value
hero 1024
standard 512
background 256
trim 512

byCategory

Key Value
Trim trim

settings

Key Value
exemptCategories Sprite, Effect

Default: standard
Tolerance: 0.25

resolutionGuide

Key Value
surfaceTiling 2048
objectUnder0_5m 1024
objectUnder2m 2048
objectOver4m 4096
trimSheet 2048

maxResolution

Key Value
Effect 2048
Sprite 2048

channelPacking

Key Value
R Metallic
G AO
B Detail
A Roughness

rgbMask

Key Value
R Primary
G Secondary
B Tertiary

overlayMargin

Key Value
edge right

trimSheets

Key Value
tilingAxis U
stripAxis V
requireSeamlessTilingAxis true
stripHeights 0.5, 0.25, 0.125, 0.0625, 0.03125
densityTier trim
sharedPerSet true

hairAtlas

Key Value
stripAxis U
cardAxis V
rootAt 1
requireSeamlessTilingAxis false
sharedPerSet true
densityTier standard
requiredMaps Albedo, Roughness, Normal

effects

Key Value
flipbook requireSquareGrid: true; frameCounts: 4, 9, 16, 25, 36, 64
requirePowerOfTwo true

importSettings

Key Value
Albedo sRGB: true; compression: high
Roughness sRGB: false; channel: SingleChannel
Normal sRGB: false; type: NormalMap
AO sRGB: false; channel: SingleChannel
Metallic sRGB: false; channel: SingleChannel
Emissive sRGB: true; compression: high
Height sRGB: false; channel: SingleChannel
Damage sRGB: false; channel: SingleChannel
EdgeMask sRGB: false; channel: SingleChannel
Packed sRGB: false; compression: high
Flipbook sRGB: true; compression: high
Noise sRGB: false; channel: SingleChannel
Gradient sRGB: true; compression: none
Distortion sRGB: false; compression: high
MotionVector sRGB: false; compression: high

Materials

Id Rule Severity Value
MAT001 Material built from one texture set does not carry that set's name warning true
MAT002 Material variant does not carry its base material's name warning
MAT003 Blender material does not name the mesh part it fills info

shape

Key Value
M_Surface_Wallpaper_01 the material built from the T_Surface_Wallpaper_01 texture set
M_Surface_Wallpaper_01_Cream a tint variant of it, sharing the same textures (see MAT002)
M_Trim_AbandonedTavern_01 the material for a kit's trim sheet, named for the Set the sheet is named for
M_Cutout_Leaf_01 a foliage material, alpha-clipped
M_Effect_Smoke_01 an unlit effect material read by a VFX graph
M_Mask_Rust_01 the rare case where a mask ships as its own material rather than as a channel of one
M_Surface_OldChair_01 a one-off baked material for a single prop; the texture set is T_Surface_OldChair_01

Pattern: M_[Category]_[SubCategory|Set_SetNum]_[Descriptor]_[Num]_[Variant]

variants

Key Value
suffixFormat PascalCase
suffixToken RoleSuffix

Prefabs

Id Rule Severity Value
PRF001 Prefab wrapping a single model does not carry that model's name warning true
PRF002 Prefab root object is not named the same as the prefab asset warning true
PRF003 Prefab variant does not carry its base prefab's name warning
PRF004 Prefab category does not match what the prefab contains warning

shape

Key Value
P_Prop_Kitchen_Mixer_01 the prefab of SMProp_Kitchen_Mixer_01. Same name, P for SM_
P_Kit_AbandonedTavern_01_Wall_Interior_01 a kit piece prefab, carrying the Set the mesh carries
P_Character_Baker_01 a rigged character with its animator and colliders
P_Prop_Kitchen_RollingPin_01 a held item, with whatever component makes it usable. The grip is a socket on this prefab; it is not a property of the mesh, which is why there is no longer a Tool category (see deprecatedCategories in rules/core.json).
P_UI_Shop_ItemRow_01 a widget under a Canvas
P_System_Dialogue_01 the singleton that becomes SYS_Dialogue in SC_Systems
P_Gameplay_Spawn_Customer_01 invisible placeable logic
P_Audio_Ambience_Street_01 an emitter placed by a designer
P_Prop_Kitchen_Mixer_01_Broken a variant of the first one

Pattern: P_[Category]_[SubCategory|Set_SetNum]_[Descriptor]_[Num]_[Variant]

variants

Key Value
suffixFormat PascalCase
suffixToken RoleSuffix

categoryMatchesContent

Key Value
UI requireRootComponent: RectTransform
Gameplay disallowComponents: MeshRenderer, SkinnedMeshRenderer
Character requireAnyComponent: Animator, SkinnedMeshRenderer
Effect requireAnyComponent: ParticleSystem, VisualEffect
Audio requireAnyComponent: AudioSource
System disallowComponents: MeshRenderer, SkinnedMeshRenderer; requireRootComponent: Transform

Scenes

Id Rule Severity Value
SCN001 Scene root is missing a required hierarchy section warning true
SCN002 Object sits at the scene root instead of inside a hierarchy section warning true
SCN003 Object still carries Unity's auto-duplication suffix warning true
SCN004 Scene object does not use the prefix required for its kind warning
SCN005 Scene name does not use a known layer warning
SCN006 Scene name does not match one of the defined scene kinds info
SCN007 Level does not have the minimal set of layer scenes warning true
SCN008 Scene object name does not follow the scene object convention warning
SCN009 Prefab instance has been renamed away from its prefab warning true
SCN010 Hierarchy group is not an empty transform at its identity warning true

layers

Base · Environment · Gameplay · Lighting · Audio · UI

Key Value
minimal Base, Environment, Gameplay
persistent SC_Systems

Pattern: SC_[Level]_[Layer]

kinds

Key Value
level shape: SC[Level][Layer]; example: SC_AbandonedTavern_Environment; note: One scene per discipline, loaded additively onto the Base layer. The Level word is the same in every layer of one level. That string is what groups them, so a typo in one splits a level in two.
persistent shape: SCSystems; example: SC_Systems; note: Loaded once and never unloaded. Holds the SYS objects and nothing that belongs to a place.
frontend shape: SC_[Screen]; example: SC_MainMenu; note: A screen rather than a place, so it has no layers. There is no environment to split from the gameplay. One scene, whole.; reserved: Boot, MainMenu, Loading, Credits, Settings; reservedNote: Reserved rather than closed: a game may have screens nobody else has. What the list buys is that the five every game DOES have are called the same thing in every game.
sandbox shape: SC_Sandbox[Topic]; example: SC_SandboxLighting; note: Test and scratch scenes. One PascalCase word, not SC_Sandbox_Lighting, because that form is already a level called Sandbox with a Lighting layer, and it would sort and load like one. The Sandbox prefix is what keeps every throwaway scene together in the list and findable when it is time to delete them.

requireHierarchySections

ARCHITECTURE · PROPS · NATURE · DECALS · SPAWNS · TRIGGERS · INTERACTABLES · NAVIGATION · CAMERAS

Key Value
Base none
Environment ARCHITECTURE, PROPS, NATURE, DECALS
Gameplay SPAWNS, TRIGGERS, INTERACTABLES, NAVIGATION, CAMERAS
Lighting LIGHTS, REFLECTIONS, VOLUMES
Audio AMBIENCE, EMITTERS
UI CANVASES

settings

Key Value
appliesTo level
all ARCHITECTURE, PROPS, NATURE, DECALS, SPAWNS, TRIGGERS, INTERACTABLES, NAVIGATION, CAMERAS, LIGHTS, REFLECTIONS, VOLUMES, AMBIENCE, EMITTERS, CANVASES
requireIdentityTransform true

Format: ---{NAME}---

objectPrefixes

Key Value
trigger TRG_
spawnPoint SPN_
waypoint WP_
camera CAM_
light LGT_
audio SND_
volume VOL_
marker MRK_
system SYS_
interactable INT_
navLink NAV_
decal DCL_
collisionBlocker COL_
effect VFX_
uiRoot UI_
probe PRB_

objectNaming

Key Value
section ---UPPERCASE---, at the origin. SCN001.
group PascalCase, optionally _NN. An empty transform at identity. SCN010.
prefabInstance the prefab asset's name, unchanged. SCN009.
kindObject the prefix from objectPrefixes, then PascalCase. SCN004.
plain PascalCase, optionally _NN.

settings

Key Value
separator _
maxLength 64
exempt ^---[A-Z0-9_]+---$

Pattern: ^[A-Z][A-Za-z0-9]*(?:_[A-Z][A-Za-z0-9]*)*(?:_\d{2})?$
Format: PascalCase

groups

Key Value
requireIdentityTransform true
requireEmpty true

Format: PascalCase

Audio

Id Rule Severity Value
AUD001 Audio is not at the project sample rate warning 48000
AUD002 Audio is not at the project bit depth warning 16
AUD003 Audio file uses a format that is not accepted for its category warning
AUD004 Audio should be mono so it can be positioned in 3D warning
AUD005 Integrated loudness is outside the target range for its category warning
AUD006 Clip is longer than the maximum for its category warning

allowedFormats

Key Value
SFX wav
Music ogg, wav
Ambience ogg, wav
VoiceOver wav
UI wav

requireMono

Key Value
SFX true
VoiceOver true
UI false
Music false
Ambience false

loudness (LUFS)

Key Value
SFX -18
Music -16
Ambience -22
VoiceOver -16
UI -18

Tolerance: 2

maxDurationSeconds

Key Value
SFX 10
UI 5

Version control

Id Rule Severity Value
VCS001 Binary or merge-hostile file type is not on the lock list warning 22 entries, below
VCS002 Generated folder is not ignored by version control warning 15 entries, below
VCS003 Asset committed without its .meta, or a .meta with no asset warning true
VCS004 Commit message does not follow the conventional-commits format warning

lockExtensions

.blend · .psd · .unity · .prefab · .asset · .IMP · .flp · .clip · .shadergraph · .vfx · .controller · .anim · .mat · .mixer · .fbx · .png · .tga · .exr · .psb · .wav · .mp3 · .ogg

ignorePaths

Library/ · Temp/ · Obj/ · Build/ · Builds/ · Logs/ · UserSettings/ · MemoryCaptures/ · Recordings/ · *.csproj · *.sln · *.user · *.pidb · *.booproj · *.svd

commitFormat

fix · feat · build · chore · ci · docs · style · refactor · perf · test

Key Value
breakingMarker !

Pattern: ^(fix|feat|build|chore|ci|docs|style|refactor|perf|test)(\([^)]+\))?!?: .+

Workspace

Id Rule Severity Value
WSP001 Required folder is missing warning
WSP002 Folder is not part of the defined structure warning
WSP003 Loose file where the structure expects only folders warning
WSP004 Manual version file is not the _V1 form warning
WSP005 Asset is not in the folder its name requires warning
WSP006 Asset name carries nothing to place it by warning

rules

Key Value
WSP001 title: Required folder is missing; severity: warning
WSP002 title: Folder is not part of the defined structure; severity: warning
WSP003 title: Loose file where the structure expects only folders; severity: warning
WSP004 title: Manual version file is not the _V1 form; severity: warning
WSP005 title: Asset is not in the folder its name requires; severity: warning
WSP006 title: Asset name carries nothing to place it by; severity: warning

versionSuffix

Key Value
activeHasNoSuffix true

Pattern: _V\d+$

placement

Key Value
unplaceableId WSP006
unplaceableSilentCategories Kit

structureIgnore

Key Value
files *.blend1, *.blend2, thumbs.db, desktop.ini

fileChecks

Key Value
nameRoots Assets/Source, Assets/Exported, Unity/*/Assets/Games
metaRoots Unity/*/Assets
extensions .fbx, .blend, .obj, .png, .tga, .exr, .psd, .psb, .jpg, .jpeg, .tif, .tiff, .wav, .mp3, .ogg, .aiff, .mat, .prefab, .unity, .anim, .controller, .asset, .vfx, .shadergraph, .shader, .sbs, .sbsar, .spp
ignore *.blend1, *.blend2, readme*, *.lnk, thumbs.db, desktop.ini

tree

Key Value
anyName true
allowUnlistedFolders false

Grid

Metrics everything is built against. These vary per project. The table below is the base.

Metric Value
primary 1
sub 0.25
wallSegment 4 × 3
wallThickness 0.2
doorOpening 1 × 2.25
windowOpenings standard 1 × 1.5 · wide 2 × 1.5 · high 1 × 0.75
stairRiser 0.1875
stairGoing 0.25
stairRiserRange 0.15–0.2
stairGoingRange 0.25–0.3
stairWidths standard 1 · wide 2
stairHeadroom 2.25
handrailHeight 0.9
ladderRungSpacing 0.25
characterHeight 1.8
eyeHeight 1.65
stepHeight 0.3
capsuleRadius 0.3
bayWidth 1
storeyHeight 3
groundStoreyHeight 4.5
trimProjection 0.1
trimProjectionMax 0.25
roofPitch 40
roofPitchTolerance 1
roofOverhang 0.5
railingHeight 1.1
balconyDepth 1.5
hatchOpening 0.9 × 0.9
doubleDoorOpening 2 × 2.25
increments 0.1 × 0.5 × 1 × 2 × 5 × 10

Project overrides

What differs per game. Everything not listed comes from the base rules.

Setting Base tiny-bakery tortured-home
texture.maxResolution.value 4096 2048 4096
texture.texelDensity.default standard standard standard
mesh.vertexDensity.default prop prop environment
mesh.triBudgets.tiers.smallProp 1500 1200 1500
mesh.triBudgets.tiers.hero 25000 15000 25000
grid.wallSegment 4 × 3 3 × 2.7 4 × 3
grid.characterHeight 1.8 1.7 1.8

Exceptions

Grandfathered violations. This list is a backlog, and it is meant to shrink.

None.