Numbers

Every load-bearing number in one place, grouped by area, each with its reason, its token or constant, the lint that holds it and the page that explains it.

Updated

This page collects the numbers that General Translation (GT) design and engineering work in Prototemplate depends on, grouped by area. Each row gives the value, the reason for it, the token or constant that carries it, the lint or gate that holds it, and the page that explains it. The explanation lives on the linked page and the value lives in its source file, so a change starts in those two places and this row follows. Traps and fixes indexes the failures behind many of these numbers in the same way.

tokens.css is src/components/viewer/tokens.css, and every other path is relative to the root of the Prototemplate repository. A value in brackets applies under 900px wide and on a phone on its side. In the Held by column a pnpm command names the lint or gate, with its rule where the lint numbers its rules, and Review means that no lint holds the value, so a person or a critic checks it on the render. Every value was read from its source on 2026-10-21.

Type

The site sets one face, the self-hosted rsms InterVariable 4.1, with an optical-size axis from 14 to 32 and a weight axis from 100 to 900.

ValueReasonToken or constantHeld byExplained in
44px at line height 1.04 and -0.025em (32px)The page title sits in Inter's Display design, which starts at 32px.--pt-d1, --pt-d1-lh, --pt-d1-track in tokens.csspnpm lint:type T7; pnpm lint:type:live L3Design system: book type
32px at 1.05 and -0.025em (26px at 1.15)A section title is the second step of the display ladder.--pt-d2, --pt-d2-lh, --pt-d2-track in tokens.csspnpm lint:type T7; pnpm lint:type:live L3Design system: book type
24px at 1.25 and -0.02em (21px)An h2 in prose and a record's title track less at a smaller size.--pt-d3, --pt-d3-lh, --pt-d3-track in tokens.csspnpm lint:type T7; pnpm lint:type:live L3Type: tracking by role
18px at 1.35An h3 and a row's title take this step at weight 500 and -0.01em.--pt-t-title in tokens.csspnpm lint:type R1 ratchets literal sizesDesign system: book type
17px at 1.55A head's lead takes this step, and one lead line, 26.35px, is also the panel's row pitch.--pt-t-lead, --pt-t-lead-lh in tokens.csspnpm lint:heads:live H5Pages: the book page's numbers
16px at 1.6Prose, notes and section leads take the body step.--pt-t-body in tokens.csspnpm lint:type R1Design system: book type
14px at 1.55, 13px at 1.5 and 12.5pxTable cells and contents links take the small step, captions and table heads the meta step, and group labels in chrome the group step.--pt-t-small, --pt-t-meta, --pt-t-group in tokens.csspnpm lint:type R1Design system: book type
-0.01em and -0.005emLabels at 13 to 18px and group labels at 12 to 12.5px are set at weight 500, which tightens with size.--pt-track-label, --pt-track-group in tokens.csspnpm lint:type R2 ratchets literal trackingType: tracking by role
0 at weight 400, and nothing positiveRunning text is never tracked, and positive tracking on Inter is a defect at every size.The comment under the text ladder in tokens.csspnpm lint:type T8; pnpm lint:type:live L3Type: tracking by role
500 at mostThe brand stops at 500, and the browser's bolder computes b and strong to 700.--pt-w-display, --pt-w-strong and the :is(b, strong) base rule in tokens.csspnpm lint:type T6; pnpm lint:type:live L5Type: weight and stack traps
opsz equal to the font size, clamped to 14 to 32With font-optical-sizing: auto the browser follows the size, so the Display design starts at 32px and the axis tightens spacing by itself.No token; font-variation-settings is never writtenpnpm lint:type T5; pnpm lint:type:live L4Type: optical size
398.55px against 380.81pxA 44px line tracked -0.025em measures the first without calt named and the second with it, because Chrome drops contextual alternates under letter-spacing.--pt-ff-text and --pt-ff-display in tokens.csspnpm lint:type T4; pnpm lint:type:live L2 and L7Type: contextual alternates under letter-spacing
32em for body text and 30em for a leadInter prose averages about 0.45em a character, so both hold about 66 characters a line.--pt-measure, --pt-measure-lead in tokens.cssskills/gt-aesthetic/scripts/measure-type.mjs --strict exits 1 past 75 characters; pnpm lint:type:live L8Type: measure
83 to 86 characters in 62ch at 17pxThe ch unit is the width of a zero, about 0.63em in Inter, so a measure in ch holds far more text than its number suggests.None; measures are set in emmeasure-type.mjs --strictType: measure
1 to 3 lead lines at 1440 (6 at 390), 200 characters at mostA head's lead reads in two or three lines.--pt-measure-lead in tokens.css; H4 in scripts/lint/heads.mjspnpm lint:heads:live H4Pages: the book page
352,240 and 112,748 bytesThe full roman file is the subsets' source, and its latin subset is the only Inter file every route preloads.public/fonts/InterVariable.woff2; ptInter in src/lib/fonts.tspnpm lint:type T3Type: subsets and glyph names
107.89%next/font's fallback face is local("Arial") at this size-adjust, and Arial draws Hebrew and Arabic before any face listed after Inter.next/font's ptInter FallbackReviewType: scripts and the Arial fallback
0.8638em and 0.728emThe baseline sits 0.8638em below the top of a line-height-1 box, and the cap height is 1490 of 2048 units, so display type is seated by its ink.None; Inter's own metricsReviewType: seating display type

Corners

Controls are rounded and shells are square. Kevin's toolbar of 2026-10-05 set the values.

ValueReasonToken or constantHeld byExplained in
0The viewer frame, the sidebar, the toolbar bar, the reading column, the book head, the dividers and full-width rows hold the interface, so they are square.--pt-radius-shell in tokens.csspnpm lint:radius; pnpm lint:radius:liveDesign system: corners
6pxButtons, fields, segmented groups and the sidebar's pills are things a reader presses or types into.--pt-radius-control in tokens.csspnpm lint:radius; pnpm lint:radius:liveDesign system: corners
5pxA part flush inside a control's 1px border stays concentric with it.--pt-radius-inner in tokens.csspnpm lint:radiusDesign system: corners
4pxKey caps, chips, tags, inline code and a control set 2 to 7px inside a field take the chip corner.--pt-radius-chip in tokens.csspnpm lint:radius; pnpm lint:radius:liveDesign system: corners
6pxCards, tiles, thumbnails, figures and popovers are objects a reader looks at.--pt-radius-card in tokens.csspnpm lint:radius; pnpm lint:radius:liveDesign system: corners
50%Dots and avatars on a square box take a full round.--pt-radius-round in tokens.csspnpm lint:radius:liveDocs site traps: the full round corner
The role's radius minus 1 to 3pxA part 1 to 3px inside a rounded box takes the concentric radius.calc(var(--pt-radius-<role>) - npx), TOKEN_FORM in scripts/lint/radius.mjspnpm lint:radiusDesign system: corners
8pxPresent's solid button is the one named exception, a chrome request of Kevin's.EXCEPTIONS in scripts/lint/radius.mjspnpm lint:radius K3 and L3Design system: chrome exceptions
33,554,400pxChrome computes Tailwind 4's rounded-full, calc(infinity * 1px), to this value, so the radius lint reports it as an illegal corner.None; a square box takes --pt-radius-roundpnpm lint:radius:liveDocs site traps: the full round corner

Lines

Every line is drawn once by one owner. In the shell's chrome every rule is 1px in one of three roles, so a line's weight says what it divides.

ValueReasonToken or constantHeld byExplained in
Ink at 0.18 in light, 242 at 0.22 in darkThe structural role draws large surfaces and the lines that divide the shell.--pt-hair in tokens.csspnpm lint:lines:shellDesign system: line law for chrome
Ink at 0.09 in light, 242 at 0.1 in darkThe row role draws list rows, panel rows and the sidebar's rail.--pt-hair-soft in tokens.csspnpm lint:lines:shellDesign system: line law for chrome
Ink at 0.62 in light, 242 at 0.55 in darkThe frame role is the darkest line in chrome, because it holds a picture in place against the paper.--pt-edge in tokens.csspnpm lint:lines:shellDesign system: line law for chrome
59 and 99 in dark, 210 and 174 in lightOne and two stacked strokes of --pt-hair composite to these greys, so a seam's grey counts its strokes.--pt-hair in tokens.cssskills/gt-verify/scripts/probe.mjs --scanLines and seams: reading a seam by its grey
4 device pixels at 2xTwo touching 1px rules of an opaque hairline keep one grey and show as a run twice as wide.--tc-hair on the GT landingprobe.mjs --dsf 2Lines and seams: reading a seam by its grey
1 to 2.5px wide and over 24px longThe line auditor counts a border side, an outline, a border-like shadow, a thin fill or an exposed-ground strip in this range as a line.Thresholds in scripts/lint/lines.mjspnpm lint:lines; pnpm lint:lines:shellLines and seams: the line auditor's thresholds
1 to 4px apart, overlapping 75% of the shorter line and 80pxTwo parallel lines from different owners this close read as one doubled line.scripts/lint/lines.mjspnpm lint:linesLines and seams: the line auditor's thresholds
Under 1px apartTwo owners draw one seam and their alphas stack, which the auditor reports as a junction.scripts/lint/lines.mjspnpm lint:linesGates: what the line auditor counts
Within 45 summed RGB steps of the groundA strip this close to the page's ground is an invisible seam.scripts/lint/lines.mjspnpm lint:linesGates: what the line auditor counts
Fill alpha 0.12 to 0.95 on an edge of 120px or longerA self-stack fails only at this size, so chips and small controls are reported without failing.scripts/lint/lines.mjspnpm lint:linesLines and seams: self-stacks and stacked grounds
Opacity 0.05 or lessThe auditor skips such elements, with SVG and canvas subtrees, so those are read by eye at 2x crops.scripts/lint/lines.mjsReview of 2x cropsLines and seams: the line auditor's thresholds
100vmaxA book's rules paint as a border image outset this far past both ends, so they run across the stage while the element keeps the column's layout.--pt-bleed-top, --pt-bleed-bottom, --pt-bleed-block in tokens.csspnpm lint:heads:live H6; the practices lint's border-image-noneLines and seams: rules that run the full width
1104pxThe GT landing's original pages ran max-w-[1120px] px-2, so their side lines were 1104px apart, and a 1100px rail doubled every hairline by 2px a side.--tc-rail in gt-cloud's landing engineThe practices lint's retired-rail checksLines and seams: rails drawn as borders
9px arms hanging 5px past the rail, at 0.38 in light and 0.34 in darkA registration cross marks where a section seam meets the rail, and the page root takes overflow-x: clip for its arms.--cross-ink in gt-cloud's landing engineReviewLines and seams: registration crosses and horizontal clipping

The book page

Every page with a book head renders one structure, and every space in it is a token.

ValueReasonToken or constantHeld byExplained in
44px (24px)The title sits this far under the stage's top, nothing is drawn in that space, and no line crosses a title.--pt-title-clear in tokens.csspnpm lint:heads S6; pnpm lint:heads:live H3Pages: the book page's numbers
14pxThis space separates the title's box from the lead's box.--pt-head-gap in tokens.csspnpm lint:heads S6Pages: the book page's numbers
56pxThis gap separates the lead's column from the panel.--pt-head-col-gap in tokens.csspnpm lint:heads S6Pages: the book page's numbers
304pxThe panel's column fits its longest value, a date with its hint such as "Sep 10, 2026 4 weeks ago", which measures 168px.--pt-head-panel in tokens.csspnpm lint:heads S6; pnpm lint:heads:live H5Badges and heads: the head's numbers
26.35pxOne lead line sets the panel's row pitch, so every fact sits on a lead baseline.--pt-row in tokens.csspnpm lint:heads:live H5Pages: the book page's numbers
26pxThe mast's rule sits this far under the taller of the lead and the panel.--pt-head-rule-pad in tokens.csspnpm lint:heads:live H6Pages: the book page's numbers
42pxThe hatch band measures this with both of its rules, and its 1px diagonal repeats every 7px.--pt-band-h, --pt-hatch in tokens.csspnpm lint:heads S3; pnpm lint:heads:live H7Design system: sanctioned devices
48px (40px)A rule sits this far under the block above it.--pt-sec-over in tokens.csspnpm lint:heads:live H7Pages: the book page's numbers
30pxAn h2's box sits this far under its rule.--pt-sec-pad in tokens.csspnpm lint:heads:live H3Pages: the book page's numbers
32px (24px) and 56px (16px)Blocks in a book column sit this far apart, and the column takes this side padding.--pt-book-gap, --pt-col-pad-x in tokens.csspnpm lint:heads S6Pages: the book page's numbers
193.16pxAt 1440 a one-line title's mast rule sits this far below the title's top on every page; the panel's four rows set it.H9_GAP in scripts/lint/heads.mjspnpm lint:heads:live H9Pages: the book page's numbers
35.5px at 1440 and 79px at 390Every section's h2 sits the same distance under its rule.scripts/lint/heads.mjspnpm lint:heads:live H8Pages: the book page's numbers
52px, and 208px or 256pxThe toolbar is 52px tall, and the sidebar is 208px wide in outline density and 256px with thumbnails.--pt-bar-h, --pt-sb-w in tokens.css; ViewerShell.cssReviewPages: the viewer shell

Motion

Bounce, elastic and back overshoot are not used, and every number here has a reduced-motion still.

ValueReasonToken or constantHeld byExplained in
0.5sFilm arrivals and scene changes land on this beat grid.The film kit's beat grid; skills/gt-motion/SKILL.mdReviewSVG lines in motion: timing numbers
(words / 3) + 1sA sentence holds this long after it has fully arrived, so it can be read.skills/gt-motion/SKILL.mdReviewSVG lines in motion: timing numbers
40 to 90msStaggers run in reading direction at this spacing.skills/gt-motion/SKILL.mdReviewSVG lines in motion: timing numbers
0.62s with a 0.055s stagger, from 16px downThe GT landing reveals its content with this tween.gt-cloud's reveal.tsReviewSVG lines in motion: timing numbers
180ms ease-out from 4px downRows on the dashboard's sign-in and onboarding plates reveal with this tween.gt-cloud's brand-tokens.cssReviewSVG lines in motion: timing numbers
120 to 220ms, 0 under reduced motionThe shell's chrome transitions run in this range, from a button's colour to the sidebar column.--pt-dur-fast to --pt-dur-sb in tokens.cssReviewSVG lines in motion: timing numbers
350ms and 150msA dithered resolve and a dithered step take these times, halved from 700 and 300ms on Kevin's request of 2026-09-29.RESOLVE_MS, STEP_MS in src/app/craft/TransitionDemo.tsxReviewDither in practice: transitions on one grid
240ms ease-outA field's first paint is a keyframe fade, because a CSS transition never runs on the first frame.gt-cloud's brand-field-picture-in keyframeReviewSVG lines in motion: transitions at first paint
0.25s or moreAn assembly moves one group at a time and rests this long between groups.skills/gt-motion/SKILL.mdReviewSVG lines in motion: timing numbers
0.7s power2.inOut, requests debounced 0.25s, none under 720pxThe moving type law allows one width tween per cycle, and phones found it slow, so the em pins to the column there.skills/gt-motion/SKILL.mdReviewSVG lines in motion: moving type
Scale 1.00 to 1.04 over a sceneA camera drift is allowed on a picture or a field, and type holds still.skills/gt-motion/SKILL.mdReviewSVG lines in motion: timing numbers
30 fpsThe CPU dither loop runs at this rate by default, which keeps the main thread free.src/lib/dither.tsReviewDither and the studio field: what a field costs

SVG lines

ValueReasonToken or constantHeld byExplained in
'100 200' parked at +101 or -101The gap keeps every dash edge clear of both ends, and the sign picks the end a draw-on grows from: + from the first point, - from the last.The draw-on tweens; skills/gt-motion/references/traps.mdReview of 2x cropsSVG lines in motion: the sign of the parked offset
pathLength 1000GSAP integer-rounds pixel CSS properties, so a looping dash on 1000 units moves by sub-pixel steps.autoRound: false on every dash tweenReviewSVG lines in motion: rounding, cached paths and empty paths
About 100ms earlyA capture synced to a GSAP state polls a CSS variable and fires early, so its own latency lands it inside the state.The capture harnessReviewSVG lines in motion: GSAP from outside the page
22 units for 20.1pxLabels in an 800-unit viewBox that renders at 0.914 are set after the scale.skills/gt-diagrams/SKILL.mdskills/gt-diagrams/scripts/figure-check.mjsSVG lines in motion: drawing under a stretched viewBox
y1="70.5"A 1px line at 1:1 sits on a half-pixel coordinate to fill one row of device pixels.skills/gt-diagrams/SKILL.mdReview of 2x cropsSVG lines in motion: drawing under a stretched viewBox
-8 214 1213 771, aspect about 1.573The GT monogram symbol carries this viewBox, so an svg that copies it draws the mark 214 units too high; the referencing svg takes only a width and height, such as 132 by 84.#gt-mark in deck/parts/head.html; src/lib/marks.tsReviewSVG lines in motion: symbols and masks

Isometric drawings

ValueReasonToken or constantHeld byExplained in
30 degrees, tan 30 (0.577) and the square root of 1.5Flat art reaches the iso plane by a 45 degree turn, y scaled by 0.577 and the whole scaled by the square root of 1.5. A 2:1 squash scales y by 0.5 and lies flatter than the face under it.project() and plane() in src/app/d/toolchain/diagrams/iso.tsReviewIsometric drawings: numbers and traps
2.4, and 1.2 on diff slatsOne corner radius serves the family; at 2.4 a thin slat reads as a capsule.ISO_RADIUS in iso.tsReviewIsometric drawings: numbers and traps
About 4% of the footprint thick, about 40% air between platesShared proportions make separate drawings read as one set.skills/gt-diagrams/references/isometric.mdThe gt-diagrams review checklistIsometric drawings: numbers and traps
Rim 0.12 + 0.08 d, top edge 0.24 + 0.24 d, front edge 0.08Depth comes from each plate's stroke alpha, where d runs from 0 at the bottom plate to 1 at the top.skills/gt-diagrams/references/isometric.mdReviewIsometric drawings: numbers and traps
240 by 180The shared viewBox fixes the relative scale of the family.ISO_VIEW_W, ISO_VIEW_H in src/app/d/toolchain/diagrams/IsoFrame.tsxReviewIsometric drawings: the kit

Dither

ValueReasonToken or constantHeld byExplained in
8 by 8 Bayer, 65 levelsA constant tone k/64 lights exactly k cells of every tile, and a cell is lit when its tone exceeds (m + 0.5) / 64.BAYER_8 in src/lib/dither.tsReviewDither in practice: ordered dither
1, 2, 3, 4 and 6 CSS px cellsThe cell grows with the use: photographs, the sign-in globe, full-bleed fields and every film, an animated burst, then small stills. From 8px a screen reads as pixel art.scale on the CPU loop; skills/gt-dither/SKILL.mdReviewDither in practice: cells are screen pixels
min(devicePixelRatio, 2)The GPU studio field computes cells from device pixels, and a dpr of 1 upscaled blurs them together.dpr in src/lib/studio-field.tsReviewDither in practice: cells are screen pixels
Opacity 0.55 in screen blend, mask 0.72 at the edges to 0.12 at the centreThe landing hero's material is the strongest a product surface may carry.Studio preset 02, bayer-8x8; skills/gt-dither/SKILL.mdReviewDither in practice: material strength
Mean tone 0.361, standard deviation 0.342Every dithered photograph is cut to the Blue Marble's own statistics, accepted from 0.30 to 0.42 and 0.28 to 0.44.scripts/media/mood-tone/standard.jsonnode scripts/lint/pictures.mjsDither in practice: the picture standard
Gamma 1.2, 0.5% autocontrast, no blurThese settings are fixed for every picture, since a blur of sigma 3 erased the Rosetta Stone's inscriptions.scripts/media/mood-tone/standard.jsonnode scripts/lint/pictures.mjsArtifact pictures: the tone grid
JPEG quality 82, 75 over 573,440 bytesThe byte cap keeps every grid under 560KB.scripts/media/mood-tone/standard.jsonnode scripts/lint/pictures.mjsDither in practice: the picture standard
144k cells at scale 3: 0.8 to 15.1ms a frameThe CPU loop's cost is linear in cells, and halving the cell size quadruples it, so a full-bleed field never animates at scale 1 (1.3 million calls).The field functions in src/lib/dither.tsReviewDither and the studio field: what a field costs
A disc 1.7 times the stack's height, its limb five sevenths along the rampThe onboarding earth sits under the thick part of the field's ramp, where the first placement left it under the thin start.src/components/plate/brand/moodPictures.tsReviewDither in practice: placing a picture on a field

Interface

ValueReasonToken or constantHeld byExplained in
44px target, under 40px a defectA phone tap target aims at 44px, and the page check fails one under 40px and notes 40 to 43px.TAP_DEFECT_UNDER, TAP_NOTE_UNDER in scripts/check/pagecheck/probes.mjspnpm check:pagesInterface details: tap targets that keep the look
0.001 per layout-shift entryAn entry within 500ms of an input stays out of the CLS score and is still a jump a reader sees.SHIFT_FLOOR in scripts/check/pagecheck/cls.mjspnpm check:pages --cls-traceInterface details: layout shifts
CLS over 0.1 fails, over 0.05 is a noteThe first is the Web Vitals limit, and the second is a margin under it.CLS_DEFECT, CLS_NOTE in scripts/check/pagecheck/probes.mjspnpm check:pagesProving a visual change: the stress matrix
4.5:1 for text under 24pxTitanium #8a8f98 on white is 3.25, so light captions take #6e737c at 4.77 or ink-2.--pt-titanium, --pt-ink-2 in tokens.cssReview; measure-type.mjsInterface details: contrast
About 1.6sA copy control holds its check this long, announced to screen readers, and its label never changes.InstallField in src/components/viewer/InstallField.tsxReviewInterface details: the copy control
350ms and 4.5sA carousel drops a command within 350ms of the last one, and autoplays every 4.5s until hover, focus or reduced motion stops it.The blog carousel in gt-cloud; skills/gt-website/references/blog.mdReviewInterface details: carousels and galleries
16px or largerInputs below the md breakpoint stay at this size so iOS does not zoom on focus.skills/gt-components/SKILL.mdReviewInterface details: third-party widgets and the site's theme

The deck

ValueReasonToken or constantHeld byExplained in
1600 by 900Every slide is drawn on one sheet that scales to the window.deck/DECK-GRAMMAR.mdnode shoot-slide.mjs prints any element past the sheetThe brand deck: the sheet and the grammar
56pxThe viewer draws the rails and rules this far in from each edge, and a slide never redraws them.deck/DECK-GRAMMAR.mdReviewThe brand deck: the sheet and the grammar
h1 88px, h2 44px, .big 72px, p 22px, .lead 26pxThe deck sets its type at these sizes on the sheet.The shared styles in deck/parts/ReviewThe brand deck: the sheet and the grammar
15px for text, 18px for SVG labelsText under 15px on the sheet is a defect, and an SVG label is never under 18px..cap and .sm in deck/DECK-GRAMMAR.mdReviewWriting: slides and cards
256px or 208pxThe deck viewer's slide list takes these widths with thumbnails and in outline density.--sb-w in deck/parts/head.htmlReviewThe brand deck: the viewer

Graphics

ValueReasonToken or constantHeld byExplained in
3 to 5xProduct captures are taken at this scale, lossless, so crops stay sharp after zoom.SHOTS in graphics/build/gen-lib.js; graphics/shots/hi/ReviewGraphics pipeline: the files
26px after zoom-to-fitNo text on the 1600px stage is smaller than a label chip once the composition is fitted.MIN_TEXT in graphics/build/gen-lib.jspnpm graphics:auditGraphics pipeline: sizing
About 700 CSS px, 0.44xA blog column shows the 1600px stage at this scale, so every label is sized for it.The 1600px stage in graphics/build/gen-lib.jspnpm graphics:auditGraphics pipeline: sizing
3840 wide webp at quality 95; OG 2400 by 1260The exports serve a dense deviceSizes ladder through next/image.graphics/build/export-blog.pyReviewGraphics pipeline: sizing
712pxThe blog globe figure is laid out at this review column before it scales.src/components/blog-globe/blog-globe.cssReviewThe blog globe figure: measurements

Films

ValueReasonToken or constantHeld byExplained in
-16 LUFS within 0.5, true peak at or under -1 dBTPA film meets these loudness targets, and the renderer lowers a track whose true peak passes -1 dBTP to -1.5 dBTP.skills/gt-films/references/sound.mdffmpeg -af ebur128=peak=trueFilms: the mix and its traps
About -26 LUFS under speech, -20 LUFS aloneThe music bed's duck is about 6dB in loudness terms.skills/gt-films/references/sound.mdReviewFilms: the mix and its traps
0.1s of silence; a -9dB shelf at 100HzA clip at full level from its first sample bumps, and sub-bass downbeats made the AAC encoder overshoot by up to 2.6dB.skills/gt-films/references/sound.mdReviewFilms: the mix and its traps
2.60 words a secondThe narrator speaks at this rate, scripts are planned on it, and a take is never sped up.skills/gt-films/references/sound.mdReviewFilms: speech synthesis
640 by 360A film plays at this size on a phone, so every thin line is checked there.skills/gt-films/SKILL.mdThe film criticFilms: thin lines over a dithered ground
3px cells, 8 by 8 BayerEvery GT film uses one screen, set on 2026-10-08.skills/gt-films/SKILL.mdThe film criticDither in practice: cells are screen pixels
5 GiB free, 8 GiB for several workersA render with several workers writes every frame before it encodes.skills/gt-films/references/kit.mdReviewFilms: frames, probes and disks
The stakes in 6 to 8s; about two picture events a secondA film states its stakes early and moves one thing at a time.skills/gt-films/SKILL.mdThe film criticFilms: pacing and scripts

Skills

ValueReasonToken or constantHeld byExplained in
1024 charactersA skill's description says what it covers and when to use it within the length agents load.MAX_DESCRIPTION in scripts/build/skills.mjspnpm lint:skillsSkills: the contract
24,000 bytesA SKILL.md body stays under this budget, and detail moves to references/ without deleting a rule.BUDGET in scripts/build/skills.mjs; exemptions with reasons and expiry dates in scripts/build/skills.budget.jsonpnpm lint:skillsSkills: the contract
30 daysA skill with no loads thirty days after distribution is cut unless Kevin keeps it by name.DAYS in scripts/skills/usage.mjspnpm skills:usageSkills: kept by use

Docs and SEO

ValueReasonToken or constantHeld byExplained in
50 to 160 charactersA description of this length shows whole in a search snippet.DESCRIPTION_MIN, DESCRIPTION_MAX in scripts/lint/seo.mjspnpm lint:seo; pnpm lint:registriesThe SEO system: what one call writes
60 charactersA title drops its section, then the site name, when it passes this length.TITLE_MAX in src/lib/seo/route.tspnpm lint:seoThe SEO system: what one call writes
1200 by 630The social card is cached for a year, because it is a pure function of its query.src/app/og/route.tsx; OG_VERSIONpnpm lint:seo:liveThe SEO system: the social card
Two segments under /docsThe Markdown twin rewrites cover docs URLs this deep, so a deeper folder needs a third rule.TWIN_REWRITES in next.config.tspnpm lint:seo:liveThe SEO system: why the twins are prerendered
tokenizeTimeLimit: 0Shiki's default 500ms limit leaves part of a line plain on a loaded build machine, so two builds differ.source.config.tsReview of a production buildDocs site traps: code highlighting across builds
next 16.2.12Next.js 16.3 holds memory for every prerendered page, and a 7,117-page build died at page 1,779.package.jsonReviewDocs site traps: prerender memory on Next.js 16.3

Engines

ValueReasonToken or constantHeld byExplained in
About 16 live WebGL contextsPast this budget Chrome's getContext returns null and a field draws black with no error.One engine per module in src/lib/studio-field.ts, horizon-field.ts and prismatic-field.tsReview; the frame probe's gl columnCanvas and WebGL engines: the context budget
1 context per engine module, 0 created by a probeThe context survives every destroy(), and a probe that calls getContext exhausts the budget it counts.The same modulesReviewThe component library: the numbers behind it
180pxA lazy plate mounts its engine when it first comes this close to the viewport.rootMargin: '180px' in src/components/docs/demos/hooks.tsReviewThe component library: the numbers behind it
2.5s warmup, windows of 120 frames, gaps over 900ms skippedThe glyph rain judges its quality tier from measured frame time, because a tier chosen by window width gave weak hardware the heaviest one.GOV_WARMUP_MS, GOV_WINDOW, GOV_GAP_MS in src/lib/glyph-field.tsThe frame probe's --cpu 12Canvas and WebGL engines: quality from measured frame time
35% of frames over 22msThe trip counts slow frames, because a median missed throttled hardware that ran over budget on 34% of its frames.GOV_TRIP, GOV_BUDGET_MS in src/lib/glyph-field.tsThe frame probe's --cpu 12Canvas and WebGL engines: quality from measured frame time
Pixel-ratio cap 2 to 1.25, then 560 of 1,280 glyphsThe governor's two tiers only step down, so it never oscillates.DPR_CAP, DPR_CAP_NARROW, NARROW_POOL, POOL in src/lib/glyph-field.tsReviewCanvas and WebGL engines: quality from measured frame time
About 1,000ms of every secondAn engine that resized its one GL canvas to each field reallocated it twice a frame, so the canvas now only grows.The blit in src/lib/prismatic-field.tsReviewCanvas and WebGL engines: a shared canvas that only grows
12 live pages, 1.3 GB and about 950ms of every secondA gallery that froze each preview still paid this, so previews are stills until hover.src/app/present/viewer/LazyFrame.tsx; the rAF gate in src/app/layout.tsxReviewCanvas and WebGL engines: galleries of live previews
6.5KB to 4.4KBComments inside a GLSL template literal ship to every visitor, so they move to a TypeScript comment.The horizon shader in src/lib/horizon-field.tsPixel diff of a deterministic frameCanvas and WebGL engines: shader source weight
5 fps against 56 fpsA seam drag ran at these rates over 27,800 SVG nodes and over one canvas, at 4x CPU throttle.--seam-cut on the reveal seamReviewLottie on canvas: before and after

Gates

ValueReasonToken or constantHeld byExplained in
0, 1 and 2Every lint exits 0 on a pass, 1 on findings and 2 when it could not judge, so a missing server stops a chain as a finding does.Each script under scripts/lint/Every gateGates: exit codes
3 to 5 minutespnpm exec tsc --noEmit is a gate of its own, because next build never type-checks here.typescript.ignoreBuildErrors in next.config.tsThe type checkGates: the type check
About 25 minutespnpm lint:all runs every static lint, then the browser audits one at a time.package.json; skills/prototemplate/SKILL.mdpnpm lint:allGates: the gates, in order
One browser gate at a timeA parallel capture made pnpm lint:lines:shell fail on correct pages on 2026-10-01.siteRoutes() in scripts/lib/site-pages.mjsEvery browser gateGates: browser gates run one at a time
Per fileA ratchet counts findings per file, so a line another session moves never reads as a new finding.scripts/lint/*.baseline.json--update-baseline after a cleanupGates: ratchets
HTTP 400 or more exits 2A 404 page audits at about one line and would pass.scripts/lint/lines.mjspnpm lint:linesLines and seams: the line auditor's thresholds
Five rows read by regexThe route list finds the first skill, motion package, archive entry and exploration and the newest post in data files, so a generator's output shape is load-bearing.firstSlug() in scripts/lib/site-pages.mjspnpm lint:registries check 3Scripts: first slugs read by regex

Dev servers and the machine

ValueReasonToken or constantHeld byExplained in
Port 3005The shared dev server runs here, and every other worktree runs its own server on its own port.pnpm dev; PT_BASE in the browser gatesReviewGet started: run the site
64 GBA long-running shared server's .next/dev grew this large, so the restart deletes it..next/devReviewDev servers and builds: failure modes of next dev
900s or moreA cold image request on a loaded dev server hangs this long and times out a page check.The image optimizer of next devReviewDev servers and builds: failure modes of next dev
2,880 minutesgt-cloud's pnpm refuses any version published in the last two days, so pnpm add can fail on an unrelated dependency.minimumReleaseAge in gt-cloud's pnpm-workspace.yamlpnpm itselfDev servers and builds: a minimum release age for dependencies
Two hours, and about 90 minutesClaude Code stops a background shell task at two hours, so a job that may run past 90 minutes starts detached and writes its own process id.skills/gt-orchestration/references/harness-traps.mdReviewAgents on one machine: long commands
128GBThe workstation ran out of application memory twice on 2026-10-12, so each heavy job is gated on its own memory estimate.headroom can-start --gb <n>ReviewAgents on one machine: memory and disk

Pull requests and workflows

ValueReasonToken or constantHeld byExplained in
420 to 900 CSS px wide, 620px tall at most, 24px of paddingA before and after crop is readable in a pull request body, where full-page captures render as strips.skills/gt-ship/references/pr-body.mdReviewPull requests and CI: size and shape
5/5 on the head commitA gt-cloud pull request waits for this Greptile score, with every bot thread answered and resolved.skills/gt-ship/references/review-loop.mdReviewPull requests and CI: review bots
4096MBThe dashboard's type check outgrew Node's default 2GB heap in CI.--max-old-space-size in gt-cloud's buildCIPull requests and CI: CI signals that mislead
About 1,800 words in, about 700 words outA build fan-out starts from a spec of this size, and a build lane reports in this many words.skills/gt-orchestration/references/briefs.mdReviewAgent workflows: workflow shapes
Three refuters, two of three to standA critical or major finding stands only when at least two refuters fail to refute it.skills/gt-orchestration/SKILL.mdReviewAgent workflows: refuting findings
8.5 of 10 per dimension, 90 of 100 overallA fresh critic scores quality work against a named reference, in every view.skills/gt-orchestration/references/convergence.mdThe criticAgent workflows: kinds of check
35 of 50A draft whose humanizer score on five axes totals less goes back for another revision.skills/gt-voice/SKILL.mdReviewWriting: the humanizer pass

Sources

  • Prototemplate, read on 2026-10-21: src/components/viewer/tokens.css; DESIGN.md sections 2, 4 and 15; deck/DECK-GRAMMAR.md; docs/GRAPHICS.md; scripts/lint/type.mjs, radius.mjs, lines.mjs, heads.mjs and seo.mjs; scripts/check/pagecheck/probes.mjs and cls.mjs; scripts/build/skills.mjs and scripts/skills/usage.mjs; src/lib/glyph-field.ts, studio-field.ts, prismatic-field.ts, dither.ts, fonts.ts and seo/route.ts; src/components/docs/demos/hooks.ts; src/app/craft/TransitionDemo.tsx; src/app/d/toolchain/diagrams/iso.ts and IsoFrame.tsx; graphics/build/gen-lib.js; scripts/media/mood-tone/standard.json; package.json; the files in public/fonts/.
  • The curated skills, read on 2026-10-21: gt-brand (references/type.md), gt-motion (section 2 and references/traps.md), gt-diagrams (references/isometric.md), gt-dither (references/engines.md, references/pictures.md), gt-films (references/sound.md, references/kit.md), gt-performance (references/webgl-lifecycles.md), gt-website, gt-ship, gt-orchestration, gt-voice, gt-aesthetic and prototemplate.
  • The docs pages each row links to, which hold the measurements with their dates.

On this page