Kevin's taste for General Translation work and the review he applies to it.
node scripts/install-skills.mjs gt-aesthetic --project <dir>Run it from a Prototemplate checkout. It links skills/gt-aesthetic into the project’s .claude/skills and .agents/skills; --copy vendors the folder instead, and --dry-run prints each step first.
General Translation (GT) builds open-source i18n libraries and a translation platform. Kevin Liu reviews its design work, and he judges every GT surface against two finished references: the brand deck for product surfaces and the Dossier for the site. This skill records what those references measure, the verdicts he has given with their dates, and the loop in which he reviews work. Read it before designing a GT surface and again before showing him the result.
Paths are relative to a checkout: $PROTOTEMPLATE is Prototemplate (Kevin's design lab, served at prototemplate.com) and $GT_CLOUD is gt-cloud (the monorepo of the GT site, docs and dashboard). Read gt-cloud facts from origin/main or a fresh worktree, because a long-lived checkout can sit on an old branch. references/verdicts.md holds every dated verdict in Kevin's words, references/measures.md holds the numbers of each reference, and scripts/measure-type.mjs reads the heads and leads of any page.
Every surface has one governing reference, and its values are measured before any new value is invented.
| Surface | Reference | Where it lives |
|---|---|---|
| Product surfaces: the dashboard, onboarding and the auth plate, the Prototemplate shell and its pages, the deck itself | The brand deck | $PROTOTEMPLATE/deck/parts/head.html (tokens and CSS), deck/DECK-GRAMMAR.md (rules), /deck on the dev server |
| The site: generaltranslation.com, landing and marketing pages | The Dossier | $PROTOTEMPLATE/src/app/d/singularity-dossier, served at /d/singularity-dossier with its /enterprise; BRAND.md section 8 |
| Enterprise and pricing pages | The toolchain prototypes | /d/toolchain/enterprise and /d/toolchain/pricing, copy included, word for word |
| Page content | Production | the current generaltranslation.com page components on gt-cloud origin/main |
| Material on a product surface | The landing hero's field | the studio's bayer-8x8 preset through createStudioField in $GT_CLOUD/apps/landing/src/lib/studio-field.ts, mounted by HeroField.tsx (references/measures.md) |
| Dithered pictures | The Blue Marble | $PROTOTEMPLATE/docs/ARTIFACT-PICTURES.md |
Kevin named both references. On the deck: "i really love our deck's navigation and basic interface" (2026-09-08), and on 2026-09-25 he answered the first dashboard pass with the deck's URL. On the Dossier: "dossier is indeed our completed version and treat it as such" (2026-08-06). BRAND.md section 8 (last edited 2026-09-09) still names the Dossier as the answer for "how the brand behaves in product". The later verdicts on the deck viewer (2026-09-08) and the dashboard (2026-09-25) set the deck for product surfaces, and they win.
head.html, the shell mirrors them as --pt-* in $PROTOTEMPLATE/src/components/viewer/tokens.css, and the dashboard plate uses the deck's own names in $GT_CLOUD/apps/dashboard/src/app/brand-tokens.css.playwright-core; from an installed copy of this skill, run that folder's scripts/measure-type.mjs with the working directory in such a checkout.bash node skills/gt-aesthetic/scripts/measure-type.mjs http://localhost:3005/brand-deck.html --storage gt-deck-mode=book --sel ".book-head h1, .book-head p" node skills/gt-aesthetic/scripts/measure-type.mjs http://localhost:3005/motion --strict
It reads 1440 and 390 in both themes and flags a heading above weight 500, a display head on more than two lines, a lead on more than three (five on a phone), prose wider than 75 characters, an unbalanced heading, a display head without cv11 and ss01, tracking above +0.02em or below -0.03em, a face other than Inter, a short last line, and text under the WCAG contrast floor. /deck frames /brand-deck.html, so measure the deck at that address; --storage gt-deck-mode=book opens its book view. A page that does not load within --timeout (120000 ms by default) prints "could not load", which happens on the shared dev server when the machine is loaded, so raise it there. --widths and --themes narrow the run.
Each row is a verdict on real work and the rule it set. The full wording and context of each is in references/verdicts.md. Work that he rejected restarts from the reference, and the rejected version is never the base of the next attempt.
| Date | What he rejected | The rule since |
|---|---|---|
| 2026-08-04 | Sections that kept the copy and drifted from the Figma mock layouts | A mock image is a layout spec: the composition, what sits left and right, which visual sits where |
| 2026-08-04 | Three-line headers, headers floating in whitespace, floating bordered cards, broken border grammar and double borders | Display heads hold two lines at most, rules run edge to edge, heads sit in ruled bands, one line per seam |
| 2026-08-04 | The Locadex isometric without its mark | Marks are seated into the drawing; Locadex is never a gif |
| 2026-08-11 | Redrawn diagrams ("these diagrams are so bad"), "ugly ai gradients", bad spacing, invented enterprise content, a sign-in that "looks exact same" | Content from production, layout from the toolchain and the Dossier, only the praised diagrams kept, no invented product vignettes |
| 2026-08-11 | The same diagrams, which laid flat logos over isometric drawings; the restart that followed seated them | A mark is an alpha mask in the face's plane, filled with a token |
| 2026-08-11 | The avoid list: mono as the brand voice, smooth scrolling, robot and sparkle AI icons, flag soup, AI gradients and glass, eyebrows, em dashes | Most items are gt-ui lint rules in gt-cloud and in Prototemplate's pnpm lint:code (no-smooth-scroll, no-eyebrow, mono-is-not-voice, no-em-dash, no-raw-locale-flags, icon-tiers); AI icons, gradients and glass have no rule and are checked by eye (gt-lints) |
| 2026-08-12 | Keeping the variant system after he picked one variant per page | The alternatives leave the code and stay in git history |
| 2026-08-17 | Pages that never had a second pass, and monospace in page copy | Every page gets a second pass against the reference |
| 2026-08-26 | The docs draft | Smaller text with more leading, no mono, diagrams and real icons, the shell's grid lines |
| 2026-09-04 | An oval shadow behind a blog graphic's subject | No drawn shadows; depth comes from lines and the dither |
| 2026-09-14 | Exploration rounds that were a costume, ten skins of one page, or the wrong lineage, pushed to main unseen | Directions differ in silhouette, material and action, and rounds stay local until he lands them |
| 2026-09-18 | Switzer beside Inter | Inter is the only face |
| 2026-09-25 | The first dashboard: boxed tiles and cells, titanium hairlines on every edge, uppercase mono eyebrows, registration crosses floating in the app, flat -0.028em tracking at every size, ink-4 text, two stacked scope switchers, chevron groups | The deck's grammar on every product surface (section 3) |
| 2026-09-25 | A heavy horizon ring as the app's material | The landing hero's field sets the strength of any material, and a surface carries one |
| 2026-09-28 | Sun and moon theme icons; 13px card facts; fade-and-rise entrances; a top header over onboarding; fills on layout containers | The ◐ and ◑ glyphs; the 12px rung; no entrance animation; the mark in the plate's head; no container fills |
| 2026-09-29 | Pictures that do not fit the page ("the great wave for example does not really make sense here"); texture cut away around type; layout shift between states | A picture shows writing, language or the earth; faint texture across the whole face; reserved heights and a fixed foot |
| 2026-09-30 | Picture plates over two lines and copy tying a picture to GT ("the corny stuff") | A title, one factual sentence about the artifact, a credit |
| 2026-09-30 | Two gaps evened at the smaller 10px | Matching measures both take the larger one |
| 2026-10-05 | Pictures of plain English prose ("never distract with text on the artifacts") | The dictionary pictures are retired and the picture lint rejects them |
| 2026-10-05 | Book heads with a seven-line lead and a floating subtitle | A lead of two or three lines at 60 to 70 characters, the rest in the body |
A page reads as General Translation through its structure, its contrast and its single material. Kevin's brief for the deck asked for minimal black and white with only the edge grid lines, images and simple diagrams, and no eyebrow text (2026-09-08).
.rows), and two lines per value at most. Bullets, boxed tiles and floating cards are out.hair (ink at 18%) for large surfaces and the lines that divide a page, hair-soft (ink at 9%) for list rows, and edge (ink at 62%) for the frame of a picture or a capture only. A large surface drawn in the frame weight reads as a boxed image. DESIGN.md section 2 ("Line law for chrome") has the ownership table and pnpm lint:lines:shell enforces it. On deck slides .rows rules draw --hair and .plain rows draw --hair-soft (references/measures.md).pnpm lint:radius holds them. The deck's sheet stays square. gt-cloud uses rounded-md for UI surfaces and rounded-full for round and pill shapes (gt-ui consistent-radius).#101010 code panel, the one plate surface (ink at 3.5%) under diagrams and captures, and objects such as the dashboard's credits card.b and strong included. State shows in ink: the active row, the pressed button and the focused field draw in ink.#8a8f98) is 3.25:1 on white, under the 4.5:1 floor for text below 24px, so the dashboard plate darkens light titanium to #6e737c (4.77:1) for its 13px captions and keys. The deck's 15px captions and the Prototemplate shell's meta text still use #8a8f98 in light. On a new light surface, text a reader needs is set in ink-2 or in the darker titanium.#2f5ce0 (dark lift #86a8ff), and a drawing gives it to one element. The deck uses no accent on text, lines or fills; semantic color appears only on icons (green #12a37a done, amber #f0a020 open, red #e5484d rejected, blue for GT).references/measures.md). A new field stays at that strength or under it. Artifact pictures print at 0.62 opacity in dark and 0.7 in light.gt-dither owns the engines, the presets and the picture standard.These numbers come from the references, and the live file wins whenever one of them matters to the work.
| Where | Measure |
|---|---|
| Deck sheet | 72px top and bottom and 80px side padding; 56px between head and body; 72px between columns; 18px under an h2 and between paragraphs; rows 16px block padding with a 32px column gap |
| Deck book head | title 44/1.04; lead 14px below at 15.5/1.5 in ink-2; 26px to the head's rule; 36px between blocks |
| Dashboard | Plate pages (sign-in and onboarding): 48px column padding; 40px from the mark to the heading; 26px between a heading and its lede; 40px before a form; 28px between fields; 10px under a label; 44px inputs and primary buttons. Under 880px tall the column padding is 32 and 24, the mark gap 30, the heading gap 16 and the form gap 24. App pages: 40px section padding, 40px sidebar rows, 14px ledger cells |
| Mobile | the --tcm-* ladder under 720px (DESIGN.md section 12); no copy within 20px of a hairline; 44px tap targets |
Kevin's ask on 2026-09-28 was "make our spacing a lot better, kerning a lot better". Gaps that look equal must be equal, and the gaps around one heading match on both sides.
100dvh correctly (2026-10-05). Air goes under headers, never at the bottom of boxes (2026-08-07, 2026-08-17: "fix space under headers here").--pt-title-clear under the sheet's border (2026-10-06). Check a small move against the screenshot before going further.no-gif-mark). gt-brand and gt-isometric hold the recipes.icon-tiers: Heroicons solid for meaning and Lucide for controls. The deck and the Prototemplate shell use Heroicons 20 solid, and in the deck an icon sits only in a key cell or at the start of a row.gt-voice has the rules.gt-brand owns the face, the tokens, the feature lists, the full tracking table, the measure tokens, the named exceptions (the Prototemplate nameplate, the /d/ directions, the presenter) and the type lint. Read its section 4 first. This section covers what to check once those are right.
font-optical-sizing: auto, display text at weight 500 with cv11 and ss01, and running text at 400.gt-brand's table. One tracking value at every size was the 2026-09-25 defect ("kerning needs to be adjusted"). Weight 400 text is never tracked, and nothing is tracked positive except the deck's 13px counter (+0.02em), the deck slides' picture credits and gt-cloud's 13px captions (+0.01em).text-wrap: balance). A display head holds two lines at most at every width (2026-08-04). Kevin's words on the hero were "TASTEFULLY two lines again" (2026-08-04).--pt-measure-lead), because 62ch comes to 83 to 86 Inter characters. The deck's own book-head lead (max-width: 62ch) measured 84 characters a line and four lines at 1440 on 2026-10-05, so copy the deck's sizes and gaps and take the measure from this rule.text-wrap: pretty, and no paragraph ends on one short word.b and strong inside a weight 500 element as 700. A base rule sets them to 500.font-variant-numeric: tabular-nums.git add -A.http://localhost:3005 (pnpm dev, launch config prototemplate-dev). Reuse the running server: Next 16 refuses a second next dev for the same checkout..agents/skills/gt-landing and gt-dashboard).document.hidden and pauses requestAnimationFrame, so canvases come out blank there.localStorage['gt-theme'] for Prototemplate and the deck, the theme key or the dark class on <html> for gt-cloud.deviceScaleFactor: 2. The line auditor reads computed CSS and cannot see SVG strokes.pnpm check:pages --pages <id> reads ten viewports in both themes for overflow, clipping, tap targets and layout shift. pnpm lint:lines:shell audits the chrome's lines. node shoot-slide.mjs 8 15, run in deck/, renders slides in both themes and reports overflow.docs/handbook/operating-principles.md rule 5).gt-explorations section 2).gt-lints).gt-ship has the PR format.The wiki's general design skills stay useful, and where they disagree with a verdict in this skill, the verdict wins.
design-engineering-polish gives the animation decision framework, easing and duration choices, the Before, After and Why table for reviews, and signature-first exploration for a round of new directions. Its rule to reject disguised duplicates matches the deco verdict. In GT work, product pages have no entrance animation, motion moves transform and opacity only at the shell's 120 to 220ms durations, and reduced motion renders a designed still (gt-motion).make-interfaces-feel-better applies as written for tabular numbers, balanced heads and pretty body text, antialiased smoothing, 44px touch and 40px desktop hit areas, the state matrix, exact transition properties and sparing will-change. Five of its rules do not apply to GT work. GT draws no shadows for elevation and never replaces a border between sections with a shadow, because lines carry the structure. Its concentric radii apply to the controls: a part flush inside a 6px control takes 5px (--pt-radius-inner). Product pages have no staggered entrances. The shell shows a press as the ink border of .is-on, with no scale and no blurred icon swap. A picture's frame is a 1px border in the edge role (ink at 62%), which is heavier than the low-opacity outline that skill suggests.taste, frontend-design, frontend-design-taste and web-design-guidelines are general references. Kevin's GT taste is the deck, the Dossier and the verdicts here.animated-component-libraries finds sources for components. Anything sourced is restyled to the tokens and passes this review.Built from the deck's defect list (DECK-GRAMMAR.md, "What a defect is") and Kevin's verdicts.
pnpm lint:lines:shell is clean, and junctions pass at 2x.measure-type.mjs --strict passes on the changed pages, or each flag has a stated reason.gt-brand (the tokens, the type system and the marks), gt-voice (copy), gt-deck (the reference deck), gt-lints (the line law, the type lint and gt-ui), gt-dither (the field and the pictures), gt-landing-pages and gt-website (the site), gt-components (the shell and shared UI), gt-isometric and gt-diagrams (drawings), gt-motion, gt-ship (PR screenshots) and prototemplate. General skills in Kevin's wiki: design-engineering-polish, make-interfaces-feel-better, animated-component-libraries, agent-browser.
deck/parts/head.html (tokens, type, rows, book view, viewer chrome); deck/DECK-GRAMMAR.md (type, color, layout classes, "What a defect is"); DESIGN.md sections 1, 2, 3, 12, 15 and 16; BRAND.md sections 3, 5, 6 and 8; docs/ARTIFACT-PICTURES.md; docs/SHIP-LOOP.md; src/components/viewer/tokens.css; scripts/lint-lines.mjs; scripts/pagecheck/.apps/dashboard/src/app/brand-tokens.css (the plate's tokens, ladder and frame); apps/dashboard/src/components/brand/FieldStack.tsx; tooling/oxlint-plugins/gt-ui.ts (consistent-radius, icon-tiers, no-gif-mark, no-eyebrow, mono-is-not-voice); apps/landing/src/lib/studio-field.ts, components/landing/shared/HeroField.tsx, home/sections/hero-terminal.css and home/v0-pages.css (the hero's field); packages/ui/src/components/frame/ThemeToggle.tsx. The branch k/dashboard-shell-ia holds packages/ui/src/lib/studio-field.ts and the no-theme-icons rule..oxlintrc.json (the gt-ui rules pnpm lint:code runs) and package.json.~/.claude/skills: skills/engineering/design-engineering-polish/SKILL.md and references/signature-first-exploration.md; skills/engineering/make-interfaces-feel-better/SKILL.md.references/verdicts.md).references/verdicts.md, checked against his Claude Code session transcripts on 2026-10-05, and recorded in his gt-cloud memory notes dashboard-deck-grammar, redesign-v0-verdict, k-pages-restart-round, brand-questionnaire-directives, variants-program-state, deco-exploration-round, explorations-stay-local, signin-field-transition, prototemplate-interface-system, artifact-picture-standard, plain-technical-english, landing-inter-only, mobile-type-ladder, page-check-system, redesign-screenshot-harness and pr-screenshots-and-gallery.The folder skills/gt-aesthetic as agents fetch it. Each file opens raw.
SKILL.mdreferences/measures.mdreferences/verdicts.mdscripts/measure-type.mjs