# Manifest schema v1 Manifests are UTF-8 YAML and may use the compact flat form: ```yaml version: 1 defaults: {dirs: 8, fps: 12, pivot: bottom_center} demo_actor: backend: blender rig: rigs/demo.blend anims: [idle, walk] demo_floor: backend: procedural generator: floor_tile params: {color: '#706860', variants: 4} dirs: 1 ``` An explicit `assets:` mapping is also supported, but it cannot be mixed with flat asset declarations. Asset IDs and backend names match `[a-z][a-z0-9_]*`. Unknown fields are errors, while generator-specific options belong under `params`. Common fields are `backend`, `dirs`, `fps`, `pivot`, `size`, `palette`, `palettes`, `tags`, `seed`, and `postprocess_scale`. A pivot is a standard name (`bottom_center`, `center`, `bottom_left`, `top_left`) or signed `x,y`. Sizes use `WIDTHxHEIGHT`. `postprocess_scale` applies a fixed nearest-neighbour scale before tight alpha cropping and target-size fitting. Set it to `0.25` for a 4x supersampled Blender render. Unlike adaptive bbox fitting, this preserves the relative world scale of short and tall assets. Backend contracts: | Backend | Required field | |---|---| | `procedural` | `generator` | | `blender` | `rig` | | `import` | `source` | | `composite` | non-empty `layers` | Additional backends register a contract through `register_backend_contract()` and put backend-specific configuration in `params`; neither the loader nor the manifest core needs modification. Validate without producing assets: ```text sf validate assets/environment.yaml assets/actors.yaml sf build assets/environment.yaml --tag environment --jobs 4 --dry-run ``` Diagnostics use `absolute-file:line:column` followed by the YAML property path.