How a General Translation design exploration runs from research to one landed design.
pnpm skills:install gt-explorations --project <dir>Run it from a Prototemplate checkout. It links skills/gt-explorations 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 localization tools for developers, and Kevin Liu does its design, website and product work. He designs in rounds. He asks for several directions, compares them live, picks by number, and asks for variants of the pick until one design lands. A direction is one complete design of a page or a site, built as its own running route. This skill holds the mechanics of a round, from the research before it to the cleanup after it, and gt-aesthetic holds the taste each round is judged by.
Paths are relative to a checkout. $PROTOTEMPLATE is Prototemplate, Kevin's design lab and the public hub at prototemplate.com, where the site directions live. $GT_CLOUD is gt-cloud, the monorepo of GT's site, docs and dashboard. Kevin's wiki is github.com/Kevin-Liu-01/Kevin-Wiki, and its paths below are relative to its checkout. references/rounds.md records every round from July to October 2026 with what was asked, what Kevin picked and the rule it set. references/charter.md holds the round charter, references/registry.md the registry and numbers, references/comparing.md the variant switches, option sheets and module review, and references/sources.md the provenance. scripts/distinct-set.mjs checks that a set of options differ before Kevin sees it.
wiki/design/README.md is the index, and ui-library-ranking.md, component-library-sources.md and x-bookmarks-design-ui.md list the libraries and references he trusts), his X bookmarks, and every post he links. Kevin, 2026-07-28: "read the x posts and ingest artifacts using fieldtheory and see the pictures to see what i want".ft, wiki page wiki/tools/fieldtheory.md). ft sync downloads new bookmarks and their media, ft search "<terms>" searches them, and ft show <id> --json prints one. A post Kevin links without bookmarking it is captured with the wiki skill absorb-sources, media included.$PROTOTEMPLATE/docs/research/STORYBOARD.md opens with the July references, each named for the section it governs (the hero mechanic, the hero background, the story window), and docs/research/inspo.md ranks the reference sites from the bookmarks with what to take from each.gt-aesthetic, "Measuring the reference"). Kevin, 2026-07-29: "first we need to delve deep into what makes the vite plus and oxlint websites tick". The answer was docs/research/teardown-measured.md, which read every value with getComputedStyle and found that the two sites are one system in two modes./d/singularity-dossier) governs the site, and the brand deck governs product surfaces (gt-aesthetic section 1). Each round names its reference in its brief.docs/reference-shots/<site>/ holds the July captures of generaltranslation.com, oxc, resend and viteplus. The July documents under docs/research/ show the method. Their aesthetic mandates (black, white and metallic, Switzer headings) were replaced later, and gt-aesthetic holds the current ones.Before cloning a product or building a feature that answers one, research the product and write the findings down before the first direction:
Kevin asked for this on 2026-09-12 and 2026-10-01 on a project of his own, and the method applies to GT work unchanged. docs/archive/feature-inventory.md is the GT example: each capability with the proof a visual must show and the misunderstanding it must prevent.
docs/archive/MODULES_PLAN.md came from that ask. It is a build contract written so that five builders could work in parallel without inventing anything, ordered module by module the way Kevin reviews.Every round starts from a written charter that every builder and reviewer reads (references/charter.md): the GT elements every direction keeps, the ordered section contract, the homes where the round's new idea may live, the copy rules, the builders' technical limits, and a completeness checklist run by reading code. The deco rounds of 2026-09-14 and 2026-09-15 ran from one after Kevin rejected the round before it as incomplete. Keep the charter in the round's notes or the repository, since the deco charter was lost with a scratchpad.
Build one section, page or state, show it, and replicate it only after Kevin signs off on its grammar (gt-aesthetic section 5). On 2026-08-04 Kevin kept one element of a full build made on an unconfirmed reading, the Locadex isometric.
A direction differs from the others on three axes.
| Axis | The question it answers | Examples from the registry |
|---|---|---|
| Silhouette | What shape does the page or its hero make at thumbnail size? | one ruled column; stepped terraces; a concentric disk; a wall of courses |
| Material | What is the surface made of, and which engine draws it? | hairlines alone; an ordered-dither field; glyph rain; a lensing shader |
| Action | What is the one motion moment, and what visibly changes? | words condense out of rain; a component crosses a lens and exits translated |
A palette, a title or a new arrangement of the same parts does not make a new direction. On 2026-09-14 a deco round rebuilt ten directions as forks of one earlier direction, and seven of the ten heroes came out with the same layout, headline and hero visual. Kevin rejected the round. Before building, write a table with one row per direction and these three columns. Two rows that match in every column are one direction. The registry keeps each direction's action as signature.
bash node skills/gt-explorations/scripts/distinct-set.mjs public/shots/light/<slug-a>.jpg public/shots/light/<slug-b>.jpg node skills/gt-explorations/scripts/distinct-set.mjs <folder of frames> --strict
It flags a pair under 2% mean difference as the same picture and a pair whose tone grids correlate at 0.9 or above as the same composition. A clean report means only that no two options are near copies. The silhouette, material and action table is still checked by eye.
src/app/d/<slug>/, with its CSS scoped under its own root class (.<name>-root) so it never restyles another direction. $PROTOTEMPLATE/skills/prototemplate/references/adding.md ("A direction") gives the steps file by file.references/registry.md holds the fields, the views and the record.
src/lib/directions.ts (DIRECTIONS) is the one list. The gallery, /directions/<slug>, /compare, /present, the sitemap and the page check all read it, so a direction is registered once. label is the number Kevin uses, slug is fixed for the life of the direction, and signature holds its action.label, so it never enters the comparison (127960d, 2026-08-25). REFERENCE_MARK in src/lib/marks.ts works the same way.label, and the shell's sidebar and toolbar count positions. When a number could name two directions, find which view he was on, and ask once if it is still unclear.bash grep -rniE "\b(thirteen|sixteen|seventeen|twenty|[0-9]+ directions)\b" README.md ARCHITECTURE.md public/llms.txt src/app src/lib src/components | grep -v "src/app/d/"
Kevin compares directions live in one place. Kevin, 2026-07-28: "give me one place to switch between all of these". Prototemplate has four views over the registry.
| Route | What it shows | Source |
|---|---|---|
/ | the gallery: every direction as an article (Book), one live 1440 exhibit at a time (Live), or every capture at once (Grid) | src/app/GalleryViewer.tsx |
/directions/<slug> | one direction on the shell: its summary, both captures and a live frame | src/app/directions/ |
/compare | two directions side by side in scroll-locked same-origin frames, with the pair in the hash (#a=<slug>&b=<slug>) | src/app/compare/ |
/present | the presenter: the opening slides, the first 16 prototypes live with a note and a star rating, and a closing gallery | src/app/present/ |
localStorage key gt-presenter-review:v1, src/app/present/viewer/reviewStore.ts). They never reach another machine or an agent, so ask Kevin for his notes in chat. src/app/present/directions.ts filters the presenter's list; Signal has been out since 2026-09-09.?chrome=0. Every capture uses it, so the control is never judged as part of a design.references/comparing.md holds the detail.
?v=1..5 parameter with a per-page cookie, a thin dispatcher per page, slot 1 as the committed page unchanged, and a development-only dock. Every variant follows the copy law: production wording, approved wording, or no words (2026-08-12).gt-reporting section 1).?chrome=0, written by pnpm capture:pages --direction <slug>. Open every capture before using it.docs/archive/ITERATION_SPEC.md is the July table.src/app/d/toolchain and rescope its CSS under their own root class (ARCHITECTURE.md, "The SSOT rule").src/lib/studio-field.ts).A round converges through a separate harsh critic who scores the work against the reference side by side. gt-orchestration section 4 holds the loop, the bar and the July rubric (docs/archive/DESIGN_STANDARD.md section 8). A design round feeds the critic composites.
scripts/check/gallery-shoot.mjs does this for the Dossier's sections against the dev server on 3005, and REDESIGN_BASE points it at another address.docs/composites/ holds the July composites of the work beside resend, oxc and viteplus. Two captures join at a common height with ffmpeg:bash ffmpeg -i ours.png -i reference.png -filter_complex "[0]scale=-2:900[a];[1]scale=-2:900[b];[a][b]hstack=inputs=2" composite.png
gt-aesthetic section 2). Kevin, 2026-08-11: "these diagrams are so bad. i literally want you to restart these lol".The exemplar Kevin picks becomes the documented default, with its parameters in code and a comment that names the pick. BAYER_DEFAULT_ID in src/lib/studio-field.ts names 02 bayer-8x8 as the shared default, and the landing hero's measured composite is the strength every later field is held to (gt-aesthetic, "Material").
DIRECTIONS with its in-page switches until Kevin cuts or retires it. HeroFieldSwitcher still swaps the Dossier hero's field on 2026-10-05. A direction cut inside a round leaves in a commit that names it: b6a7eba names the three revival directions cut on 2026-09-14, and its parent holds their code.git diff <before> -- <winner's paths> prints nothing), and capture its route before and after at the same viewport. On 2026-08-12 the flattened sign-in route was checked byte-identical to the committed page.src/lib/archive.ts: its slug and name, a 1440 first-fold capture and a full-page capture under public/shots/archive, and the last commit that held its code. /archive/<slug> shows it, and git checkout <lastCommit> -- src/app/d/<slug> restores it. Retiring also prunes its paths from scripts/lint/practices.baseline.json.motion/out/v<N>/ folder before it is overwritten, and each film folder keeps archive/ for earlier compositions (gt-films, "Renders").gt-local-dev section 1).gt-ship section 8 holds the landing steps for the shared checkout.k/<topic> branch in its own worktree and becomes a PR when Kevin asks for one (gt-ship section 1).distinct-set.mjs flags no pair.DIRECTIONS once, its label is the number Kevin uses, and every count written in prose matches the registry.GT skills: gt-aesthetic (the references, the verdicts and the review loop), gt-orchestration (the critic loop and the agents that run it), gt-verify (what each kind of check proves), gt-reporting (showing a round to Kevin), gt-local-dev (review servers), gt-ship (landing), prototemplate (the registries and adding a direction), gt-dither (the Bayer engines and presets) and gt-films (film rounds and their archive). Wiki skills: absorb-sources and x-bookmark-absorb (ingesting posts and bookmarks), design-engineering-polish (its references/signature-first-exploration.md applies the same duplicate test to signature visuals), animated-component-libraries (component sources) and agent-browser.
references/sources.md lists the Prototemplate files and commits, the gt-cloud commits, the wiki pages, the memory notes and Kevin's dated directives behind each section, and the lines added on 2026-10-10.
The folder skills/gt-explorations as agents fetch it. Each file opens raw.
SKILL.mdreferences/charter.mdreferences/comparing.mdreferences/registry.mdreferences/rounds.mdreferences/sources.mdscripts/distinct-set.mjs