# `Placement`

> 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 { Placement } from '@holostep-configurators/runtime-client/contract';` · stable · since 2.0.0 · section 6. Queries, rules and parts

Where and how an imperatively created part sits. Fixed at creation.

## Members

| Member | Kind | Summary |
| --- | --- | --- |
| <a id="name"></a>[`name?`](Placement.name.md) | property | The part's name, matched by [`Query.name`](Part.name.md). |
| <a id="at"></a>[`at?`](Placement.at.md) | property | Local to `parent` (by default the collection's root, whose pose then applies on top: turn content in one of them, not both). |
| <a id="parent"></a>[`parent?`](Placement.parent.md) | property | The part it hangs under; `at` is then local to it. |
| <a id="tags"></a>[`tags?`](Placement.tags.md) | property | Tags, matched by [`Query.tag`](Query.md). |
| <a id="meta"></a>[`meta?`](Placement.meta.md) | property | Your labels, e.g. { segment: 3 }. |

## Declaration

```ts
export interface Placement {
  name?: string;
  at?: PoseInput;
  parent?: Part;
  tags?: readonly string[];
  meta?: Readonly<Record<string, JsonPrimitive>>;
}
```

## Generic-API test (spec 3.1)

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