Genesis design system
Black, white, grey and photography carry the identity. Hue carries meaning.
Everything else is downstream of that one rule. An agent that internalises only this
sentence gets most calls right.
The design system lives in ~/repos/aesthetic_and_web_guidelines. This skill routes you
there. It deliberately does not restate the rules — a paraphrase here would be a second
source of truth that drifts from the first, which is the exact failure that repository
exists to prevent. If you are answering a design question without having read the
document, stop and read it.
Preflight
If ~/repos/aesthetic_and_web_guidelines is missing, say so and stop. Do not reconstruct
the rules from memory.
Several of the documents below — including docs/rules.md, docs/INDEX.md and
tools/check_surface.py — were untracked in that repository as of 2026-08-02. A fresh
clone or a git stash there will not have them. Check the working tree, not git show.
Read first
Absolute paths are relative to ~/repos/aesthetic_and_web_guidelines.
| situation |
read |
| any Genesis surface |
docs/00-foundations.md, then the matching guide in surfaces/ |
| a specific question |
docs/INDEX.md — routes by question, down to the section anchor |
| adopting the tokens |
docs/09-adoption.md |
| what a rule is called |
docs/rules.md |
docs/rules.md held 42 rules across 12 prefixes on 2026-08-02 — COLOR, TYPE, LAYER,
LAYOUT, MOTION, A11Y, FIG, PROV, VOICE, IMG, INST, ADOPT. If your count differs, the
repository is right and this skill is stale: re-read docs/INDEX.md before relying on
anything here.
The tools
Four stdlib-only Python 3 scripts in tools/. All take --json. Two observe other
repositories and none of them ever write to one. A whole-repo check takes about 125 ms —
run it rather than reasoning about what it would say.
|
|
palette_audit.py |
the colour maths. --selftest proves it against 26 Sharma reference pairs; --emit-tokens re-solves the palette |
check_tokens.py |
inward: do the artefacts, the maths and the prose agree? Twelve checks |
check_surface.py |
outward: does a surface obey the rules? Read-only, reports by rule ID |
audit_surfaces.py |
outward: how far apart is everything today? --html for the drift dashboard |
check_surface.py exits 1 when it finds something — that is a result, not a crash.
Branch on whether stdout parses as JSON. It also needs a directory: hand it a single
file and it reports zero findings, which is indistinguishable from clean. /genesis-check
wraps both traps.
Every finding carries a guideline anchor, so you can go from a finding to the paragraph
arguing for the rule in one read. Do that instead of restating the rule.
Five rules an agent otherwise breaks confidently
- Never hand-compute a contrast ratio. Get it from
palette_audit.py. Do not estimate,
do not recall, do not reason about luminance.
- Never write a number into prose the tools cannot reproduce. In the guidelines
repository this is enforced — an unanchored ratio fails the build.
- Name the ground beside any ratio. There are three, not two:
#ffffff light reading,
#0a0a0b dark reading, #000000 display. "On black" is ambiguous between the last
two by enough to flip a pass into a fail.
- Cite rule IDs.
COLOR-04, not a paraphrase. A paraphrase drops the reason first, and
the reason is what stops the next person overturning the rule.
- Do not edit a surface repository from the guidelines repository, or the reverse,
without being asked in that repository for that change. Adoption is the surface owner's
decision and the owner is David.
Enough to answer without opening a file
Verified by check_tokens.py as of 2026-08-02. Where this and the repository disagree, the
repository is right.
- Two token tiers.
--gx-* is the raw palette and component CSS never names it.
Semantic tokens — --ink, --accent, --data-1 — are the only ones a stylesheet may use.
- One declaration per token. Each scheme-varying token is a single
light-dark(l, d).
Switching scheme is switching color-scheme and nothing else. There is no
prefers-color-scheme block to add a token to.
- Seven reading sizes — micro, label, fine, body, lead, title, hero — plus two
instrument sizes only the bioreactor guide may use.
- No bold. SN Leif ships one weight (OS/2 class 600) and its italic. Emphasis is size,
case, tracking, ink and rules.
- Four data series, re-derived on every check rather than chosen. Past four:
direct-label and mute, facet, or aggregate. Diverging scales are blue-to-orange.
- One accent per surface, one meaning, declared in a machine-readable comment. On a
landing page the answer is
none — the photography carries it.
- Layer order:
tokens, fonts, base, layout, components, surface, state, print. Append
domain layers after components; never reorder; name every layer in the statement.
- Floors: body prose 7:1, supporting text and accent 4.5:1, plotted lines and control
boundaries 3:1, hit targets 44×44 and 60px on an instrument. WCAG 2.2 AA, AAA on body.
- No AI-generated images, anywhere. Standing instruction, not a preference.
- The company is Genesis, legally Organogenesis Labs, Inc. Never Spacetime Bio, Non
Fiction or Organogenesis Corporation.
Six questions are still open in research/open-questions.md, including whether the margin
column earns its width — which most of the layout rests on and has never been tested with a
reader. Do not present those as settled.
Delegation
Reading the whole design system into the main thread costs more than the task. For a broad
review — "does this site follow the guidelines" — run /genesis-check first and read the
findings; open a guideline only when a finding needs its reasoning. For a narrow question,
docs/INDEX.md gives a section anchor directly.
Not for
- Non-Genesis web work. A generic React app is not a Genesis surface.
- Editing
~/repos/aesthetic_and_web_guidelines itself — it has its own CLAUDE.md and a
stricter contract, including a pre-commit checker you must not bypass.
- Chart form. Chart type, encoding and axis treatment stay with
plotting-advisor for
Python figures and dataviz for everything else. What comes from here is the palette,
the four-series limit, FIG-01…FIG-04, genesis.mplstyle and genesis_palette.py — so
where their palette guidance and ours disagree on a Genesis surface, ours wins.
- Scientific content. That is
essay-pipeline, latex-document-manager or
papers-library.
1---2name: genesis-design3last_updated: 2026-08-024description: >5 Use when building or changing any Genesis surface — a white paper, the paper6 library, a KOL record, a deck, an explorable, the bioreactor screens, or7 genesis.bio — or when a design question needs the house answer: colour,8 contrast, type scale, layout, focus rings, chart palettes, alt text, voice.9 Triggers on CSS work in ~/repos/white_papers, ~/repos/papers or ~/repos/kol,10 on any tokens.css or Genesis stylesheet, on greenfield work for a Genesis11 surface ("build a landing page for", "new page on genesis.bio", "a deck12 for"), and on "what colour should", "is this accessible", "how many13 series", "which font size", "what is the focus ring". Pair it with14 frontend-design, which builds the interface while this supplies the house15 rules. NOT for non-Genesis web work, and NOT for editing the guidelines16 repository itself (that has its own CLAUDE.md).17categories:18 - design-system19 - web-management20handoff:21 accepts_from:22 - web-presence-manager23 - frontend-design24---2526# Genesis design system2728**Black, white, grey and photography carry the identity. Hue carries meaning.**2930Everything else is downstream of that one rule. An agent that internalises only this31sentence gets most calls right.3233The design system lives in **`~/repos/aesthetic_and_web_guidelines`**. This skill routes you34there. It deliberately does not restate the rules — a paraphrase here would be a second35source of truth that drifts from the first, which is the exact failure that repository36exists to prevent. **If you are answering a design question without having read the37document, stop and read it.**3839## Preflight4041If `~/repos/aesthetic_and_web_guidelines` is missing, say so and stop. Do not reconstruct42the rules from memory.4344Several of the documents below — including `docs/rules.md`, `docs/INDEX.md` and45`tools/check_surface.py` — were **untracked** in that repository as of 2026-08-02. A fresh46clone or a `git stash` there will not have them. Check the working tree, not `git show`.4748## Read first4950Absolute paths are relative to `~/repos/aesthetic_and_web_guidelines`.5152| situation | read |53|---|---|54| any Genesis surface | `docs/00-foundations.md`, then the matching guide in `surfaces/` |55| a specific question | `docs/INDEX.md` — routes by question, down to the section anchor |56| adopting the tokens | `docs/09-adoption.md` |57| what a rule is called | `docs/rules.md` |5859`docs/rules.md` held **42 rules across 12 prefixes** on 2026-08-02 — COLOR, TYPE, LAYER,60LAYOUT, MOTION, A11Y, FIG, PROV, VOICE, IMG, INST, ADOPT. If your count differs, the61repository is right and this skill is stale: re-read `docs/INDEX.md` before relying on62anything here.6364## The tools6566Four stdlib-only Python 3 scripts in `tools/`. All take `--json`. Two observe other67repositories and none of them ever write to one. A whole-repo check takes about 125 ms —68run it rather than reasoning about what it would say.6970| | |71|---|---|72| `palette_audit.py` | the colour maths. `--selftest` proves it against 26 Sharma reference pairs; `--emit-tokens` re-solves the palette |73| `check_tokens.py` | inward: do the artefacts, the maths and the prose agree? Twelve checks |74| `check_surface.py` | outward: does a surface obey the rules? Read-only, reports by rule ID |75| `audit_surfaces.py` | outward: how far apart is everything today? `--html` for the drift dashboard |7677`check_surface.py` **exits 1 when it finds something** — that is a result, not a crash.78Branch on whether stdout parses as JSON. It also needs a **directory**: hand it a single79file and it reports zero findings, which is indistinguishable from clean. `/genesis-check`80wraps both traps.8182Every finding carries a `guideline` anchor, so you can go from a finding to the paragraph83arguing for the rule in one read. Do that instead of restating the rule.8485## Five rules an agent otherwise breaks confidently8687- **Never hand-compute a contrast ratio.** Get it from `palette_audit.py`. Do not estimate,88 do not recall, do not reason about luminance.89- **Never write a number into prose the tools cannot reproduce.** In the guidelines90 repository this is enforced — an unanchored ratio fails the build.91- **Name the ground beside any ratio.** There are three, not two: `#ffffff` light reading,92 `#0a0a0b` dark *reading*, `#000000` *display*. "On black" is ambiguous between the last93 two by enough to flip a pass into a fail.94- **Cite rule IDs.** `COLOR-04`, not a paraphrase. A paraphrase drops the reason first, and95 the reason is what stops the next person overturning the rule.96- **Do not edit a surface repository from the guidelines repository, or the reverse,**97 without being asked in that repository for that change. Adoption is the surface owner's98 decision and the owner is David.99100## Enough to answer without opening a file101102Verified by `check_tokens.py` as of 2026-08-02. Where this and the repository disagree, the103repository is right.104105- **Two token tiers.** `--gx-*` is the raw palette and component CSS never names it.106 Semantic tokens — `--ink`, `--accent`, `--data-1` — are the only ones a stylesheet may use.107- **One declaration per token.** Each scheme-varying token is a single `light-dark(l, d)`.108 Switching scheme is switching `color-scheme` and nothing else. There is no109 `prefers-color-scheme` block to add a token to.110- **Seven reading sizes** — micro, label, fine, body, lead, title, hero — plus two111 instrument sizes only the bioreactor guide may use.112- **No bold.** SN Leif ships one weight (OS/2 class 600) and its italic. Emphasis is size,113 case, tracking, ink and rules.114- **Four data series**, re-derived on every check rather than chosen. Past four:115 direct-label and mute, facet, or aggregate. Diverging scales are blue-to-orange.116- **One accent per surface, one meaning**, declared in a machine-readable comment. On a117 landing page the answer is `none` — the photography carries it.118- **Layer order:** `tokens, fonts, base, layout, components, surface, state, print`. Append119 domain layers after `components`; never reorder; name every layer in the statement.120- **Floors:** body prose 7:1, supporting text and accent 4.5:1, plotted lines and control121 boundaries 3:1, hit targets 44×44 and 60px on an instrument. WCAG 2.2 AA, AAA on body.122- **No AI-generated images, anywhere.** Standing instruction, not a preference.123- **The company is Genesis**, legally Organogenesis Labs, Inc. Never *Spacetime Bio*, *Non124 Fiction* or *Organogenesis Corporation*.125126Six questions are still open in `research/open-questions.md`, including whether the margin127column earns its width — which most of the layout rests on and has never been tested with a128reader. Do not present those as settled.129130## Delegation131132Reading the whole design system into the main thread costs more than the task. For a broad133review — "does this site follow the guidelines" — run `/genesis-check` first and read the134findings; open a guideline only when a finding needs its reasoning. For a narrow question,135`docs/INDEX.md` gives a section anchor directly.136137## Not for138139- **Non-Genesis web work.** A generic React app is not a Genesis surface.140- **Editing `~/repos/aesthetic_and_web_guidelines` itself** — it has its own CLAUDE.md and a141 stricter contract, including a pre-commit checker you must not bypass.142- **Chart form.** Chart type, encoding and axis treatment stay with `plotting-advisor` for143 Python figures and `dataviz` for everything else. What comes from here is the palette,144 the four-series limit, FIG-01…FIG-04, `genesis.mplstyle` and `genesis_palette.py` — so145 where their palette guidance and ours disagree on a Genesis surface, ours wins.146- **Scientific content.** That is `essay-pipeline`, `latex-document-manager` or147 `papers-library`.