# Hyperpart consumer map (reverse index)

Auto-generated by `tools/consumer_map.py`. Do not hand-edit.

Regenerate: `python packages/hatchi-maxchi/tools/consumer_map.py --write`

When you mutate a lower-level part (contract attrs, controller seams,
box metrics, submit shape), check **who consumes it** before shipping.
Hard embeds (`composes`) and blueprint uses are blast-radius. Soft
`composes_with` is agent guidance only. **Refused by** is deliberate
non-composition — do not wire that part in without flipping the registry
entry and completing the linked spike.

## How edges are declared

| Edge | Source | Meaning |
|------|--------|---------|
| `embedded_by` | `Hyperpart.composes` | Parent embeds this part in partial/exchange |
| `related_from` | `guidance.composes_with` | Soft agent link (not a runtime import) |
| `extends_parent` | `Hyperpart.extensions` | Extension controller rides this parent |
| `refused_by` | `Hyperpart.does_not_compose` | Parent resembles this part but uses a local primitive |
| `used_by_blueprint` | `Blueprint.composes` | Full-page motif includes this part |

## Explicit non-compositions (local primitives)

These are the high-risk lookalikes. CI locks (`require_substrings` /
`forbid_substrings`) keep the local implementation honest.

| Parent | Does not use | Seam | Reason | Spike |
|--------|--------------|------|--------|-------|
| `grid` | `combobox` | kind=select in-cell editor | bare <select class=dz-inline-edit-select> for density, morph survival (root._dzEdit + before/after-swap), and commit-on-change PUT — not the progressive-enhancement combobox overlay | `docs/spikes/combobox-in-grid-cell.md` |

## By recipe (L0)

Same **job** can have multiple **surfaces**. Pick from `docs/agent/pick-a-surface.md`; do not merge L1s by visual shape.

- **`chrome-presentation`** (presentation / chrome): `toast`, `toolbar`
- **`command-palette`** (command palette search): `command`
- **`confirm-affordance`** (confirm irreversible action): `confirm`
- **`field-triad`** (label + help + error triad): `field`
- **`layout-primitive`** (layout primitive): `auto-grid`, `center`, `cluster`, `sidebar-layout`, `stack`
- **`list-region-host`** (server-driven list / data table host): `app-shell`, `grid`, `master-detail`
- **`money-minor-units`** (money as minor-unit integer): `money`
- **`multi-label-form`** (multi free-form labels): `tags`
- **`overlay-dialog`** (modal / drawer overlay): `dialog`, `drawer`
- **`remote-fk-typeahead`** (remote FK typeahead): `search-select`
- **`single-select-form`** (single-select (form field)): `combobox`
- **_(unset)_** (68 parts): open pick-a-surface or seed `_RECIPE_SEED` in `site/registry.py` when a part sits on the matrix

## Reverse index by part

### `accordion`

**Layer:** `L1`

_No composition edges declared._

### `action-grid`

**Layer:** `L1`

_No composition edges declared._

### `activity-feed`

**Layer:** `L1`

_No composition edges declared._

### `alert`

**Layer:** `L1`

**Embedded by (hard `composes`)**

- `drawer` — composes

**Used by blueprints**

- `record-page` — blueprint
- `triage-drawer` — blueprint

**Related from (`composes_with`)**

- `drawer` — composes_with
- `toast` — composes_with

### `app-shell`

**Layer:** `L2` · **Recipe:** `list-region-host` (server-driven list / data table host)

**Used by blueprints**

- `saas-shell` — blueprint

**Related from (`composes_with`)**

- `navigation-menu` — composes_with

### `aspect-ratio`

**Layer:** `L1`

**Embedded by (hard `composes`)**

- `carousel` — composes

**Related from (`composes_with`)**

- `carousel` — composes_with

### `auto-grid`

**Layer:** `L1` · **Recipe:** `layout-primitive` (layout primitive)

**Embedded by (hard `composes`)**

- `card` — composes

**Used by blueprints**

- `dashboard` — blueprint
- `record-page` — blueprint
- `saas-shell` — blueprint
- `workspace-drawer` — blueprint

### `avatar`

**Layer:** `L1`

**Related from (`composes_with`)**

- `search-select` — composes_with

### `badge`

**Layer:** `L1`

**Embedded by (hard `composes`)**

- `drawer` — composes
- `related-tables` — composes
- `two-factor` — composes

**Used by blueprints**

- `dashboard` — blueprint
- `manager-sla-strip` — blueprint
- `master-detail` — blueprint
- `ops-queue` — blueprint
- `record-page` — blueprint
- `triage-drawer` — blueprint

**Related from (`composes_with`)**

- `carousel` — composes_with
- `drawer` — composes_with
- `grid` — composes_with

### `bar-chart`

**Layer:** `L1`

_No composition edges declared._

### `bar-track`

**Layer:** `L1`

_No composition edges declared._

### `box-plot`

**Layer:** `L1`

_No composition edges declared._

### `breadcrumb`

**Layer:** `L1`

_No composition edges declared._

### `bubble`

**Layer:** `L1`

_No composition edges declared._

### `bullet`

**Layer:** `L1`

_No composition edges declared._

### `button`

**Layer:** `L1`

**Embedded by (hard `composes`)**

- `carousel` — composes
- `dialog` — composes
- `drawer` — composes
- `pdf` — composes
- `toolbar` — composes
- `two-factor` — composes

**Used by blueprints**

- `auth` — blueprint
- `manager-sla-strip` — blueprint
- `ops-queue` — blueprint
- `record-page` — blueprint
- `saas-shell` — blueprint
- `triage-drawer` — blueprint
- `workspace-drawer` — blueprint

**Related from (`composes_with`)**

- `app-shell` — composes_with
- `carousel` — composes_with
- `command` — composes_with
- `confirm` — composes_with
- `confirm-panel` — composes_with
- `dialog` — composes_with
- `drawer` — composes_with
- `grid` — composes_with
- `kbd` — composes_with
- `menu` — composes_with
- `pdf` — composes_with
- `popover` — composes_with
- `tabs` — composes_with
- `toast` — composes_with
- `toggle` — composes_with
- `wizard` — composes_with

### `card`

**Layer:** `L2`

**Embedded by (hard `composes`)**

- `carousel` — composes
- `drawer` — composes
- `master-detail` — composes

**Used by blueprints**

- `auth` — blueprint
- `dashboard` — blueprint
- `master-detail` — blueprint
- `record-page` — blueprint
- `saas-shell` — blueprint
- `triage-drawer` — blueprint
- `workspace-drawer` — blueprint

**Related from (`composes_with`)**

- `carousel` — composes_with
- `drawer` — composes_with
- `master-detail` — composes_with

**Embeds (forward `composes`)**

- `auto-grid`

### `carousel`

**Layer:** `L2`

**Embeds (forward `composes`)**

- `aspect-ratio`
- `button`
- `card`

### `center`

**Layer:** `L1` · **Recipe:** `layout-primitive` (layout primitive)

**Used by blueprints**

- `auth` — blueprint
- `master-detail` — blueprint
- `workspace-drawer` — blueprint

### `chart-legend`

**Layer:** `L1`

_No composition edges declared._

### `cluster`

**Layer:** `L1` · **Recipe:** `layout-primitive` (layout primitive)

**Used by blueprints**

- `auth` — blueprint
- `dashboard` — blueprint
- `manager-sla-strip` — blueprint
- `master-detail` — blueprint
- `ops-queue` — blueprint
- `record-page` — blueprint
- `triage-drawer` — blueprint
- `workspace-drawer` — blueprint

### `code`

**Layer:** `L1`

_No composition edges declared._

### `combobox`

**Layer:** `L1` · **Recipe:** `single-select-form` (single-select (form field))

**Refused by (explicit non-composition)**

- `grid` — kind=select in-cell editor: bare <select class=dz-inline-edit-select> for density, morph survival (root._dzEdit + before/after-swap), and commit-on-change PUT — not the progressive-enhancement combobox overlay (spike: docs/spikes/combobox-in-grid-cell.md)

### `command`

**Layer:** `L1` · **Recipe:** `command-palette` (command palette search)

**Related from (`composes_with`)**

- `kbd` — composes_with

### `confirm`

**Layer:** `L1` · **Recipe:** `confirm-affordance` (confirm irreversible action)

_No composition edges declared._

### `confirm-panel`

**Layer:** `L1`

_No composition edges declared._

### `controls`

**Layer:** `L1`

**Embedded by (hard `composes`)**

- `drawer` — composes

**Related from (`composes_with`)**

- `drawer` — composes_with

### `date-range`

**Layer:** `L1`

_No composition edges declared._

### `diagram`

**Layer:** `L1`

_No composition edges declared._

### `dialog`

**Layer:** `L1` · **Recipe:** `overlay-dialog` (modal / drawer overlay)

**Embedded by (hard `composes`)**

- `drawer` — composes

**Used by blueprints**

- `ops-queue` — blueprint
- `triage-drawer` — blueprint
- `workspace-drawer` — blueprint

**Related from (`composes_with`)**

- `confirm` — composes_with
- `drawer` — composes_with

**Embeds (forward `composes`)**

- `button`

### `drawer`

**Layer:** `L1` · **Recipe:** `overlay-dialog` (modal / drawer overlay)

**Embeds (forward `composes`)**

- `dialog`
- `button`
- `field`
- `badge`
- `card`
- `alert`
- `toggle-group`
- `switch`
- `controls`

### `empty-state`

**Layer:** `L1`

_No composition edges declared._

### `field`

**Layer:** `L1` · **Recipe:** `field-triad` (label + help + error triad)

**Embedded by (hard `composes`)**

- `drawer` — composes
- `form-chrome` — composes
- `money` — composes
- `wizard` — composes

**Used by blueprints**

- `auth` — blueprint

**Related from (`composes_with`)**

- `combobox` — composes_with
- `confirm-panel` — composes_with
- `drawer` — composes_with
- `money` — composes_with
- `search-select` — composes_with
- `slider` — composes_with
- `tags` — composes_with
- `wizard` — composes_with

**Extensions on this part**

- `controllers/dz-color.js`

### `form-chrome`

**Layer:** `L2`

**Embedded by (hard `composes`)**

- `wizard` — composes

**Embeds (forward `composes`)**

- `field`

### `funnel`

**Layer:** `L1`

_No composition edges declared._

### `grid`

**Layer:** `L2` · **Recipe:** `list-region-host` (server-driven list / data table host)

**Does not compose (forward)**

- `combobox` @ kind=select in-cell editor: bare <select class=dz-inline-edit-select> for density, morph survival (root._dzEdit + before/after-swap), and commit-on-change PUT — not the progressive-enhancement combobox overlay — spike `docs/spikes/combobox-in-grid-cell.md`

**Extensions on this part**

- `controllers/dz-grid-cols.js`
- `controllers/dz-grid-resize.js`
- `controllers/dz-grid-edit.js`

### `grid-list`

**Layer:** `L1`

_No composition edges declared._

### `heatmap`

**Layer:** `L1`

_No composition edges declared._

### `histogram`

**Layer:** `L1`

_No composition edges declared._

### `hover-card`

**Layer:** `L1`

_No composition edges declared._

### `icon`

**Layer:** `L1`

_No composition edges declared._

### `item`

**Layer:** `L1`

_No composition edges declared._

### `kanban`

**Layer:** `L1`

_No composition edges declared._

### `kbd`

**Layer:** `L1`

**Related from (`composes_with`)**

- `command` — composes_with

### `list-region`

**Layer:** `L1`

**Related from (`composes_with`)**

- `master-detail` — composes_with

### `marker`

**Layer:** `L1`

_No composition edges declared._

### `master-detail`

**Layer:** `L2` · **Recipe:** `list-region-host` (server-driven list / data table host)

**Used by blueprints**

- `master-detail` — blueprint

**Embeds (forward `composes`)**

- `card`

### `menu`

**Layer:** `L1`

**Embedded by (hard `composes`)**

- `toolbar` — composes

**Related from (`composes_with`)**

- `menubar` — composes_with

### `menubar`

**Layer:** `L1`

**Related from (`composes_with`)**

- `navigation-menu` — composes_with

### `message`

**Layer:** `L1`

_No composition edges declared._

### `message-scroller`

**Layer:** `L1`

_No composition edges declared._

### `metrics`

**Layer:** `L1`

**Used by blueprints**

- `manager-sla-strip` — blueprint
- `ops-queue` — blueprint

### `money`

**Layer:** `L1` · **Recipe:** `money-minor-units` (money as minor-unit integer)

**Embeds (forward `composes`)**

- `field`

### `navigation-menu`

**Layer:** `L1`

_No composition edges declared._

### `pagination`

**Layer:** `L1`

_No composition edges declared._

### `pdf`

**Layer:** `L2`

**Embeds (forward `composes`)**

- `button`

### `pivot`

**Layer:** `L1`

_No composition edges declared._

### `popover`

**Layer:** `L1`

_No composition edges declared._

### `profile-card`

**Layer:** `L1`

_No composition edges declared._

### `progress`

**Layer:** `L1`

**Used by blueprints**

- `dashboard` — blueprint

**Related from (`composes_with`)**

- `wizard` — composes_with

### `progress-region`

**Layer:** `L1`

_No composition edges declared._

### `queue`

**Layer:** `L1`

**Used by blueprints**

- `manager-sla-strip` — blueprint
- `ops-queue` — blueprint
- `triage-drawer` — blueprint

**Related from (`composes_with`)**

- `kanban` — composes_with

### `radar`

**Layer:** `L1`

_No composition edges declared._

### `related-tables`

**Layer:** `L2`

**Embeds (forward `composes`)**

- `tabs`
- `badge`

### `search-box`

**Layer:** `L1`

**Related from (`composes_with`)**

- `search-select` — composes_with

### `search-select`

**Layer:** `L1` · **Recipe:** `remote-fk-typeahead` (remote FK typeahead)

**Related from (`composes_with`)**

- `combobox` — composes_with

### `separator`

**Layer:** `L1`

_No composition edges declared._

### `sidebar-layout`

**Layer:** `L1` · **Recipe:** `layout-primitive` (layout primitive)

**Used by blueprints**

- `master-detail` — blueprint
- `triage-drawer` — blueprint
- `workspace-drawer` — blueprint

**Related from (`composes_with`)**

- `app-shell` — composes_with

### `skeleton`

**Layer:** `L1`

_No composition edges declared._

### `slider`

**Layer:** `L1`

_No composition edges declared._

### `sparkline`

**Layer:** `L1`

_No composition edges declared._

### `stack`

**Layer:** `L1` · **Recipe:** `layout-primitive` (layout primitive)

**Used by blueprints**

- `auth` — blueprint
- `dashboard` — blueprint
- `manager-sla-strip` — blueprint
- `master-detail` — blueprint
- `ops-queue` — blueprint
- `record-page` — blueprint
- `saas-shell` — blueprint
- `triage-drawer` — blueprint
- `workspace-drawer` — blueprint

### `status-list`

**Layer:** `L1`

**Used by blueprints**

- `manager-sla-strip` — blueprint

### `switch`

**Layer:** `L1`

**Embedded by (hard `composes`)**

- `drawer` — composes

**Related from (`composes_with`)**

- `drawer` — composes_with

### `tabs`

**Layer:** `L1`

**Embedded by (hard `composes`)**

- `related-tables` — composes

**Used by blueprints**

- `record-page` — blueprint

### `tags`

**Layer:** `L1` · **Recipe:** `multi-label-form` (multi free-form labels)

**Related from (`composes_with`)**

- `combobox` — composes_with

### `task-inbox`

**Layer:** `L1`

_No composition edges declared._

### `time-series`

**Layer:** `L1`

_No composition edges declared._

### `timeline`

**Layer:** `L1`

_No composition edges declared._

### `toast`

**Layer:** `L2` · **Recipe:** `chrome-presentation` (presentation / chrome)

**Used by blueprints**

- `ops-queue` — blueprint

**Extensions on this part**

- `controllers/dz-cue.js`

### `toggle`

**Layer:** `L1`

_No composition edges declared._

### `toggle-group`

**Layer:** `L1`

**Embedded by (hard `composes`)**

- `drawer` — composes
- `toolbar` — composes

**Related from (`composes_with`)**

- `drawer` — composes_with
- `toggle` — composes_with

### `toolbar`

**Layer:** `L2` · **Recipe:** `chrome-presentation` (presentation / chrome)

**Related from (`composes_with`)**

- `toggle` — composes_with

**Embeds (forward `composes`)**

- `button`
- `toggle-group`
- `menu`

### `tooltip`

**Layer:** `L1`

_No composition edges declared._

### `tree`

**Layer:** `L1`

_No composition edges declared._

### `two-factor`

**Layer:** `L2`

**Embeds (forward `composes`)**

- `button`
- `badge`

### `wizard`

**Layer:** `L2`

**Embeds (forward `composes`)**

- `form-chrome`
- `field`

## Related

- `AGENTS.md` — curriculum (stems, layers, invention ladder)
- `docs/agent/compose-or-refuse.md` — host playbook
- `docs/agent/pick-a-surface.md` — L0 → L1 matrix
- `docs/decisions/0003-composition-declared.md`
- `docs/spikes/combobox-in-grid-cell.md` — design spike for flipping grid↛combobox
- `CONTRACT_SURFACE.md` — DOM/model surface drift gate (breaking-change detector)
- `DUAL_LOCK_COVERAGE.md` — dual-lock inventory
