Skip to content

Commit bfd17ba

Browse files
Give impeccable four measured modes instead of adjectives
The skill described production-grade typography, motion and spacing, which is a description of a bar rather than the bar. The one head-to-head anyone has run found prose instruction without retrieval made outcomes worse than no instruction at all, 9.94% against a 6.08% baseline, while the same instruction with retrieval context reached 1.82%. Telling a model to be tasteful is net-negative; handing it a measured type scale is not. Four modes, measured 2026-08-23 from live sites via computed styles, pixel histograms, canvas autocorrelation and font-outline run-length measurement. Each signature is written as implementable CSS rather than named: pixel four feTurbulence filters swapped by steps(1) at 400ms/4 = 10fps, the traditional animation boil rate, on exactly one element plate a display face quantized to 32 units per em, so step = fontsize/32 and scale alone flips it between Renaissance serif and CRT bitmap editorial a sticky 100svh hero overscanned to 1.17x that never moves a pixel, with an opaque curtain scrolling over it; no parallax JS at all scrollfield animation-timeline with stagger encoded as animation-range offsets rather than delays, so mid-transition elements coexist at different opacities while scrolling; no motion library on the page Invariants are separated from divergences because the divergences contradict each other -- 2px base against 4px, grain against none, binary radius against a three-step set -- and averaging resolves each contradiction toward the default. Opt-in via .impeccable/brand.json, which ui-gate/rules/tokens.sh already reads. Absent, nothing fires. Claude Design recorded as a publishing lane: /design-sync pushes a design system up, the return trip is a manual export, there is no in-session pull.
1 parent a944111 commit bfd17ba

11 files changed

Lines changed: 825 additions & 5 deletions

File tree

.claude-plugin/marketplace.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"plugins": [
1111
{
1212
"name": "vstack",
13-
"version": "1.22.0",
13+
"version": "1.23.0",
1414
"source": "./claude",
1515
"description": "28 skills that fire without a slash command, 14 agents, 15 commands, and the session hook that routes situations to skills. Most skills are ported from pstack and Superpowers — see claude/skills/ATTRIBUTION.md for per-skill source and license.",
1616
"category": "workflow"

CHANGELOG.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,40 @@ Versions follow [semver](https://semver.org). The version lives in two manifests
66

77
## Unreleased
88

9+
## 1.23.0 — 2026-08-23
10+
11+
**Four visual modes, measured rather than described.** `impeccable` described the bar in
12+
adjectives, which cannot produce it. The only head-to-head anyone has run on config-layer
13+
interventions found prose instruction without retrieval made outcomes worse than none — 9.94%
14+
regression rate against a 6.08% baseline — while the same instruction with retrieval context
15+
reached 1.82%. So the bar now ships as numbers read off live sites: computed styles, pixel
16+
histograms, canvas autocorrelation, font-outline measurement.
17+
18+
`reference/modes/` carries `pixel`, `plate`, `editorial` and `scrollfield`, each with its
19+
signature mechanism written out as implementable CSS. What held across all four is separated from
20+
what distinguishes them, because the distinguishing properties contradict each other directly —
21+
base unit 2px against 4px, grain against none, binary radius against a three-step set — and
22+
averaging them resolves every contradiction toward the stock default.
23+
24+
The invariants are enforceable claims, not taste: weight 400 for all display and body with
25+
hierarchy carried by size and tracking; tracking as a monotonic function of size locked in `em`,
26+
crossing zero at 15–20px; line-height inverting with size; one accent hue or none; motion in two
27+
bands with nothing between 300 and 420ms.
28+
29+
**Opt-in per project.** A `.impeccable/brand.json` selects the mode and declares tokens.
30+
`ui-gate/rules/tokens.sh` already reads its `type.scale` and fails a build off it. With no such
31+
file nothing fires. A skill that decides on its own whether something deserves to be beautiful
32+
would fire wrongly and constantly; a file in the repo is a decision somebody made.
33+
34+
**Claude Design documented as a publishing lane.** `/design-sync` and `/design-login` are built
35+
into the CLI binary at 2.1.239 with a seven-operation `DesignSync` tool. Flow is one way — push a
36+
design system up, export by hand to come back — so it is not a generation lane and should not be
37+
planned around as one. Where the account lacks access, say so and tell the user to enable it
38+
rather than working around the absence.
39+
40+
Two defects were recorded from the references rather than copied: a 12px consent line failing AA
41+
at 4.34:1, and a scroll-driven site whose `prefers-reduced-motion` coverage misses its own hero.
42+
943
## 1.22.0 — 2026-08-23
1044

1145
**Register rule tightened after it failed once.** v1.21.0 banned commentary on the facts and did

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ while measuring nothing. The first five:
117117
- Two mutations stopped matching after a prose rewrite and reported the checks as unfalsifiable.
118118
The suite now distinguishes "this check is weak" from "this mutation landed nowhere".
119119

120-
The v1.22.0 audit found thirteen more, and they fall into four shapes worth naming:
120+
The v1.23.0 audit found thirteen more, and they fall into four shapes worth naming:
121121

122122
- **An anchor in prose that a prose edit moved.** Check 18's comparison of the README's
123123
context-cost figure was guarded by a grep for a sentence the same commit reworded into a table
@@ -163,9 +163,9 @@ cd vstack
163163
**Pinned to a release, reading the script first.**
164164

165165
```bash
166-
curl -fsSL https://raw.githubusercontent.com/itsvedantkumar/vstack/v1.22.0/bootstrap.sh -o bootstrap.sh
166+
curl -fsSL https://raw.githubusercontent.com/itsvedantkumar/vstack/v1.23.0/bootstrap.sh -o bootstrap.sh
167167
less bootstrap.sh # about 100 lines
168-
VSTACK_REF=v1.22.0 bash bootstrap.sh # installs that tag, not main
168+
VSTACK_REF=v1.23.0 bash bootstrap.sh # installs that tag, not main
169169
```
170170

171171
Check 24 fails if a version named in these docs is not a tag that exists. It was added after this

claude/.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "vstack",
3-
"version": "1.22.0",
3+
"version": "1.23.0",
44
"description": "Skills that fire on the situation instead of a slash command, plus the subagents, commands, and session hook that make them fire. Verification gates, parallel fan-out, code review, and writing discipline.",
55
"author": {
66
"name": "Vedant Kumar"

claude/skills/impeccable/SKILL.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,56 @@ The mode names what the visitor's success looks like on this surface.
3333

3434
Choose the mode from the requested surface, not the product, and persist it only in that surface brief. A tool's landing page is still Persuade; a fashion house's documentation is still Read; a docs index is Read, not Persuade. See [new-work.md](reference/new-work.md) for new surfaces and [operate.md](reference/operate.md) for deeper Operate/Read guidance.
3535

36+
## Visual modes, measured
37+
38+
The four surface modes above answer *what the visitor is doing*. They do not answer *what it looks
39+
like*, and a description of visual quality cannot produce it: the one head-to-head anyone has run
40+
found prose instruction without retrieval made outcomes worse than none (9.94% regression rate
41+
against a 6.08% baseline), while the same instruction with retrieval context reached 1.82%.
42+
43+
So the visual bar is carried by numbers read off live sites rather than adjectives.
44+
[reference/modes/](reference/modes/) holds four, measured 2026-08-23 from computed styles, pixel
45+
histograms and canvas autocorrelation:
46+
47+
| mode | reference | signature | base unit | texture |
48+
|---|---|---|---|---|
49+
| [pixel](reference/modes/pixel.md) | talk2hug | 4 SVG turbulence filters swapped at 10fps | 4px | grain .52 screen |
50+
| [plate](reference/modes/plate.md) | perseus | display face quantized to 32 units/em | **2px** | grain .06 overlay |
51+
| [editorial](reference/modes/editorial.md) | forge | sticky pinned hero, the page scrolls over it | 4px | **none** |
52+
| [scrollfield](reference/modes/scrollfield.md) | lighthouse | `animation-timeline`, reveals bound to scroll not to a clock | **2px** | **none** |
53+
54+
[reference/modes/README.md](reference/modes/README.md) carries what held across all three —
55+
weight 400 everywhere, tracking as a monotonic function of size locked in em, line-height
56+
inverting with size, one accent hue or none, motion in two bands with nothing between 300 and
57+
420ms. Treat a violation of those as a defect. The divergences are the modes, and they contradict
58+
each other directly on base unit, texture and radius; averaging them resolves every contradiction
59+
toward the stock default.
60+
61+
**These apply only where a project opted in.** A `.impeccable/brand.json` in the target repo
62+
selects the mode and declares the tokens; `ui-gate/rules/tokens.sh` reads its `type.scale` and
63+
fails a build off it. With no such file, nothing here fires and the surface is built normally.
64+
Schema and field-by-field rationale:
65+
[reference/modes/brand.schema.json](reference/modes/brand.schema.json).
66+
67+
## Claude Design
68+
69+
Claude Code ships `/design-sync` and `/design-login` built into the CLI binary (verified at
70+
2.1.239), backed by a `DesignSync` tool with `list_projects`, `create_project`, `get_project`,
71+
`list_files`, `write_files`, `delete_files`, `finalize_plan`. It detects Storybook or bare-package
72+
repo shape, builds and grades component previews, and maintains `.design-sync/` in-repo.
73+
74+
Direction is one way: **Claude Code pushes a design system up to claude.ai/design.** Coming back is
75+
a manual Export, "Hand off to Claude Code". There is no in-session pull and no public API, so this
76+
is a publishing lane, not a generation lane. Do not plan around generating a Design artifact from
77+
here.
78+
79+
Requires the feature enabled on the account. If `/design-login` reports no access, say so and tell
80+
the user to enable Claude Design for their account — Pro, Max and Team have it; Enterprise has it
81+
off by default and an admin must turn it on. Do not work around the absence.
82+
83+
Do not copy a signature move into a project that did not ask for that mode. One jittering element
84+
reads as deliberate; two read as a broken renderer.
85+
3686
## Commands
3787

3888
| Command | Category | Description | Reference |
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# Measured modes
2+
3+
Three reference sites, measured rather than described: computed styles read from a live browser,
4+
pixel histograms, autocorrelation on canvas output. Adjectives were excluded on purpose. The one
5+
head-to-head anyone has run on config-layer interventions found prose instruction without
6+
retrieval made outcomes worse than no instruction (9.94% regression rate against a 6.08%
7+
baseline) while the same instruction with retrieval context cut it to 1.82%. A mode file carries
8+
numbers for that reason.
9+
10+
Sources: talk2hug.com, perseus.computer, forgeresidency.com, lighthousehq.com, measured 2026-08-23.
11+
12+
## What every one of them does
13+
14+
These held across all three. Treat a violation as a defect, not a choice.
15+
16+
**Weight carries no hierarchy.** `font-weight: 400` for every display and body element. Forge uses
17+
500/600 on exactly two buttons and the wordmark. Hierarchy comes from size and tracking.
18+
19+
**Tracking is a monotonic function of size, locked in `em`.** Negative on display, zero in the
20+
middle, positive on small uppercase. Measured curves:
21+
22+
| site | at display | crossover | at eyebrow |
23+
|---|---|---|---|
24+
| forge | −0.12em @ 400px | 0 @ ~20px | +0.22em @ 11px |
25+
| perseus | −0.04em @ 124px | 0 @ 15–18px | +0.16em @ 10px |
26+
| hug | −0.05em @ 48px | 0 @ 16px | +0.24em @ 14px |
27+
28+
Locked in `em` so the ratio survives a fluid resize untouched. Forge's mobile display is exactly
29+
0.50× desktop with byte-identical tracking; that is why it does not read loose.
30+
31+
**Line-height inverts with size.** Display 0.88–0.95. Mid 1.35–1.5. Body 1.5–1.75. No exceptions
32+
in any of the three.
33+
34+
**One accent hue, or none.** Perseus `#647fff`. Forge `#16a85a`. Hug has no type accent at all and
35+
reserves pure `#ffffff` for a single line of stats. Everything else is a neutral ramp plus alpha.
36+
37+
**Ink is never pure white on a dark ground.** Hug `#f7f4ec` (4.3% warm). Perseus `#ecebf2` (cool).
38+
Ground is never pure black: `#050505`, `#09090b`, `#060708`.
39+
40+
**Tight groups inside enormous silence.** The ratio is the signature, not any single value:
41+
forge 7:1 (16px intra, 112–128px section), perseus 16:1 (1:1.5:3:5:16), hug 24:1 (8px to 192px).
42+
43+
**Measure under 60ch.** Forge 42–58ch. Perseus 55–62ch for prose. Hug 32.6ch. Machine output is
44+
exempt and runs long on purpose (perseus terminal transcript at 134ch).
45+
46+
**Emptiness is the product.** Text ink coverage: hug 1.22% of hero pixels, forge 12–27% per
47+
section, perseus ~20% of hero. Nothing here is dense.
48+
49+
**Motion has two bands and a hole.** Hover and colour 130–200ms. Entrance 420–760ms. Nothing
50+
between 300 and 420ms in any of the three. Stagger steps are small and explicit: 45ms (forge),
51+
75/80ms (perseus).
52+
53+
**prefers-reduced-motion is honoured structurally, not gestured at.** Hug removes the filter
54+
entirely rather than freezing a distorted frame. Forge defines its marquee only inside
55+
`@media (prefers-reduced-motion: no-preference)` so it never starts. Copy that, not a blanket
56+
duration clamp.
57+
58+
## Where they diverge, and what that makes them
59+
60+
| | pixel | plate | editorial | scrollfield |
61+
|---|---|---|---|---|
62+
| reference | talk2hug | perseus | forge | lighthouse |
63+
| base unit | 4px | **2px** | 4px | **2px** (8pt conformance 13%) |
64+
| grain | feTurbulence `screen` .52 | feTurbulence `overlay` .06 | **none** | **none** |
65+
| radius | 0 | 8 / 12 / 28 | **0 or 9999 only** ||
66+
| elevation | `blur(14px)` | `blur(56px)`, shadow `0 28px 80px/.76` | **zero shadows**, `ring-1` | 31× `backdrop-filter` |
67+
| display tracking | −0.05em | −0.04em | −0.12em | **`normal`, even at 80px** |
68+
| motion | CSS filter swap | mount-time entrances | IntersectionObserver | **`animation-timeline`, no library** |
69+
| signature | `pixel.md` | `plate.md` | `editorial.md` | `scrollfield.md` |
70+
71+
`scrollfield` is the one exception to the tracking invariant above: it leaves display type at
72+
`normal` and uses tracking only to open small mono caps. If you take that mode, take it whole.
73+
74+
Pick one. Averaging them produces the stock look with extra steps: the base unit, the grain and
75+
the radius policy contradict each other directly, and a blend resolves each contradiction toward
76+
the default.
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
{
2+
"$schema": "http://json-schema.org/draft-07/schema#",
3+
"title": ".impeccable/brand.json",
4+
"description": "Per-project opt-in. Absent by default: with no brand.json, ui-engineer and component-registry behave normally and ui-gate falls back to its default type scale. Present, it is read by ui-gate/rules/tokens.sh (TOK-TYPE-SCALE) and by impeccable. A skill that fires on whether something deserves to be beautiful will fire wrongly and constantly; a file in the repo is a decision somebody made.",
5+
"type": "object",
6+
"required": ["mode", "type"],
7+
"properties": {
8+
"mode": {
9+
"enum": ["pixel", "plate", "editorial", "custom"],
10+
"description": "Which measured mode this surface targets. See reference/modes/. Not a style preference: the modes contradict each other on base unit, grain and radius policy, and averaging them resolves each contradiction toward the stock default."
11+
},
12+
"type": {
13+
"type": "object",
14+
"required": ["scale"],
15+
"properties": {
16+
"scale": {
17+
"type": "array", "items": {"type": "number"}, "minItems": 3,
18+
"description": "Font sizes in px. TOK-TYPE-SCALE fails any font-size not on this list. Measured references have no modular ratio: pixel has a 2.31x hole, plate runs two regimes, editorial uses 19 bespoke clamps. State the sizes, not a ratio."
19+
},
20+
"tracking": {
21+
"type": "array",
22+
"description": "Tracking as a monotonic function of size, in em. Every reference locks this in em so it survives fluid resize untouched.",
23+
"items": {
24+
"type": "object",
25+
"required": ["minPx", "em"],
26+
"properties": {
27+
"minPx": {"type": "number"},
28+
"em": {"type": "number", "description": "Negative on display, 0 mid-band, positive on small uppercase. Crossover sits at 15-20px in all three references."}
29+
}
30+
}
31+
},
32+
"leading": {
33+
"type": "object",
34+
"description": "Line-height inverts with size in every reference. No exceptions found.",
35+
"properties": {
36+
"display": {"type": "number", "description": "0.88-0.95 measured"},
37+
"mid": {"type": "number", "description": "1.35-1.5 measured"},
38+
"body": {"type": "number", "description": "1.5-1.75 measured"}
39+
}
40+
},
41+
"measureCh": {"type": "number", "description": "Max prose line length. 32.6-62 measured; all under 60 except plate's prose at 62. Machine output is exempt and runs long on purpose."}
42+
}
43+
},
44+
"color": {
45+
"type": "object",
46+
"properties": {
47+
"ground": {"type": "string", "description": "Never pure black. Measured: #050505, #09090b, #060708."},
48+
"ink": {"type": "string", "description": "Never pure white on dark. Measured: #f7f4ec (4.3% warm), #ecebf2 (cool)."},
49+
"accent": {"type": "string", "description": "One hue, or none. pixel has no type accent and reserves #ffffff for a single line."},
50+
"hairline": {"type": "string", "description": "Ink at low alpha. plate's most-used value is rgba(236,235,242,0.08) at 1033 occurrences; it has no solid grey borders at all."}
51+
}
52+
},
53+
"spacing": {
54+
"type": "object",
55+
"properties": {
56+
"baseUnit": {"type": "number", "enum": [2, 4, 8], "description": "plate is 2 (85.8% of values), pixel and editorial are 4. Not 8 in any reference."},
57+
"ratio": {
58+
"type": "array", "items": {"type": "number"},
59+
"description": "Tight groups inside enormous silence. Measured: editorial 7:1, plate 1:1.5:3:5:16, pixel 24:1. The ratio is the signature, not any single value."
60+
}
61+
}
62+
},
63+
"motion": {
64+
"type": "object",
65+
"properties": {
66+
"hoverMs": {"type": "number", "description": "130-200 in all references."},
67+
"entranceMs": {"type": "number", "description": "420-760 in all references."},
68+
"staggerMs": {"type": "number", "description": "45 (editorial), 75-80 (plate)."},
69+
"easing": {"type": "object", "properties": {
70+
"micro": {"type": "string", "description": "cubic-bezier(.4,0,.2,1)"},
71+
"entrance": {"type": "string", "description": "cubic-bezier(.16,1,.3,1) or cubic-bezier(0,0,.2,1)"}
72+
}}
73+
},
74+
"description": "Two bands and a hole: nothing between 300 and 420ms in any reference."
75+
},
76+
"radius": {
77+
"type": "array", "items": {"type": "number"},
78+
"description": "editorial is binary: 0 or 9999, nothing between, 551 elements against 14. plate runs 8/12/28. Declare the set; anything off it is drift."
79+
},
80+
"texture": {
81+
"type": "object",
82+
"description": "Optional. editorial ships none at all and still reads expensive, so absence is a valid choice rather than an omission.",
83+
"properties": {
84+
"grain": {"type": "object", "properties": {
85+
"baseFrequency": {"type": "number", "description": "0.85 (plate), 1.15 (pixel)"},
86+
"numOctaves": {"type": "number"},
87+
"opacity": {"type": "number", "description": "0.06 overlay (plate), 0.52 screen (pixel)"},
88+
"blendMode": {"type": "string"}
89+
}}
90+
}
91+
}
92+
}
93+
}

0 commit comments

Comments
 (0)