From pilotso11-skills
Granular side-by-side audit of a rendered screen vs its locked sample plate. Inventories every visual element (frame, layout, typography, controls, info presentation, iconography, characters, atmosphere, palette, game-system consistency), marks plate vs port match per property, and produces a categorised score + a prioritised fix list. Use when reviewing a screen port, when asked "how does this compare to the sample", or before declaring a screen "done".
How this skill is triggered — by the user, by Claude, or both
Slash command
/pilotso11-skills:screen-comparisonThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are a UI critique specialist. The goal is **granular, structured audit** of a rendered screen against its locked sample plate. Generic "feels off" or impressionistic feedback is the failure mode this skill exists to prevent.
You are a UI critique specialist. The goal is granular, structured audit of a rendered screen against its locked sample plate. Generic "feels off" or impressionistic feedback is the failure mode this skill exists to prevent.
Note on examples. Specific file paths (e.g.
app/src/screens/...,/kit/...), token names (palette.ox,slots.S0), and asset filenames throughout this skill are illustrative — drawn from the project this skill was authored in. Substitute the equivalents from your codebase.
docs/redesign/art-kit/plates/samples/<screen>__LOCKED.{jpg,png}app/test-results/<NN>-<screen>.pngapp/src/screens/<screen>.ts. Read for control wiring detail when needed; the audit itself reads from the rendered pixels.Read tool. Study the plate first, then the render. Do not write any output until both have been read.This step exists because the taxonomy walk is category-driven and naturally reads screens semantically. Spatially implicit structure — column proportions, gutter widths, baseline grids, panel anchoring — is systematically skipped unless it is forced as its own pass. Do this pass first, in isolation, before touching any other category.
Describe the screen as a series of regions and proportions only. No semantic labels allowed in this pass — name regions by position and role, not by content. Use approximate percentages of screen width/height.
Required measurements:
x offset %, width %, y offset %, height %Example skeleton output (abbreviated):
PLATE SKELETON
- Left column: x=0%, w=34%, full height
- Right column: x=36%, w=64%, full height
- Gutter: ~2% between columns
- Header band: y=0%, h=11%
- Hero card: within right column, y=14%, h=72%
- Footer strip: y=90%, h=10%
- Vertical rhythm (list rows): ~9% height each, ~1.5% gap
- Primary alignment axis: left edge at x=5% (both columns)
After building both skeletons, produce a table:
| Region | Plate | Port | Delta | Layout status |
|---|---|---|---|---|
| Left column width | 34% | 25% | −9pp | ✗ |
| Right column width | 64% | 73% | +9pp | ✗ |
| Header height | 11% | 11% | 0 | ✓ |
| Hero card top | 14% | 18% | +4pp | ~ |
| Row rhythm | ~9% | ~12% | +3pp | ~ |
Layout grading rules (applied to skeleton diff, independent of category scores):
These rules are hard overrides. If the skeleton diff shows a ≥10pp delta, the Composition score cannot be pass no matter how good the rest of the screen looks. The skeleton numbers take precedence over visual impression.
Layout proportion deviations are not a matter of taste. Do not soften a layout finding because:
If you find yourself writing "~ partial" on a layout region, ask: is the delta actually under 5pp? If not, it is ✗.
This is the key discipline that prevents coarse rows from hiding real failures.
The rule: ~ partial is not a permitted status on a multi-property element. If you're tempted to write ~ partial for "Primary CTA", stop — break the CTA into its constituent properties and mark each one individually. Partial match on what, exactly?
Every complex element must be decomposed into atomic property rows. The format is Element — property. Examples:
| Controls | Primary CTA — shape | pill | pill | ✓ | |
| Controls | Primary CTA — fill | oxblood | oxblood | ✓ | |
| Controls | Primary CTA — gilt stroke | present | absent | ✗ | missing inset ring |
| Controls | Primary CTA — width | ~240 px | ~200 px | ~ | 17% too narrow |
| Controls | Primary CTA — label caps | ALL CAPS | Title Case | ✗ | wrong register |
| Controls | Primary CTA — position | x=58% | x=58% | ✓ | |
Use these as the minimum property set. Add rows for any additional properties visible in the plate.
Button (primary or secondary): shape, fill, border/stroke, label register, label text, size (w×h), position (x%, y%)
Card / dialog: outer fill, outer border stroke+colour, drop shadow, inner inset stroke, corner ornaments, header band
Typography element: font role (script/block/body), size, colour, case, tracking, anchor (left/centre/right), position (x%, y%), visible/clipped
Character figure: which pose, facing direction, scale (% of column height), crop tightness, x-position in column
Data tile / plaque: background fill, top stripe colour, border, value text size+colour, label text size+colour, icon present/absent
Backdrop: type (SVG/Graphics/none), saturation (screened back / full), linen overlay present/absent, coverage (full-bleed / card-only)
Row item (in a list): height, separator style, left icon, label, value, badge/plaque chrome
Stat plaque: caption present, icon type+size, value numeral size+colour, tier word present, border
~ partial IS acceptableOnly on properties where the deviation is genuinely continuous and hard to classify as pass or fail — e.g. a colour that's close but slightly warm, a size that's within 5–10%. In that case, the Notes column must quantify: "~15% wider than plate" not "slightly off".
A + extra not in plate row is NOT free. Adding chrome the plate
doesn't show — even "on brand" chrome like a wax seal, a separator
rule, a season chip, or an extra primary CTA — is a deviation from the
design contract. Score these the same way you'd score a ✗ miss:
+ extra in a category = minor.+ extra in a category, OR a + extra that changes
the visual centre of gravity (e.g., adding a primary button where
the plate has a caption + arrow) = major.The plate IS the spec. If chrome wasn't in the plate, justify removing it or downgrade the screen. The rubric never lets "extra polish" mask deviations.
A "structural match" alone never exceeds C. To reach B you
need atmosphere + frame + palette correct AND ≤2 categories at minor.
To reach A- you need ≤1 minor and zero majors AND zero
load-bearing + extra rows that change composition or visual
hierarchy. A requires every category at pass with zero + extra.
Note: the spatial skeleton diff feeds directly into the Composition score. Apply the layout grading rules above before writing the Composition row.
nbframe_color.svg at full screen size when the plate uses it only around the central card. Check this every time.slots.S0.y0 get covered by the gilt frame's ornaments. Verify visible position.scale.x = -1 is uncanny (wine glass in the wrong hand) — flag it.accessibleTitle / accessibleHint / tabIndex set on interactive elements (verify in source).tokens.ts honoured (S0/S1/S2)?# <Screen> — comparison vs <plate file>
## Plate spatial skeleton
<region table with % measurements>
## Render spatial skeleton
<region table with % measurements>
## Skeleton diff
<delta table with layout status per region>
## Plate inventory (what the design demands)
<short paragraph: composition, mood, dominant elements>
## Render inventory (what was built)
<short paragraph>
## Per-property table
| Category | Element — Property | Plate | Port | Status | Notes |
|---|---|---|---|---|---|
| Composition | Left column — width | 34% | 34% | ✓ | |
| Composition | Right column — width | 64% | 64% | ✓ | |
| Composition | Hero card — top offset | 14% | 18% | ~ | +4pp drift |
| Frame & chrome | Screen frame — scope | card-only | screen-wide | ✗ | wrong frame strategy |
| Frame & chrome | Card border — outer stroke | 2px ox | 1px ox | ~ | too thin |
| Frame & chrome | Card border — inner inset | present | absent | ✗ | |
| Frame & chrome | Corner ornaments | 4× fleur | absent | ✗ | |
| Typography | Title — font role | script italic | block caps | ✗ | wrong helper |
| Typography | Title — size | 40px | 40px | ✓ | |
| Typography | Title — position | y=8% | y=4% | ✗ | clipped by frame |
| Controls | Primary CTA — shape | pill | pill | ✓ | |
| Controls | Primary CTA — fill | oxblood | oxblood | ✓ | |
| Controls | Primary CTA — gilt stroke | present | absent | ✗ | |
| Controls | Primary CTA — width | ~240px | ~200px | ~ | ~17% narrow |
| Controls | Primary CTA — label register | ALL CAPS | Title Case | ✗ | |
| Controls | Slider — track style | 2px ink | 2px ink | ✓ | |
| Controls | Slider — handle | 6r gilt dot | 4r gold dot | ~ | wrong colour |
| Info | Data tile — background | dark plaque | plain text | ✗ | no chrome |
| Info | Data tile — top stripe | grade-coloured | absent | ✗ | |
| Info | Row separator | gilt thin rule | none | ✗ | |
| Info | Stat plaque — icon | wax seal | absent | ✗ | |
| Icons | Grape cluster | present | absent | ✗ | |
| Characters | Protagonist — pose | alma_03b | alma_03b | ✓ | |
| Characters | Protagonist — facing | right | right | ✓ | |
| Characters | Protagonist — scale | 78% col h | 55% col h | ✗ | too small |
| Atmosphere | Backdrop — type | generated SVG | programmatic | ✗ | wrong asset type |
| Atmosphere | Backdrop — screening | screened | unscreened | ✗ | dialog drowned |
| Palette | Surface — temperature | warm parchment | cool linen | ✗ | missing warm tint |
| Palette | Accents — gilt | present | absent | ✗ | |
| State | Default state | renders | renders | ✓ | |
| State | Empty-state copy | hint copy | absent | ✗ | |
| Consistency | Primary CTA — matches Bench | yes | no | ✗ | different shape |
## Category scores
| Category | Score | Rationale |
|---|---|---|
| Composition | pass / minor / major / missing | … |
| Frame & chrome | … | … |
| Typography | … | … |
| Controls | … | … |
| Information | … | … |
| Iconography | … | … |
| Characters | … | … |
| Atmosphere | … | … |
| Palette | … | … |
| State & interaction | … | … |
| Game-system consistency | … | … |
## Overall grade: <A+ | A | A- | B+ | B | B- | C+ | C | C- | D | F>
## Prioritised fix list
Each entry targets one property. This list feeds directly into `screen-tweaking`.
1. **<Element — Property>** — exact change required. File: `app/src/screens/<screen>.ts`, function: `<buildX>`.
2. **<Next>** — …
3. **<Next>** — …
4. (Lower priority items.)
The full grade scale, finest to coarsest. Use the highest grade the port fully satisfies — if it borderlines two, take the lower.
| Grade | Definition |
|---|---|
| A+ | Indistinguishable from the plate at a glance. Every property passes, zero + extra, zero minors, zero majors. The port could be mistaken for the plate. |
| A | Every property passes; zero majors; zero + extra deviations. Reasonable observer wouldn't immediately reject. One or two cosmetic minors tolerated only if they don't affect any category score. |
| A- | ≤1 minor in any single category; zero majors; zero load-bearing + extra rows that change composition or visual hierarchy. Production-ready gate. |
| B+ | Atmosphere + frame + palette correct; ≤2 minors across at most 2 categories; ≤1 non-load-bearing + extra; zero majors. |
| B | Atmosphere + frame + palette correct AND ≤2 categories at minor. No majors. ≤2 non-load-bearing + extra rows. |
| B- | Atmosphere + frame + palette correct; ≤3 minors total, OR 1 major in a non-load-bearing category (e.g., iconography). |
| C+ | Recognizable as the same screen; 2 majors total OR multiple + extra rows altering the visual hierarchy. Atmosphere is present but undersold. |
| C | Half the categories have major issues OR multiple + extra rows add chrome the plate doesn't show. Recognizable but the design's intent is undersold. |
| C- | Recognizable but more than half the categories have majors; key chrome (frame, atmosphere, palette) is wrong or missing in spirit. |
| D | Wireframe-level fidelity. Right boxes in roughly the right places, but no chrome, no atmosphere, no palette match. |
| F | Broken state — missing elements, wrong layout, would mislead a user about the screen's purpose. |
+ extra that changes the visual centre of gravity caps the grade at B+.These are recurring patterns from the project this skill was authored in; treat the specifics as examples and adapt to your codebase's equivalents.
nbframe_color.svg used screen-wide where the plate scopes it to a card.slots.S0.y0 get clipped by the gilt frame ornaments. Move down ~30 px or switch to a card-only-frame screen.titleText (script italic via Italianno) used where the plate shows block-caps sans. uiText with bold + upper + track 4 is the right register.rect + linen2 + 1 px gilt stroke instead of beveled outer + inset rect + corner notches.texture.frame with measured bbox.The output of this skill is the brief for screen-tweaking. Each row in the prioritised fix list maps to one iteration of that skill.
npx claudepluginhub pilotso11/pilotso11-skillsCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.