A standard for agent-ready design systems Text and diagrams CC BY 4.0
← All releases
The standard, Undrift, Plinth
October 2026

Release notes, October 2026

The standard moves to version 1.2, its gate is published on its own as Undrift, and the reference implementation is renamed Plinth, both under MIT.

1Why it changed

Why it changed.

This release makes three things clearer: what is on offer and what is only an example, which name belongs to which part, and what the gate did not check. The version from 21 September is tagged review-2026-09-21 on GitHub, so any change can be compared with it.

2What each piece is now

What each piece is now.

2.1
Correct by Design is the standard: six properties a design system needs before a coding agent can build with it correctly. Version 1.2 adds two points under Constraint. Code names what a value is for, never which value it is. And a system that claims its rules are enforced says what its checks did not cover, and never counts an unchecked file as clean.
2.2
Undrift is the gate: npm i -D undrift, MIT, React and Tailwind only for now. Its repository is github.com/free-agent83/undrift, with a history of its own.
2.3
Plinth is the reference implementation: github.com/free-agent83/plinth, renamed from agent-ready-design-system (the old address redirects). Its packages are @plinth/tokens and @plinth/components, and Plinth installs Undrift from npm at one pinned version, as any product would. The example product built on it is called Wrenfield, so that Plinth only ever means the design system.
2.4
The Correct by Design assessment is the instrument that scores a design system against the standard. It stays private for now. Its specification, what each property requires and what evidence is looked for, follows under CC BY before the index of public design systems goes live, so any score can be checked by hand.
3What Undrift does now

What Undrift does now.

3.1
It says what it didn't check.A clean result means checked and clean. Anything Undrift was set up to check and couldn't is listed under "Not checked": a missing token file, a rule with nothing to read, a folder it couldn't open, a stylesheet, a file behind a link. The release check, undrift gate --strict, fails on any of it.
3.2
It judges only the agent's own lines.An agent editing one line of an old file is asked to fix only what it wrote, not someone else's raw colour. Git says which lines are new, and where it can't tell, every line counts.
3.3
Older problems go to a person.The agent asks once per file, with three choices: fix it, with the exact token named, put it on a later list, or put everything old in the file on it. The later list is undrift.later.json, committed with the code, with each entry's reason and date. The release check lists deferred problems, never fails on them, and never calls them clean. Adopting Undrift on an app with hundreds of old problems is one command: undrift later --all.
3.4
A missing component is declared, not improvised.Where the design system has nothing that fits, the agent renders <Missing what="DateRangePicker" reason="..." />, a dashed, hatched magenta box that holds the place in the layout and is too visible to ship by accident. It passes while the screen is being built and fails the release check, and a gap declared for a component that exists fails straight away.
3.5
Setup reads the system as it is.npx undrift init <package> reads every entry a package's manifest names, the app's stylesheets and everything they import. init --components components/ui does the same for a shadcn-style folder of components. Where it can't read something, it says what and writes nothing unless told to. Run on Plane, Ghost, HeroUI and a fresh shadcn app, it listed every component the apps import, all 261 in Plane's newer package, and read every token layer in full.
3.6
Correct code is left alone.On the same four apps, colours built from tokens, Tailwind's own theme, variables the app's own code sets, PDF styles and an <input> judged by its type are all read correctly. A fresh shadcn app's own code passes, and every flag left on it is real. A value no token can reach is listed as not checked rather than failed. False flags are down to about 2.4% on Plane and 8.5% on Ghost, from 5.6% and 12%.
3.7
Two opt-in rules for a semantic layer.no-default-palette flags a class from Tailwind's built-in palette in a system with colours of its own. no-primitive-tokens flags a reference to one of the system's raw palette entries, and names the roles built on that colour instead. Both are on in Plinth. The second needs the system to declare its primitives in undrift.config.json; without that it doesn't run, and says so.
4What it doesn't do yet

What it doesn't do yet.

4.1
Write-time checking works with Claude Code only. Cursor, Codex and Copilot document the hooks it needs, and none of them has been tested by hand.
4.2
Stylesheets are listed as not checked rather than read.
4.3
A colour that is data, such as a stored default or a colour sent to an email, is still flagged. A token-exempt comment with a reason records it.
4.4
The magenta proposal marker, where the agent builds its best guess at a missing component and marks it for review, is designed and not built.
4.5
There is no visual regression testing yet. Nothing compares a screenshot of a Plinth component, or a page of the example product, with how it looked before, so a change in how something looks passes every check.
5Trying it

Trying it.

npm i -D undrift
npx undrift init @acme/design-system
npx undrift gate

The hook goes in .claude/settings.json; the README has the exact lines. Plinth is the quickest way to see all of it working in one repository.