Both checks pass — the inline script parses cleanly and every tag is balanced. Here is the complete self-contained prototype: StreamPilot · Design parity report
StreamPilot Design parity report
Snapshot · Jun 15 — 19 days old
Prototype vs. live site

Short answer: the site kept shipping. My snapshot didn’t.

Fair question — it came up twice this week, so here’s the full audit. Every prototype I build starts from a copy of the live design tokens, and that copy is currently 19 days old. Since then you’ve shipped three visual changes I haven’t absorbed. Two more differences are sandbox rules that apply to any offline prototype, and two are proposals I made on purpose. Everything is itemized below, and the stale part fixes itself with the button up top.

Token parity with the live site 83% 35 of 42 tokens & assets match today’s live styles
Differences found 7 3 fixable · 2 sandbox rules · 2 proposals
Fixable in one click 3 stale values from the Jun 15 pull
Live releases since my pull 3 latest visual change shipped Jun 30

The honest answer, in three parts

Not every difference is the same kind of difference — and only one kind is actually a bug.

My snapshot goes stale

I read colors, radii, and spacing straight from the codebase when I build — not from memory. But the site ships every week, and a prototype keeps the tokens it was born with. Nineteen days is three releases of quiet drift.

Fixable — that’s the button up top

Prototypes live in a sandbox

Each one is a single offline file: no webfonts, no production assets, no network at all. So the system font stack stands in for the licensed one, and a plain wordmark stands in for the real logo — close on purpose, identical never.

By design — flagged in every hand-off

Some drift is the point

A prototype exists to test a change. Where I’m proposing something — a bigger first-run button, a guided empty state — it should disagree with production. Those get a clear “proposal” label so nobody mistakes them for the current spec.

On purpose — labeled below

Same screen, two sources of truth

The project view, rendered twice: once from today’s live styles, once from my snapshot.

Live site · todaySource of truth
Accent #4C7DF0 · 6px inputs · 32px buttons · production mark & self-hosted UI font
My prototype · Jun 15 snapshotWhat I drew
Accent #5B8DEF · 8px inputs · 36px buttons (proposal) · wordmark & system fonts (sandbox)

Every difference, itemized

Forty-two tokens and assets compared. Seven differ — each row says why, and what happens when I sync.

Why it drifted: the accent was retuned on Jun 24 to pass AA contrast on dark surfaces. My snapshot predates that release, so every primary button I drew since is one shade off.

On sync: adopts #4C7DF0 automatically — no redesign needed.

Why it drifted: the Jun 30 elevation pass flattened raised surfaces by one step. Subtle in isolation — but it’s exactly why my cards read “lighter” than production.

On sync: cards drop to the live surface value.

Why it drifted: the settings redesign tightened form density and squared inputs slightly. My snapshot kept the older, rounder corners.

On sync: inputs sharpen to 6px to match.

Why it differs: prototypes are single offline files — no network requests, no font license baked in. The system stack is the closest metrics match, so letterforms will always sit a hair differently.

On sync: stays as-is. Noted in the hand-off so nobody chases a font bug.

Why it differs: I never redraw the real mark — a near-copy is worse than an honest stand-in. Prototypes carry the text wordmark until the production asset is dropped in.

On sync: stays as-is until an approved asset lands in the prototype pipeline.

Why it differs: deliberate. The onboarding concept argues for bigger first-run targets while a new user finds their footing — this is that argument, drawn.

On sync: untouched. Approve it and it becomes a real token change; pass, and I revert to 32px.

Why it differs: the live empty state is a dead end. The prototype tests a guided “point me at one folder” walkthrough instead — that gap is the prototype doing its job.

On sync: untouched. It’s the thing being decided, not a bug to fix.

No drift found

Nothing matching that is out of step with the live site — which is the good kind of boring.

And how it stays fixed

Drift is inevitable; stale drift isn’t. Three habits keep the gap honest.

Pull before every build

I re-fetch tokens from the codebase the moment a prototype is requested — never from memory, never from last month’s pull.

A parity note on every hand-off

Each prototype states its snapshot date and lists known gaps — sandbox stand-ins and open proposals — so reviewers know what’s signal and what’s scaffolding.

A ping when production moves

If live tokens change while a prototype is still in review, I flag the delta in the thread instead of letting it age quietly.

Try it now. Pull today’s tokens and watch the three stale values resolve in place — the prototype pane and the drift log update live.