# `Labs`

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

Interface · `import type { Labs } from '@holostep-configurators/runtime-client/contract';` · labs · since 2.0.0 · section 20. Labs

Members that serve one app or wrap an engine-shaped capability. Their rows block the release
exactly like stable rows. They graduate (the `labs.` prefix is removed by a codemod) when a
second app uses them.

## Members

| Member | Kind | Summary |
| --- | --- | --- |
| <a id="geometry"></a>[`geometry`](Labs.geometry.md) | property | Read and write vertex data of loaded and created meshes. |
| <a id="skin"></a>[`skin`](Labs.skin.md) | method | Skins a collection mesh to a model's skeleton; it then follows that model's clips. |
| <a id="decal"></a>[`decal`](Labs.decal.md) | method | A decal on the matched surfaces, owned by `owner`: an item of that collection under a key the runtime makes, so its part has the owner's `role` and `collection`. |
| <a id="fire"></a>[`fire`](Labs.fire.md) | method | Volumetric fire, owned by `owner`: an item of that collection, so it follows its `parent` and goes with its owner. |
| <a id="lightlinking"></a>[`lightLinking`](Labs.lightLinking.md) | method | The light stops reaching the parts `except` matches; every other part stays lit by it. |
| <a id="mirror"></a>[`mirror`](Labs.mirror.md) | method | A geometry mirror of models and collections about the world plane x = 0. |
| <a id="prefetch"></a>[`prefetch`](Labs.prefetch.md) | method | Fetches into the browser cache what a write naming these nodes would load on this device and quality tier: a ModelNode with its active descendants; a MaterialNode's maps, using the optimized twin where the runtime would. |
| <a id="shading"></a>[`shading`](Labs.shading.md) | property | Typed MaterialX shading graphs (a fabric grade, a wood grain). |

## Declaration

```ts
export interface Labs<C extends object = NoCommitOptions> {
  readonly geometry: {
    read(query: Query, attributes: readonly GeometryAttribute[], options?: {
      from?: 'authored' | 'current';
      signal?: AbortSignal;
    }): Promise<GeometryData<C>[]>;
    write(query: Query, data: GeometryWrite | null, options?: C & SignalOption): Promise<Report>;
  };
  skin(part: Part, binding: SkinBinding, options?: C & SignalOption): Promise<Report>;
  decal(target: Query, spec: DecalSpec, options: {
    owner: Collection;
    signal?: AbortSignal;
  }): Promise<Part<C>>;
  fire(spec: FireSpec, placement: Placement & {
    owner: Collection;
  }): Promise<Part<C>>;
  lightLinking(light: Part, except: Query, options?: {
    signal?: AbortSignal;
  }): () => void;
  mirror(axis: 'x' | null, options: C & SignalOption & {
    owner: Collection;
  }): Promise<Report>;
  prefetch(nodes: readonly (string | DeepReadonly<ConfiguratorNode>)[], options?: SceneModelOptions): Promise<void>;
  readonly shading: {
    graph<U extends Record<string, ShadingUniformType>>(uniforms: U, build: (n: ShadingNodes<U>) => ShadingOutputs, options: {
      owner: Collection;
    }): Shading<U>;
  };
}
```

## Generic-API test (spec 3.1)

| Rule | Result |
| --- | --- |
| 1. Neutral name | pass: `Labs` names no product |
| 2. A precedent | not recorded: no ledger row (coverage.json) names this member or its owner |
| 3. Two apps, or labs | labs: it graduates when a second app uses it |
| 4. The cheaper fix first | not recorded per member (Appendix B decides it per need) |
