agentkit · skill showcase · 2026-08-05

Five passes turn any design request into a page whose visual system was derived from that subject

It is a method, not a theme: four authoring passes that end in a measured verification loop, which can hand the work back before anything ships. This page was produced by running that method on the skill itself.

skill designer output self-contained HTML floor references/scaffold.html gate both themes, measured bar indistinguishable from a Claude artifact
01 · Overview

The whole method, one figure

Your request enters as words at the far left and leaves as a file at the far right. In between: three passes that decide how the page will look before any markup exists, one that writes it, and one that measures it — and can hand the work back. Everything later in this page is a zoom into one of these six boxes.

an authoring pass — a human decision a clause of the contract — a number measured evidence a documented failure mode
showcase/index.html verify · pass 2 Read screenshots Re-verify

Grammar · routed

header.pageused
.mockused
.stripused
.stepsused
tableused
.seqused
.nongoalsused
.acceptused
.phasescut

Pass 3 deletes every component the page does not use. A method has no delivery slices, so .phases never shipped.

01 · read
classify the askpolished vs editorial
02 · design plan
the three linesbefore any code
03 · scaffold
copy · re-derivereferences/scaffold.html
04 · compose
concept → componentreal content only
05 · verify
capture · probeboth themes, measured
hand-off
host takes the filepublish-page · repo

Inspector · 05 verify

geometry · this page
overflow-x wrappers6
clipped0
svg endpoints6 on border
page height6991 px
contrast · computed
pairs per theme396
min · light5.44
min · dark5.23
floor4.50
Accept Re-run

What pass 05 found in this page — read back out of the render, not eyeballed. Section 05 zooms in.

02 · Zoom · each pass

What the five boxes actually do

The order is load-bearing. The palette is decided before any markup exists, so the page cannot drift into a house theme; the scaffold is copied before composition, so quality has a floor; verification runs last and can send the work back to pass 04.

Read the request. A design doc, plan, or brief gets the polished utilitarian treatment — real hierarchy, considered spacing, no gigantic hero. Only a landing page or a keep-and-share app earns editorial flourish. Unsure means well-composed, not over-designed. judgement · not a template choice
Write the design plan before any code. Three lines kept with the work: colour (4–6 named hex values, neutrals hue-biased toward the accent, 2–4 semantic families with -soft grounds), type (a sans for body, mono for labels only, stacks named), layout (one sentence). semantic colour answers “what must the reader tell apart”
Start from the scaffold. Copy references/scaffold.html, rename the semantic families to the plan’s, re-derive every value, and delete every component the page does not use. Its token structure is a contract; its example palette is not. references/scaffold.html
Compose by routing. Each concept goes through the component grammar — a surface gets a mockup, a pipeline gets a strip, enumerable facts get a table. Real paths, real payloads, real numbers: a mockup with placeholder labels fails exactly like a diagram of “API” boxes. grammar table · section 04
Verify by looking, then by measuring. Screenshot both themes at full height, read the images back, probe the DOM for clipping and endpoints, compute every contrast pair. Fix and repeat. An unviewed page is never delivered. the loop in section 05
03 · The token system

Four families, taken from this subject’s own distinctions

Semantic colour is not decoration; each family names something the reader has to keep apart. For a method, those four things are: a pass you perform, a clause that binds you to a number, evidence you measured, and a failure the skill has already met. A different subject yields different families — that substitution is the whole idea, and section 07 shows it.

Zoom · how one family is derived
The subjectits own distinctions
what differs
2–4 familiesfrom the subject
needs a ground
--x / --x-softa pair, not a colour
re-picked
3 theme blocks:root · media · [data-theme]
computed
≥ 4.5:1on surface AND on soft
--step / --step-soft

An authoring pass: something a designer decides, not something a checker can compute.

light#9c2a6e · #fbe7f3
dark#f48fce · #3a1330
on --surface7.07 · 8.00
on --step-soft6.00 · 7.35
--step on --step-soft
--bind / --bind-soft

A clause of the contract: a number the page must satisfy — widths, measures, ratios.

light#1f57a8 · #e4edfb
dark#86b4ff · #142944
on --surface7.03 · 8.27
on --bind-soft5.96 · 6.98
--bind on --bind-soft
--proof / --proof-soft

Measured evidence: a value read back out of the rendered page, never an estimate.

light#106a4e · #dff2ea
dark#4fd0a0 · #0d3328
on --surface6.58 · 8.99
on --proof-soft5.64 · 7.14
--proof on --proof-soft
--trap / --trap-soft

A failure mode the skill documents because it has already shipped past someone once.

light#ab3220 · #fce7e1
dark#ff9c85 · #3d1a14
on --surface6.54 · 8.56
on --trap-soft5.50 · 7.63
--trap on --trap-soft

Dark values are re-picked, not inverted — compare any pair of rows above and the second is not a mathematical flip of the first. Soft grounds go deep and desaturated; accents brighten to hold their ratio. Theme changes travel through tokens only: no component carries a rule inside the colour-scheme media query, which is why the OS path and the toggle path can never disagree.

ClauseValueWhy it is a number and not a taste
Semantic contrast≥ 4.5:1On --surface and on its own -soft ground. The soft-ground half is the binding one: light accents that look right land near 3:1 there.
Surface levels3 minimum--bg, --surface, --surface-2. Depth comes from layering, not from stacked shadows.
Theme blocks3:root, the dark media query, then both [data-theme="dark"] and [data-theme="light"] so a host toggle overrides the OS in both directions.
Canvas≤ 1080 pxWider figures scroll inside their own wrapper; the body itself never scrolls sideways.
Prose measure≤ 68 chRunning paragraphs only. Structured list rows — non-goals, acceptance — may run to ~82 ch.
Body type15–16 px / 1.6Sans. Mono is confined to eyebrows, labels, data and code — mono body reads as a terminal dump.
Heading scale34 / 21 pxh1 at weight 650 and −0.015em tracking; both levels text-wrap: balance.
Eyebrows10.5–11 pxUppercase mono at 0.1–0.14em tracking, paired with the h2 on one baseline.
Radii4 / 6 / 8 / 10 · 99One scale for the whole page. Pills are the only exception.
Mockup rails≤ 430 pxCombined, at a 1080 canvas — so the drawn surface keeps roughly 640 px to be a surface.
04 · The grammar

Every concept is routed, never free-styled

Composition is a lookup, not an improvisation: identify what a concept is, then take the component that already encodes it. The last column is this page’s own routing — including the one component that was deleted for having nothing to describe.

The concept isComponentOn this page
Page identity + load-bearing decisionsheader.pageTitle, lede, five chips naming the skill, its floor and its gateused
A UI or product surface the page describes.mockSection 01 — the centerpiece: all five passes plus the hand-off, with pass 05's readout in the railused
Linear pipeline whose stages carry state.stripSection 03 — how one semantic family is derived, subject → families → pair → theme blocks → ratioused
Ordered passes through a system.stepsSection 02 — the zoom into each pass, top border encoding authored / bound / provenused
Enumerable facts, N items × M propertiestableSections 03, 04, 07 — the numeric clauses, this routing, and the generalisationused
Ordered messages between ≤6 participants.seqSection 05 — the zoom into pass 05: seven messages between agent, browser, probe and filesused
Verifiable done-criteria.acceptSection 08 — each row carries the measurement that discharged itused
Refused scope.nongoalsSection 06 — the looks the skill will not spend its freedom onused
A state code the figures share.legendAbove the mockup, once, before the first figure that uses the four familiesused
Evidence the page rests onfooterReal paths, the capture command, the measured numbersused
Delivery slices with estimates.phasesDeleted at pass 03 — a method has no shippable slices, and a card with invented estimates would be a liecut
Loop-backs, trust boundaries, hand-drawn architecturediagram skillEscalation — inline its SVG in a figure block instead of forcing the grammarabove
>6 participants, alt/loop fragments, state machinesmermaidEscalation — where the host renders it, else the diagram skill. Never ASCII artabove

Inventing a component above this floor is encouraged when the subject demands one — the token cards in section 03 and the trap cards in section 05 are two, built for this page and kept strictly on its tokens.

05 · Zoom · inside pass 05

The loop that decides whether the page is finished

This is the fifth box of the overview, opened up. Looking is mandatory but not sufficient: the eye passes a clipped figure, a 3.2:1 pill and a page whose bottom third was never rendered. So each pass runs headless Chrome twice, reads both images back, and then interrogates the DOM for the three things looking cannot settle.

One verification pass, message by message
designer chrome --headless=new DOM probe index.html · *.png
01load · --dump-dom
02evaluate probe script
03scrollHeight · rects · ratios
04--screenshot --window-size=1280,7078
05light.png · dark.png at full height
06Read both images · judge the composition
07defect → rewrite endpoints, darken token, re-run 01

Three rules make the loop honest, and each one exists because of a specific way a page lies about being finished.

A fixed-height capture verifies the top and calls the rest clean. The window is 1280×800, the page is 4000 px, and everything below the fold is unviewed — including the figure that broke. Worse, --window-size is the window, not the viewport: headless keeps 87 px for chrome, so even a “full-height” capture loses the last lines. size the window to scrollHeight + the measured viewport delta
Estimated endpoints drift the moment text rewraps. Absolute figures depend on the font that actually resolved, not the one you assumed. Arrows end in mid-air or overshoot the node. dump offsetLeft/Top/Width/Height, derive endpoints from measured borders
A horizontally clipped figure is invisible under --hide-scrollbars. The screenshot looks fine because the scrollbar that would have told you is suppressed; a third of the strip is simply gone. assert scrollWidth === clientWidth on every overflow-x wrapper
The eye happily passes a 3.2:1 mono pill. Small mono on a soft ground is exactly where accents fail, and exactly where a designer stops looking. resolve tokens per theme, compute WCAG for every pair actually used
Arrowheads vanish inside an SVG edge layer. .edges path { fill: none } cascades into the marker’s own path, so every head renders empty — on a figure that otherwise looks correct. .edges marker path { fill: currentColor } + style="color:var(--token)"
Mono body copy reads as a terminal dump. The exact look the skill exists to replace, reached by using the label face for prose or headings because it felt technical. mono for eyebrows, labels, data, code — nothing else
06 · Non-goals

What the freedom is never spent on

Where you pin a direction, the skill follows it exactly. Left free, it still refuses the handful of looks that read as an AI reflex rather than a decision.

Warm cream, a serif, and terracotta. The default “thoughtful” costume; it says nothing about the subject underneath it.
Near-black with one acid accent. Reads as a dashboard screenshot, and leaves no second family for a real distinction.
A purple-to-blue gradient hero. Costs a screenful of vertical space and carries zero information.
Inter or Space Grotesk as the reflex face. Not wrong — unchosen. A stack should be named in the plan for a reason.
Emoji section markers and everything centered. Centred text destroys the left edge that makes scanning possible; emoji substitute mood for hierarchy.
A pure mid-grey neutral. Reads as unconsidered. Neutrals carry a slight bias toward the accent — the plum in this page’s greys is deliberate.
A fixed house theme poured over new content. The failure this whole skill exists to prevent: the palette is derived per subject, or it means nothing.
07 · Any subject

What happens when you hand it something else

Only one input changes: the distinctions the reader must keep apart. Those become the semantic families, the families drive the palette, and the grammar routing follows from what the content is. Nothing about the method is specific to design.

Hand itWhat a reader must tell apartFamilies it would deriveComponents it would route to
This skill Passes of a method, numeric clauses, measured evidence, documented failures from the subject mock, strip, steps, tables, seq, non-goals, accept
A migration plan What exists today, what gets built, what a human must approve, what is done exists · build · gate · ok strip for the cutover, steps for one run, phases for the slices, accept
An incident review Timeline fact, contributing cause, mitigation applied, still open fact · cause · fix · open seq for the timeline, table for the causes, accept for the follow-ups
An API proposal Stable surface, new surface, deprecated, authenticated-only stable · new · sunset · authed mock of the console, table of endpoints, seq of one exchange, non-goals
A capacity report Measured now, projected, headroom left, breach threshold now · projected · slack · breach tables with tabular-nums, strip of the growth path, accept as alert thresholds

What you can therefore predict about any request you hand it: a three-line plan you can argue with before code exists, a palette derived from your subject rather than a house style, components chosen by a lookup you can audit, and a page that was screenshotted and measured before it reached you.

08 · Acceptance

What had to be true before this page was handed over

Both themes captured at the page’s full documentElement.scrollHeight and read back as images, not assumed. 1280 × 6991, twice
Every overflow-x wrapper reports scrollWidth === clientWidth, so no figure is silently clipped. 6 wrappers · 0 clipped
Every semantic text/ground pair computes at or above 4.5:1 from the tokens as resolved in each theme. 396 pairs · min 5.44 light, 5.23 dark
Every SVG edge endpoint sits on a node border measured from the rendered DOM. 6 edges · max gap 4 px
No placeholder content: every class name, path, rule and number on this page resolves to something real in the skill. SKILL.md · scaffold.html
Mono type appears only in eyebrows, labels, data and code; all running prose is the sans stack at 15.5 px / 1.6. by construction
The theme toggle stamps data-theme and persists it, and no component carries a rule inside the colour-scheme media query. tokens only