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:
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.