Get started

Design system migration checklist: plan a source-to-screen cutover

A design system migration is complete only when named product consumers use the intended target contracts and the team has checked representative rendered states. A new package, rebuilt library, or generated token set is only an input. This checklist turns the cutover into migration units you can assign, test, accept, or roll back.

Updated October 22, 2026

Set the technical boundary before inventorying anything

This checklist begins after the target design system has been selected. Its job is to replace existing tokens, components, packages, wrappers, and local styling rules without losing supported product behavior. It doesn't choose a brand strategy, rename the product, approve identity assets, or plan customer communications. Put that work in a rebranding plan so the technical migration doesn't quietly acquire a second, much larger mandate.

Write the boundary as a migration contract before counting components. Name the current and target authorities, their versions, supported platforms, behaviors that must remain stable, permitted changes, excluded surfaces, acceptance conditions, and rollback boundary. Give every unresolved field an owner. Don't let the implementation team settle the question through whichever value or component happens to be easiest to install.

  • Current authority and version: the exact library, token source, package, or project rules being replaced.
  • Target authority and version: the selected system and the artifacts that carry its decisions.
  • Preserved behavior: workflows, keyboard behavior, responsive behavior, data presentation, permissions, and other contracts that must not change.
  • Permitted change: the intended visual or structural differences approved for this migration.
  • Exclusions: products, platforms, brand work, deprecated flows, or experimental surfaces outside this wave.
  • Acceptance boundary: the consumers and conditions that require evidence before the wave can close.
  • Rollback boundary: what can be reverted together without producing an unsupported hybrid.

Do not use visual similarity as the contract

A screenshot can show how one state looks. It can't specify supported variants, responsive behavior, keyboard interaction, data extremes, mode policy, package versions, or who may approve an exception.

Inventory migration units, not component names

A component list helps, but it's too coarse for migration. A single Button name may refer to several implementations, package versions, wrappers, variants, or product-specific behaviors. At the other extreme, one semantic token can reach hundreds of components. The migration unit should be the smallest decision or contract that a clear owner can replace, verify, and roll back.

Inventory units across the source-to-screen path. Include token roles, typography and spacing contracts, component APIs, packages, wrappers, product surfaces, modes, interaction states, and named consumers. Record dependencies in both directions: what the unit needs and what will change when it moves.

  • Token unit: a semantic role, mode pair, alias, or deprecated name with known consumers.
  • Component unit: a versioned API, variant, state contract, composition rule, or behavior.
  • Distribution unit: a package, registry item, generated file, design library, or documentation release.
  • Adaptation unit: a compatibility wrapper, alias, transform, or project mapping.
  • Consumer unit: a named route, workflow, screen, application, or embedded surface using the contract.
  • Observation unit: a specific consumer under a recorded mode, viewport, state, content condition, and environment.

Inventory intended and actual use. Search results, dependency graphs, design-library analytics, and code references can identify candidates, but none of them alone proves runtime use. Attach each finding to a named consumer. Mark uncertain relationships as unresolved instead of filling the gaps with inference.

Map every unit to a target disposition

Choose one mapping disposition for each current unit. That disposition determines who must act and what evidence they need. A direct replacement follows an established target contract. A transformed mapping needs a documented conversion, while a wrapper needs support and removal rules. A redesign requires an authorized product decision. An exception needs a defined scope and review dates. A blocked unit exposes a gap in the target system.

Use whenRequired recordClosure condition
Direct replacementThe target has an equivalent supported contract.Old and target identifiers, versions, consumers, and preserved behavior.Consumers use the target directly and required observations pass.
Transformed mappingThe target can represent the intent after a deterministic conversion.Transform owner, input and output versions, assumptions, and validation evidence.The emitted artifact and consuming mapping match the approved result.
Compatibility wrapperConsumers cannot move together, but old and new contracts can coexist safely.Wrapper API, precedence, support window, telemetry, owner, and removal gate.All named dependants leave the wrapper or receive an approved continuing exception.
Redesign requiredThe target lacks equivalent structure or supported behavior.Decision owner, affected workflows, constraints, and approval evidence.A new contract is approved, implemented, adopted, and observed.
Approved exceptionA bounded divergence is intentional and currently acceptable.Reason, scope, owner, expiry or review trigger, and protected surfaces.The exception remains within scope and is rechecked at its trigger.
BlockedA missing role, component, platform capability, or authority prevents safe migration.Blocking gap, impacted consumers, owner, next decision, and prohibited workaround.The owning layer resolves the gap or the wave scope is explicitly changed.
Use one disposition per migration unit. Split the unit if different consumers need different outcomes.

Split overloaded rows

If one row has several owners, unrelated rollback triggers, or different target dispositions, it's probably several migration units disguised as one.

Copy the migration-unit register

Keep expectations and observations in the same record, but never in the same field. This stops a planned result from being mistaken for a test result. A row can link to detailed evidence elsewhere; the register remains the control surface for status, ownership, and closure.

Migration unit ID:
Unit type: token | component | package | wrapper | surface | other
Current authority and version:
Current contract:
Target authority and version:
Target contract:
Named consumers:
Required modes, states, viewports, and content conditions:
Dependencies:
Preserved behavior:
Permitted changes:
Mapping disposition: direct | transformed | wrapper | redesign | exception | blocked
Replacement mechanism:
Coexistence window and precedence:
Owner:
Expected result:
Delivered evidence:
Mapped evidence:
Adopted evidence:
Observed evidence:
Open exceptions and review trigger:
Rollback trigger:
Rollback mechanism and last verified status:
Final disposition: accept | revise | block | rollback | unresolved
Closure condition:
Retest triggers:
Copyable migration-unit record. Leave unknown fields unresolved and assign an owner rather than inventing an answer.

Give the register stable identifiers so evidence, defects, and exceptions can point to the same unit. Keep versions precise enough to distinguish the assessed artifact from a later release. When a decision changes, preserve the earlier record and supersede it. The reason for a mixed implementation then remains recoverable.

Need a target-state kit before you map the product?

Identity Forge can provide semantic light and dark tokens, typography, spacing, layout guidance, DESIGN.md, and implementation exports. Treat them as versioned migration inputs. Your team still owns project mapping, component behavior, consumer adoption, accessibility evaluation, rollout, and acceptance.

Choose the rollout route from product constraints

No rollout pattern is universally safe. Choose one for a defined set of migration units. Base the decision on dependency coupling, blast radius, reversibility, tolerance for mixed versions, available evidence, and rollback cost.

Best fitMain riskRequired control
Coordinated cutoverContracts are tightly coupled, mixed versions are unsafe, and the whole scope can be verified together.Large blast radius and expensive rollback.Frozen dependency set, rehearsed rollback, complete pre-cutover evidence, and a clear decision authority.
Phased replacementUnits can move in bounded waves and old and new implementations can coexist.The migration stalls and temporary duplication becomes permanent.Wave owners, adoption tracking, expiry criteria, and a prohibition on unowned hybrids.
Compatibility wrapperMany consumers depend on an old API that can be translated without hiding behavior changes.The wrapper becomes a second design system or masks unsupported differences.Narrow API, precedence rules, observability, removal gate, and one owner.
Land-and-expandA representative but noncritical surface can prove the path before broader adoption.A successful local pilot is overgeneralized to unlike consumers.Explicit transfer criteria, protected high-risk surfaces, and a new acceptance decision for every expansion.
Rollout selector for a defined migration scope

A coordinated cutover fits when the old and new contracts can't coexist safely, such as a theme architecture change that would create ambiguous precedence across one application shell. Prefer phased replacement when units are separable and the team can observe each wave independently. Use a compatibility wrapper only when its translation is explicit and temporary. Land-and-expand helps when the migration route itself needs evidence, but success on one surface doesn't approve the rest of the estate.

The rollout route belongs to the migration scope. It isn't a permanent philosophy for the whole design system.

Write a coexistence contract for mixed systems

During a gradual migration, old and new implementations are both legitimate for a time. That is manageable only when the boundary is written down. Without it, local aliases, copied styles, wrapper variants, and package overrides accumulate until nobody can say which behavior is temporary.

  • Precedence: which authority wins when old and new rules both reach a consumer.
  • Package boundaries: which packages, entry points, or applications may use each version.
  • Alias and wrapper ownership: who may add mappings and who approves changes.
  • Support window: the dates or wave conditions during which coexistence is supported.
  • Expiry criteria: the dependency, consumer, and evidence conditions required before removal.
  • Observability: how remaining old references, wrapper calls, exceptions, and runtime failures are found.
  • Forbidden combinations: versions, themes, wrappers, or local overrides that must never coexist.
  • Failure behavior: what happens when a mapping is missing or a consumer receives incompatible artifacts.

A deadline is not a removal gate

A date can trigger a review, but it can't prove that dependants have migrated. Remove an old contract only when the named consumers and generated outputs no longer require it, remaining exceptions are authorized, and the rollback boundary is still valid.

Run one bounded pilot wave

Pick a pilot that is representative enough to expose the migration path but bounded enough to reverse. A decorative marketing page may be easy, yet reveal little about application states. A payment flow may be representative but too consequential for the first attempt. A better pilot often includes shared tokens, at least one interactive component, realistic content, light and dark modes where supported, and a noncritical workflow with observable outcomes.

  1. 1

    Confirm the source decision

    Record the approved target contract, version, owner, preserved behavior, and permitted changes.

  2. 2

    Inspect the delivered artifact

    Confirm that the required tokens, component contracts, packages, or guidance exist in the exact artifact being used.

  3. 3

    Verify the project mapping

    Check that the consumer resolves the intended package, export, aliases, tokens, fonts, and mode policy.

  4. 4

    Verify the component contract

    Check structure, variants, states, responsive behavior, content handling, and preserved interactions before evaluating polish.

  5. 5

    Record approved exceptions

    Keep deliberate divergence separate from defects. Give each exception an owner, scope, reason, and review trigger.

  6. 6

    Confirm consumer adoption

    Establish that the named surface uses the target component or mapping instead of a local substitute or stale wrapper.

  7. 7

    Observe the rendered result

    Inspect representative modes, states, viewports, content extremes, keyboard paths, and consequential interactions under recorded conditions.

  8. 8

    Exercise the rollback route

    Verify the rollback mechanism within the pilot boundary before expanding the wave. Record what was tested and what remains unproven.

Keep a baseline for behavior that must remain stable. Depending on the contract, use screenshots, interaction tests, accessibility observations, performance measurements, or recorded product outcomes. Keep known defects visible. Changing the baseline to hide an old defect turns uncertainty into false parity.

Keep four completion states separate

A single progress percentage hides where the migration stops. Report four evidence states for every accepted unit. They build on one another, but one doesn't automatically prove the next.

What it provesWhat it does not prove
DeliveredThe expected target artifact exists at a recorded version.That the consuming project maps or uses it.
MappedThe project resolves the intended artifact, role, package, or wrapper.That a named consumer actually uses the mapping.
AdoptedThe named consumer uses the target contract or an approved compatibility route.That the rendered result works under required conditions.
ObservedThe expected result occurred in a named consumer under recorded conditions.That untested consumers, states, environments, or future versions also pass.
Evidence states for each migration unit

This distinction matters in status reports. A team can truthfully say that 90 percent of artifacts were delivered while only 40 percent of named consumers have adopted them. Combining those figures into one done value would hide the actual cutover risk.

Verify representative consumers and close the wave

Don't inspect every possible rendering unless the contract requires it. Select representative consumers based on reach, difference, and consequence. Include the shared shell or highest-reach consumer, unusual compositions, a high-consequence workflow, and any platform whose implementation differs from the pilot.

  • Modes: every supported light, dark, high-contrast, branded, or nested mode relevant to the unit.
  • Interaction states: default, hover, focus, active, selected, disabled, loading, validation, error, empty, and recovery states that the component supports.
  • Content extremes: long labels, localization, large numbers, missing media, dense data, and user-generated content.
  • Viewports and containers: narrow and wide layouts, zoom conditions, and container-specific adaptations.
  • Consequential surfaces: authentication, billing, permissions, destructive actions, critical data entry, and other workflows where regression cost is high.
  • Behavior: keyboard order, focus movement, pointer behavior, validation, navigation, persistence, and asynchronous transitions.
  • Accessibility evidence: system-level checks plus product-level retesting. A component result cannot certify every composition in a product.
  • Operational conditions: the deployed package, feature configuration, runtime environment, and rollback route relevant to the wave.
Wave ID:
Scope and included migration-unit IDs:
Excluded units and reason:
Target versions:
Rollout route:
Coexistence contract version:
Representative consumers and selection rationale:
Required modes, states, viewports, and content conditions:
Delivered evidence complete: yes | no | not applicable
Mapped evidence complete: yes | no | not applicable
Adopted evidence complete: yes | no | not applicable
Observed evidence complete: yes | no | not applicable
Open defects:
Approved exceptions, owners, and review triggers:
Rollback trigger:
Rollback mechanism verified under:
Retest triggers:
Decision authority:
Decision: accept | revise | block | rollback
Decision rationale and evidence links:
Next wave authorization: approved | withheld | not requested
Wave acceptance record. Complete it for the bounded scope, not for the design system in the abstract.

Accept the wave when every required unit has the necessary evidence, each open divergence is resolved or covered by a current authorized exception, and rollback remains usable. Revise when the route is sound but correctable gaps remain. Block when required authority, target capability, evidence, or safe rollback is missing. Roll back when an agreed trigger occurs and keeping the wave would create greater product risk.

Route failures to the first divergent layer

When a migrated screen looks wrong, trace the issue from the governing decision downstream. Fix the first layer where expected and observed evidence differ. Patching the visible consumer may remove the symptom while preserving the cause, allowing the defect to return in the next component or wave.

First checkCorrection ownerDo not substitute
Missing target role or componentApproved target contract and backlog state.Target design-system owner.A local token, copied component, or undocumented variant.
Incompatible component APIRequired behavior versus the target component contract.Component owner and product decision owner when behavior must change.A wrapper that silently drops supported behavior.
Transform emits the wrong resultInput version, transform rules, resolver output, and emitted artifact.Transform or build-pipeline owner.Manual edits to generated output.
Project uses a stale mappingInstalled version, imports, aliases, cache, and configuration precedence.Consuming-project owner.A component-level override that hides the stale source.
Unauthorized exceptionException record, scope, approver, and review period.Consumer owner and migration authority.Relabeling accidental drift as a design choice.
Partial adoptionNamed consumer imports, wrappers, detached copies, and local styles.Consumer implementation owner.Counting package installation as adoption.
Runtime or accessibility regressionRendered evidence, preserved behavior, composition, environment, and product policy.Consumer owner, component owner, or target-system owner according to the first divergence.A cosmetic patch before the behavioral cause is located.
Rollback failsVersion availability, data or configuration compatibility, deployment route, and rollback rehearsal record.Release owner for the bounded wave.Expanding the rollout while recovery is unproven.
Failure-routing table

Record both expectation and observation

Write the expected result before running the check. Then record the observed result, environment, evidence location, and disposition. An unlabeled screenshot leaves reviewers to infer the criterion after seeing the outcome.

Use Ambient Sage only as target-state intake

Ambient Sage illustrates the upstream boundary without pretending that a migration was executed. The public kit supplies a warm neutral visual direction, semantic light and dark color roles, typography, spacing, layout guidance, component rules, and implementation-oriented artifacts. These are candidate target inputs for a consuming project.

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 shows the kind of versioned target-state inputs a migration can receive. This specimen is not evidence that any existing product has mapped, adopted, or verified them.

An intake row can mark the public kit and its available artifacts as delivered. Project mapping remains unresolved until a named project connects its configuration and dependencies to them. Component adoption remains unresolved until named consumers use the intended contracts. Accessibility, preserved behavior, and runtime rendering remain unresolved until the team evaluates them under recorded product conditions.

Where Identity Forge stops

Identity Forge can supply target-state visual inputs and machine-readable exports. It doesn't inventory an existing product, migrate components, resolve local behavior, certify accessibility, authorize rollout, or prove adoption in a rendered consumer.

Track progress without rewarding shallow adoption

Measure migration progress by evidence state and consequence, not raw component count. Replacing ten unused icons isn't equivalent to migrating one table that supports a critical workflow. For each wave, report the number of required units delivered, mapped, adopted, and observed alongside high-reach consumers, open target gaps, expired exceptions, remaining legacy references, and rollback readiness.

Use wave-level outcomes to decide whether the route transfers. A pilot may show that the mapping and verification method works for one application while leaving another platform untested. Expand only when the next scope has named units, representative conditions, an owner, and its own acceptance decision.

Design system migration questions

Is installing the new design-system package a completed migration?

No. Installation is delivery or, at most, part of project mapping. Completion requires named consumers to adopt the intended contracts and the team to observe representative rendered behavior under the migration's acceptance conditions.

Should we migrate every component at once?

Only when dependency coupling makes mixed versions unsafe and the whole scope has affordable verification and rollback. Otherwise, use bounded waves with explicit coexistence, ownership, and expiry rules.

Can old and new design systems coexist?

Yes, when precedence, package boundaries, wrappers, supported combinations, observation, expiry criteria, and failure behavior are documented. Unbounded coexistence turns temporary compatibility into permanent drift.

How do we handle a missing target component?

Mark the affected unit as blocked or redesign required, then route it to the target-system owner and the relevant product decision owner. Don't create an undocumented local substitute merely to preserve the rollout schedule.

Does a successful pilot approve the full migration?

No. It proves only what the team tested in the named consumers and conditions. Use it to judge whether the route can transfer, then create a new scope and acceptance record for the next wave.

Does the migration checklist certify accessibility?

No. It keeps accessibility evidence and ownership visible. Shared components can be tested in isolation, but representative product consumers must be retested with the real composition, content, interaction paths, modes, zoom conditions, and assistive technology relevant to the stated scope.

Start with one consequential migration unit and complete its register before scheduling the wider rollout. If you can't name its current contract, target contract, consumers, owner, evidence, and rollback trigger, the migration isn't ready to expand.

Sources

  • An insider's guide to a seamless Figma migration: Figma's guide supports treating migration as cross-functional work involving planning, advocacy, rebuilding, onboarding, timelines, and communication.
  • Guide | Carbon Design System: Carbon's migration guide distinguishes release changes across themes, design kits, packages, Sass, grid, and component implementations.
  • migrate-design-system Skill: The application-migration workflow emphasizes inventory, preserved behavior, baselines, shared-layer changes, and verification rather than package installation alone.
  • Checklist & Recs FlowUI Migration: The FlowUI case study shows that feedback from important product surfaces can reveal interaction and layout failures after the implementation appears ready.
  • I tried three ways to ship a design system. Here's what actually worked.: The practitioner retrospective compares coordinated replacement, gradual replacement, and land-and-expand, showing that each rollout route carries different disruption and adoption risks.
  • Design System Versioning: Manage Your UI/UX in 2026: The versioning guide connects migration planning with coordinated design assets, code, documentation, and release history.
  • Ambient Sage Design Kit: The public Ambient Sage kit provides target-state visual inputs including semantic colors, typography, spacing, component guidance, and implementation artifacts, but it does not prove adoption in a consuming product.
  • Rebranding a SaaS product checklist: The existing rebranding guide covers identity and brand-change cutovers, which sit outside this technical design-system migration checklist.