In-between states

In agent-driven UI, components routinely arrive before their data: a table binds rows: {"path": "/deploys"} and the deploys stream in later. The gap is where quality is felt, so all three states are contract-level commitments, not afterthoughts.

Skeleton — the data hasn't arrived

An unresolved binding renders a component-shaped shimmer sized to the typical value — heights are exact, widths are honest approximations — so arrival shifts as little layout as possible. No spinner, no blank.

Empty — the data arrived, and there is none

An empty collection is a designed quiet state, never a blank hole. Components that earn it (DataTable, Timeline) take an emptyText prop; the voice is factual and lowercase:

No deploys yet today.

Error — the data is the wrong shape

A binding that resolves to something type-invalid is treated as unresolved: the component holds its skeleton rather than rendering garbage. Never a throw. (A stricter neutral-fallback with a console warning is on the roadmap; the docs will change when the behavior does.)

The wire side

These states exist because the vocabulary encourages binding over re-sending: agents are taught to reference {"path"} values and update the data model, so a component's life has phases. The prompt-pack documents this; the components honor it.