# Problem code `'unsupported-spec'`

> Contract 2.0.0 · package sha256 `a857eca95b35921109faf997094bb4192f12527d9d0fcd4be7e97f06425bad6e` · generated from `configurator-runtime.d.ts`, `tables/problems.json` and `services/onsite-scripter/scripts/contract-docs-what-to-do.json` by `services/onsite-scripter/scripts/build-contract-docs.mjs`; edit the source, not this file.

A member of [`ProblemCode`](../api/ProblemCode.md) · stable · since 2.0.0

A value this runtime or device can't apply (a UV channel, `sizeM` without `uvMetres`, a shading node, a linked light past the limit, a material `ref` no [`apply()`](../api/Writer.apply.md) defines), or an unknown spec field from a page whose declared `contract` is newer than this runtime's (spec section 3.4); it was ignored. Also `CameraLimits.gestures: 'cooperative'` under an ancestor of `el` whose `touch-action` excludes `pan-y`: its touch half can't apply there (`path` '/camera/limits/gestures').

## What to do

The value was ignored on this runtime or device, and `message` names it: drop it, or guard it with [`session.supports(id)`](../api/Session.supports.md) or [`has(session, id)`](../api/has.md) first. [`TextureSpec.sizeM`](../api/TextureSpec.sizeM.md) needs a slot whose asset declares `uvMetres` (else use `scale`); a material `ref` must name a material in the look's materials ([`session.apply({ materials })`](../api/Writer.apply.md)); an unknown field from a newer declared `contract` needs a runtime of that contract, so leave it out.

```ts
await session.apply({ materials: { oak }, rules: [{ query: { tag: 'top' }, set: { material: { ref: 'oak' } } }] });
```

## Where the declaration names it

- [`ApplyReport.problems`](../api/ApplyReport.problems.md): A value this runtime can't carry yet: 'unsupported-spec' with its path.
- [`CameraLimits.gestures`](../api/CameraLimits.gestures.md): Turning it on under such an ancestor records 'unsupported-spec' (`path` '/camera/limits/gestures', the element in `message`); the wheel half applies.
- [`Labs.lightLinking`](../api/Labs.lightLinking.md): A link past the limit links nothing, records 'unsupported-spec' and returns a no-op unlink, so that light reaches every part: compare the limit with your light count before linking.
- [`Labs.shading.graph`](../api/Labs.shading.graph.md): `build` runs at the call; a node, input or output outside [`ShadingNodes`](../api/ShadingNodes.md)' set records 'unsupported-spec' naming it, and materials wearing the graph draw their base fields.
- [`LightSpec`](../api/LightSpec.md): Among such items the first casts, collections in creation order and items in their spec's order; each other one lights unshadowed and records 'unsupported-spec' at its item's path, at the commit that leaves it so.
- [`MaterialSpec.variant`](../api/MaterialSpec.variant.md): A name the mesh's model doesn't declare records 'unsupported-spec' with `path` 'patch.material.variant' (a [`find(q).set`](../api/PartActions.set.md) or [`node(id).set`](../api/PartActions.set.md); 'scene.rules[i].set.material.variant' for a rule [`apply`](../api/Writer.apply.md) lists), naming the meshes and the names it declares, and the fields lay over what the mesh wears.
- [`ModelDescription.manifest`](../api/ModelDescription.manifest.md): The server stamps no upload yet, and no backfill has run, so today every GLB answers null unless its author stamped it: then [`TextureSpec.sizeM`](../api/TextureSpec.sizeM.md) records 'unsupported-spec' and [`checkAsset`](../api/checkAsset.md) has nothing to read here.
- [`ShadingNodes`](../api/ShadingNodes.md): Any other node or input name, other standard-library ones included, records 'unsupported-spec' naming it when the graph is built, and materials wearing the graph keep their base fields.
- [`TextureSpec.sizeM`](../api/TextureSpec.sizeM.md): On a slot without `uvMetres` it records 'unsupported-spec' and leaves the placement as it was; a collection `model` item's GLB counts as one (its manifest's slots aren't read).
- [`TextureSpec.uv`](../api/TextureSpec.uv.md): A channel the mesh's geometry lacks, or one this device can't bind, records 'unsupported-spec' with `path` 'patch.material.maps.<slot>.uv' ('scene.rules[i].set.material.maps.<slot>.uv' for a rule [`apply`](../api/Writer.apply.md) lists) and the slot shows no map there; on the fake, where its [`FakeModel`](../api/testing.FakeModel.md) mesh entry declares `uvChannels`.
- [`testing.FakeModel.variants`](../api/testing.FakeModel.variants.md): The GLB's KHR_materials_variants names, as the runtime reads them from the loaded file, stamped or not: a [`MaterialSpec.variant`](../api/MaterialSpec.variant.md) this list lacks records 'unsupported-spec' at 'patch.material.variant', as on the runtime.

The set is open: handle a code you don't know (`'other'`).

## Recorded by

- the table row `failure-matrix/errorCases/unknown-spec-field-newer-contract` (`tables/failure-matrix.json`)
