Hypothesis, sites, cases: see TEST-PLAN.md. Candidate repo (from tech ledger): https://github.com/senlindesign/taste-skill
Ground truth (independent of skill)
Playwright (chromium, desktop 1440x900, one load per site) reads computed styles from the live DOM:
- primary/accent color: computed background-color of the most prominent CTA button/link (first visible /
- font families: computed font-family of body and h1 (first family token).
- radius: computed border-radius of that CTA button.
- base spacing: most common padding/margin/gap value (px) among visible elements, reported as mode; secondary check: is the claimed base unit (4/8) a divisor of the mode.
Raw JSON saved in outputs/groundtruth/
.json.
Tolerances (fixed now)
- Font family: exact match of first family name (case-insensitive); fallback stacks ignored. Brand fonts that aren't web-visible by name (e.g. Apple "SF Pro" serving as system) count as match if the skill names the same family or the documented system alias.
- Colors: pass if CIE76 delta-E <= 10 in Lab vs ground truth (primary, background, text each scored).
- Radius: pass if within +/-2px (or both "pill"/>=999 vs >=100px).
- Spacing base unit: pass if claimed base unit equals ground-truth mode, or the mode is an integer multiple (1-3x) of it.
- Token accuracy per site = passed tokens / tokens with ground truth. Skill beats baseline if its accuracy is higher by >= 0.10 averaged over sites; tie within 0.10 = no evidence of difference.
Pass/fail for the hypothesis
- "Accurate": mean skill token accuracy >= 0.70.
- "More useful than baseline": skill accuracy >= baseline + 0.10 AND mean rationale score greater than baseline's by >= 0.5 (1-5 blind judge, 2 judge repeats averaged).
- Usability: mean mock resemblance >= 3.0 of 5 (judge sees both screenshots, not told which method). Otherwise hypothesis is reported not supported / inconclusive.
Controls and bias handling
- Baseline: same model, same inputs (same site data given to both), prompt "extract this site's design tokens and explain the choices", no skill text.
- Both skill and baseline receive the identical page evidence (screenshot + DOM-derived page summary that is NOT the ground truth extraction; no computed-color table). If the skill itself drives the browser, that is recorded as its native mode and any deviation noted.
- Judge agents are blind: outputs labelled A/B randomly, site names retained but method hidden.
- Honest limits: n=5 sites, one model, LLM judges; no statistical significance claimed.
Amendment 1 (2026-10-03, still before any site load or model run)
After reading the skill: its Phase 1 input is a screenshot plus references/extract.js output (computed-style tables). So:
- Evidence given to the skill arm = viewport screenshot + extract.js JSON (verbatim file, run via Playwright library instead of the Playwright MCP; same 1440x900 viewport, 3s wait). Deviation recorded in insights.
- Baseline arm B1 ("same evidence"): identical screenshot + identical extract.js JSON, plain prompt, no skill text. This isolates the skill's prompt pipeline.
- Baseline arm B0 ("screenshot only"): the screenshot only, plain prompt. Extra control; shows what the extractor adds.
- Ground truth uses a different, independent script (CTA-based, in outputs/capture/capture.js) run in the SAME page load (the plan allows one load per site). Caveat: both read the same live DOM, so it is independent in method, not in source. Limitation will be reported.
- Skill's multi-page crawl and export targets are off (defaults: single page, skip export).
- Models run via
claude -p(Claude Code CLI, sonnet) from a clean directory with no CLAUDE.md, settings, MCP or user skills, so global instructions cannot contaminate arms. Judges: same CLI, fresh sessions, 2 repeats each, blind A/B/C labels. - Mock resemblance judged on the 1440x900 mock screenshot vs the real screenshot.
- Token set scored per site: bg, text, accent (CTA) colors; body font; heading font; CTA radius; spacing base unit.
Amendment 2 (2026-10-03, before any skill/baseline run)
Ground-truth script v1 (kept in outputs/capture/failed-first-attempt/gt-v1/) picked "Skip to content" links as the CTA on linear.app and vercel.com and a dark-tile paragraph as body text on apple.com. Fixed (v2: exclude /skip/ links, require on-screen, body text = first visible paragraph >40 chars) and recaptured. This is a 3rd load per site (1st failed on my own syntax error, 2nd had the GT bug); no model output had been seen. Extra scoring rules fixed now:
- Font match: compare lowercase with spaces/hyphens removed and the words variable/var/sans/display/text/pro-less suffixes ignored; "contains" in either direction counts (e.g. InterVariable ~ Inter, GeistSans ~ Geist, sohne-var ~ Söhne/Sohne, SFProDisplay ~ SF Pro).
- Colors with alpha are composited over the page background before delta-E.
- Ground truth is a proxy for the "true" token set (CTA color = accent). If a site's primary accent is judged by me not to be what the CTA shows, I will say so in RESULTS rather than change the rule.