UI verification criteria, structure checklists, severity definitions, and tolerance rules for comparing implementations against Figma designs.

MITAuto-check: notesMobile

Install Tsh UI Verifying

skills CLI
$ npx skills add TheSoftwareHouse/copilot-collections --skill tsh-ui-verifying -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install TheSoftwareHouse/copilot-collections tsh-ui-verifying --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/TheSoftwareHouse/copilot-collections.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.github/skills/tsh-ui-verifying .claude/skills/tsh-ui-verifying && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
tsh-ui-verifying
GitHub stars
284
Token cost
~7.8k tokens
SKILL.md length
3,819 words
Files
1
Skills in repo
21
Repo updated
First seen
Licence
MIT

At a glance

UI verification criteria, structure checklists, severity definitions, and tolerance rules for comparing implementations against Figma designs.

  • Works in 3 steps: Resolve the Figma node from the supplied… → Export the Figma node image via the… → Extract the design specifications to…
  • Verifying UI matches design
  • SKILL.md covers Verification Process, Verification Order, Verification Categories and Tolerances, plus 5 more sections
  • Calls npx; needs NORMALIZED_FIELD_KEY

What it does

Tsh UI Verifying is an agent skill from TheSoftwareHouse/copilot-collections. UI verification criteria, structure checklists, severity definitions, and tolerance rules for comparing implementations against Figma designs. Use for verifying UI matches design, understanding what to check, and determining acceptable differences.

Its SKILL.md is about 7.8k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Mobile, covering Mobile testing and debugging. It works with Figma. The repository describes itself as: Opinionated AI-enabled workflows for product engineering. The licence is MIT.

When your agent uses it

  • Verifying UI matches design
  • Understanding what to check
  • Determining acceptable differences

Example prompts

  • “/tsh-ui-verifying”

Requirements

  • A credential in NORMALIZED_FIELD_KEY

Workflow steps

3 steps, taken from the first numbered list in SKILL.md.

  1. Resolve the Figma node from the supplied Figma URL (extract fileKey + nodeId). If the URL or node cannot be resolved, raise it through…
  2. Export the Figma node image via the figma MCP and SAVE it to the shared verification directory as…
  3. Extract the design specifications to compare against

What it can do on your machine

Read from SKILL.md and the folder at commit 2fbe51e. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • npx

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use npx, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • NORMALIZED_FIELD_KEY

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Tsh UI Verifying loads about 7.8k tokens when it runs. Until then it costs about 66 tokens; SKILL.md has 3,819 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~66
When it runs · the whole SKILL.md, loaded when a task matches
~7.8k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NoteMentions a .env fileSKILL.md:38
    al form. If it is, derive one repo-root `.env` var per required field from the live form using this order of precedence
  • NoteMentions a .env fileSKILL.md:40
    ogin. Add these exact vars to repo-root `.env` and tell me when the file is saved:
  • NoteMentions a .env fileSKILL.md:43
    e file, I will rerun capture and reload `.env` automatically."
  • NoteMentions a .env fileSKILL.md:51
    ne login and either populated the local `.env` contract derived from the real login form, completed the redirected real
  • NoteMentions a .env fileSKILL.md:53
    local env contract: in the target repo `.env` file, set one env var per required login field using the derived naming r
  • NoteMentions a .env fileSKILL.md:54
    the user to populate the exact derived `.env` vars and confirm when the file is saved, then rerun capture with `.env` r

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from TheSoftwareHouse/copilot-collections at commit 2fbe51e, republished under its MIT licence (© TheSoftwareHouse). 3,819 words, ~7,846 tokens.

Download SKILL.mdSave it as .claude/skills/tsh-ui-verifying/SKILL.md (or your agent's skills folder).
name
tsh-ui-verifying
description
UI verification criteria, structure checklists, severity definitions, and tolerance rules for comparing implementations against Figma designs. Use for verifying UI matches design, understanding what to check, and determining acceptable differences.
user-invocable
false

UI Verification

Verification process, criteria, and tolerances for comparing UI implementations against Figma designs.

Default to asking when anything is off — this is a judgment rule, not a checklist. Every specific blocker named in this skill (missing Figma, auth redirect, wrong page, missing or partial artifacts, unconfirmed URL, tool error, …) is only an EXAMPLE of one underlying rule: whenever you cannot run a real, complete verification against the full artifact base — because something is missing, broken, ambiguous, inconsistent, or simply unexpected, including situations not listed anywhere here — stop and raise it through vscode/askQuestions (when that tool is available to you). Do not guess, do not improvise a workaround, do not fabricate values, and do not proceed on partial evidence. Think about whether the evidence you actually have supports a verdict; if it does not, ask instead of pushing forward.

Verification Process

Use the checklist below and track your progress:

Progress:
- [ ] Step 1: Validate inputs
- [ ] Step 2: Get EXPECTED from Figma
- [ ] Step 3: Get ACTUAL from implementation
- [ ] Step 4: Compare using verification categories
- [ ] Step 5: Generate report

Step 1: Validate inputs

Before starting verification, confirm:

  • Figma URL is available for the component/section being verified
  • Dev server URL is a user-confirmed pinned session input:
    • Standalone verification without a caller-provided URL: on the first verification in a session, ask the user to confirm the exact full dev server URL that should be used for verification. Do not infer it from project config, running processes, port scans, or other discovery.
    • Delegated verification with a caller-provided user-confirmed URL: use that exact full URL unchanged for the entire session. Do not rediscover it, normalize it, swap ports, inspect config to suggest another URL, or launch a different local app/server.
    • Once the user has confirmed the URL, every downstream verification and capture pass must treat it as pinned session state.
  • Dev server is running and the target page is reachable through the CLI capture flow using that confirmed URL:
    • Never circumvent an authentication, login, or access/permission gate by any means or technique — proactively or reactively. Legitimate authentication through the app's real login UI is allowed only when the user has explicitly authorized it and supplied the exact inputs required to perform it through a local env-based contract derived from the real login form, direct in-browser entry, or a real storage-state path created from a prior login. Navigate to the pinned URL only as an ordinary user would. Do not assume, fabricate, simulate, seed, inject, or manufacture any signed-in or authorized state. If you notice the gate is trivially bypassable (for example it can be satisfied entirely client-side), report it as a potential security vulnerability when you raise the blocker, so the user is made aware and can plan a fix — flag the concern, never exploit it.
    • Use the CLI capture flow to open the page at the full target URL before verification begins
    • If the capture flow reports a redirect to a login/authentication screen and the required login inputs were not already provided: first determine whether the redirected screen is a standard credential form. If it is, derive one repo-root .env var per required field from the live form using this order of precedence for the field key: name -> autocomplete -> id -> visible label text. Normalize the chosen key to uppercase snake case and prefix it with TSH_UI_LOGIN_. Examples: email -> TSH_UI_LOGIN_EMAIL, userName -> TSH_UI_LOGIN_USER_NAME, company-code -> TSH_UI_LOGIN_COMPANY_CODE. If the verifying agent has vscode/askQuestions, the immediate next action MUST be a vscode/askQuestions call telling the user to add those exact derived env vars to repo-root .env and confirm when the file is saved. On the next capture pass, reload .env and reuse those env vars without printing their values. Use a prepared storage-state path or direct manual login only when the redirected screen is not a standard credential form (for example SSO chooser, MFA challenge, or captcha), the runtime cannot derive the field keys reliably, or the user explicitly prefers one of those fallbacks. Do NOT bypass, seed, inject, or fake authentication yourself by any means or technique, and never fake an identity or assume a role, even if you can see how the auth check works. Use this wording pattern for the user message: "The page redirected to login. Add these exact vars to repo-root .env and tell me when the file is saved:
      • [DERIVED_ENV_VAR_1]=...
      • [DERIVED_ENV_VAR_2]=... After you save the file, I will rerun capture and reload .env automatically."
    • If the capture flow reports a redirect to a login/authentication screen and the required login inputs were already provided, continue through the authenticated capture pre-step below instead of treating the redirect as a manual-only blocker.
    • If the capture flow reports unexpected content (error page, blank page, different route): if the verifying agent has vscode/askQuestions, the immediate next action MUST be a vscode/askQuestions call such as: "The page at [URL] shows [description]. Is this the correct URL for [component name]?" Do not ask in plain assistant text first.
    • If the capture flow cannot find the expected component on the confirmed page: if the verifying agent has vscode/askQuestions, raise the blocker through that tool immediately rather than a freeform reply.
  • If any input is missing or any blocker is encountered, stop and resolve it through vscode/askQuestions when that tool is available to the verifying agent — do not proceed, do not fall back to code-level review, and do not skip the verification step
Authenticated capture pre-step
  • Use this only when the user has explicitly authorized a genuine login and either populated the local .env contract derived from the real login form, completed the redirected real login form in the open browser session, or supplied an already-authenticated storage-state path.
  • A genuine login means using the application's real sign-in UI exactly as an ordinary user would. It is allowed. Bypass is not.
  • Standard local env contract: in the target repo .env file, set one env var per required login field using the derived naming rule TSH_UI_LOGIN_<NORMALIZED_FIELD_KEY>, where NORMALIZED_FIELD_KEY comes from name -> autocomplete -> id -> visible label text, normalized to uppercase snake case.
  • Default path: if the redirect lands on a standard credential form, ask the user to populate the exact derived .env vars and confirm when the file is saved, then rerun capture with .env reloaded before filling the login form. Use direct in-browser login or a prepared storage-state path only for non-standard auth flows such as SSO, MFA, or captcha or when .env automation is not workable.
  • Never ask the user to paste the password into chat. Read the env vars only at runtime and do not echo their values back into artifacts, reports, or tool output.
  • Preferred pattern: perform the real login once, state-save to a secret path outside specifications/**, then state-load that path for each later capture iteration so the authenticated session is reused instead of recreated.
  • Never write credentials into task specs, reports, artifacts, or committed files. Never seed cookies, tokens, localStorage, or sessionStorage by hand.

Step 2: Get EXPECTED from Figma — MANDATORY, runs BEFORE capture

This step is mandatory and always runs before capturing the implementation. A verification without fresh Figma EXPECTED data is INVALID. EXPECTED comes ONLY from the figma MCP tools — never open a figma.com URL (or any Figma link) in the Playwright/CLI browser to "fetch" the design, and never screenshot the Figma web app, its login page, or an error page as the reference. The browser is for the running app (ACTUAL) only. Do these in order:

  1. Resolve the Figma node from the supplied Figma URL (extract fileKey + nodeId). If the URL or node cannot be resolved, raise it through vscode/askQuestions (when that tool is available), report VERIFICATION NOT RUN, and stop. Never continue without a resolved node.
  2. Export the Figma node image via the figma MCP and SAVE it to the shared verification directory as specifications/<task-id>/ui-verification/figma-expected.png (the parent directory of the iteration directories defined in Step 3). Use the figma MCP's node-image / screenshot export — not a browser screenshot. This file is REQUIRED for the verification item and must be the real design export; it is the visual reference the comparison is judged against. Do not keep it only in memory or a tool response; it must exist on disk in the shared verification directory. If the figma MCP is not available in this workspace, that is a blocker: do NOT fall back to the browser and do NOT save any non-design image as figma-expected.png — report VERIFICATION NOT RUN and use vscode/askQuestions to ask the user to enable the Figma MCP or provide an exported reference image.
  3. Extract the design specifications to compare against:
    • Layer hierarchy and component structure
    • Layout direction, alignment, spacing
    • Frame width (use it as the capture viewport width in Step 3)
    • Typography, colors, radii, shadows
    • Component variants and states

ENSURE-OR-FETCH: At the start of every pass, check whether a valid shared figma-expected.png (a real design export) already exists at specifications/<task-id>/ui-verification/figma-expected.png for the current verification item. If it is missing, export it now via the figma MCP (steps 1–2 above). If it already exists and the Figma URL/node is unchanged, reuse it — do not re-export it for each iteration. Only after a genuine export failure (the figma MCP is unavailable, Figma cannot be reached, the node cannot be resolved, or the file cannot be written) do you report VERIFICATION NOT RUN, surface the blocker through vscode/askQuestions, and stop. Never browser-scrape Figma, never save a browser/login/error screenshot as figma-expected.png, and never proceed to compare against memory, source code, or the running app while a valid shared figma-expected.png is absent.

Step 3: Get ACTUAL from implementation

Use the tsh-ui-capture-worker capture flow to collect ACTUAL evidence from the running implementation. CLI capture is mechanical evidence collection only. The visual judge remains the reviewer brain comparing Figma EXPECTED against CLI ACTUAL using multimodal reasoning plus computed styles.

When the caller provides a Figma URL to tsh-ui-capture-worker, that worker may also export or ensure the shared figma-expected.png before opening the app page, purely as evidence preparation. This does not transfer design judgment from the reviewer; it only guarantees the EXPECTED artifact exists even when later ACTUAL capture is blocked by auth or page reachability.

The capture worker must use only the caller-provided full URL for the current pass. It never discovers its own URL, never replaces the caller-provided URL, never inspects project config to pick another port, and never launches or switches to another local app/server. If the delegated task does not include the confirmed full URL, treat that as a blocker and return immediately.

You MUST collect all three ACTUAL evidence types — a verification that skips any type is incomplete:

  1. Structure & content — element hierarchy, order, grouping via accessibility snapshot.
  2. Actual rendered dimensions — computed widths, heights, paddings, margins, gaps, and other measured layout properties of every major container via JavaScript evaluation of computed styles. This is the most commonly missed step — without it you cannot detect sizing/layout differences.
  3. Visual appearance — full-page screenshot for side-by-side comparison with the design.

If the three live-capture artifacts are not all present (actual.png, computed-styles.json, a11y-snapshot.yml), the verification is incomplete and invalid. Code reading is never a substitute for live capture.

CLI-first capture flow

Write every ACTUAL capture artifact into the task's iteration directory, never into .playwright-cli/ or the current working directory. playwright-cli writes to .playwright-cli/ by default — that default location is WRONG for these artifacts, so always pass an explicit path. The shared Figma reference remains at specifications/<task-id>/ui-verification/figma-expected.png. Use a named session and keep the flow explicit:

  1. Define and create the artifact directory FIRST:
  • UI_VERIFICATION_DIR="specifications/<task-id>/ui-verification" (or specifications/<page-slug>/ui-verification when no task-id exists).
  • ARTIFACT_DIR="$UI_VERIFICATION_DIR/iteration-<N>".
  • FIGMA_EXPECTED="$UI_VERIFICATION_DIR/figma-expected.png".
  • Keep any state-save file outside specifications/**, for example in a git-ignored temp path supplied by the caller.
  • mkdir -p "$ARTIFACT_DIR".
  • Every command below writes into "$ARTIFACT_DIR/<file>". Never rely on default output locations.
  1. Ensure shared Figma reference when the caller provided a Figma URL — export or verify "$FIGMA_EXPECTED" before browser capture begins. If the shared reference export fails, stop as VERIFICATION NOT RUN before opening the app page.
  2. Open named session — playwright-cli open -s <session-name>.
  3. Resize to the Figma frame width — playwright-cli resize <figma-width> 1080 -s <session-name>.
  4. Navigate to the full target URL including query params — playwright-cli goto <full-url> -s <session-name>.
  5. Stabilize render before collecting evidence:
    • playwright-cli run-code -s <session-name> "async page => { await page.emulateMedia({ reducedMotion: 'reduce' }); await page.waitForLoadState('networkidle'); }"
    • Add route mocks only when the task explicitly requires deterministic mocked data.
    • Mask dynamic regions when unavoidable so transient timestamps, avatars, ads, or animations do not dominate the evidence.
  6. Capture screenshot into the artifact directory:
    • Preferred: playwright-cli screenshot --filename="$ARTIFACT_DIR/actual.png" -s <session-name> (full page when supported).
    • Required fallback: playwright-cli run-code -s <session-name> "async page => { await page.screenshot({ path: '$ARTIFACT_DIR/actual.png', fullPage: true }); }".
  7. Capture accessibility snapshot — playwright-cli --raw snapshot -s <session-name> > "$ARTIFACT_DIR/a11y-snapshot.yml".
  8. Capture computed styles and measurements — playwright-cli --raw eval -s <session-name> "JSON.stringify(...)" > "$ARTIFACT_DIR/computed-styles.json".
  9. Confirm artifacts landed in the right place — run ls -la "$ARTIFACT_DIR" and verify actual.png, a11y-snapshot.yml, and computed-styles.json exist there, then verify the shared figma-expected.png exists at "$FIGMA_EXPECTED". If a capture artifact (actual.png, a11y-snapshot.yml, computed-styles.json) is missing or landed in .playwright-cli/ or the working directory, move it into $ARTIFACT_DIR or re-run that command with the explicit path. If the shared figma-expected.png is missing, go back to Step 2 and export it before continuing — a missing reference image is fixed by fetching it, not by reporting a blocker.
  10. Clean up — playwright-cli close -s <session-name> or equivalent session cleanup if the capture flow aborts.

The JSON.stringify(...) payload should cover the major containers and controls being verified: bounding boxes, computed width/height, max-width, min-height, padding, margin, gap, alignment-relevant properties, and any targeted style values needed to explain differences.

CRITICAL: The accessibility tree does NOT contain CSS dimensions. A full-width container and a narrow centered container produce identical accessibility trees. If you only collected structure without measuring actual rendered dimensions, your verification is INVALID — mark confidence as LOW and report what's missing.

Show full SKILL.md (1,549 more words)Show less
Render stabilization rules
  • Wait for networkidle before capture.
  • Emulate reduced motion before taking evidence.
  • Use optional route mocks only to remove nondeterministic backend data, not to hide real UI defects.
  • Mask dynamic regions when they are known noise sources.
  • Different image heights or dimensions between Figma and the implementation are evidence for the reviewer brain; they are NOT hard failures that abort the loop.
Artifact directory contract

Store each verification pass under:

text
specifications/<task-id>/ui-verification/
  figma-expected.png
  iteration-<N>/
    actual.png
    computed-styles.json
    a11y-snapshot.yml
    pixel-gate/               # optional, phase 2 only
      report.json
      exit-code.txt
      *-diff.png
    report.md

Required files for the core flow are the shared figma-expected.png, plus actual.png, computed-styles.json, a11y-snapshot.yml, and report.md for the current iteration. pixel-gate/ is optional and only exists when the phase-2 tripwire runs. Never leave any ACTUAL capture artifacts in .playwright-cli/ or the working directory — pass the explicit $ARTIFACT_DIR/... path to every capture command and confirm the files exist there.

Exit codes and escalation rules
  • playwright-cli open or playwright-cli goto non-zero: escalate immediately instead of silently continuing.
  • Redirect to login, auth wall, or unexpected page content: escalate immediately instead of silently continuing.
  • Missing component at the confirmed URL: escalate immediately.
  • Session cleanup failures: note them in the report, then attempt explicit cleanup.
  • Phase-2 tripwire exit 0: evidence that the render is within the loose screenshot threshold; not the final verdict.
  • Phase-2 tripwire exit 1: evidence of visual difference; not the final verdict.

If open/goto/auth fails, if the page state is wrong, or if required artifacts are missing/incomplete, stop the capture flow and raise clarification through vscode/askQuestions when that tool is available to the verifying agent. Do not use a plain-text blocker request as a substitute. These are pre-verification blockers. Report the verification result as VERIFICATION NOT RUN, include blocker-resolution guidance, and rerun on fresh artifacts after the blocker is resolved. They do not consume any post-fix iteration budget and do not enter the post-5-iteration escalation gate. Do not substitute code reading for verification.

Step 4: Compare using verification categories

Compare EXPECTED (Figma) against ACTUAL (implementation) following the Verification Order and Categories below. The Figma design is the source of truth for every comparison. When in doubt, the design wins.

IMPORTANT: Complete ALL verification categories in a single pass. Do not stop after finding differences in one category — continue through every category and collect every difference. Go category by category (Structure → Layout → Dimensions → Visual → Components) and explicitly record, for each category, either the concrete differences found or an evidence-backed "no differences". A report that lists a single issue when more exist is an INCOMPLETE review: it wastes an iteration and forces extra loops. The report must contain ALL differences found across all categories so the engineer can fix them all at once, minimizing verification iterations.

Step 5: Generate report

Produce a structured report following the Report Format below. Include exact values from both Figma and implementation for every difference found.

Optional phase-2 tripwire: toHaveScreenshot

Use this only as a non-blocking signal layer after the core CLI-first capture exists.

  • Baseline source: the Figma PNG export is the baseline, not a self-generated app screenshot.
  • Run through the Playwright test runner, for example: PLAYWRIGHT_HTML_OPEN=never npx playwright test --reporter=json.
  • Use toHaveScreenshot with a loose threshold such as maxDiffPixelRatio, fullPage: true, and masks for known dynamic regions.
  • Save the runner JSON output and diff artifacts under pixel-gate/.
  • Tripwire exit 0 or 1 is evidence for the reviewer brain. It never replaces the multimodal comparison and computed-style review.
  • If dimensions differ and the screenshot assertion fails for that reason, keep the artifacts and continue the review loop. That size mismatch is itself evidence.

Verification Order

Always verify in this order — complete ALL categories regardless of findings. Do not stop after finding differences in one category. The goal is to catch every difference in a single pass so all fixes can be applied at once.

  1. Structure (CRITICAL)
  2. Layout (CRITICAL)
  3. Dimensions (CRITICAL)
  4. Visual (CRITICAL)
  5. Components

Verification Categories

Structure (CRITICAL)
CheckDescription
Container hierarchyDoes DOM structure match Figma's layer hierarchy?
Nesting depthAre elements nested at the same level as in Figma?
GroupingAre related elements grouped together as in design?
Element orderIs the visual order of elements the same?
Wrapper elementsAre there extra/missing wrapper divs that change layout?
Sections presentAre ALL sections from Figma present in implementation?
Layout (CRITICAL)
CheckDescription
Flex/Grid directionrow vs column, wrap behavior
Alignmentjustify-content, align-items values
DistributionHow space is distributed between elements
Positioningrelative, absolute, fixed - matches design intent?
CenteringIs content centered as in design?
Dimensions (CRITICAL)
CheckDescription
Container widthmax-width, fixed width constraints
Card/panel boundariesDoes card have same width as in Figma?
Content area vs viewportRatio of content width to available space
Width/HeightFixed, percentage, auto, min/max constraints
SpacingPadding, margin, gap between elements
GapsSpace between flex/grid children

WARNING: Accessibility tree does NOT contain CSS dimensions. A full-width container and a narrow centered one look identical in it. You must measure actual computed styles to detect width/sizing differences.

Visual
CheckDescription
Typographyfont-family, size, weight, line-height, letter-spacing
ColorsText, background, border colors
Radiiborder-radius values
Shadowsbox-shadow, drop-shadow
BackgroundsSolid, gradient, image
Components
CheckDescription
Correct variantsIs the right variant of a component used?
Design tokensAre correct tokens used (not hardcoded values)?
Stateshover, focus, active, disabled states

Tolerances

CategoryToleranceNotes
StructureNoneAny structural difference = FAIL
Layout directionNonerow vs column must match exactly
AlignmentNoneCentering, justify, align must match
Dimensions1-2pxOnly for browser rendering variance
ColorsExact matchMust use correct design tokens
TypographyExact matchFont properties must match
Spacing1-2pxOnly for browser rendering variance

Severity Definitions

SeverityDescriptionAction
CriticalStructure/layout differences, wrong component usedMust fix immediately
MajorDimensions off by >2px, wrong colors/typographyMust fix before merge
Minor1-2px browser rendering varianceAcceptable, document if recurring
Content/data clarification gate

If structure, layout, dimensions, visual styling, and component usage are otherwise acceptable, and the remaining differences are limited to content/data that may plausibly vary by environment, seed data, locale, or user state, do not treat them as automatic UI defects.

In that branch:

  1. Summarize the remaining content/data differences clearly.
  2. Ask the user whether those values are intentionally environment-specific or whether the UI should match Figma exactly.
  3. Keep the PASS/FAIL report format. Until the user confirms those values may differ, keep the overall result as FAIL and represent the items under Clarification Needed rather than as automatic fix items.
  4. Only convert them into actionable fixes after the user confirms they should be corrected.

If the content/data mismatch also changes structure, layout, or visual fidelity in a real way, report that underlying UI defect normally.

PASS Gate (strict)

A pass is only allowed when the evidence proves it. Do NOT report PASS on "looks close", on a partial review, or to end the loop early.

Report PASS only when ALL of these hold:

  • The shared figma-expected.png exists at specifications/<task-id>/ui-verification/figma-expected.png, and actual.png, computed-styles.json, and a11y-snapshot.yml for THIS pass all exist in the current iteration directory.
  • Every CRITICAL category — Structure, Layout, Dimensions — has ZERO differences beyond the allowed 1–2px rendering tolerance, each backed by a cited measured value from computed-styles.json or a cited structural fact from a11y-snapshot.yml, not by impression.
  • The full-page actual.png has been compared side by side against the shared figma-expected.png.

If ANY of the following is true, the result is FAIL (or VERIFICATION NOT RUN when evidence is missing), never PASS:

  • Any structural difference (missing, extra, or reordered elements; wrong nesting or grouping).
  • Any layout difference (wrong flex/grid direction, wrong alignment, wrong centering, wrong distribution).
  • Any dimension difference greater than the 1–2px rendering tolerance.
  • The layout "looks roughly right" but you have not measured it against computed-styles.json.

Layout and structure mismatches are CRITICAL and can never be waived as "acceptable" or "close enough". Only genuine 1–2px rendering variance is Minor.

Verification Checklist

Before reporting PASS:

  • Verified ENTIRE page (scrolled from top to bottom)
  • All sections from Figma are present in implementation
  • Container hierarchy matches Figma layers
  • Flex/grid direction is correct
  • Alignment (justify/align) matches design
  • Element order matches design
  • No extra/missing wrapper elements that change layout
  • Actual computed container widths measured (not inferred from accessibility tree)
  • Full-page screenshot taken and visually compared against Figma

Report Format

markdown
## Verification Result: [PASS | FAIL | VERIFICATION NOT RUN]

### Component: [name]

**Confidence:** [HIGH | MEDIUM | LOW]

### Differences

| Property | Expected (Figma) | Actual (Implementation) | Severity   |
| -------- | ---------------- | ----------------------- | ---------- |
| [prop]   | [expected]       | [actual]                | [severity] |

> **List ALL differences found across ALL verification categories.** Do not omit lower-severity items when critical ones exist. The engineer needs the complete list to fix everything in one iteration.

### Clarification Needed

- [content/data differences that may be intentional]
- [question asking whether the observed values should remain or match Figma exactly]

> When this section is used, keep `## Verification Result` as `FAIL` until the user confirms the content/data/state differences are acceptable, and do not promote them to `Recommended Fixes` before that confirmation.

### Recommended Fixes

- [specific fix with exact values]

Use VERIFICATION NOT RUN only when capture is missing or blocked. It is not a pass, not a clean fail, and must never be treated as a gate pass. The required action is to obtain the live-capture artifacts or escalate the blocker, then rerun verification on fresh artifacts.

VERIFICATION NOT RUN is a pre-verification blocker state. It is distinct from the post-5-iteration gate used for genuine exhausted verify-fix loops.

Re-verify After Fix

After any fix prompted by a verification finding, discard stale artifacts, collect a fresh capture, and run a fresh verification pass on the new artifacts before deciding PASS or FAIL. Never reuse pre-fix evidence or assume the fix worked.

Confidence levels:

  • HIGH — Both Figma and implementation data complete, comparison is reliable
  • MEDIUM — Some values couldn't be extracted, manual review recommended
  • LOW — Tool errors occurred, manual verification required before making changes

When content/data differences are the only remaining gaps and may be intentional, ask for user confirmation before escalating them as defects. Keep the report in the normal PASS/FAIL format and treat the result as FAIL pending clarification.

Connected Skills

  • tsh-implementing-frontend - for implementing fixes following design system patterns
  • tsh-technical-context-discovering - for understanding project's design token conventions

© TheSoftwareHouse, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .github/skills/tsh-ui-verifying of TheSoftwareHouse/copilot-collections.

Open the folder on GitHubat commit 2fbe51e

Compare with similar skills

Tsh UI Verifying next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Tsh UI Verifying compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Tsh UI Verifying this skillTheSoftwareHouse/copilot-collections284—~7.8kAutomated safety check: NotesMIT
Prototype First UIDejavuMoe/Smoji114—~4.2kAutomated safety check: PassApache-2.0
Teswiz Projectznsio/teswiz105—~977Automated safety check: PassMIT
Phone HarnessShawnPana/phone-harness3.2k—~4.3kAutomated safety check: PassMIT
Maa Issue Log AnalysisMaaAssistantArknights/MaaAssistantArknights24k—~4kAutomated safety check: PassAGPL-3.0
Sleek Design Mobile Appssleekdotdesign/agent-skills585—~2.1kAutomated safety check: PassMIT

Similar skills

  • Prototype First UI

    DejavuMoe/Smoji

    Run a safe prototype-first UI/UX workflow across web, desktop, mobile, extensions, and multimodal design inputs.

    114 GitHub stars~4.2k tokensUpdated 5 days ago
    DevelopmentAuto-check passed
  • Teswiz Project

    znsio/teswiz

    A skill your agent uses when working in the znsio/teswiz repository to modify framework code, Cucumber/TestNG hooks, Applitools visual testing flows, configs/caps, or related docs/tests.

    105 GitHub stars~977 tokensUpdated yesterday
    Testing & QAAuto-check passed
  • Phone Harness

    ShawnPana/phone-harness

    Control the user's phone — an iPhone through the Mac's iPhone Mirroring window, an Android over adb, or a rented cloud Android: open apps, tap, type, swipe, read the screen.

    3.2k GitHub stars~4.3k tokensUpdated today
    MobileAuto-check passed
  • Maa Issue Log Analysis

    MaaAssistantArknights/MaaAssistantArknights

    分析 MaaAssistantArknights 上游仓库公开 Issue(https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/...

    24k GitHub stars~4k tokensUpdated today
    MobileAuto-check passed
  • Sleek Design Mobile Apps

    sleekdotdesign/agent-skills

    Design mobile app screens with Sleek, edit Sleek projects, and implement their designs in React Native or HTML.

    585 GitHub stars~2.1k tokensUpdated 3 days ago
    MobileAuto-check passed
  • Mobile QA

    tloncorp/tlon-apps

    Run a mobile QA checklist on a physical Android device over adb for tlon-apps, then triage what fails into fixes.

    107 GitHub stars~2.4k tokensUpdated today
    MobileAuto-check passed

More from TheSoftwareHouse/copilot-collections

All 21 skills in this repo
  • Tsh Creating Skills

    TheSoftwareHouse/copilot-collections

    Create new skills (SKILL.md) for GitHub Copilot. An agent skill from TheSoftwareHouse/copilot-collections.

    284 GitHub stars~4.1k tokensUpdated 3 days ago
    Auto-check passed
  • Tsh Implementing Frontend

    TheSoftwareHouse/copilot-collections

    Frontend component patterns, composition, design token integration, barrel file organization, error handling, and Figma-to-code workflow.

    284 GitHub stars~2.6k tokensUpdated 3 days ago
    Auto-check passed
  • Tsh Implementing Terraform Modules

    TheSoftwareHouse/copilot-collections

    Build reusable Terraform modules for AWS, Azure, and GCP infrastructure following infrastructure-as-code best practices.

    284 GitHub stars~1.6k tokensUpdated 3 days ago
    Auto-check passed
  • Tsh Optimizing Frontend

    TheSoftwareHouse/copilot-collections

    Frontend rendering optimization, code splitting, memoization strategies, bundle size control, asset optimization, and memory management.

    284 GitHub stars~4.1k tokensUpdated 3 days ago
    Auto-check passed
  • Tsh Reviewing Frontend

    TheSoftwareHouse/copilot-collections

    Frontend-specific code review criteria, component anti-patterns, hooks quality, rendering correctness, accessibility and performance spot-checks, and module organization issues.

    284 GitHub stars~4.4k tokensUpdated 3 days ago
    Auto-check passed
  • Tsh Writing Hooks

    TheSoftwareHouse/copilot-collections

    Custom hook and composable patterns — naming, composition, stable return shapes, lifecycle cleanup, and testing strategies.

    284 GitHub stars~3k tokensUpdated 3 days ago
    Auto-check passed

Works with

Categories

Questions about Tsh UI Verifying

What does Tsh UI Verifying do?

UI verification criteria, structure checklists, severity definitions, and tolerance rules for comparing implementations against Figma designs. Tsh UI Verifying is an agent skill from TheSoftwareHouse/copilot-collections. UI verification criteria, structure checklists, severity definitions, and tolerance rules for comparing implementations against Figma designs.

When should I use Tsh UI Verifying?

Tsh UI Verifying fits situations like: verifying UI matches design; understanding what to check; determining acceptable differences.

How do I install Tsh UI Verifying in Claude Code?

Run `npx skills add TheSoftwareHouse/copilot-collections --skill tsh-ui-verifying -a claude-code`. Or copy the skill folder (.github/skills/tsh-ui-verifying in TheSoftwareHouse/copilot-collections) into .claude/skills/tsh-ui-verifying in your project. Claude Code loads it when a task matches its description.

How do I install Tsh UI Verifying in Codex?

Run `npx skills add TheSoftwareHouse/copilot-collections --skill tsh-ui-verifying -a codex`. Or copy the skill folder (.github/skills/tsh-ui-verifying in TheSoftwareHouse/copilot-collections) into .agents/skills/tsh-ui-verifying in your project. Codex loads it when a task matches its description.

Can I use Tsh UI Verifying in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add TheSoftwareHouse/copilot-collections --skill tsh-ui-verifying -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/tsh-ui-verifying, .gemini/skills/tsh-ui-verifying, .github/skills/tsh-ui-verifying and .opencode/skills/tsh-ui-verifying in your project.

What does Tsh UI Verifying need to run?

Going by SKILL.md and its folder, Tsh UI Verifying needs the command-line tools its instructions call (npx) and credentials named NORMALIZED_FIELD_KEY. Our summary lists: A credential in NORMALIZED_FIELD_KEY.

Does Tsh UI Verifying access the network?

SKILL.md contains no URLs. Its commands use npx, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Tsh UI Verifying safe to install?

Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Tsh UI Verifying use?

Tsh UI Verifying is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Tsh UI Verifying use?

About 7.8k tokens (SKILL.md is roughly 31k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Tsh UI Verifying?

Skills that share tags, products or a category with Tsh UI Verifying: Prototype First UI (DejavuMoe/Smoji, 114 stars), Teswiz Project (znsio/teswiz, 105 stars), Phone Harness (ShawnPana/phone-harness, 3.2k stars) and Maa Issue Log Analysis (MaaAssistantArknights/MaaAssistantArknights, 24k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Tsh UI Verifying?

TheSoftwareHouse (a GitHub organization) maintains it in TheSoftwareHouse/copilot-collections, which has 284 GitHub stars. The repository holds 21 skills in this directory. The repository was last updated on October 5, 2026.

Source: TheSoftwareHouse/copilot-collections on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.