Start with the right definition
Generative UI means that an agent influences the interface shown for a particular request or context. It isn't the same as AI-assisted design, where a tool helps a person create a mostly fixed interface, and it's broader than raw code generation. An agent can select a prebuilt component, declare a structured component tree, or generate executable interface code. Those routes grant very different authority.
The design-system job is narrower than the whole generative UI stack. It defines reusable visual decisions and component contracts. It doesn't determine whether a user may view an account, approve a payment, disclose private data, or retry a failed operation. Those decisions need current application policy and runtime facts.
A valid declaration is not an accepted interface
Schema validity proves that data has the expected shape. It doesn't prove that the declaration is authorized, renderable with the active catalog, accessible in composition, connected to current data, or successful for the user.
Choose how much composition the agent controls
Choose the route per product surface, not for the company as a whole. A support assistant may select fixed status cards, while an analysis workspace may need bounded declarative composition. A prototype sandbox may permit generated code that would be unacceptable in an account or billing surface.
| Fixed component selection | Declarative composition | Open-ended code generation | |
|---|---|---|---|
| Agent controls | Which approved component to show and its admitted inputs | An approved component tree, properties, and relationships within a schema | Markup, styles, behavior, or executable interface code |
| Application controls | Component implementation, placement rules, data, policy, and actions | Catalog, schema, validation, policy, renderer, data, and actions | Sandbox, capabilities, data boundary, execution, inspection, and integration |
| Primary advantage | Smallest trust surface and predictable behavior | More expressive layouts without accepting arbitrary code | Maximum flexibility for novel or exploratory interfaces |
| Main failure mode | An eligible component is selected for the wrong task or state | A valid-looking declaration conflicts with catalog versions, policy, or runtime data | Generated code introduces unsafe behavior, inaccessible output, or visual drift |
| Good fit | High-consequence flows and repeated product tasks | Adaptive dashboards, assistants, and workspaces with known primitives | Isolated prototypes or tightly sandboxed low-consequence experiences |
Use the least permissive route that can express the current user task. Moving from fixed selection to declarative composition is a product decision because it changes what must be validated. Open-ended code generation also changes the execution and security boundary.
A component catalog becomes governable when every decision has an owner and every failure has a correction route. Don't collapse those responsibilities into a single generative UI owner column. The model, design system, application, and runtime do different jobs.
| Authority | Correct when | |
|---|---|---|
| Visual source | Semantic color and type roles, spacing scale, layout intent, modes, motifs, and usage guidance | The approved visual intent or reusable role is missing or wrong |
| Component contract | Structure, admitted inputs, content bounds, variants, states, interaction behavior, and accessibility obligations | An approved component cannot represent a required state or behaves incorrectly in isolation |
| Application policy | Which components and combinations are permitted for the current surface, task, tenant, and consequence | The declaration is valid but should not be allowed in that context |
| Authorization | What the current user and service identities may read, disclose, or execute | The system permits an action or data access that the active identity may not perform |
| Agent declaration | A proposal using catalog identifiers and admitted properties | The proposal requests an unknown component, invalid property, or unsuitable composition |
| Validator | Schema, catalog-version, relationship, content-bound, and policy checks | Invalid input passes, valid input fails, or diagnostic output is insufficient |
| Renderer | Mapping approved declarations to known implementations and fallback views | The approved declaration resolves to the wrong component or rendered state |
| Runtime integration | Current data, events, action execution, persistence, interruption, and recovery | The component receives stale facts, loses events, or misrepresents execution |
| Acceptance owner | The final disposition for a named consumer and evidence scope | Required evidence is missing, stale, contradictory, or outside the accepted scope |
When an interface fails, inspect these layers in order. Repair the first layer where the recorded expectation differs from the evidence. A local CSS change can hide a bad catalog mapping, while a prompt edit can hide an authorization defect. Neither corrects the governing decision.
Admit components before agents can select them
Presence in a component library doesn't amount to admission into a generative catalog. A component can be stable for human-authored screens while still lacking bounded content, machine-readable states, safe action semantics, or a fallback that works without model judgment.
- Name the catalog, catalog version, component identity, and component version. A declaration must target these identities explicitly.
- List accepted data with provenance requirements, validation rules, freshness limits, and content bounds. Don't let free text stand in for authoritative runtime facts.
- Enumerate supported states and legal transitions. Include loading, empty, partial, unavailable, error, interrupted, and recovered states when the task can reach them.
- Define permitted actions, their consequence classes, and the application authority that approves them. Component visibility doesn't grant permission.
- Map semantic visual roles rather than raw values. Record modes, focus behavior, user-preference handling, and approved exceptions.
- Define a deterministic fallback for every rejection class. The fallback must work without asking the model to repair its own invalid output.
- Name the contract, policy, implementation, evidence, and acceptance owners. One person may hold several roles, but the roles remain distinct.
- Specify the evidence needed for the component in isolation and in each named consumer. Mark unexecuted cases as unexecuted.
Component specimen · Card
Ambient Sage
Live renderThe card primitive in Ambient Sage, across 3 states.
Default
Starter plan
Everything a small team needs to ship a branded UI.
Hover
Starter plan
Everything a small team needs to ship a branded UI.
Focus
Starter plan
Everything a small team needs to ship a branded UI.
Copyable component-admission contract
The following record is illustrative and protocol-neutral. It hasn't been executed, validated against a live schema, or accepted for a production consumer.
{
"recordStatus": "illustrative_unexecuted",
"catalog": { "id": "workspace-ui", "version": "1.4.0" },
"component": { "id": "task-summary-card", "version": "2.1.0" },
"eligibleSurfaces": ["project-workspace"],
"input": {
"schema": "TaskSummaryInput@2",
"provenance": ["application-task-service"],
"freshness": "checked_by_application",
"contentBounds": {
"title": { "min": 1, "max": 90 },
"summary": { "min": 0, "max": 600 },
"items": { "min": 0, "max": 12 }
}
},
"states": [
"loading", "ready", "empty", "partial",
"stale", "error", "interrupted", "recovered"
],
"actions": [
{
"id": "open-task",
"consequence": "navigation",
"authorizationSource": "application-policy"
},
{
"id": "mark-complete",
"consequence": "durable-write",
"authorizationSource": "task-service",
"confirmation": "policy-dependent"
}
],
"forbidden": [
"agent-supplied-permission-state",
"unbounded-html",
"action-success-inferred-from-click"
],
"visualRoles": [
"background", "foreground", "card", "card-foreground",
"border", "primary", "primary-foreground", "ring",
"muted", "muted-foreground", "destructive"
],
"accessibilityObligations": [
"programmatic-name",
"keyboard-action-path",
"visible-focus",
"status-not-conveyed-by-color-alone",
"content-reflow-under-supported-zoom"
],
"fallbacks": {
"unknownComponent": "safe-message",
"invalidInput": "safe-message",
"permissionDenied": "permission-notice",
"missingData": "task-list-link",
"interruptedStream": "last-validated-snapshot"
},
"owners": {
"contract": "design-system-team",
"policy": "workspace-product-team",
"authorization": "task-service-owner",
"implementation": "frontend-platform",
"acceptance": "workspace-release-owner"
},
"requiredEvidence": [
"schema-validation-record",
"isolated-state-results",
"policy-decision-log",
"named-consumer-observations",
"keyboard-and-screen-reader-results",
"interruption-and-recovery-results"
]
}Keep repair outside the acceptance path
A model may propose a replacement declaration after rejection, but the deterministic fallback should render first. Otherwise, a malformed stream, unavailable model, or repeated invalid proposal can leave the user without a stable interface.
Carry visual rules into the catalog without moving product policy
Visual-system artifacts can supply the catalog with semantic color roles, typography roles, spacing values, layout guidance, light and dark mappings, motifs, and usage constraints. Component contracts then map those inputs to supported structures and states. The consuming application still decides whether a component is permitted, which data is authoritative, and which actions the user may take.
Token specimen · real values
Ambient Sage
Live renderAmbient Sage's actual tokens — the same values its exports use.
Ambient Sage provides a concrete example of that boundary. Its public kit defines semantic visual roles, Plus Jakarta Sans and JetBrains Mono typography roles, spacing, layout guidance, DESIGN.md, and structured exports. A product team could map those inputs into its own components. The kit doesn't prove that the mapping is correct, that a protocol accepts it, that an action is authorized, or that the composed interface is accessible.
Focus and preference handling need the same separation. A visual source may provide a ring role. A component contract defines when the component exposes focus, and CSS and platform code implement the behavior. The application decides theme policy and persists user choices. Acceptance evidence records whether the complete path worked in the named consumer.
Inspect a complete visual input before defining catalog mappings
Use the free Ambient Sage kit to examine semantic roles, typography, spacing, and guidance as upstream inputs. Keep component behavior, application policy, authorization, and runtime evidence in their owning layers.
Track the runtime evidence lifecycle
A single status such as generated, done, or successful collapses claims that need different proof. Track the declaration as it crosses each boundary. A later state doesn't retroactively prove that every earlier decision was correct, and a component can render while the task remains incomplete.
- 1
Declared
The catalog and application define the permitted components, versions, states, relationships, and evidence requirements.
- 2
Generated
The agent emits a proposal. Preserve the proposal identity and targeted catalog version without treating it as approved.
- 3
Validated
Deterministic checks confirm schema shape, component identity, versions, content bounds, and allowed relationships.
- 4
Policy-approved
Application policy and authorization permit the proposed data disclosure, component use, and actions for the current context.
- 5
Rendered
The renderer resolves the approved declaration to known implementations or a deterministic fallback.
- 6
Interactive
Required controls are available through supported input and assistive-technology paths under the recorded environment.
- 7
Completed
The authoritative service reports the requested operation's terminal result. A click, optimistic state, or stream ending isn't enough.
- 8
Observed
The product records the relevant interface, runtime, and user outcome evidence for the named consumer and conditions.
- 9
Accepted
The acceptance owner compares observations with expectations, resolves required exceptions, and records pass, revise, or block.
The agent proposes an interface; the application establishes whether that interface is allowed, true, usable, and accepted.
Make fallbacks deterministic
Fallbacks belong to the product contract, not model recovery prose. Each rejection class should produce a known result, preserve useful validated work where safe, and expose a stable retry or alternate path.
| Deterministic response | Evidence to retain | |
|---|---|---|
| Unknown component | Reject the node and render a safe message or admitted container | Declaration ID, requested component, catalog version, validator result |
| Invalid schema or content bounds | Do not render invalid fields; use the component's invalid-input fallback | Schema version, failed path, bounded diagnostic, fallback identity |
| Catalog-version mismatch | Reject unsupported declarations or use an explicitly maintained compatibility mapping | Requested and active versions, compatibility rule, resolved outcome |
| Missing or stale data | Show an admitted unavailable or stale state and a stable alternate route | Data source, freshness result, omitted fields, visible state |
| Partial or interrupted stream | Render only the last validated snapshot, mark interruption, and offer a bounded retry | Accepted chunks, rejected chunk, snapshot ID, interruption event |
| Permission failure | Suppress protected data and actions; render the application-owned permission state | Policy decision ID, authorization source, disclosed fields, visible fallback |
| Unsupported preference or mode | Use the documented default or application-owned preference fallback | Requested preference, support result, chosen mapping |
| Renderer failure | Replace the failed subtree with a stable error boundary or alternate task path | Approved declaration, renderer version, exception, fallback result |
Fallbacks can be less expressive
The fallback doesn't need to preserve the generated layout. It needs to preserve truth, user orientation, and a safe route forward. A plain task link is often better than a clever reconstruction.
Write a named-consumer manifest
A catalog can behave differently across chat, co-creator, and embedded application surfaces. Name the consumer, region, data sources, catalog versions, policies, fallbacks, environments, and acceptance owner. Without that context, a passing component demo can be misapplied to a materially different surface.
record_status: illustrative_unexecuted
consumer:
id: project-workspace/task-panel
surface: embedded-application
adaptive_region: task-panel-body
stable_regions:
- application-navigation
- account-controls
catalogs:
- id: workspace-ui
version: 1.4.0
allowed_components:
- task-summary-card@2.1.0
- safe-message@1.0.0
- permission-notice@1.2.0
data_authorities:
task_state: application-task-service
authorization: task-service
user_preferences: application-profile-service
composition:
route: declarative
executable_code: forbidden
nested_depth_max: 4
fallback_policy: workspace-genui-fallbacks@1
acceptance_owner: workspace-release-owner
observations: unexecutedRun an expectation-first acceptance record
Write expectations before generating test output. Add observations, evidence references, and dispositions only after execution. The example below is deliberately unexecuted. It's a test plan, not proof that the named consumer or components exist.
| Observation and evidence | Owner and disposition | |
|---|---|---|
| Catalog mismatch: a declaration targeting workspace-ui 1.3.0 is rejected unless an approved compatibility mapping exists. | UNEXECUTED. Evidence needed: declaration, active catalog, validator result, visible fallback. | Validator owner. Pending execution; block if an unsupported declaration renders. |
| Unknown component: billing-summary must not resolve through a guessed or similarly named component. | UNEXECUTED. Evidence needed: rejection code, fallback identity, rendered capture. | Catalog owner. Pending execution; block if arbitrary resolution occurs. |
| Invalid schema: an overlong title and unknown property are rejected without exposing raw input. | UNEXECUTED. Evidence needed: bounded validation output and fallback observation. | Validator owner. Pending execution; revise diagnostics or block unsafe rendering. |
| Missing or stale data: the task card shows an explicit unavailable or stale state and does not invent task status. | UNEXECUTED. Evidence needed: source freshness result, input payload metadata, rendered state. | Runtime integration owner. Pending execution; block fabricated or unlabeled data. |
| Partial stream: only the last validated snapshot renders, interruption is visible, and retry is bounded. | UNEXECUTED. Evidence needed: chunk log, accepted snapshot ID, interruption event, interaction result. | Streaming owner. Pending execution; revise or block if incomplete nodes become interactive. |
| Permission-gated action: mark-complete remains unavailable until current authorization allows it. | UNEXECUTED. Evidence needed: policy decision, authorization source, control state, attempted-action result. | Authorization owner. Pending execution; block unauthorized availability or execution. |
| Fallback rendering: every rejection class resolves to an admitted fallback with a usable alternate path. | UNEXECUTED. Evidence needed: rejection-to-fallback mapping, render results, keyboard path. | Renderer owner. Pending execution; revise isolated defects and block missing safe paths. |
| User preferences: supported mode and text settings are application-owned and survive generated recomposition. | UNEXECUTED. Evidence needed: stored preference, resolved mapping, before-and-after observations. | Application owner. Pending execution; revise if recomposition resets supported choices. |
| Long content: admitted bounds preserve meaning without breaking layout or hiding required actions. | UNEXECUTED. Evidence needed: boundary fixtures, viewport observations, accessible-name inspection. | Component owner. Pending execution; revise component bounds or presentation. |
| Interruption and recovery: recovery does not duplicate a durable action or turn an unknown result into success. | UNEXECUTED. Evidence needed: action ID, service result, recovery events, final visible state. | Runtime owner. Pending execution; block ambiguous or duplicated consequences. |
Retest when the catalog, component, schema, renderer, authorization policy, fallback policy, named consumer, supported browser or platform, or relevant accessibility behavior changes. Evidence from another surface may inform the plan, but it doesn't automatically transfer.
Diagnose the first divergent layer
- 1
Freeze the expected record
Identify the exact catalog, component, consumer, policy, data authority, fallback, environment, and evidence requirement involved.
- 2
Inspect the original declaration
Check component IDs, versions, properties, content bounds, relationships, and action requests before looking at the screenshot.
- 3
Read validation and policy evidence separately
A schema pass and a policy approval answer different questions. Find the earliest recorded rejection, omission, or unexpected approval.
- 4
Compare renderer input with output
Confirm which approved declaration reached the renderer and which implementation and fallback versions it resolved.
- 5
Trace runtime facts and events
Check data freshness, authorization, action IDs, terminal service results, interruption, persistence, and recovery.
- 6
Compare observed behavior with acceptance criteria
Use the named environment and user path. Record uncertainty instead of filling a missing evidence field with inference.
- 7
Correct the first divergence and retest downstream
Repair the owning layer, preserve the evidence chain, and rerun every downstream case invalidated by the change.
This method separates common defects. An unknown or underspecified component is a catalog problem. A request outside the contract is an agent-declaration problem, while a valid but prohibited combination is a policy rejection. Incorrect mapping is a renderer defect. Stale data or a lost completion event is a runtime integration failure. A preference without an owner is an unresolved product decision.
Keep Identity Forge at the visual-system boundary
Identity Forge can supply upstream visual-system inputs for a governed catalog: semantic light and dark color roles, typography, spacing, layout and motif guidance, DESIGN.md, and structured exports. Those artifacts can reduce visual ambiguity for component authors and coding agents.
The consuming team still owns the component implementation, catalog schema, protocol integration, validation, application policy, authorization, sandbox or execution boundary, runtime data, event handling, persistence, accessibility evaluation, acceptance evidence, and release decision. A complete kit doesn't certify any of those downstream layers.
Adjacent topic boundary
Generative UI governance is adjacent to Identity Forge's core design-kit work. The connection is the visual input to a component catalog. Agent orchestration, protocol support, authorization, runtime behavior, and generative UI acceptance are outside Identity Forge's shipped product claims.
Start with one component and one consumer
Choose one high-reuse component in one named product surface. Write its admission record, declare its data and authorization sources, implement every required fallback, and trace one generated declaration through validation, policy, rendering, interaction, completion, observation, and acceptance. Don't expand the catalog until that record contains real observations instead of unexecuted fields.
Sources
- What is Generative UI? Building Agent-Powered Interfaces: Describes fixed, declarative, and open-ended generative UI approaches and identifies security, testing, latency, and accessibility as production concerns.
- Generative UI and Outcome-Oriented Design: Defines generative UI as interfaces generated in real time for user needs and argues that designers must define constraints around desired outcomes.
- Generative UI: A rich, custom, visual interactive user experience for any prompt: Documents Google's implementation and evaluation framing for dynamically generated interactive experiences.
- Generative UI: Understanding Agent-Powered Interfaces: Distinguishes generative UI surfaces such as threaded chat, co-creator workspaces, and interfaces embedded in an application.
- What Is GenUI? Generative UI Explained, with Examples: Discusses how an existing design system can constrain model-controlled interface composition.
- A2UI v0.9: The New Standard for Portable, Framework-Agnostic Generative UI: Presents a versioned declarative route in which agents express UI intent against a client application's component catalog and renderer.
- Ambient Sage Design Kit: Publishes Ambient Sage as a free visual kit with semantic colors, typography, spacing, layout guidance, DESIGN.md, and structured implementation artifacts.
- Design system accessibility checklist: test the system, then retest the product: Explains why documented intent and isolated component evidence do not prove accessibility in a composed product consumer.