Get started

Generative UI design system: constrain components, states, and runtime evidence

A generative UI design system is not a model with access to your component library. It is a governed catalog that defines what an agent may declare. Application policy decides what is allowed, a renderer maps valid declarations to known components, and an evidence process checks what users actually received. Admit one component first. Version its contract, then test every route from declaration to observed outcome before expanding the agent's surface.

Updated October 18, 2026

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 selectionDeclarative compositionOpen-ended code generation
Agent controlsWhich approved component to show and its admitted inputsAn approved component tree, properties, and relationships within a schemaMarkup, styles, behavior, or executable interface code
Application controlsComponent implementation, placement rules, data, policy, and actionsCatalog, schema, validation, policy, renderer, data, and actionsSandbox, capabilities, data boundary, execution, inspection, and integration
Primary advantageSmallest trust surface and predictable behaviorMore expressive layouts without accepting arbitrary codeMaximum flexibility for novel or exploratory interfaces
Main failure modeAn eligible component is selected for the wrong task or stateA valid-looking declaration conflicts with catalog versions, policy, or runtime dataGenerated code introduces unsafe behavior, inaccessible output, or visual drift
Good fitHigh-consequence flows and repeated product tasksAdaptive dashboards, assistants, and workspaces with known primitivesIsolated prototypes or tightly sandboxed low-consequence experiences
Composition routes for a governed generative UI system

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.

Assign authority before exposing a catalog

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.

AuthorityCorrect when
Visual sourceSemantic color and type roles, spacing scale, layout intent, modes, motifs, and usage guidanceThe approved visual intent or reusable role is missing or wrong
Component contractStructure, admitted inputs, content bounds, variants, states, interaction behavior, and accessibility obligationsAn approved component cannot represent a required state or behaves incorrectly in isolation
Application policyWhich components and combinations are permitted for the current surface, task, tenant, and consequenceThe declaration is valid but should not be allowed in that context
AuthorizationWhat the current user and service identities may read, disclose, or executeThe system permits an action or data access that the active identity may not perform
Agent declarationA proposal using catalog identifiers and admitted propertiesThe proposal requests an unknown component, invalid property, or unsuitable composition
ValidatorSchema, catalog-version, relationship, content-bound, and policy checksInvalid input passes, valid input fails, or diagnostic output is insufficient
RendererMapping approved declarations to known implementations and fallback viewsThe approved declaration resolves to the wrong component or rendered state
Runtime integrationCurrent data, events, action execution, persistence, interruption, and recoveryThe component receives stale facts, loses events, or misrepresents execution
Acceptance ownerThe final disposition for a named consumer and evidence scopeRequired evidence is missing, stale, contradictory, or outside the accepted scope
Responsibility and correction ownership

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.

  1. Name the catalog, catalog version, component identity, and component version. A declaration must target these identities explicitly.
  2. List accepted data with provenance requirements, validation rules, freshness limits, and content bounds. Don't let free text stand in for authoritative runtime facts.
  3. Enumerate supported states and legal transitions. Include loading, empty, partial, unavailable, error, interrupted, and recovered states when the task can reach them.
  4. Define permitted actions, their consequence classes, and the application authority that approves them. Component visibility doesn't grant permission.
  5. Map semantic visual roles rather than raw values. Record modes, focus behavior, user-preference handling, and approved exceptions.
  6. Define a deterministic fallback for every rejection class. The fallback must work without asking the model to repair its own invalid output.
  7. Name the contract, policy, implementation, evidence, and acceptance owners. One person may hold several roles, but the roles remain distinct.
  8. 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 render

The card primitive in Ambient Sage, across 3 states.

Default

Starter plan

Everything a small team needs to ship a branded UI.

Active
Renews monthly

Hover

Starter plan

Everything a small team needs to ship a branded UI.

Active
Renews monthly

Focus

Starter plan

Everything a small team needs to ship a branded UI.

Active
Renews monthly
A visual treatment can demonstrate component states, but catalog admission still requires data, behavior, policy, fallback, and evidence contracts.

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"
  ]
}
Illustrative and unexecuted. Adapt field names and values to the selected protocol, application policy, and evidence system.

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 render

Ambient Sage's actual tokens — the same values its exports use.

Color tokensSemantic roles with HEX / HSL / CMYK

Color tokens

Ambient Sage
light · HEX · HSL · CMYK

Core

#F3F4EF

background

H 72 · C0, 0, 2, 4

#1A1C17

foreground

H 84 · C7, 0, 18, 89

#E5E6E0

card

H 70 · C0, 0, 3, 10

#ECEEE8

muted

H 80 · C1, 0, 3, 7

#D8D9D2

border

H 68.57 · C0, 0, 3, 15

Brand

#FEE951

primary

H 52.72 · C0, 8, 68, 0

#1A1C17

primary-fg

H 84 · C7, 0, 18, 89

#E5E6E0

secondary

H 70 · C0, 0, 3, 10

#F7E464

accent

H 52.24 · C0, 8, 60, 3

#FEE951

ring

H 52.72 · C0, 8, 68, 0

Semantic

#C0392B

destructive

H 5.64 · C0, 70, 78, 25

#FFFFFF

destructive-fg

H 0 · C0, 0, 0, 0

#2D7238

success

H 129.57 · C61, 0, 51, 55

#C97D12

warning

H 35.08 · C0, 38, 91, 21

#545651

muted-fg

H 84 · C2, 0, 6, 66

Charts

#FEE951

chart-1

H 52.72 · C0, 8, 68, 0

#4A8FD4

chart-2

H 210 · C65, 33, 0, 17

#6BBF8A

chart-3

H 142.14 · C44, 0, 28, 25

#E07498

chart-4

H 340 · C0, 48, 32, 12

#E8A24B

chart-5

H 33.25 · C0, 30, 68, 9

Type scaleHeading, body, and mono in the kit's fonts

Typography

Ambient Sage

Scale: compact-product

Density: balanced

Heading · Plus Jakarta Sans · 1.875rem

Ship beautiful product faster

Subheading · Plus Jakarta Sans · 1.375rem

A warm-sage neutral-surface mobile kit with a single vivid yellow accent, flat tonal cards, and oversized display numerals.

Body · Plus Jakarta Sans · 1rem

Ambient Sage uses a near-white warm-sage canvas (#f3f4ef) with card panels distinguished only by a tonal shift to #e5e6e0, never by shadows or borders. A single vivid yellow (#fee951) is the only saturated color and appears sparingly at component scale as orbs, button fills, and focus rings. Primary data values render as oversized bold hero numerals with a small superscript unit. Typography is a friendly rounded geometric (Plus Jakarta Sans) with no uppercase and no tight tracking, while JetBrains Mono is reserved for hex codes and technical strings. Generous rounding and luminance-only contrast give the whole system a calm, minimal feel.

Mono · JetBrains Mono · 0.8125rem

npx shadcn add ambientsage.json

Aa

Plus Jakarta Sans · Heading

400500600700

Aa

Plus Jakarta Sans · Body

400500600700

ABCDEFGHIJKLM NOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789 & @ # % →

Radius & spacingCorner radius, elevation, and spacing steps

Tokens

Ambient Sage primitives
density: balanced

Radius scale

sm · 0.375rem
md · 0.75rem
lg · 1.25rem
xl · 1.75rem

Component radius

button
card
input

Elevation

level 1
level 2
level 3
level 4

Spacing · base 4px

1x
2x
3x
4x
6x
8x
Ambient Sage is a bounded example of upstream visual input. Its tokens and guidance don't establish a generative component catalog or runtime policy.

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

    Declared

    The catalog and application define the permitted components, versions, states, relationships, and evidence requirements.

  2. 2

    Generated

    The agent emits a proposal. Preserve the proposal identity and targeted catalog version without treating it as approved.

  3. 3

    Validated

    Deterministic checks confirm schema shape, component identity, versions, content bounds, and allowed relationships.

  4. 4

    Policy-approved

    Application policy and authorization permit the proposed data disclosure, component use, and actions for the current context.

  5. 5

    Rendered

    The renderer resolves the approved declaration to known implementations or a deterministic fallback.

  6. 6

    Interactive

    Required controls are available through supported input and assistive-technology paths under the recorded environment.

  7. 7

    Completed

    The authoritative service reports the requested operation's terminal result. A click, optimistic state, or stream ending isn't enough.

  8. 8

    Observed

    The product records the relevant interface, runtime, and user outcome evidence for the named consumer and conditions.

  9. 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 responseEvidence to retain
Unknown componentReject the node and render a safe message or admitted containerDeclaration ID, requested component, catalog version, validator result
Invalid schema or content boundsDo not render invalid fields; use the component's invalid-input fallbackSchema version, failed path, bounded diagnostic, fallback identity
Catalog-version mismatchReject unsupported declarations or use an explicitly maintained compatibility mappingRequested and active versions, compatibility rule, resolved outcome
Missing or stale dataShow an admitted unavailable or stale state and a stable alternate routeData source, freshness result, omitted fields, visible state
Partial or interrupted streamRender only the last validated snapshot, mark interruption, and offer a bounded retryAccepted chunks, rejected chunk, snapshot ID, interruption event
Permission failureSuppress protected data and actions; render the application-owned permission statePolicy decision ID, authorization source, disclosed fields, visible fallback
Unsupported preference or modeUse the documented default or application-owned preference fallbackRequested preference, support result, chosen mapping
Renderer failureReplace the failed subtree with a stable error boundary or alternate task pathApproved declaration, renderer version, exception, fallback result
Fallback rules by failure class

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: unexecuted
Illustrative named-consumer manifest. No implementation or runtime behavior is claimed.

Run 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 evidenceOwner 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.
Illustrative acceptance record for project-workspace/task-panel. Every observation remains unexecuted.

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

    Freeze the expected record

    Identify the exact catalog, component, consumer, policy, data authority, fallback, environment, and evidence requirement involved.

  2. 2

    Inspect the original declaration

    Check component IDs, versions, properties, content bounds, relationships, and action requests before looking at the screenshot.

  3. 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. 4

    Compare renderer input with output

    Confirm which approved declaration reached the renderer and which implementation and fallback versions it resolved.

  5. 5

    Trace runtime facts and events

    Check data freshness, authorization, action IDs, terminal service results, interruption, persistence, and recovery.

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