One-pager · for design teams
When AI writes the words, takes the actions, and draws the screens, the product still has to keep its promises. So we design the rules, not just the surfaces.
We used to draw a screen and ship it exactly as drawn. Now the model composes each reply and each layout at runtime. The screen is an output. The behavior is the design.
The product owns meaning. The model owns expression.
Declarative UI does not complicate any of this. It sharpens it. The model composes from a catalog we own instead of inventing widgets, so a required disclosure stops being a sentence we hope for and becomes a required node we can assert on: present, before the confirm, not inside a collapsed container. Structural checks are faster and far more reliable than judging prose.
Components, required props, composition rules, tokens, voice. Ours.
The agent picks and arranges components for this person, channel, and moment.
Structural check on the emitted tree, before anything renders.
Our surface: rules enforced. Someone else's: rules requested, not guaranteed.
Gate fails, the pre-approved fallback tree ships instead.
// catalog/ConfirmTransfer.yaml ours, versioned, reviewed
requires: [amount, fee, rate, received, recipient]
renders: terms block, above the confirm control
never: collapsed, or below the fold
// what the agent emits, composed for this turn
- Text: "Listo, este es el resumen"
- ConfirmTransfer: { amount: 350, fee: 4.99, rate: 18.90,
received: 6615, recipient: "María López" }
// gate/confirm.rules runs before anything renders
terms present → pass
terms precede confirm → pass
terms not collapsed → pass
anything else → ship the fallback tree
Listo, este es el resumen.
Para enviar $350.00 a María López: comisión $4.99, tipo de cambio 18.90. Ella recibe MX$6,615.
The fallback is stiffer, and it still carries every required term. A plain accurate sentence beats a fluent omission. Note also what the model was never asked to do: compute the fee, or remember the disclosure. It chose a component and filled declared props. The strongest version of this is to make bad output unrepresentable rather than detected. A confirm component that requires the terms cannot be composed without them. Validation is the second line. The catalog is the first.
Every state drawn by hand, in a file.
Spec, redlines, a ticket.
Everyone sees what was drawn.
Review happened once, on the drawing, before anything shipped.
Components, rules, voice, fallbacks.
Per person, channel, language, moment.
Required nodes, in the right order.
None of them drawn by hand.
Review happens twice: on the rules before, and on sampled output every week after.
We stop designing the output and start designing the space of allowed outputs. Which means:
Completion, effort, tone, time to resolve. Push them up release over release.
The disclosure appeared. No policy was invented. The money reached the right person.
A release can improve every dial and still be blocked because a floor failed. That is the system working. Without floors, the fastest way to raise completion is to ask less and warn less.
In proportion to what a wrong sentence costs. A marketing bot needs almost none of it. A money flow needs all of it.
If the model changed tomorrow, what would still hold? Whatever the answer is, that is the part we own.
Full argument: Conversational Design Systems. Companion one-pager: The Adaptive Brand. Print-styled for handouts.