Reference08/09
Changelog: what's new in OpenDesigner
What we added, changed and fixed, newest first. This page is built from CHANGELOG.md each time the site is published, so it shows the repository as it is. The reasons behind each product decision are in _coordination/.
To see whether a design system you made is up to date, run python3 skills/ in your project. It compares your system with the copy of OpenDesigner you have installed. It never checks online.
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
- 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.jscounts the lines each text run inside a button, tab, chip, tag or badge spans, andreview.py checkreports 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 withfixtures/(two planted breaks, four controls that must pass).labels.html - 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.mdsection 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/). Every correction a person typed in a demo trial, each with its repo fix. Trial 1 gave 15. New rules intrial_messages.py making.mdsection 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/: 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.quality.md references/: 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.practices.md - 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.pylists 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/): 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 inlibrary.md 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
opendesignerskill'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.mdsection 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.
- The
- Before and after, on the person's own page (owner feedback row 24, 2026-10-21).
review.py comparewrites one self-containedcompare.htmlwith 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()inprobe.jsturns 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/): the review skill measured the page before and after its fix, anddemo/ before-after/ /demo/serves the full report.before-after/
- The boxes come from the page itself:
- A ready-made variant picker:
skills/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,opendesigner/ assets/ picker.js ?v=in the address, and a re-mount on every switch. Options go in<template data-od-variant>blocks on a review copy.making.mdsection 3 says how to use it, andreview.py compareuses it. - The changelog and a contribute guide on the website:
/docs/is built from this file on every publish, andchangelog/ /docs/sums up how to help. The home page and the footer link both.contribute/ - 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/recordsstate.json opendesigner: the release that last wrote it, the one that first made it, and the one whosebuildlast 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 buildand links CHANGELOG.md.buildthen says it brought the files up to date. A system saved with a newer release gets the opposite note: update OpenDesigner first.--jsonoutput,resolve,initandfeelprint no note. engine.py versionprints 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/(which CI is set to run) fails when the engine's release differs frombuild_dist.py --checkplugin.jsonor.claude-.plugin/ plugin.json
- Every write of
- 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, andengine.py reviewflags 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/): what to do after the system exists.L22- making- and- review.md - A guide for agents,
skills/: 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.opendesigner/ references/ making.md - A cohesion audit template,
assets/, for a page that stopped looking like one page.output/ COHESION- AUDIT.md - 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/section 9 describes it.HOW-IT-WORKS.md
- A guide for agents,
- Defaults for dense B2B work tools (lane L23,
research/, from a Mobbin study of premium B2B screens and three showcase builds).L23- b2b- work- tool.md - 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 insynthesis/(levers.json profiles). The engine records it asauto_defaultindecisions.mdand inopendesigner.meta.json, with the reason for each value and why any was skipped. - New for every system: row heights
size.row.sm/in each density mode (36 / 40 / 48 / 64 at compact),md/ lg/ two- line color.border.separatorfor row hairlines, and tabular digits (text.numeric.*) on by default, as house standard STD-visual-details-02 requires. - Fixed: Q-aud-01
regularnow 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_followsinquestions.json), so accepting it no longer undoes a dense answer. Stage 14 no longer recommends sharp corners for data and developer tools. A near-blackraw.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.
- When Q-aud-01 is
- Your own design-system page (
opendesigner/,overview.html engine.py overview): everybuildrebuilds 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.
buildalso fills every visual template with the person's system inopendesigner/, so nobody sees sample data.preview/
- The system as a Claude Design System artifact (
engine.py export --format artifact, also part ofbuild):opendesigner/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.build/ artifact/ project/
- Painting skill (
skills/): original art and films painted in code in the brand's palette (watercolour, pointillism, charcoal, sketch, woodcut, 2D cel).opendesigner- paint/ - The engine is vendored from generative-painting-skills (MIT, by Divyanshu Kumar, commit 1ff8212), by owner decision.
THIRD-PARTY.mdkeeps 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 briefturns 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.
- a style recommended from the dials, or from
scaffoldcreates a film project withsrc/andbrand.js BRIEF.md. It installs nothing: npm and Chromium wait for the person's yes.lintchecks scenes for brand colours, seeded randomness, text painted into plates, unadapted library scenes and length.ingestrefuses 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 andCREDITS.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.
- The engine is vendored from generative-painting-skills (MIT, by Divyanshu Kumar, commit 1ff8212), by owner decision.
- Review skill (
skills/): 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.opendesigner- review/ scripts/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 onprobe.js 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/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 writesreview.py 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/(generated fromcases.md synthesis/) 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.review- cases.json - Two optional helpers:
scripts/(Playwright for Python, which the skill never installs; loopback addresses only; never clicks, types or submits) runs the whole plan;capture.py 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: pastingprobe.jsdoes 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.pyagainst 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>,srcsetimages, a sticky sidebar).
- Preflight skill (
skills/): 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.opendesigner- preflight/ references/has 34 yes-or-no checks in seven groups: system, type, layout, motion, truth, sound and words, and process.checklist.md references/explains 35 mistakes that really happened, in the explainer videos and the showcase builds.mistakes.md scripts/(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 (preflight.py web,app,watchorvideo), 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/): 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.opendesigner- illustrate/ scripts/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):illustrate.py searchandfetchcall the agent-fetch sources over HTTPS, 3 MB per file at most, and--offlineprints 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.
applywrites an SVG, HTML or React component, scopes ids, class names and CSS to the drawing, setsaria-hiddenor a label, and keeps a licence ledger withATTRIBUTION.md. The first piece applied locks the project to one illustration style.- Illustration directory:
synthesis/(copied into the skill asillustration- sources.json references/bysources.json 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.pyalso rendersreferences/from it.directory.md illustrate.py directory --openopens one page with filters and a single search box for every site, andillustrate.py sources --q "<words>"prints each site's search link.references/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.searching.md - 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/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 andsources.json illustrate.py addbrings 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/indexes it by area, standard, card and question.MAP.md learn/explains how to change the app from it.IMPROVING.md - The pipeline runs through
tools/(wiki.py add,fetch,check,ingest,trace,cite-checkwith TypeSafe's Jev,standards,map,proposals,next,upstream) and five saved workflows in.claude/.workflows/ - OpenWiki is pinned in
learn/and checked weekly in CI.openwiki.lock.json - The rules are in
docs/.KNOWLEDGE.md
- House standards (
synthesis/, v3): 455 rules from the owner's non-negotiable sources (Emil Kowalski's writing and skills, Sonner, animations.dev, Vaul).standards.json - 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], andstandard 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.
reviewflags code that breaks a standard. DESIGN.md carries a short summary, with the full list inopendesigner/.standards.md
- Decision Cards from the wiki: 164 in
research/, with 253 proposed changes and 75 conflicts with older research.L19- learning- wiki.md - Three cards are adopted so far; the rest are listed as pending in
synthesis/for lane L20.QUESTIONNAIRE.md - "Now / As it grows" notes for 30 high-impact questions appear under each option.
- Three cards are adopted so far; the rest are listed as pending in
- Research search:
tools/also searches the house standards and ranks with BM25. It judges each card by its recommended default and marks older cards the house supersedes.jev_nav.py find
- 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/, the board, heartbeats, inbox and decision log.PROTOCOL.md - Research tools:
tools/(status, search, citation check, card export, decision graph) andjev_nav.py tools/(offline Markdown link check).check_links.py - Product specification:
docs/(copied fromSPEC.md synthesis/).OPENDESIGNER- SPEC.md - Skills:
opendesigner(the interview),opendesigner-extract,opendesigner-extendandopendesigner-export, in the Agent Skills format, with generated copies in.agents/andskills/ .claude/, knowledge files built from the synthesis, and 8 JSON-fed visual templates.skills/ - Host packaging: a Claude plugin and marketplace (
.claude-plugin/), an Agent Plugins manifest (plugin.json), claude.ai skill zips built bytools/, and a ChatGPT Project bundle (build_dist.py chatgpt-project/). - Engine (being finished):
skills/for state, generation, validation and exports.opendesigner/ scripts/ engine.py - 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.mdsection 10; review cases MS-05 and CV-04 measure stacked rows and scroll inside cards. The log is_coordination/.OWNER- FEEDBACK.md
Fixed
- 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/, whileglossary.json tools/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"), andcheck_glossary.py --builddocs/lacked all 13.GLOSSARY.md synthesis/is now the file to edit.glossary.json --buildchecks it, sorts it and writesdocs/; the shards andGLOSSARY.md terms-input.jsonare retired (git history has them).- The new
--checkruns in CI. It fails when a term breaks the three-voice rules, names something today's engine doesn't have, ordocs/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.GLOSSARY.md - 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-tableused 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.jsonformulas.type.), 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.tracking. sfPro - Corners: Q-shape-04 used to be recorded only.
squircle-enhancenow adds Apple's continuous corner to the CSS and Tailwind exports where the browser drawscorner-shape.continuousandsquircle-enhancegive 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.). Theradius. continuous squirclekeyword 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 withoutcorner-shapelose 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.
- Letter spacing:
- Renaming a system no longer leaves an old export behind.
export --format dtcgremoved nothing, so afterset namethe folder held both<old>.resolver.jsonand<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-orreduced- transparency prefers-contrast: more, now also when the device is in dark mode. House standards are v3: only the conflict note ofSTD-changed.accessibility- motion-12 - A brand color the person typed is never replaced (
brand/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".showcase/ STRESS- TEST.md - A hex given with
--brandstays the person's, even under--delegated all. It counts as the model's pick only whenbrandis 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 newcolor.accent2.seedandcolor.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-hexnow puts back a hex that an older sketch replaced. It never undoes a color set since then.
- A hex given with