Google Stitch design system: diagnose drift and verify handoff

Google Stitch can use portable DESIGN.md rules, generate interfaces, and move designs toward developer tools. But none of that proves every screen follows the same system or that exported code preserves it. Treat DESIGN.md as a governed source of design rules. Record legitimate exceptions separately, then verify one controlled change across representative screens and the exported artifact before you accept the handoff.

Updated July 26, 2026

What DESIGN.md controls, and what it does not prove

Google describes DESIGN.md as a portable way to import and export design rules. It can hold shared decisions about color roles, typography, spacing, layout principles, component treatment, and visual constraints. That portability matters: the rules can travel between projects and platforms instead of living only in one conversation.

The file has a narrower job. It states rules. It doesn't prove that every generated screen followed them, that a prompt didn't override them, or that exported code preserved them. Nor does it certify task completeness, accessibility, responsive behavior, generated-code quality, or production readiness. Those need separate checks.

No dedicated Identity Forge integration is established

Identity Forge produces DESIGN.md and implementation artifacts, but the frozen evidence contains no successful Identity Forge-to-Stitch import or export test. So this guide uses Ambient Sage as an intake example, not as proof of compatibility or consistent generation.

Label the evidence before choosing a workflow

Stitch changes quickly, and search results mix product documentation, tutorials, and user reports. Label each workflow claim by evidence class. This keeps a confident tutorial or isolated failure report from becoming an accidental product contract.

What it supportsWhat it cannot establish
First-party documentationPortable DESIGN.md rules, AI-assisted interface creation, iteration, and developer-delivery pathsPerfect rule adherence in your project or parity in a particular export
Third-party walkthroughA practitioner's described extraction, multi-page, iteration, or export workflowCurrent universal availability, official guarantees, or results in your account
Community reportA reachable failure pattern worth testing, such as changed icons, navigation, or color modeFailure frequency, root cause, or behavior across all projects
Your project recordObserved behavior for named screens, prompts, rules, and exported artifactsQuality outside the screens, states, and changes you actually checked
Evidence state as observed on July 26, 2026

For any capability that matters to the handoff, use current first-party documentation to establish availability and your own recorded observations to establish behavior. Keep third-party instructions provisional until you've reproduced them. Community reports are test ideas, not forecasts.

Record the four authorities

Consistency gets expensive when several artifacts look authoritative at once. A reference site suggests one type scale, DESIGN.md names another, a generated screen introduces a third, and someone manually corrects the exported code. Without a precedence record, the latest visible result tends to win even when it shouldn't.

Authority and precedenceOwner
Input sourceApproved brand decisions, existing product evidence, or a documented reference. It provides facts but does not silently outrank an approved project rule.Designer or product owner
Stitch DESIGN.mdThe default authority for shared visual rules. It turns source material into explicit instructions that apply across screens.Design-system owner
Approved screen exceptionsNarrow deviations with a reason, scope, and expiry or review condition. They outrank the shared rule only for the named screen or state.Designer and feature owner
Exported codeA downstream implementation. It must preserve governing rules and approved exceptions, but it does not become the design source merely because it runs.Developer
A practical authority record

For each unresolved conflict, record the competing values, the owning layer, the person who decides, and the evidence they need. Don't settle it by copying whichever value appeared in the newest generation.

Freeze invariants and representative screens

Before asking Stitch to generate more screens, write down the decisions that must stay stable. Use observable language. "Keep it cohesive" isn't testable. "Use the same primary navigation structure on the account, billing, and analytics screens" is.

  • Navigation: structure, placement, selected state, collapse behavior, and permitted variations.
  • Icons: source style, stroke or fill treatment, size rules, and where text labels are required.
  • Color mode: allowed modes, the default mode, semantic roles, and whether a screen may switch independently.
  • Typography: family by role, available weights, scale, line-height intent, and treatment of data or code.
  • Spacing and layout: container widths, gutters, section rhythm, grid behavior, and density.
  • Components: shared button, input, card, table, feedback, and focus treatments.
  • Exceptions: the exact screen, state, reason, approver, and limit of each deviation.

Don't check only the most polished screen. Choose a representative set that includes the main shell, a dense data screen, a form, a destructive or error state, and any screen with an approved exception. If mobile or dark mode is in scope, include those states explicitly.

Consistency check · No dark-mode parity

The same plan card, built two ways in Ambient Sage.

Drifting system

Pricing

Starter$19/mo

Everything a small team needs to ship a branded UI.

Consistent system

Pricing

Starter$19/mo

Everything a small team needs to ship a branded UI.

What to notice: A mode change is easy to spot. The same rule applies to quieter drift in spacing, typography, and component treatment.

Inspect a real source artifact before writing the authority record

Ambient Sage provides a public design kit and DESIGN.md-backed handoff. Use it to see how documented tokens and prose rules remain distinct before you assume any Stitch-specific behavior.

Route drift to the layer that owns it

When two screens diverge, find the first point where their evidence differs. Regenerating every screen immediately can hide the cause and introduce fresh changes.

  1. 1

    Check whether the governing rule is complete

    Find the relevant DESIGN.md rule. If it only says "use consistent navigation," it doesn't define structure, states, or exceptions. Revise the rule at its owning layer before correcting screens.

  2. 2

    Compare the prompts and accepted suggestions

    Record the original prompt, follow-up instructions, and any automatic or manual suggestions. A screen-specific instruction may have overridden the shared rule. Remove or narrow that override, then retry only the affected case.

  3. 3

    Check for an approved exception

    A legitimate difference isn't drift when its screen, state, reason, and scope were approved. If the exception is undocumented, pause and get an ownership decision instead of normalizing it after the fact.

  4. 4

    Locate the first divergent artifact

    Compare representative Stitch screens before you inspect downstream code. If the screens agree but the export differs, route the finding to the export or implementation boundary. If the screens already disagree, keep the fix upstream.

  5. 5

    Change one owner-controlled variable

    Apply one narrow rule change, such as the default color mode or navigation selection treatment. Don't bundle typography, spacing, and component revisions into the same test.

  6. 6

    Assign a disposition

    Pass when the intended change appears where expected with no material unrelated drift. Revise when the governing rule or prompt is incomplete. Block when ownership, evidence, or downstream parity remains unresolved.

Keep prompts in the evidence record

The community response recommends explicit prompting and protecting selected elements. That may improve control, but a prompt can still override the shared rules. Save the exact instruction with the result so someone else can reproduce or challenge the decision.

Run one controlled-change check

A controlled change tests whether a declared rule reaches the places it should. It's narrower than a general visual review. Pick one rule with an observable result, name the screens and export surface in scope, then capture both the intended and unintended effects.

Controlled change

Project:
Observed date:
Reviewer:

Governing layer:
Rule identifier:
Current rule:
Proposed rule:
Reason for change:
Owner and approver:

Representative screens:
- Screen / state:
  Expected change:
  Actual observation:
  Evidence reference:
- Screen / state:
  Expected change:
  Actual observation:
  Evidence reference:

Approved exceptions:
- Screen / state:
  Exception and reason:
  Expected to remain unchanged: yes / no

Exported artifact:
Artifact and version:
Expected change:
Actual observation:
Evidence reference:

Unrelated drift:
- Navigation:
- Icons:
- Color mode:
- Typography:
- Spacing and layout:
- Component treatment:

Unresolved conflicts:
Owner:
Next evidence required:

Disposition: pass / revise / block
Disposition reason:
Copyable worksheet for one bounded rule change

"No unrelated drift observed" is valid only for the named screens and artifact. It doesn't mean the entire project is consistent. Where your workflow permits, attach references to screenshots, screen versions, prompt text, DESIGN.md revisions, and exported commits or archives.

Use Ambient Sage as an intake record, not a compatibility claim

This intake record shows how to bring a bounded source into the process without inventing Stitch results. Ambient Sage is a free, published Identity Forge kit. Its documented typography uses Plus Jakarta Sans for body and heading roles at weights 400, 500, 600, and 700, plus JetBrains Mono for the mono role at weights 400, 500, and 700. The published scale is compact-product.

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 69 · C0, 0, 3, 15

Brand

#FEE951

primary

H 53 · 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 · C0, 8, 60, 3

#FEE951

ring

H 53 · C0, 8, 68, 0

Semantic

#C0392B

destructive

H 6 · C0, 70, 78, 25

#FFFFFF

destructive-fg

H 0 · C0, 0, 0, 0

#2D7238

success

H 130 · C61, 0, 51, 55

#C97D12

warning

H 35 · C0, 38, 91, 21

#545651

muted-fg

H 84 · C2, 0, 6, 66

Charts

#FEE951

chart-1

H 53 · C0, 8, 68, 0

#4A8FD4

chart-2

H 210 · C65, 33, 0, 17

#6BBF8A

chart-3

H 142 · C44, 0, 28, 25

#E07498

chart-4

H 340 · C0, 48, 32, 12

#E8A24B

chart-5

H 33 · 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

Sample headline

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's published token roles provide an inspectable source for the intake record. This specimen does not represent a Stitch import result.
Artifact intake: Ambient Sage

Source state
- Public kit page: documented
- Kit access: free and published
- Typography roles: documented
- Body and heading family: Plus Jakarta Sans
- Body and heading weights: 400, 500, 600, 700
- Mono family: JetBrains Mono
- Mono weights: 400, 500, 700
- Typography scale: compact-product
- DESIGN.md: available
- Semantic light and dark tokens: available
- Delivery formats: shadcn, Tailwind, CSS, and DTCG

Stitch evidence state
- DESIGN.md imported into Stitch: not tested
- Import warnings or transformations: not tested
- Generated-screen adherence: not tested
- Navigation consistency: not tested
- Icon consistency: not tested
- Light and dark mode behavior: not tested
- Typography and spacing parity: not tested
- Exported-artifact parity: not tested
- Controlled-change result: not tested

Handoff disposition
- Status: block pending evidence
- Reason: the source artifact is documented, but no Stitch-specific behavior or source-to-export parity has been observed
- Next action: import through the currently documented Stitch workflow, capture any transformation, then run one controlled change across representative screens and the chosen export
Populated, source-bounded intake record

Why the record starts as blocked

"Not tested" is useful information, not a failure. It prevents a complete source kit from being mistaken for evidence that another product imported, applied, and exported it faithfully.

Hand off without promoting the export to source of truth

Hand over the governing DESIGN.md, machine-readable tokens or implementation artifacts, exception register, controlled-change record, and exported code together. Give each item a version or stable evidence reference. The developer should be able to trace a visible value to a semantic role or written rule and see which differences were approved.

  • Name the DESIGN.md revision and token artifact used for generation.
  • List representative screens and their recorded states.
  • Include exact approved exceptions and unresolved conflicts.
  • Record the export method and resulting artifact version.
  • Separate verified parity from areas that weren't tested.
  • Route downstream corrections back to the owning rule when they represent shared design decisions.

If a developer changes a shared color, spacing value, or component treatment only in exported code, treat it as downstream drift until the governing source accepts the change. If it's an implementation detail with no design-system consequence, keep it in code and explain why it doesn't need to travel upstream.

Consistency is only one acceptance track

This procedure doesn't certify accessibility, task completion, responsive correctness, generated-code quality, security, or production readiness. Review each of those against its own requirements and evidence.

Choose pass, revise, or block

Pass the design-system handoff when the governing rule and owner are clear, representative screens show the expected result, approved exceptions stay bounded, the exported artifact preserves the checked change, and no material unrelated drift appears in scope.

Choose revise when the evidence points to an incomplete DESIGN.md rule, a broad prompt override, or a poorly defined exception that the current owner can correct. Choose block when sources conflict without an owner, Stitch-specific behavior hasn't been observed, the exported artifact breaks a governing rule, or the evidence record is too weak to reproduce the decision.

For a new project, fill in the four-layer authority record before generating another screen. For an existing project, pick one visible inconsistency, route it to its owning layer, and run the controlled-change worksheet before you accept or regenerate the rest.

Sources