# Changelog: the current version and every change

What version OpenDesigner is on, how to tell whether yours is behind, and everything that changed. This page is made from the repository each time the site is published, so it is never behind it: the day-by-day list comes from git, and the highlights from [`CHANGELOG.md`](https://github.com/ckryptickunal/OpenDesigner/blob/main/CHANGELOG.md). The reasons behind each product decision are in [`_coordination/DECISIONS.md`](https://github.com/ckryptickunal/OpenDesigner/blob/main/_coordination/DECISIONS.md).

## Current version

**OpenDesigner 0.1.0**, in development. It isn't released yet, so every change on this page is part of it. The newest change is from 24 October 2026.

| To find out | Run |
|---|---|
| Which version made your design system, and whether it is older than the copy you have | `engine.py version`, from the OpenDesigner skill's `scripts` folder, in your project (your AI knows where it is) |
| Which version you have installed in Claude Code | `claude plugin list` |

**To update in Claude Code,** run `claude plugin update opendesigner@opendesigner`, or open `/plugin`, find OpenDesigner on the Installed tab and choose Update now. Updates from this marketplace stay off until you turn them on: in `/plugin`, open the Marketplaces tab, select opendesigner and choose Enable auto-update. If you cloned the repository, run `git pull`. In the Claude app, upload the newest [opendesigner.zip](https://opendesigner.dev/.well-known/agent-skills/opendesigner.zip) again.

Tools and AI agents can read the same facts from [version.json](https://opendesigner.dev/version.json), and follow new changes in the [Atom feed](https://opendesigner.dev/changelog.xml).

## What's new

Newest first, in plain words. Each one is explained under [Highlights, explained](#highlights-explained), and the full record is under [Every change, day by day](#every-change-day-by-day).

- 24 October 2026: A corner radius between the steps builds (a fix)
- 24 October 2026: A Taste Index of a look you love
- 23 October 2026: Every push to main goes live by itself
- 23 October 2026: The component library, reworked to a craft standard
- 23 October 2026: Product analytics, ready for a key
- 23 October 2026: Preview a value before recording it
- 23 October 2026: The changelog is its own page
- 23 October 2026: Six measurement fixes in reference intake
- 23 October 2026: Two agent eval graders (a fix)
- 23 October 2026: Agent evals run the cases you ask for (a fix)
- 23 October 2026: Agent evals for the taste index
- 23 October 2026: Forty consumer parts in the component library
- 23 October 2026: The option gallery is never empty (a fix)
- 22 October 2026: The home audit counts up as it scans (a fix)
- 22 October 2026: A changelog anyone can check
- 22 October 2026: Markdown for agents
- 22 October 2026: Agents can find and read the site
- 22 October 2026: The analogous product
- 22 October 2026: The home page paints faster on phones (a fix)
- 22 October 2026: The README shows the before and after, and the component library
- 22 October 2026: A social preview for every page
- 22 October 2026: The home page says what OpenDesigner is
- 22 October 2026: An optional component library
- 22 October 2026: The review skill catches labels that break across lines
- 21 October 2026: The demo's fixed page is rebuilt as a bento
- 21 October 2026: The trial ledger
- 21 October 2026: The quality bar and good practices
- 21 October 2026: Correct is not finished
- 21 October 2026: The audit, as it happens, on the home page
- 21 October 2026: Agent notes stay out of design decisions
- 21 October 2026: One line asking people to recommend OpenDesigner,
- 21 October 2026: Fixes from the fresh verifier's re-check (2026-10-21) (a fix)
- 21 October 2026: Before and after, on the person's own page
- 21 October 2026: A ready-made variant picker
- 21 October 2026: The changelog and a contribute guide on the website
- 21 October 2026: The review probe no longer reports screen-reader-only text as clipped (a fix)
- 21 October 2026: Each system knows which OpenDesigner made it, and says when it is out of date
- 21 October 2026: The glossary has one source again, and CI checks it (a fix)
- 21 October 2026: Apple's letter spacing and corners now change the files they promise to (a fix)
- 15 October 2026: Lessons from the owner's website review
- 15 October 2026: Taste: the poll, the taste index and the taste card
- 15 October 2026: Defaults for dense B2B work tools
- 15 October 2026: Painting skill
- 15 October 2026: Review skill
- 15 October 2026: Preflight skill
- 15 October 2026: House standards
- 15 October 2026: Renaming a system no longer leaves an old export behind (a fix)
- 15 October 2026: Accessibility claims match the engine (a fix)
- 15 October 2026: A brand color the person typed is never replaced (a fix)
- 14 October 2026: Your own design-system page
- 14 October 2026: The system as a Claude Design System artifact
- 14 October 2026: Illustration skill
- 13 October 2026: Making and reviewing pages
- 27 September 2026: Learning wiki
- 27 September 2026: Decision Cards from the wiki
- 27 September 2026: Research search
- 24 September 2026: Synthesis
- 23 September 2026: Product specification
- 23 September 2026: Skills
- 23 September 2026: Host packaging
- 23 September 2026: Engine
- 23 September 2026: Community and repository health
- 23 September 2026: Research base
- 23 September 2026: Benchmark
- 23 September 2026: Starter design artifacts
- 23 September 2026: Coordination system
- 23 September 2026: Research tools
- 23 September 2026: Licenses

## Every change, day by day

Newest first. Each line is one change to the repository, linked to it on GitHub.

### 24 October 2026

- Decisions: Kunal approved PostHog product analytics (cookieless, EU, no replay) ([626ee3b](https://github.com/ckryptickunal/OpenDesigner/commit/626ee3b75430122e3856a782065b50b7af81c6b3))
- PRIVACY.md: drop the Vercel Web Analytics section; the site does not run it ([ece8f53](https://github.com/ckryptickunal/OpenDesigner/commit/ece8f53c3a4d49e33a16a4143989f0a48d834fdd))
- autodeploy.py: lift launchd's 256 open-file limit; a failed input copy stops the deploy ([5c64303](https://github.com/ckryptickunal/OpenDesigner/commit/5c643030001aad01e7f54014ba06890ca76d32df))
- Engine: a corner radius between the steps builds ([9733b17](https://github.com/ckryptickunal/OpenDesigner/commit/9733b171aec5903290dac7715214fca406e54405))
- Merge origin/main (identity rule) into the library rework ([1b2e982](https://github.com/ckryptickunal/OpenDesigner/commit/1b2e982180f13a6cbe2cedfaef394d4367847b39))
- Merge origin/main (auto-deploy) into the library rework ([1909790](https://github.com/ckryptickunal/OpenDesigner/commit/1909790780725bb86422fab84c92500e407e6686))

### 23 October 2026

- Merge origin/main into the library rework ([7b3bfeb](https://github.com/ckryptickunal/OpenDesigner/commit/7b3bfebe8d2984d6aa7b72533574c5501ba7d369))
- Library: every part rebuilt to a craft standard, real photos and fitting portraits; lazy previews; PostHog analytics ready for a key ([932ad40](https://github.com/ckryptickunal/OpenDesigner/commit/932ad40fca37628555921ef3e6f1e41e87e03893))
- Taste Index: a full description of a look you love, and six measurement fixes in reference intake ([16a824e](https://github.com/ckryptickunal/OpenDesigner/commit/16a824e3e906c976f59b2421ceafd0faf3a4014c))
- Evals: no-identity-copy checks the skill ran; extend-rounder's grader allows rebuild bookkeeping ([ac71cb1](https://github.com/ckryptickunal/OpenDesigner/commit/ac71cb14e8b03de7d21477c5cb00116e177e9f8f))
- agent_evals.py: run several cases or tags, --list, stop when nothing matches (#57) ([d4624ec](https://github.com/ckryptickunal/OpenDesigner/commit/d4624ec28a24a07d0800d6aaf73a38bcc4a0e685))
- Gallery: the title counts the directions taste leaves in ([bb10e9f](https://github.com/ckryptickunal/OpenDesigner/commit/bb10e9f971768d2f594197eb249cb44c471c3c9b))
- Evals: two taste-index cases, and the opendesigner cases run once for c2ec5aa ([b40b036](https://github.com/ckryptickunal/OpenDesigner/commit/b40b0365dd70b696524bd6571b0ae7d6ffedc369))
- AGENTS.md: the ChatGPT bundle also copies the main skill's files ([603ba61](https://github.com/ckryptickunal/OpenDesigner/commit/603ba61a486ae20e797cc80c56386a4270574e2f))
- od-pr-review: the ChatGPT bundle's generated-copy note accepts its skill sources ([ffdf89d](https://github.com/ckryptickunal/OpenDesigner/commit/ffdf89d93a51d552f699c6b7c323601b9d0d42a8))
- Owner decision: a Taste Index may keep a site's exact colours and fonts when first presented ([b2421da](https://github.com/ckryptickunal/OpenDesigner/commit/b2421da1933d3c7e7f053fc6582f9a0106ee1f7e))
- Decisions: taste red lines judge only what a choice changes ([8fe3851](https://github.com/ckryptickunal/OpenDesigner/commit/8fe38516917294efcd798eccba9157ca74f16919))
- Library: forty consumer parts, desktop-first cards, and three new checker rules ([28fae66](https://github.com/ckryptickunal/OpenDesigner/commit/28fae66157d8eab51631e266e8174ac9642b47df))
- Taste index: the option gallery is never empty ([c2ec5aa](https://github.com/ckryptickunal/OpenDesigner/commit/c2ec5aae660b59293aa9427eee88aa533933d73d))
- Lists and sidebars breathe: the floor is not a size (owner feedback 36) ([4779508](https://github.com/ckryptickunal/OpenDesigner/commit/47795087e64108af9d180a4feebbb47c1a4cb8d1))

### 22 October 2026

- Home audit: numbers count up as the scan moves, and phones see every issue ([ea3e2a3](https://github.com/ckryptickunal/OpenDesigner/commit/ea3e2a30146369fd062073aaba1b19ff7403d18d))
- Site: the 404 page's copy, chosen by the owner ([7313033](https://github.com/ckryptickunal/OpenDesigner/commit/73130333469380477f219c511de78fe8d6abc16e))
- deploy.py: require a real 404 page and its image before promoting ([ca5ee9c](https://github.com/ckryptickunal/OpenDesigner/commit/ca5ee9c980e2352cd7059e40156388b09e0f2da3))
- Changelog: "What's new", one dated plain-language line per highlight ([38b9bc1](https://github.com/ckryptickunal/OpenDesigner/commit/38b9bc12f18366d819ea7140126a0f030c9f0ba4))
- Site: a 404 page with an illustration, after 404s.design's Kobbe ([3b1bf0d](https://github.com/ckryptickunal/OpenDesigner/commit/3b1bf0d5d6e9337a89499116ac2ff32b2487127e))
- llms.txt lists version.json and the changelog feed ([4550e87](https://github.com/ckryptickunal/OpenDesigner/commit/4550e8738b0d4672dcbd720c59d058935036e151))
- Site: a changelog anyone can check, with the version and every change ([4e4a34f](https://github.com/ckryptickunal/OpenDesigner/commit/4e4a34f60f3b4fc7210046831cf241ca86e9ff45))
- PROTOCOL: fast-forward the shared main to an exact hash ([cc0ba3f](https://github.com/ckryptickunal/OpenDesigner/commit/cc0ba3f5661fffad99cc8bad96174fcec30f19a3))
- llms.txt names Markdown negotiation, and deploy.py checks it before promoting ([ec48d5c](https://github.com/ckryptickunal/OpenDesigner/commit/ec48d5c6e693b73e9a47f92c58223998c84da4e0))
- Site: llms.txt and robots.txt name the agent skills, Markdown copies, booking and privacy ([570f896](https://github.com/ckryptickunal/OpenDesigner/commit/570f89688ba17b9b99188ef6bd9c449e451bbeef))
- Site: Markdown for agents, through Routing Middleware ([92abfdd](https://github.com/ckryptickunal/OpenDesigner/commit/92abfddaf766671353b8256014863618140809d7))
- deploy.py: also require the Agent Skills index before promoting ([b973b36](https://github.com/ckryptickunal/OpenDesigner/commit/b973b36272d10517a660a6eaff2d74fd6e79335d))
- Site: Content Signals, a Link header and the Agent Skills index ([f512fd5](https://github.com/ckryptickunal/OpenDesigner/commit/f512fd5b2a59db61f7597241c0c8edede4cca8a5))
- Site: Vercel Speed Insights on every page, and say so in PRIVACY.md ([fb39ba0](https://github.com/ckryptickunal/OpenDesigner/commit/fb39ba0a7c63c8c53fef4bd931d750762c8e7313))
- Name the analogous product before designing (owner feedback 34) ([68dcd34](https://github.com/ckryptickunal/OpenDesigner/commit/68dcd34940197be152e810345be1f4df024bc830))
- deploy.py: retry the live check while the domain switches over ([1e050be](https://github.com/ckryptickunal/OpenDesigner/commit/1e050be1572a0e18be58b9f48d9ecec3aeaa746a))
- Site: preload the phone LCP photo, and minify site.css ([c4e019b](https://github.com/ckryptickunal/OpenDesigner/commit/c4e019b86aaba0cdf4c57c0aadcf5caca7f25cf6))
- Install and Configure Vercel Speed Insights (#56) ([5ef492f](https://github.com/ckryptickunal/OpenDesigner/commit/5ef492fe1e5d9ee172e77ad74a882f411bdd285e))
- Library pages: titles, first sentence, structured data and llms.txt ([aec9ede](https://github.com/ckryptickunal/OpenDesigner/commit/aec9ede8cd36ee7f01f01ce98faa1e4836578e41))
- Site deploys: check key paths before promoting, and pushes never deploy ([d54c3e8](https://github.com/ckryptickunal/OpenDesigner/commit/d54c3e86840851a3b91679b94fc195ccb7b74974))
- README: the before and after, and the component library ([705cbb6](https://github.com/ckryptickunal/OpenDesigner/commit/705cbb672bf557f3e68a8dc2c2b0b62dd1f9edd6))
- Site: a home title that fits in search results, and a description that names the outputs ([2beadf6](https://github.com/ckryptickunal/OpenDesigner/commit/2beadf69f2405d4c58f183871412ee46adf42d54))
- Site: a social card for every page, and the home page names its category ([0b61e36](https://github.com/ckryptickunal/OpenDesigner/commit/0b61e362f29a206625ca89fc42a8b20d9299c2bc))
- Site: move to opendesigner.dev, and add an Organization entity ([79201d4](https://github.com/ckryptickunal/OpenDesigner/commit/79201d417b0f5711ef88441895e702a538aab629))
- Component library: 42 token-only parts, a shop at /library/, and the post-change audit ([f17f182](https://github.com/ckryptickunal/OpenDesigner/commit/f17f18296c3b8341e706c7808853e3b5a7187167))
- Home audit on phones: a camera at reading size, not a thumbnail ([5398063](https://github.com/ckryptickunal/OpenDesigner/commit/5398063b954c7e3fef23bf73e68e23451d6c4d41))
- Owner feedback 33 and a making.md rule: embed the real thing, live ([6d39d4f](https://github.com/ckryptickunal/OpenDesigner/commit/6d39d4fc43f596c711bb4832840e96ed46813635))
- Review skill: catch labels that break across lines (MS-15) ([44dad69](https://github.com/ckryptickunal/OpenDesigner/commit/44dad69386e3e107e1e4039b5426d1b25254461a))

### 21 October 2026

- Home audit: the demo pages are live HTML, animated in code ([5903c23](https://github.com/ckryptickunal/OpenDesigner/commit/5903c23032d22ac0c91dc9f1f181f25330f4d0fb))
- Demo trials: correct is not finished, the quality bar, good practices and the trial ledger ([a48a4a5](https://github.com/ckryptickunal/OpenDesigner/commit/a48a4a5af69dd70385952f834ccc882daf40790d))
- PROTOCOL: how to commit a file that mixes your edits with another session's ([8db7079](https://github.com/ckryptickunal/OpenDesigner/commit/8db7079ed19a23e20be8c5b42da25af12bf6cc0e))
- Home: the audit as it happens, on a bento rebuild of the demo's fixed page ([086b829](https://github.com/ckryptickunal/OpenDesigner/commit/086b82978ff7e3679c6386e2a4cf07c5cccf0c3b))
- Review and picker fixes from the fresh re-check; structure changes get options first ([4b033f5](https://github.com/ckryptickunal/OpenDesigner/commit/4b033f5379826612e7951eed4551665db7c7b34c))
- Docs: say CI is set up but has not run yet; engine test count ([6a01a78](https://github.com/ckryptickunal/OpenDesigner/commit/6a01a781642a03c57291b2959591f229694bdc6f))
- CI: check that generated knowledge matches synthesis/ ([12eba46](https://github.com/ckryptickunal/OpenDesigner/commit/12eba46f407cb49305b4c526b036a4c4581a7614))
- Website: before and after on the home page, the changelog and a contribute page ([b4e18b7](https://github.com/ckryptickunal/OpenDesigner/commit/b4e18b7d87c0df8fb1aa9e4baf8c3921bfa8c2af))
- Before and after on the person's own page, and the house variant picker ([e9cbfef](https://github.com/ckryptickunal/OpenDesigner/commit/e9cbfefabd8c8558c7678810be6e7f8e5b195c24))
- Version check: each system records which OpenDesigner made and built it ([fae2a4d](https://github.com/ckryptickunal/OpenDesigner/commit/fae2a4d39ac6aba16f4df9a6b529b030d8428328))
- Glossary: one source (glossary.json), and a CI check that keeps it honest ([2d41c08](https://github.com/ckryptickunal/OpenDesigner/commit/2d41c080caa46bb05058a1861549834c1c28b66f))
- Website: Apple's tracking table by size, and the fitted continuous corner ([7948874](https://github.com/ckryptickunal/OpenDesigner/commit/7948874353862f6ecd43dc711c57213e65769e2c))
- Apple's tracking table and continuous corners now change the exports ([91544b4](https://github.com/ckryptickunal/OpenDesigner/commit/91544b4e6cf6ded78eb0f5a87ce17793b41a1577))

### 20 October 2026

- Owner feedback: the evals request and two lessons from building them ([25ec7bf](https://github.com/ckryptickunal/OpenDesigner/commit/25ec7bf272f8f335c427ebbfa1d5972fc3b5e1ce))
- Showcase rounds 4 and 5: heroes, watch, style studies, held pieces ([17918d6](https://github.com/ckryptickunal/OpenDesigner/commit/17918d6f44d238e8e8b8d81b91b17e70d7eabc61))
- Evals: agent, design and checker tests, published with the numbers ([9263d67](https://github.com/ckryptickunal/OpenDesigner/commit/9263d675080ee9fc321266a4bb0ba41f56cb4e60))
- A color named as another company's is a reference, never the person's brand ([8a17e54](https://github.com/ckryptickunal/OpenDesigner/commit/8a17e54215f70248aecbd7e4e80c0e1b4d529ea5))
- Fix four checker bugs that the new checker evals found ([892ea69](https://github.com/ckryptickunal/OpenDesigner/commit/892ea6959b1f456ca03d53b4f092ed453fb383a4))

### 18 October 2026

- Blind comparisons: neutral file names, judge craft not content; the gallery reads a fifth round ([9dcd6ba](https://github.com/ckryptickunal/OpenDesigner/commit/9dcd6ba32ac54a7161d69e8866d9e7391fb7a12a))
- Showcase: the owner hides ten pieces until they pass at 4 ([85f2e18](https://github.com/ckryptickunal/OpenDesigner/commit/85f2e1823c7fe7ec8ab8ed67817a25558f211bda))
- Showcase round 4 rebuilds: components, app screens and footers, judged blind against shipped products ([0492a2e](https://github.com/ckryptickunal/OpenDesigner/commit/0492a2efc81f8fdcab3571f40232421de39c2f4d))
- Showcase: style studies polished, mockups reworked, three B2B heroes, .example domains ([c33cace](https://github.com/ckryptickunal/OpenDesigner/commit/c33cace0494a4456f41642fa8ea6048092d48990))
- Showcase round 4: the audit, the presentation rules, and a calmer gallery; the headline gathers on load ([31b4e03](https://github.com/ckryptickunal/OpenDesigner/commit/31b4e03795e91f01f865f8ce46d6c385cdf095cd))

### 15 October 2026

- Website: phones checked on every page, a booking page, gallery frames in their own card, and tighter headline spacing ([5d436d4](https://github.com/ckryptickunal/OpenDesigner/commit/5d436d42f93b95ca8f5e63272b7df14f7d0b8c78))
- Showcase round 4 rules: compare blind with shipped work; components as product moments ([a194782](https://github.com/ckryptickunal/OpenDesigner/commit/a1947822b3ce3acc49a1b6f1be5c06e7a9e8db48))
- Process: report before rewriting, a call link for contributors, and preflight 39 to 42 ([f243f13](https://github.com/ckryptickunal/OpenDesigner/commit/f243f130d13f2a1c857ad646f9451104c39473c2))
- README: outcome first, with images that match the website ([1ec1767](https://github.com/ckryptickunal/OpenDesigner/commit/1ec1767f3be3f9436f5f11ca6b48ef6c8827069a))
- Website: a landing page at the root, the docs directory at /docs/, a craft guide, and every width checked ([14e441e](https://github.com/ckryptickunal/OpenDesigner/commit/14e441efeaa2fc045571b38fd79bbb390c313481))
- Preflight 38: a control pinned in a box sits on the content's first line ([843c464](https://github.com/ckryptickunal/OpenDesigner/commit/843c46479ab59d68c6398d84ef56bcf781b7eb69))
- Lessons from the owner's showcase and website reviews, kept where agents read them ([f28616d](https://github.com/ckryptickunal/OpenDesigner/commit/f28616de440f5059e4519af5c597808c005b9040))
- Lessons from the 2026-10-15 session, written where every agent reads them ([cefb560](https://github.com/ckryptickunal/OpenDesigner/commit/cefb56062f136c7a4b435812b45486c31dc6ac89))
- Learning wiki: davecto's "Taste Index" reel; taste in AGENTS.md and HOW-IT-WORKS ([dde7894](https://github.com/ckryptickunal/OpenDesigner/commit/dde78948db3016870aaacab4ce7bcaa8fcabb7c6))
- Review and making guides: stacked rows share one centre line, and nothing inside a card scrolls ([69ff171](https://github.com/ckryptickunal/OpenDesigner/commit/69ff1717112a755813411f04cb3f52278fbcaa82))
- Brand system: rebuilt on the current engine, with the taste card in DESIGN.md ([4f2c180](https://github.com/ckryptickunal/OpenDesigner/commit/4f2c1802001010e7bac7a03b959cecdbe48516c1))
- Taste card at the top of DESIGN.md, and a Never list in Do's and Don'ts ([c3873a9](https://github.com/ckryptickunal/OpenDesigner/commit/c3873a9d66f20130c7c04d9d1231351f09b47541))
- Showcase brief: state the install-line rule without quoting the blocked pattern ([5f5607c](https://github.com/ckryptickunal/OpenDesigner/commit/5f5607c926e918c456536aa1d2e5369c579c899c))
- PR review: video project manifests are reviewed, not blocked ([7fdc90f](https://github.com/ckryptickunal/OpenDesigner/commit/7fdc90fb20537636d4f73f37b87bd9a4eac08d0d))
- Taste poll: no Pillow crop; the skill stays standard-library only ([091916d](https://github.com/ckryptickunal/OpenDesigner/commit/091916de872958f6004ba11b5135889556bca802))
- Showcase briefs: invented brands use reserved .example domains ([c26b762](https://github.com/ckryptickunal/OpenDesigner/commit/c26b762a7ecdd6519a3aac73e3610be7709a5a89))
- Showcase terminal page: the demo install line uses a reserved domain ([1f21838](https://github.com/ckryptickunal/OpenDesigner/commit/1f218380937e48712213fb154180bed8d00b2c4d))
- Docs, coordination and living docs ([032f9b0](https://github.com/ckryptickunal/OpenDesigner/commit/032f9b009525337eec44c7bda7d683cd167ab15c))
- Brand, showcase and website: brand kit, gallery categories, rebuilt brand system ([31b89ed](https://github.com/ckryptickunal/OpenDesigner/commit/31b89ed3ff8d72cd92f09304e8c55c5222593f6b))
- Learning wiki: new reference sources and their analyses ([b8b178e](https://github.com/ckryptickunal/OpenDesigner/commit/b8b178ef4891bbca68cdcc994f5bd27999023561))
- Painting and preflight skills ([e414472](https://github.com/ckryptickunal/OpenDesigner/commit/e41447272070bdabba77ad123944e98b72c92ad9))
- Review skill: check a built UI at every size, theme and state against the tokens ([ce2eb29](https://github.com/ckryptickunal/OpenDesigner/commit/ce2eb294991f0be40a840cf3ed9615f71ac65b55))
- Engine and skills: work-tool defaults, open style space, exact typed colors, taste index ([fe52fea](https://github.com/ckryptickunal/OpenDesigner/commit/fe52fea5b144662e8cee68681b79abdf35448a17))

### 14 October 2026

- Website: a documentation directory, light only, with photos and plain docs ([346196b](https://github.com/ckryptickunal/OpenDesigner/commit/346196bbd982cbca1807c5b773c4713dd51aa816))
- Website: IndexNow key and ping on every production deploy ([41864eb](https://github.com/ckryptickunal/OpenDesigner/commit/41864eb5c1aad58c7b9702e35e71970da40b0cd3))
- Website: opendesigner.vercel.app, built from the brand system, with SEO, AEO and GEO ([dc1987a](https://github.com/ckryptickunal/OpenDesigner/commit/dc1987af6376eb318c566617d300102ef6583f23))
- Overview page: the same answer count as DESIGN.md, and on-fill text measured on its fill ([3df6f0f](https://github.com/ckryptickunal/OpenDesigner/commit/3df6f0f272bcda61d0dcaaf5589b16b9fc6a6c59))
- Showcase gallery thumbnails in the repo, reviewed instead of blocked ([3785947](https://github.com/ckryptickunal/OpenDesigner/commit/37859476f44601779864178185fd00ea10ed645a))
- Reword an engine docstring the PR scanner read as an import ([a915c79](https://github.com/ckryptickunal/OpenDesigner/commit/a915c7946455e0239ced91607227dcc6e2f15403))
- Brand system and showcase stress test, made with OpenDesigner ([f34d87d](https://github.com/ckryptickunal/OpenDesigner/commit/f34d87d37926a702e33cf37e9e8e9e3baa139a9c))
- Every project gets its own design-system page, filled templates and an artifact export ([1a1d17e](https://github.com/ckryptickunal/OpenDesigner/commit/1a1d17e7bd37f68c3f661d52c52ea259f0b208da))
- Preview page keeps the accessibility floors it checks: 4.5:1 text, no sideways scroll at 320px ([16ca9e2](https://github.com/ckryptickunal/OpenDesigner/commit/16ca9e2939c83d4e526589e217a2836b06da1471))
- opendesigner-illustrate may use the network (owner decision) ([b965466](https://github.com/ckryptickunal/OpenDesigner/commit/b96546697cc29fb4df2e57e1c4cd83da91f83ac9))
- Add opendesigner-illustrate: open-licence illustrations recolored to the tokens ([b281023](https://github.com/ckryptickunal/OpenDesigner/commit/b281023ccb906f6e1b4588fe385f08b8c4a3e765))

### 13 October 2026

- PR review log: 53 merged after fixes, 52 held with ten findings, 54 (README and the main ruleset) merged (#55) ([34bda93](https://github.com/ckryptickunal/OpenDesigner/commit/34bda938ceace28411d070d65347e7bc6095f728))
- L22: making and reviewing pages (a guide for agents, a cohesion audit, nine cards from one site build) (#53) ([5e5429a](https://github.com/ckryptickunal/OpenDesigner/commit/5e5429ac779e12f9231a858148a9934e19d79766))
- README: shorter and plainer; record the main ruleset in GITHUB-SETTINGS (#54) ([30a3b05](https://github.com/ckryptickunal/OpenDesigner/commit/30a3b059376ead21dc910f47732d5ca6fd5c4242))

### 28 September 2026

- L19: heartbeat ([0568892](https://github.com/ckryptickunal/OpenDesigner/commit/0568892c40d353da24a87262066310bb6f11c986))
- L19: Mobbin's findings folded into the wiki: topic pages and Decision Cards updated in 7 areas (11 new cards: DC-L19-77..79, -139, -154..158, -178, -179), each verified; research/L19 now 175 cards, 288 proposed changes, 86 conflicts; 172 proposals pending for lane L20 ([d98adb0](https://github.com/ckryptickunal/OpenDesigner/commit/d98adb042a7dee0b333554bc6868597d555843e3))
- L19: Mobbin's 8 videos extracted with OpenWiki 0.3.1 (timed transcripts), analysed and verified (paywalls, onboarding, dashboards, streaks, A/B tests, AI with 600k screens); 59/59 rules confirmed by the Jev citation check; wiki pages and S-L19 ids ([b402ccf](https://github.com/ckryptickunal/OpenDesigner/commit/b402ccff35b62cde443bbddf3b681a2297aa2b6b))

### 27 September 2026

- L19: adopt OpenWiki 0.3.1 (f3c7242: keyless listing, timed transcripts, grounded quotes) behind both test suites; wiki.py reads [m:ss] cues; analyses cite cue timestamps ([b2613c0](https://github.com/ckryptickunal/OpenDesigner/commit/b2613c0be8226b96a4d6e06681eaeed7453c46ea))
- L19: heartbeat ([48df3ea](https://github.com/ckryptickunal/OpenDesigner/commit/48df3ea2c51da41510fac88793011760392169ea))
- L19: fixes from the persona tests: standards follow platform and stack, settle questions and refuse breaking options; constraints; per-path overrides and --beats; honest DESIGN.md and previews; sturdier wiki tooling; standards v2 ([e5fe115](https://github.com/ckryptickunal/OpenDesigner/commit/e5fe115e4842bc87187802778647c6100b3b1549))
- L19: standards create their new tokens (press scale, sheet springs, gesture and toast values) in every export; Q-motion-03 and Q-state-04 adopt DC-L19-85/-93/-102; engine exits decelerate and are ~20% shorter; Jev find always pools standards, BM25 ranking, judges each card's default, marks overridden cards; check covers standard ids ([a7cce09](https://github.com/ckryptickunal/OpenDesigner/commit/a7cce0920e6b35742e4dd8781c6c9a8b1571d49e))
- L19: topic pages for the last 4 topics (gradients, dark patterns, Swift, launch), map refreshed; persona tests copy the repo with git archive and check free disk first ([0f19fcf](https://github.com/ckryptickunal/OpenDesigner/commit/0f19fcf275048ebeebd2119d98544ba01a8ef82b))
- od-pr-review: also run every CI workflow step when testing the merged result (#46) ([90c8830](https://github.com/ckryptickunal/OpenDesigner/commit/90c8830ebc85ac9e30a9d4aabc241a3a0a1b8b84))
- L19: learning wiki, house standards and the pipeline that keeps them current ([acd7586](https://github.com/ckryptickunal/OpenDesigner/commit/acd7586e7fbc33b018d028803cceb923eff07c0c))
- Add PR review skill, living-docs checker, field plan and review log (#45) ([1c53734](https://github.com/ckryptickunal/OpenDesigner/commit/1c537342e26fd2d0cc07bfc542e0a2e261568260))
- Add public feedback corpus for AI-assisted design (#35) ([998a8f4](https://github.com/ckryptickunal/OpenDesigner/commit/998a8f49fd53321a36dc53797cd754814c0a7388))
- docs: benchmark Porsche Design System (#43) ([02cad05](https://github.com/ckryptickunal/OpenDesigner/commit/02cad05d0c4f1e983ddf58aa7772c388047acb83))
- docs: add Duet benchmark (#42) ([c849b63](https://github.com/ckryptickunal/OpenDesigner/commit/c849b63db6991d67eb3bc44a55f7fa5ff33fe9f9))
- docs: add GC Design System benchmark (#41) ([20600b1](https://github.com/ckryptickunal/OpenDesigner/commit/20600b1828b6c63ee0419db79651f3a17f49b04b))
- docs: benchmark AWS Cloudscape (#40) ([1e6ee5b](https://github.com/ckryptickunal/OpenDesigner/commit/1e6ee5b6a7469977b7916e2d56b59d65e1deb157))
- docs: benchmark NYPL Reservoir (#39) ([465eae9](https://github.com/ckryptickunal/OpenDesigner/commit/465eae9a30ceba15bff6ad7b94c29765242a3c1c))
- docs: add Elastic EUI Borealis benchmark (#38) ([991b844](https://github.com/ckryptickunal/OpenDesigner/commit/991b84450eddb7d66db6293ec7b0d33b06567f8d))
- docs: benchmark Workday Canvas (#37) ([14e8cf8](https://github.com/ckryptickunal/OpenDesigner/commit/14e8cf8dda8a0890eaab61834017234770ba6d5d))
- research: resolve Fluent web token conflicts from published packages (#36) ([27eeab1](https://github.com/ckryptickunal/OpenDesigner/commit/27eeab1cc98b0aacd39be2cac82c1801adaef414))
- Merge reviewed PRs 28-34: consent test, zip templates, product vision, preferences, flow suggestions, status board (#44) ([65f74b7](https://github.com/ckryptickunal/OpenDesigner/commit/65f74b774135688cab0a52631329d1a21eed01c0))
- Align illustration fallback order across hook references (#27) ([0df8a42](https://github.com/ckryptickunal/OpenDesigner/commit/0df8a428c60cda780f58681a923d9435671aa3f6))

### 24 September 2026

- U5 usability fixes: every answer reaches the system, exact brand color, personal DESIGN.md and preview, per-platform fonts, review for JSX/Tailwind, add-token, sketch --delegated, show command; extract measures by role with confidence; 2-line sharing ask and host-aware log wording; CI runs extract tests ([30f0429](https://github.com/ckryptickunal/OpenDesigner/commit/30f04295ea43b991d5d4209ab70f3feee72f5886))
- T1 phase B: journey tracker wired into engine and skills, both consent questions, consent-drift test, CI and dist bundle; 63 tests pass ([f2ac19c](https://github.com/ckryptickunal/OpenDesigner/commit/f2ac19c3795cc0d576728895b353195425a785f6))
- F1 consistency fixes: engine/skills/spec mismatches, kebab-case token paths, owner-input block class, surface-mode question, three-voice DESIGN.md; 58 tests pass ([b2004b1](https://github.com/ckryptickunal/OpenDesigner/commit/b2004b1bf2542f4d7f0ec8c21a262c0e5d771be4))
- U4 plain-language pass complete (README, docs, skills, questionnaire, engine messages); GitHub Sponsors enabled in FUNDING.yml ([8e9400d](https://github.com/ckryptickunal/OpenDesigner/commit/8e9400d2333b5b8fb2cbb6261043b818ddc8c843))
- Checkpoint: V1 verification (161 claims, 49 corrections), S2 ontology and graph follow-ups, T1 journey tracker phase A with opt-in anonymous sharing (journey.py, PRIVACY.md, reference receiver), partial U4 plain-language edits; all checks green (48 tests) ([2ca83ae](https://github.com/ckryptickunal/OpenDesigner/commit/2ca83ae14cd40610cb40e0fc23e064bbed8ec4f4))
- U1: three-voice glossary (393 terms) with engine-checked names; THREE-VOICES rule; readability tool; hooks.json parser and rules.md fixes ([6079ddf](https://github.com/ckryptickunal/OpenDesigner/commit/6079ddfc28cafc42de931aca6a278037dd347acd))

### 23 September 2026

- Board: funding packets, outreach drafts and handover done (private files, outside the repo) ([b1e7c3c](https://github.com/ckryptickunal/OpenDesigner/commit/b1e7c3c1efd33fb6d582b6ded492e3415564dfd1))
- Decision log: repo observed public; Actions disabled at account level ([6e29495](https://github.com/ckryptickunal/OpenDesigner/commit/6e29495ddfc6910b70512fa91e045c74a149d600))
- R2 engine (sketch, review, feedback, zoom levels, intake) with 25 tests; three validated examples; R3 zoom levels, three-voice rules, self-improvement loop ([a0e06a2](https://github.com/ckryptickunal/OpenDesigner/commit/a0e06a2fc470ba51f0836ce2f697bf2b33ca390c))
- R1 README, docs, community files, CI; GitHub settings and seed issues applied ([67701da](https://github.com/ckryptickunal/OpenDesigner/commit/67701da4047309759f8c369cee12da381bd0237a))
- Coordination: od.py sees every lane id, adds lanes under the lock, refuses duplicates ([f592b27](https://github.com/ckryptickunal/OpenDesigner/commit/f592b2794a3479af6c23e44ddc6ee429dc0426e3))
- R3 skills, knowledge build, templates and manifests; R2 engine (in progress); R1 community files; U lanes for ease of use (BRIEF 12-17) ([c7f3da6](https://github.com/ckryptickunal/OpenDesigner/commit/c7f3da6f0db555753395824e6d376d8d84c06305))
- S1d spec done (14 sections, 32 contradictions settled); R4 sponsorship plan; work in progress from R1-R3 and P1 ([893047d](https://github.com/ckryptickunal/OpenDesigner/commit/893047decb7e34c7a68a50f6f830dbb3cc334610))
- S1b questionnaire done; D1 tokens and atlas; repo plan (REPO-PLAN.md) and lanes R1-R4 ([1423417](https://github.com/ckryptickunal/OpenDesigner/commit/14234175de575f62724b9c895c18b6fdd39c390a))
- S1b questionnaire done: 27 screens, Quick/Standard/Expert, validator ([ee753f5](https://github.com/ckryptickunal/OpenDesigner/commit/ee753f574ea9e66c5be8f9debf4873066d90b5a6))
- L17 and L18 done; S1d spec started ([583ae03](https://github.com/ckryptickunal/OpenDesigner/commit/583ae0368767efe368ad20ef511b05932990d9bf))
- S1a ontology done (271 nodes, 325/325 cards mapped); work in progress from S1b, L17, L18 ([7ef38cb](https://github.com/ckryptickunal/OpenDesigner/commit/7ef38cbaa6ad48276fdb19f9a4dbf42a8b2f33df))
- Graph overrides from S1c; od.py sync writes heartbeat before commit ([1ab8f29](https://github.com/ckryptickunal/OpenDesigner/commit/1ab8f292f171d24406a18ab488c8fa815c4b148c))
- Coordination: cross-tool protocol, od.py, AGENTS.md, decision log; synthesis progress ([8e75274](https://github.com/ckryptickunal/OpenDesigner/commit/8e7527406ab6054ea62b2707a8bf20fb263d7c90))
- Stop tracking .env; add .gitignore ([58009fb](https://github.com/ckryptickunal/OpenDesigner/commit/58009fbd9a1736e3ef8b73eaed8183d249915c30))
- Initial commit ([bfc098c](https://github.com/ckryptickunal/OpenDesigner/commit/bfc098c2d951b5f93d2dc8363252e6a9306cb64a))

## Highlights, explained

The bigger changes in plain words: what each one does for you and why it was made.

### Unreleased: planned as 0.1.0

The first public version: the research base, the synthesis that turns it into an interview, and the first skills, engine and host packaging.

#### Added

- **The component library, reworked to a craft standard** (owner, 2026-10-23: "very congested", "the smiley icon ... is not properly done", "use sample images from Unsplash"). `assets/library/CRAFT.md` sets the rules: roomy token spacing, neutral colour with one accent, Lucide icons (ISC), real free Unsplash photos where a picture belongs (`photos.json`, 119 photos and 80 portraits, each verified), and phones that stack instead of squeezing. All 82 parts were rebuilt to it, reviewed by four fresh reviewers and fixed; every person has one portrait that fits their name (`people.json`). The shop opens in the calm Nordic look, credits each photographer on the part's page, loads card previews lazily as you scroll (layout on load from 830 ms to 70 ms), and leads with the parts most likely to draw people in. `library.py check` gains rules for photos, scripts that look elements up by id, rows sized to the target floor, hard bottom ledges and attributes the site's scripts read.
- **Product analytics, ready for a key** (owner, 2026-10-23). `site/static/ph.js` loads PostHog's EU cloud through `/ingest/` on the site, cookieless, with no session replay or autocapture, and the library sends named events for its funnels (part opened, kit added, prompt copied). Nothing loads until a public project key is set in `site/analytics.json`; `docs/PRIVACY.md` says what is counted.
- **Every push to main goes live by itself** (owner, 2026-10-23: "so that I do not have to keep doing this again and again"). `site/autodeploy.py` runs every 2 minutes on the maintainer's Mac. When `main` on GitHub moves and has been still for 5 minutes, it builds and checks the site in the clean deploy worktree and publishes it with `site/deploy.py`, which checks the key pages before the domain switches over. A failed deploy leaves the site as it was, and the Mac shows a notification. It runs on the Mac because GitHub Actions is disabled for the owner's account and Vercel can't build this site from a plain clone.
- **A Taste Index of a look you love** (owner, 2026-10-23: the reel's Taste Index "is the way taste indexes should be implemented"). `opendesigner-extract`'s new `taste_index.py` writes a full description of one look from a few pages of a site, or a screenshot: a one-line picture, 5 to 7 principles with their reasons, every colour with its job and share of the page, type roles with exact font names and free substitutes, component rules, motion, voice as counts, a Never list, a CSS variable for every value and a live specimen page. Every line says measured or inferred. By owner decision it keeps the site's exact colours and font names when first shown, with a notice that what you keep is your responsibility; logos, brand names, images and copy never go in, and font files are never shipped. A project can hold several; each nudges the taste dials as an inspiration, and the system follows one only when the person chooses it (`taste_index.py use`, which also asks exact fonts or free substitutes). When someone asks to copy a brand's look, the agent offers a Taste Index of it (owner, 2026-10-23); the logo, name, images and copy are still declined. SPEC 5.4, AGENTS.md, the extract skill, the guardrails, HOW-IT-WORKS, taste.md and both FAQs say so.
- **Six measurement fixes in reference intake**, found by reading typesafe.ai and davecto.com against the reel's own indexes. Borders drawn by `::before`/`::after`, windows, frames and hard shadows are seen (typesafe's depth 56 with soft shadows is now 8 with 1 px windows). Loops that always run are kept apart from UI transitions and easing is kept (its energy 100 is now 35). The browser's link blue, wrapper links and error-state focus rules no longer win the accent (davecto's accent is its teal, not its error red). Density reads the space between text and blank bands, not only body size (davecto 78 compact is now 29 spacious). Colourfulness reads how much of the page is coloured. Section colours and their share of the page are recorded. Several pages of one site merge, and cookie banners are left out.
- **Preview a value before recording it** (2026-10-23). `engine.py set <path> <value> --dry-run`, and `pick <Q-id> <value> --dry-run`, run the same checks a real set runs and print what it would report, plus each token's old and new value (named roles first, each mode that changes), any check the value would add or clear, and the command that records it. Nothing is written: state.json, decisions.md, DESIGN.md and the journey log stay byte for byte as they were. In the extend-rounder agent eval, an agent compared roundness 55, 60 and 65 with real sets, which added decisions the person never made to their append-only log. The extend skill now previews values and records only the one the person picks.
- **The changelog is its own page** (owner, 2026-10-22: "it looks a part of the documentation"). It moved from /docs/changelog/ to /changelog/, and the old address redirects. The docs menu, breadcrumb and previous/next links are gone. Each day shows its date on the left, its highlights in full and its commits folded underneath, so each change is listed once instead of three times and the page is half as long. Styles are in `site/static/changelog.css`.
- **Agent evals for the taste index** (owner, 2026-10-23). Two cases, `taste-leaves-out` and `taste-all-past`, sketch a project and import a taste poll, then ask which style directions to pick. One poll rules out two of the three directions; the other puts every direction past a line. Both gave an empty gallery before the fix. Run once each on 2026-10-23: the OpenDesigner skill did not start for this question in three tries, so the agent answered from the files and, in one run, recommended a direction the person's taste rules out. With the skill loaded by hand, it followed the new rule in both. The scores stay as they are until the skill starts on its own.
- **Forty consumer parts in the component library** (owner, 2026-10-22: "we have so many b2b components, add more consumer"). The library grows from 42 to 82 parts: social (stories, a feed post, a chat thread, comments, sharing), media (a video player, a track list, podcast episodes, a seat picker, live chat), shopping and food (a product gallery, a bag, reviews, delivery tracking, a menu item), travel and home (flight results, a boarding pass, a stay card, trip search, an itinerary, weather, smart-home controls), and health, money and learning (activity rings, a workout, habits, sleep, a card wallet, a savings goal, a lesson path, a quiz). Nine consumer industries join the filters, and the shop gains a For: Consumer / B2B filter. Every part is built only on design tokens and passes the same checks.
- **A changelog anyone can check** (owner, 2026-10-22). The website's changelog now opens with the current version, whether it is released, how to see which version made your design system (`engine.py version`) and which one you have installed (`claude plugin list`), and how to update. Below it, every change day by day comes from git when the site is built, so it is never behind; the explained highlights follow. `/version.json` and an Atom feed (`/changelog.xml`) give tools and agents the same facts, and the footer and home page show the version. A "What's new" list gives each highlight in one dated line, newest first, dated by when git says it was written.
- **Markdown for agents** (2026-10-22). A request that asks for `text/markdown` gets the page's Markdown copy instead of HTML; browsers and search engines still get HTML (`Vary: Accept`). Vercel serves files before rewrites, so this is a short Routing Middleware, `site/middleware.js`, tested on a preview first. The PR scanner treats it, and `site.js`, as code that runs for every visitor.
- **Agents can find and read the site** (2026-10-22, from Cloudflare's agent-readiness scan). robots.txt says yes to search, AI answers and training in every crawler's group (Content Signals). The home page sends a Link header to llms.txt, its Markdown copy, the docs and the skills index. /.well-known/agent-skills/index.json lists the eight skills (Agent Skills discovery v0.2.0), each a self-contained zip with its SHA-256.
- **The analogous product** (owner feedback 34). Before designing, OpenDesigner names the product that already solved the same interface problem in any market, as Notion did for a client's block-based tool. It confirms it with the person in one question, studies it, and reads it as an inspiration so it shapes the taste index. Competitors come after, as the baseline. In `practices.md` section 3, the `opendesigner` skill, `making.md` section 1, opendesigner-extract's tags and the Good practices page.
- **The README shows the before and after, and the component library** (owner, 2026-10-22). Two new image panels, each with a phone version: the invoices page today with its seven measured issues beside the same page fixed, linked to the live audit on the website, and six of the library's 42 parts. `brand/kit/readme/src/render.py` draws them: the first from the demo's capture, the second from the built site's /library/ page (`--library-from`).
- **A social preview for every page** (2026-10-22, the opendesigner.dev move). A shared docs link shows its own card: its section and title beside the home card's drawing. Every card shows opendesigner.dev and has alt text. Cards are JPEG, about 60 KB instead of 800 KB, and are drawn again only when their text changes.
- **The home page says what OpenDesigner is.** The headline carries the category, "Design systems for AI coding tools", set like the section kickers, and the opening line says "a design system", so search engines and AI answers can tell what the page is about.
- **The review skill catches labels that break across lines** (review case MS-15). `probe.js` counts the lines each text run inside a button, tab, chip, tag or badge spans, and `review.py check` reports any as an error, grouped by repeats. A wrapped label overflows nothing, so overflow checks missed it. In trial 1 a dashboard's "Reassign" buttons broke inside the word for two rounds while the agent reported no overflow. Run on that dashboard, the new check found them, plus a "Delete account" button breaking on phones. Tested with `fixtures/labels.html` (two planted breaks, four controls that must pass).
- **The audit, as it happens, on the home page** (owner, 2026-10-21). The before-and-after section now plays once when it comes into view.
  - A scan line moves down an invented invoicing page and stops at each issue in the order it meets them. Each issue gets a dashed box, its number and one measured line.
  - Then a green line sweeps down with Merriweft's tokens. A chip carries each token from a small Merriweft card to its place, and the box becomes a check.
  - Today, Audit and Fixed stop it and show that state; Replay plays it again. With reduced motion it never plays by itself, and without the script the page and the list of findings still show.
  - Both pages are live HTML drawn and animated in code, not screenshots or a video (owner, 2026-10-21). Each sits in its own shadow root, so its styles and the site's never mix, and every box is measured on the page as drawn. The fixed page builds itself as the line passes: bars grow, the sparkline draws, totals count up, and rows and labels arrive.
  - On a phone the page is no longer shrunk to a thumbnail. A camera shows part of it at the size it reads on a desktop and moves the view: to each issue as it is found, out for the fix, then onto the Collected chart (`making.md` section 6).
  - The findings sit in a short list beside the page, not in cards under it. The page sits on a credited photo.
- **The demo's fixed page is rebuilt as a bento** that the owner picked from three directions shown on a review copy. The October total no longer appears twice, and each tile holds one figure with a small true chart: weekly bars, an eight-week sparkline, a late-money meter and the week's due days. Red is kept for late money. The demo's system raises colorfulness to 85 for cleaner status colors, with the brand green unchanged. It is near-monochrome, after the owner's taste notes: charts in ink, the pine green only on the logo and the one filled button, red only for late money, and lighter totals with smaller cents.
- **Agent notes stay out of design decisions:** `engine.py set profile.seen.<name> ...` stores a note, such as "the recommend line was said", without writing a decision.
- **The trial ledger** (`_coordination/TRIAL-LEDGER.md`, `tools/trial_messages.py`). Every correction a person typed in a demo trial, each with its repo fix. Trial 1 gave 15. New rules in `making.md` section 12: one shell across pages, check after every round, the accent chosen by looking, type and icons from the category's best, theme from the users' context, dense dashboards that show problems and charts, and first-run help offered once. Also preflight 44 (M45), review case MS-13, and install notes for the desktop app.
- **The quality bar and good practices.**
  - `references/quality.md`: floors a tool checks, a nine-line scorecard judged blind against three shipped products, a fix prompt for every line below 4, and a scorecard in every report.
  - `references/practices.md`: what an agent looks for at the start (Mobbin, a browser, image and video tools such as Higgsfield, the project's keys by name) and how to use each.
  - A "Good practices" docs page for people setting up their agent.
- **An optional component library** (owner feedback row 24, 2026-10-21). 42 finished components across nine aisles (data, charts, forms, overlays, navigation, feedback, AI, commerce, content), most rebuilt from the B2B showcase pieces. Each is one HTML file built only on the engine's `--ds-*` tokens, so it takes the project's colors, type, spacing and corners.
  - `library.py` lists components, suggests one, adds one to a project (and names any token the project lacks), and checks the rules: tokens only, scoped selectors, only variables every system writes, focus styles, a reduced-motion block, and scripts that stay inside their own root.
  - The skills offer it only when it fits (`references/library.md`): never during the interview; at the first build, one pick for a novice; for a designer only when the library has that part in a matching style. The answer is kept in `profile.library`.
  - The website has it as a shop at `/library/` (a Library link with a four-squares icon in the top nav): a bento of aisles, every component live in a glass frame on one calm gradient, each card opening on the same view as its page, ten looks made by the engine to try them in, filters by type, style, industry and words, and stickers. Each component has its own page that shows it at phone, tablet and desktop width. People add components and one look to a kit, and the kit gives one prompt: just the parts, the parts plus the design system, or the Claude Code commands.

- **Correct is not finished** (from the first demo trial, 2026-10-21). A run that passed every code and width check was judged "an admin template" by the owner. Now:
  - The `opendesigner` skill's end-of-implementation step opens the result for the person, compares it blind with three shipped products, and reports the score.
  - A built product is audited before it is redesigned (a new row in the skill's routing table, and `making.md` section 1).
  - New preflight check 43 (mistake M44) and review case PR-10.
  - New agent eval `redesign-audits-first`. Its first run showed the skill didn't load for "make it look professional", and once it did load, the agent still rewrote every page. The skill's description now names redesigns of a built UI, and the built-product rule sits at the top of the skill. One run per arm afterwards: with OpenDesigner, 3 of 3 checks; without, 1 of 3.
- **Before and after, on the person's own page** (owner feedback row 24, 2026-10-21). `review.py compare` writes one self-contained `compare.html` with three views: the page today, the audit drawn on it (a dashed box and a number on each issue), and the fix. Each fix says what it gives the person ("Fixing this makes ..."), with the measured numbers before and after.
  - The boxes come from the page itself: `__od.marks()` in `probe.js` turns selectors into boxes on a full-page screenshot. A selector that matches a column gets one box around it.
  - The home page opens with a real run of it on an invented invoicing app (`site/demo/before-after/`): the review skill measured the page before and after its fix, and `/demo/before-after/` serves the full report.
- **A ready-made variant picker:** `skills/opendesigner/assets/picker.js` is the house picker, built to its spec (STD-process-review-taste-44 to -46): the floating bar, keys 1 to N and the arrows, `?v=` in the address, and a re-mount on every switch. Options go in `<template data-od-variant>` blocks on a review copy. `making.md` section 3 says how to use it, and `review.py compare` uses it.
- **The changelog and a contribute guide on the website:** `/docs/changelog/` is built from this file on every publish, and `/docs/contribute/` sums up how to help. The home page and the footer link both.
- **One line asking people to recommend OpenDesigner,** once per project and only after it has helped (`rules.md`). It never shares a message with another question, and a note (`profile.seen.recommend`, kept out of the design decisions) keeps it from coming back.
- **Each system knows which OpenDesigner made it, and says when it is out of date** (owner feedback row 24, 2026-10-21).
  - Every write of `opendesigner/state.json` records `opendesigner`: the release that last wrote it, the one that first made it, and the one whose `build` last wrote the files. Systems made before this keep working and count as made before version stamps.
  - When a system was built with an older release, or before stamps, each command says so once, names `engine.py build` and links CHANGELOG.md. `build` then says it brought the files up to date. A system saved with a newer release gets the opposite note: update OpenDesigner first. `--json` output, `resolve`, `init` and `feel` print no note.
  - `engine.py version` prints this copy's release and how the system compares with it. It never checks online, so it cannot see newer releases. The main and extend skills run it at the start of work on an existing system and say how to update the plugin in Claude Code.
  - Releases compare as numbers, so 0.10.0 is newer than 0.9.0. DESIGN.md's opening note, the overview page and feedback issue links name the release.
  - `tools/build_dist.py --check` (which CI is set to run) fails when the engine's release differs from `plugin.json` or `.claude-plugin/plugin.json`.
- **Taste: the poll, the taste index and the taste card** (`skills/opendesigner/references/taste.md`).
  - The taste poll: the person rates 20 to 30 real screens from shipped products, and the result recommends the eight dials. Images stay on the person's machine; the library holds links and dial values only.
  - The taste index (`taste.py index`) merges the poll, the person's own decisions, inspirations, the style pick and feel words into a value and a confidence per dial, with red lines. The option gallery is ordered by fit and leaves out directions past a red line, and `engine.py review` flags drift.
  - The taste card: five lines under the opening sentence of DESIGN.md's Overview, and on the overview page. It shows the person's own picture of the look (`sketch --brief`), color, shape, motion and a Never list, each with where it came from. The picture and the Never list are never invented. Color, shape and motion repeat the sentences that open those sections, and the color line uses the sourced 15% accent guide (DC-L15-03), not 60-30-10. The Never list is repeated in Do's and Don'ts as taste: it warns, never fails. DESIGN.md keeps its 17 headings.
- **Making and reviewing pages** (lane L22, `research/L22-making-and-review.md`): what to do after the system exists.
  - A guide for agents, `skills/opendesigner/references/making.md`: the first draft built on the tokens, one round of feedback at a time, options on a review copy of the page with the current version kept, what stays the same between sections, checking the rendered page in the person's own window, finished interface shown inside a page, sections that hold the page, and figures drawn as graphics. It ends with the mistakes an AI builder made in that project, and what to do when the person has to repeat a note.
  - A cohesion audit template, `assets/output/COHESION-AUDIT.md`, for a page that stopped looking like one page.
  - Nine Decision Cards (DC-L22-01 to -09) from the decision trail of one marketing-site build, with 22 rows of evidence on existing cards, standards and rules, and six items for the maintainer to decide. No standard, question, default or engine code changed.
  - The main and extend skills point to the guide, and `docs/HOW-IT-WORKS.md` section 9 describes it.
- **Defaults for dense B2B work tools** (lane L23, `research/L23-b2b-work-tool.md`, from a Mobbin study of premium B2B screens and three showcase builds).
  - When Q-aud-01 is `dense`, the engine fills only what the person has not answered, set or locked. Corners are 6 / 8 / 12 px, weights are 400 / 500 / 600, and with no brand color, one blue marks selection, links and focus while the primary button can stay ink. Static cards get a 1px ring and no shadow, and floating layers keep theirs. The profile lives in `synthesis/levers.json` (`profiles`). The engine records it as `auto_default` in `decisions.md` and in `opendesigner.meta.json`, with the reason for each value and why any was skipped.
  - New for every system: row heights `size.row.sm/md/lg/two-line` in each density mode (36 / 40 / 48 / 64 at compact), `color.border.separator` for row hairlines, and tabular digits (`text.numeric.*`) on by default, as house standard STD-visual-details-02 requires.
  - Fixed: Q-aud-01 `regular` now gives the 16px body it promises (14px once Q-aud-02 or Q-layout-03 says it is a work tool). Q-dir-02's recommended default now follows Q-aud-01 (`default_follows` in `questions.json`), so accepting it no longer undoes a dense answer. Stage 14 no longer recommends sharp corners for data and developer tools. A near-black `raw.primaryActionColor` (for example `#17181c`) now stays near-black, where it used to turn periwinkle, and inverts to near-white in dark mode. Any typed action color is kept exactly when its text reads, and DESIGN.md says the buttons use it.
  - Web text floor (owner decision, 2026-10-14): when the platforms include the web, the type scale has no size under 12px. The default web system used to get an 11px small body style. iOS and Android keep 11 pt/sp.
- **Your own design-system page** (`opendesigner/overview.html`, `engine.py overview`): every `build` rebuilds it, so it grows with the system.
  - It shows the cover, brand book, colors per theme with contrast, headings h1 to h6, every text style, spacing, corners, depth, motion, core components, the 14 brand assets and a timeline of decisions.
  - Each area says **Chosen**, **Picked for you** or **Default**. Anything only a person can give (a logo, a voice guide, what the product is for) shows as **Not enough information**, with the question that fills it.
  - `build` also fills every visual template with the person's system in `opendesigner/preview/`, so nobody sees sample data.
- **The system as a Claude Design System artifact** (`engine.py export --format artifact`, also part of `build`): `opendesigner/build/artifact/project/` holds tokens in the artifact's list format, the brand book from DESIGN.md, a cover and a button preview. It is ready to publish with the Artifact tool, and the files stay in the repository.

- **Painting skill** (`skills/opendesigner-paint/`): original art and films painted in code in the brand's palette (watercolour, pointillism, charcoal, sketch, woodcut, 2D cel).
  - **The engine** is vendored from [generative-painting-skills](https://github.com/ckryptickunal/generative-painting-skills) (MIT, by Divyanshu Kumar, commit 1ff8212), by owner decision. `THIRD-PARTY.md` keeps the licence and every change:
    - three paintings ported from unattributed sketches are left out;
    - Playwright and Vite are pinned;
    - the manifest now records the real style;
    - film ids are checked;
    - the images are smaller.
  - **`paint.py brief`** turns the design system into a painting brief:
    - a style recommended from the dials, or from `Q-img-04`;
    - 8-10 palette families built only from the token ramps, each marked for which text polarity stays at 4.5:1;
    - the font licence status, the slot's size and length, and the motion, sound and identity rules.
  - **`scaffold`** creates a film project with `src/brand.js` and `BRIEF.md`. It installs nothing: npm and Chromium wait for the person's yes.
  - **`lint`** checks scenes for brand colours, seeded randomness, text painted into plates, unadapted library scenes and length.
  - **`ingest`** refuses failed exports and brings a film into the app muted, with a reduced-motion still and a pause control over 5 s (WCAG 2.2.2). It keeps a ledger and `CREDITS.md`.
  - **The standards record the exception:** this is the one skill allowed Node code, a pinned npm manifest and lockfile (installed with `npm ci`), numpy and scipy tools, and images. SPEC principle 9, REPO-PLAN, SECURITY.md and the PR-review threat table say so, and the scanner reports these files for review instead of blocking them.
  - It is offered for the H-motion, H-illus and H-motif hooks, and from opendesigner-illustrate when found art would read generic.
- **Review skill** (`skills/opendesigner-review/`): checks a built UI, yours or anyone's, the way a careful user would, and reports with evidence. It exists because a single screenshot hides what is below the fold, at other sizes, in dark mode, on hover, on Tab, in motion, and any error in spacing smaller than a few pixels.
  - `scripts/probe.js` is a read-only measurement of a running page: overflow, computed type, spacing, radius and color use, contrast (with the real backdrop), fonts and whether they loaded, targets, names, images, placeholder text, animations and what the stylesheets declare. It leaves helpers on `window.__od`: a Tab-walk recorder (ring visible, focus covered by a sticky bar), style snapshots for hover, `measure(a, b)`, `at(x, y)`, reversible stress toggles (text spacing, 200% text, long words, +40% pseudo-localized text, right-to-left), a theme/density/motion switch for OpenDesigner CSS, and pause-and-seek for animations, SVG, video, GSAP and Lottie.
  - `scripts/review.py` plans the coverage matrix and a ledger of what was and was not checked, checks probe output against the accessibility floors and, when the project has a system, its tokens (each drift names the value, how often, and the nearest token), keeps findings with how each is known (measured, operated, seen, inferred), and writes `REPORT.md`. The verdict is FAIL, INCOMPLETE or NO ERRORS FOUND in the cells checked, never "looks good". Run again on the same files, it prints what was resolved and what is new.
  - `references/cases.md` (generated from `synthesis/review-cases.json`) lists 65 ways a review goes wrong in 7 groups, each with why it is missed and how to catch it, citing 100 sources opened for the research lane (R5), re-checked by three independent fact-checking passes.
  - Two optional helpers: `scripts/capture.py` (Playwright for Python, which the skill never installs; loopback addresses only; never clicks, types or submits) runs the whole plan; `review.py serve` (127.0.0.1 only, random path) lets a browser tool load the probe in one short call and saves the result to disk. Neither is needed: pasting `probe.js` does the same job. **The standards record the exception** (2026-10-14): SPEC principle 9, REPO-PLAN, SECURITY.md and the PR-review threat table say so, and the scanner reports their Playwright imports for review instead of blocking them.
  - Tested: 58 offline tests, and 22 that drive Chrome: through the probe and `capture.py` against a page with one of every planted defect, and against each browser behaviour the references call tested (full-page capture, lazy images, finished transitions, seeking, font checks, mobile profile, focus-visible, media emulation). Run on the documentation site and a showcase app on 2026-10-14, it found a real 11 px sideways scroll at 320 px and dark-mode text at 1.14:1; four false findings seen there were fixed (an off-screen skip link, links inside a closed `<details>`, `srcset` images, a sticky sidebar).
- **Preflight skill** (`skills/opendesigner-preflight/`): the last look at anything visual (a page, video, deck or card) before it is exported or shared. It starts by asking which design system the piece was built on.
  - `references/checklist.md` has 34 yes-or-no checks in seven groups: system, type, layout, motion, truth, sound and words, and process. `references/mistakes.md` explains 35 mistakes that really happened, in the explainer videos and the showcase builds.
  - `scripts/preflight.py` (standard library, no network) reads a page's CSS, including linked token files and Google Fonts links: font sizes, sizes off the token scale, the smallest text for the medium (`web`, `app`, `watch` or `video`), tracking, fonts that never load, `<br>` in headings and layout tweens. With ffmpeg it also measures frozen time and black frames in a video, writes full-size and phone-size frames, and finds clicks and noise at the edges of voice clips.
- **Illustration skill** (`skills/opendesigner-illustrate/`): finds open-licence illustrations for a product's empty states, onboarding, error pages, sign-in, hero and feature tiles, ranks them, recolors them to the design tokens and applies them.
  - `scripts/illustrate.py` searches Openverse, Wikimedia Commons, Open Doodles, Lukasz Adam and CocoMaterial (and Iconify's multicolor sets for small spot art). It is the one skill allowed to use the network (owner decision, 2026-09-28): `search` and `fetch` call the agent-fetch sources over HTTPS, 3 MB per file at most, and `--offline` prints the requests for sandboxes without internet. It ranks by relevance, licence, format and style fit, and draws contact sheets so the model and the person judge by eye.
  - Recoloring keeps each shape's lightness and moves it to a token ramp: grays to neutral, the main hues to accent, accent2 and accent3, and skin tones are kept. It writes six variants (`themed`, `light`, `dark`, `tint`, `mono`, `swap`). The themed one follows light and dark mode through CSS variables.
  - Every SVG passes an allow-list sanitizer first: no scripts, animation, foreign content or remote loads, in markup or CSS. An independent review found four bypasses in the first deny-list version; all are now regression tests.
  - `apply` writes an SVG, HTML or React component, scopes ids, class names and CSS to the drawing, sets `aria-hidden` or a label, and keeps a licence ledger with `ATTRIBUTION.md`. The first piece applied locks the project to one illustration style.
  - **Illustration directory:** `synthesis/illustration-sources.json` (copied into the skill as `references/sources.json` by `build_data.py`) covers 44 sources (flat scenes, people, doodles, spot art and emoji, 3D, animation, pattern generators and open museum collections), each with its licence, credit rule, formats, search link, filters, tips and step-by-step navigation, and lists 12 more that were checked and left out, with the reason. Every source was checked live on 2026-09-28. `build_data.py` also renders `references/directory.md` from it. `illustrate.py directory --open` opens one page with filters and a single search box for every site, and `illustrate.py sources --q "<words>"` prints each site's search link. `references/searching.md` says where to look first, how to word a search, what each file format allows, and how an agent moves through each kind of source.
  - Sources have three access levels: agent fetches (the script searches and downloads over HTTPS: Openverse, Wikimedia Commons, Open Doodles, Lukasz Adam, CocoMaterial, Iconify), agent may browse (bots allowed, no connector), and you download (the site forbids bots).
  - `references/sources.json` records each source's licence as read on 2026-09-28. unDraw, Storyset, ManyPixels, Blush, DrawKit and SVG Repo forbid automated search or download, so the person downloads from them and `illustrate.py add` brings the file in.
  - It adapts ideas from existing tools, without copying code: from Icons8's agent skills, one style per project and a list of what each screen needs before any search; from CaesiumY's unDraw skill, a warning when a recolor changes nothing and never keeping a catalogue.
- **Learning wiki** (`learn/`, lane L19): the knowledge OpenDesigner draws from sources its owner trusts, kept as an independent, self-updating knowledge base.
  - It covers 99 sources, each with a verified analysis, and an OpenWiki Markdown wiki with 53 cross-source topic pages.
  - `learn/MAP.md` indexes it by area, standard, card and question. `learn/IMPROVING.md` explains how to change the app from it.
  - The pipeline runs through `tools/wiki.py` (`add`, `fetch`, `check`, `ingest`, `trace`, `cite-check` with TypeSafe's Jev, `standards`, `map`, `proposals`, `next`, `upstream`) and five saved workflows in `.claude/workflows/`.
  - OpenWiki is pinned in `learn/openwiki.lock.json` and checked weekly in CI.
  - The rules are in `docs/KNOWLEDGE.md`.
- **House standards** (`synthesis/standards.json`, v3): 455 rules from the owner's non-negotiable sources (Emil Kowalski's writing and skills, Sonner, animations.dev, Vaul).
  - Each rule is citation-checked and reviewed.
  - The engine applies and locks them for each project's platforms and stack, including new tokens such as the 0.97 press scale.
  - Commands: `engine.py standards [--update]`, and `standard override|restore|add|remove`, which covers project standards, per-path overrides and `--beats`.
  - Constraints stop values that break a rule (no ease-in curves on UI; UI motion stays under 300 ms unless a standard names the exception).
  - The interview skips questions a standard settles and refuses options that break one.
  - `review` flags code that breaks a standard. DESIGN.md carries a short summary, with the full list in `opendesigner/standards.md`.
- **Decision Cards from the wiki:** 164 in `research/L19-learning-wiki.md`, with 253 proposed changes and 75 conflicts with older research.
  - Three cards are adopted so far; the rest are listed as pending in `synthesis/QUESTIONNAIRE.md` for lane L20.
  - "Now / As it grows" notes for 30 high-impact questions appear under each option.
- **Research search:** `tools/jev_nav.py find` also searches the house standards and ranks with BM25. It judges each card by its recommended default and marks older cards the house supersedes.

- **Research base:** 18 finished research lanes (L00 to L18, with L12 still open) written as 352 Decision Cards, with 2,740 sources logged in `traces/`, including rejected ones.
- **Benchmark:** 25 public design systems compared with real values in `benchmarks/`.
- **Synthesis:** the building-block ontology (271 nodes in 10 layers), the guided interview (193 questions on 27 screens, 6 of them planned and skipped until built, with Quick, Standard and Expert modes), the eight dials with generation formulas and 13 famous systems as dial recipes, and the decision graph (352 decisions, 465 dependencies, 12 cycles).
- **Starter design artifacts** in `design/`: a DTCG 2025.10 token set with 126 contrast-checked pairs, and four HTML artboards.
- **Coordination system** for parallel human and AI sessions: `tools/od.py`, `_coordination/PROTOCOL.md`, the board, heartbeats, inbox and decision log.
- **Research tools:** `tools/jev_nav.py` (status, search, citation check, card export, decision graph) and `tools/check_links.py` (offline Markdown link check).
- **Product specification:** `docs/SPEC.md` (copied from `synthesis/OPENDESIGNER-SPEC.md`).
- **Skills:** `opendesigner` (the interview), `opendesigner-extract`, `opendesigner-extend` and `opendesigner-export`, in the Agent Skills format, with generated copies in `.agents/skills/` and `.claude/skills/`, knowledge files built from the synthesis, and 8 JSON-fed visual templates.
- **Host packaging:** a Claude plugin and marketplace (`.claude-plugin/`), an Agent Plugins manifest (`plugin.json`), claude.ai skill zips built by `tools/build_dist.py`, and a ChatGPT Project bundle (`chatgpt-project/`).
- **Engine** (being finished): `skills/opendesigner/scripts/engine.py` for state, generation, validation and exports.
- **Community and repository health:** README, CONTRIBUTING, Code of Conduct (Contributor Covenant 2.1), security policy, support, governance, citation file, issue forms, pull request template, labels, CI, `llms.txt`, `funding.json`, a social preview image, a sponsorship plan, and docs (`docs/HOW-IT-WORKS.md`, `docs/RESEARCH.md`, `docs/FAQ.md`, `docs/GITHUB-SETTINGS.md`, `docs/SEED-ISSUES.md`).
- **Licenses:** MIT for code, skills and data; CC BY 4.0 for research and documentation.

- **Lessons from the owner's website review** (2026-10-15): preflight checks 35 to 42 (alignment at every width, one primary action, real names and marks, controls on the content's first line, no widows, whole labels on phones, opposite actions apart, one mark per company) and mistakes M36 to M43; five rows in `making.md` section 10; review cases MS-05 and CV-04 measure stacked rows and scroll inside cards. The log is `_coordination/OWNER-FEEDBACK.md`.

#### Fixed

- **A corner radius between the steps builds** (2026-10-23). `engine.py set radius.control 10` was recorded, but the tokens pointed at a 10 px step the scale did not have, so the next build stopped in all 12 mode combinations and nothing exported. The same happened for `radius.container`, `radius.overlay` and `radius.detail`. A radius between the steps now gets its own step on the scale (as `raw.borderWidths` does for border widths), and the small-control radius drops to the step below it (8 for 10). `set` and `standard add` refuse a value that cannot be a radius before anything is written, and name the steps: a negative or fractional number, another unit, or "full" for cards and dialogs ("full" stays for controls and tags; "10px" is stored as 10). `icon.defaultSize` takes only 16, 20 or 24; before, 19 was recorded and the tokens silently used 20. A bad radius recorded by an older version builds with the Roundness dial's value, and validate says so.
- **Two agent eval graders** (2026-10-23). `no-identity-copy` now checks that the OpenDesigner skill ran, so a run where it never starts shows as that, not only as a copied brand. `extend-rounder`'s "says what changed" no longer fails a reply for listing the files the rebuild wrote again, corner sizes that follow from the same setting, the engine's log entry for that setting or a version stamp; it still fails a reply that says another design choice changed. Run once each after the change: both scored 1, with the skill used.
- **Agent evals run the cases you ask for** (2026-10-22). `tools/agent_evals.py` takes several cases or tags at once (`--case 'export*,extend*'`, `--tag smoke,guardrail`, or the flag repeated) and stages only those, so `claude plugin eval` runs exactly them. `--list` shows which cases match and their tags, at no cost. A filter that matches nothing now stops with that list and exit 2. Before, it reported "overall 0" and exited 0: on 2026-10-22 two runs silently ran nothing, one with a brace list inside quotes and one with `[ceons]*`, a pattern `claude plugin eval` does not match but Python's `fnmatch` now does.

- **The option gallery is never empty** (2026-10-23). Hating native-looking screens in the taste poll drew a red line on brand presence, a dial none of the three directions sets, so all three were hidden while one was still recommended. A red line now only judges the dials the directions differ on; a dial they all share is flagged by `engine.py review` as drift instead. If every direction is still past a line, all are shown with a warning that names each line. The recommendation is always a direction that is shown, and `taste.py fit` follows the same rule.
- **The home audit counts up as it scans** (owner, 2026-10-22). The scan found issues 1, then 6 and 7, then 2 to 5; they are now numbered in reading order, and the site build stops if they would not count up. On phones the view now goes to each issue as it is named, zooming out for a wide one, so none is off screen, and Replay sits on the tabs' row as an icon.
- **The home page paints faster on phones** (2026-10-22). Lighthouse found the phone's largest element was the hero figure's photo, a CSS background the browser found only after the 37 KB stylesheet. It is now preloaded at high priority (one URL for both, so it is fetched once), and site.css is minified: 37 KB to 26 KB transferred. Layout is unchanged (check_layout.py 0 errors at 13 widths on five pages).
- **Fixes from the fresh verifier's re-check (2026-10-21).**
  - `review.py compare`'s badges and help text now meet 4.5:1, a box at the edge keeps its number in view, and a mark with no number, a blank "gives" or numbers in place of text is refused or mended instead of crashing. An acronym keeps its capitals ("WCAG").
  - The variant picker can no longer show two options when two switches land in one frame.
  - A system made with a newer OpenDesigner keeps saying so after an older copy writes it, and pre-releases compare by number (beta.10 after beta.2).
  - The Markdown copies of the changelog and evals pages, and llms-full.txt, no longer show raw `{{...}}` placeholders. Lists nest at any depth.
- **The review probe no longer reports screen-reader-only text as clipped.** A 1 x 1 px, absolutely positioned label is visually hidden on purpose. The checker evals' clean page now holds one, so the false alarm can't come back.
- **The glossary has one source again, and CI checks it.** Terms were being added straight to `synthesis/glossary.json`, while `tools/check_glossary.py --build` still rebuilt it from the old writing shards. A rebuild would have deleted 13 terms (twelve visual styles such as glassmorphism and bento, and "Taste card"), and `docs/GLOSSARY.md` lacked all 13.
  - `synthesis/glossary.json` is now the file to edit. `--build` checks it, sorts it and writes `docs/GLOSSARY.md`; the shards and `terms-input.json` are retired (git history has them).
  - The new `--check` runs in CI. It fails when a term breaks the three-voice rules, names something today's engine doesn't have, or `docs/GLOSSARY.md` is out of date. It reads the engine afresh each time, so its list of real token names, settings and commands can't go stale. That list had not been refreshed since 24 September.
  - The checker no longer lists record data (house standards, overrides) as settings. "Taste card" was rewritten to fit the word limits and reading level.
- **Apple's letter spacing and corners now change the files they promise to** (Q-type-13 `size-table`, Q-shape-04).
  - Letter spacing: `size-table` used to give the same coarse bands as the default. It now gives Apple's SF Pro tracking table from the HIG (64 sizes from 6 to 96 pt, `levers.json` `formulas.type.tracking.sfPro`), interpolated between sizes. A face other than the system font takes the table only up to 19px, because from 20 pt Apple loosens SF Pro Display and other faces would look loose. Uppercase labels stay at least +0.05em. Systems built before this keep their spacing unless the person chose the table.
  - Corners: Q-shape-04 used to be recorded only. `squircle-enhance` now adds Apple's continuous corner to the CSS and Tailwind exports where the browser draws `corner-shape`. `continuous` and `squircle-enhance` give Figma corner smoothing 0.6, and the Swift export uses `.continuous` (`Radius.shape(...)`). DESIGN.md says which platform draws which.
  - The web corner is `superellipse(1.35)` at 1.22 times the radius. It follows SwiftUI's own curve within 0.4% of the radius (`tools/fit_corner.py`, `formulas.radius.continuous`). The `squircle` keyword the docs recommended is 18.7% of the radius off, squarer than iOS. A plain circular arc of the same radius is within 1.4%, so browsers without `corner-shape` lose little.
  - The website follows the same rules: a build step gives each text size up to 19px its tracking value. Before, 37 of 108 text styles had the wrong spacing, because inherited letter spacing goes wrong when a child changes size. Its corners use the fitted shape, and only the boxes that get the shape are enlarged.
  - The Q-shape-04 options no longer break at the colon in `corner-shape: squircle`, which had split one option's label in two.
- **Renaming a system no longer leaves an old export behind.** `export --format dtcg` removed nothing, so after `set name` the folder held both `<old>.resolver.json` and `<new>.resolver.json`. It now keeps only the current one (found while rebuilding showcase hero 02).
- **Accessibility claims match the engine.** The docs, the spec, the GTM facts and the interview no longer say every system gets reduced-transparency or high-contrast modes. The engine's modes are theme, density and motion. A system with glass gets a solid fallback for each glass surface, which the CSS export swaps in under `prefers-reduced-transparency` or `prefers-contrast: more`, now also when the device is in dark mode. House standards are v3: only the conflict note of `STD-accessibility-motion-12` changed.
- **A brand color the person typed is never replaced** (`brand/showcase/STRESS-TEST.md` findings 1, 6 and 19). The sketch used to swap light brands for a dark shade so white text would pass: yellow #FFE500 became olive #847600, lemon #FFE45C became #877400 and lantern gold #FFC24B became #996d00, and the message said "I picked an olive".
  - A hex given with `--brand` stays the person's, even under `--delegated all`. It counts as the model's pick only when `brand` is named.
  - The brand and secondary colors (`raw.secondaryColors`) stay exact on their fills, with white or dark text, whichever reads. In dark mode, each stays exact when the dark text of dark-mode buttons reads on it. Otherwise dark mode uses a lighter shade that keeps the color's own chroma, for the brand and the secondaries alike.
  - When neither white nor dark text reads on a color, fills that carry text use a readable shade, and the exact color stays in its seed token (`color.brand.seed`, and the new `color.accent2.seed` and `color.accent3.seed`) for logos, large areas and anything without text. The message says so in plain words, including the dark-mode shade.
  - `pick Q-color-01 keep-hex` now puts back a hex that an older sketch replaced. It never undoes a color set since then.
