How to prove General Translation work is done before saying so.
pnpm skills:install gt-verify --project <dir>Run it from a Prototemplate checkout. It links skills/gt-verify into the project’s .claude/skills and .agents/skills; --copy vendors the folder instead, and --dry-run prints each step first.
Kevin checks General Translation (GT) work in the running app, and he finds what an agent did not look at. On 2026-09-02 he asked "did you actualy test this?" about a fix that had been reported with screenshots and never tried with a mouse. This skill defines when an item is done, which cases to walk for each kind of change, and what the report says about each item.
Capture tooling lives in gt-aesthetic (section 5, "Local review") and gt-website ("Looking at pages"), and the gates live in gt-lints. This skill adds the definition of done, the cases those tools miss, two headless scripts (scripts/probe.mjs measures one spot of a page and scripts/stress.mjs walks a scroll story through the stress matrix) and three parity scripts (scripts/compare-signatures.py fetches the same routes from two servers and diffs each page's structure, read through scripts/page-signature.py; scripts/row-diff.py diffs screenshots row by row). Commands and code for every check are in references/recipes.md, the cases in detail in references/cases.md and the parity method in references/parity-review.md.
$GT_CLOUD is a checkout of gt-cloud, GT's monorepo (the site at generaltranslation.com is its apps/landing, and the dashboard is apps/dashboard). $PROTOTEMPLATE is a checkout of Prototemplate, the design hub behind prototemplate.com. Run both scripts from $PROTOTEMPLATE, because its node_modules holds playwright-core. On a new machine, pnpm exec playwright-core install chromium webkit there downloads the browsers they launch. Pass a scratch folder as --out.
An item is done when all seven hold:
A typecheck, a clean lint and a passing structural audit are gates (gt-lints). They and the agent's own claim say nothing about what renders or what a user can do, so an item that passed only gates is reported as unverified.
sh node skills/gt-verify/scripts/probe.mjs http://localhost:3005/brand --sel ".pt-book-title h1" --theme dark --out <scratch>/probe
The probe prints the box model per side, the type and paint values, the parent's gap and the space to each sibling, and saves a crop plus 24px (references/cases.md).
getComputedStyle on the live element (the probe, or the Browser pane's JavaScript) says what rendered.--dsf 4 for 4x). One 1px line is 2 device px at 2x, and a full-page capture hides it. The line auditor reads computed CSS and cannot see SVG strokes, so figures are judged on crops (gt-lints).--point x,y lists the elements under a viewport point from the top (elementsFromPoint), with each one's borders, background, opacity, shadow and outline, and the composite pixel there. It shows which owner draws a line, what covers a control and which layer leaks a fill.--scan x,y,down,24 (or right) groups the device pixels along a segment into runs of one grey and marks the runs that are lines. A reading near the two-stroke grey is a double line or a stroke over a brighter backing (the arithmetic and the expected greys: references/cases.md, "Reading a seam").--frames 12 --every 120 takes the box reading and a crop twelve times, since a footprint changes with an animation's state (the 2026-08-01 orbit gaps are in references/cases.md).pnpm check:pages reads the layout shift score in every cell (over 0.1 fails, over 0.05 is a note; --cls-trace samples the boxes behind a shift), and stress.mjs records the entries in every phase. Around one gesture, read the entries directly (recipes, "Layout shift around one interaction"). Every entry over 0.001 is a defect, reported with its sources. Kevin, 2026-08-05: "either trannsition and animate them properly or dont let them layout shift around".getSelection(). A hover state is hovered, then clicked. A sign-in change is proven by signing in: "hmm but i cant sign in. full flow is technically not working" (Kevin, 2026-07-21). Recipes has the drag.click({ force: true }), a script that sets state or a harness route proves nothing about the gesture. Report the shortcut, run the gesture, then report the gesture; a harness route stays out of the PR (gt-ship section 3; the 2026-09-02 label case is in references/cases.md).Scroll stories, pinned stages and animated sections are verified through the whole matrix before they are called fixed. On 2026-08-08 Kevin found three failures in one evening: "if i reload i briefly see 3 layers stacked on top of each other", a story that did not lock "in the same place" when scrolled up and down, and text rewriting that looked "so off" under 10x CPU throttling.
| Case | What must hold |
|---|---|
| Every beat, the last ones included | Each beat, the finale included, locks at its read line |
| Slow, fast and reverse scrolling | The same position shows the same state from either direction; nothing stale is visible after a fast jump |
| Reload mid-page and a restored scroll position | The first painted frame is already right: no stacked layers, no hidden copy |
| A deep link into the story | The linked beat shows lit, with no extra scroll needed |
| Zoom fully out and back in | The story at the same position reads as it did before |
| Show and hide the mobile URL bar | The document does not jump (DESIGN.md section 13) |
| CPU throttled 10x | Settled states equal the unthrottled run; only the frame rate drops |
| 1440 by 900, 1920 by 1080, intermediate widths, a phone | Each width shows one composition (section 4) |
node skills/gt-verify/scripts/stress.mjs http://localhost:3001/en-US \
--copy ".v0-stack-beat" --story "#platform" --hash platform --theme dark \
--out <scratch>/stressstress.mjs walks every phase at five viewports, fails when copy in the read band is not visible, records shifts, errors and frame cadence, and writes REPORT.md and a capture sheet (--phases, --viewports, --steps narrow a run).--hide; the URL bar is checked on a phone. The rules with the incidents behind them are in references/cases.md ("The stress matrix").gt-motion holds the motion rules (one clock, paused loops, reduced motion). gt-landing-pages and DESIGN.md sections 13 and 14 hold the story's layout (the 55 and 80 percent read lines, the svh and dvh law).pnpm check:pages --preset quick --pages <ids> (devices from 320 wide to the 3440 ultrawide, layout shift per cell, the declared interactions; gt-lints). Another site takes --base <url> --pages-module <file>; the presets are in references/cases.md.items and columns (gt-website section 2).--browser webkit on both scripts. On 2026-08-18 the blog index's lead card broke only in Safari (references/cases.md, "Mobile menus and WebKit").--theme), and confirm it took: the probe prints data-theme and the dark class.sh node skills/gt-verify/scripts/probe.mjs http://localhost:3001/en-US/docs --viewport 390x844 --a11y --strict --out <scratch>/a11y
It lists controls with no accessible name, the name and state every icon-only control announces, user-select: none text and the live regions. Read each name against what the control does, tab through the changed controls, and check reduced motion (references/cases.md, "Accessibility reading").
/dev/states gallery (gt-local-dev section 4) supply the states.dir on the node, unicode-bidi: isolate), and Arabic stays joined, which needs one shaped text node with no per-character spans (DESIGN.md section 8). Devanagari keeps its matras. Every layout is checked in CJK, RTL and Indic text as well as Latin (BRAND.md section 6).git log and git diff <good> <bad> -- <paths>) or bisect in a scratch worktree before changing code (recipes).rm -rf .next clears a stale dev build (gt-website section 2).compare-signatures.py, and every difference gets a verdict and evidence (references/parity-review.md).uptime load average beside every timing and rerun at low load before calling a timing defect real (gt-performance section 2, which also holds budgets and frame-time work).Work that shipped is done when production serves it. Kevin, 2026-10-01: "why does your deploys keep regressing?"
git merge-base --is-ancestor <sha> origin/main succeeds; a lane's work lost in a rebase counts as unshipped.githubCommitSha contains it (recipes, "The live deployment").dpl_ id. Prototemplate's check is gt-ship section 8.200 image/png, and the card is opened and looked at (recipes; gt-graphics for the design).gt-website section 8, gt-ship section 8).When Kevin flags one instance, find every instance: "in everything, make sure our footers are properly logo and text side by side" (Kevin, 2026-08-03); "look for ANYWHERE ELSE icons nneed to be synced" (Kevin, 2026-09-28).
git grep -n "select-none" -- 'packages/ui/src' 'apps/*/src'), a registry (Prototemplate's scripts/lib/site-pages.mjs, the header's items and columns), a lint (gt-ui rules), or a measurable heuristic such as symmetry (left and right padding equal) or attachment (a logo and its wordmark on one baseline) read with the probe on every member (--nth).gt-lints section 4). Cross-app UI changes go through packages/ui (gt-components, "Standardization").gt-testing, "Tautological").REPORT.md, the text in the response) as well as the exit code. Gate hygiene (chained with &&, unpiped, real exit codes) is gt-lints section 5.gt-ship section 3 and gt-testing hold the size rules.ALLOW entry or a baseline row with its reason) that keeps the failure visible. A gate is never skipped silently.--pages, --viewports, --phases); the full matrix before a release. Run browser gates one at a time.xcrun simctl boot opens no window; the simulator panel opens only when Kevin wants to watch.Every reported item says how it was verified and names anything left unverified, with the reason. gt-reporting holds the report format; gt-aesthetic and gt-ship hold the crop format.
A worked report to this standard, for the 2026-09-02 label fix, is in references/cases.md ("A report to this standard").
stress.mjs in every phase, and the first-frame captures were looked at.probe.mjs --a11y --strict.dpl_ stamp matches, each feature was spot-checked live, and the cards were read live.Prototemplate: gt-aesthetic (the review standard and local review tooling), gt-website (the site, its deploys and "Looking at pages"), gt-lints (every gate, gate hygiene and new lints), gt-ship (PR crops, Prototemplate's deploy stamp), gt-motion (motion rules and verifying motion), gt-landing-pages (scroll story layout), gt-components (cross-app standardization), gt-graphics (social cards), gt-reporting (the report format), gt-local-dev (dev environments and review servers), gt-performance (frame budgets and Lighthouse), prototemplate (check:pages against another site). gt-cloud: gt-dashboard (the UI Verification Checklist), gt-testing. Kevin's wiki: agent-browser, webapp-testing, dogfood, accessibility, og-metadata-audit, agent-iteration-loop.
Dated provenance for every rule, script and number in this skill is in references/sources.md.
The folder skills/gt-verify as agents fetch it. Each file opens raw.
SKILL.mdreferences/cases.mdreferences/parity-review.mdreferences/recipes.mdreferences/sources.mdscripts/compare-signatures.pyscripts/page-signature.pyscripts/page-signature.test.pyscripts/probe.mjsscripts/row-diff.pyscripts/row-diff.test.pyscripts/stress.mjs