Prototype First UI
DejavuMoe/Smoji
Run a safe prototype-first UI/UX workflow across web, desktop, mobile, extensions, and multimodal design inputs.
UI verification criteria, structure checklists, severity definitions, and tolerance rules for comparing implementations against Figma designs.
$ npx skills add TheSoftwareHouse/copilot-collections --skill tsh-ui-verifying -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install TheSoftwareHouse/copilot-collections tsh-ui-verifying --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ 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-srcUse ~/.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/
Install the "tsh-ui-verifying" agent skill from https://github.com/TheSoftwareHouse/copilot-collections/tree/main/.github/skills/tsh-ui-verifying into .claude/skills/tsh-ui-verifying/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tsh-ui-verifying", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/TheSoftwareHouse/copilot-collections/tree/main/.github/skills/tsh-ui-verifyingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add TheSoftwareHouse/copilot-collections --skill tsh-ui-verifying -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install TheSoftwareHouse/copilot-collections tsh-ui-verifying --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TheSoftwareHouse/copilot-collections.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.github/skills/tsh-ui-verifying .agents/skills/tsh-ui-verifying && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "tsh-ui-verifying" agent skill from https://github.com/TheSoftwareHouse/copilot-collections/tree/main/.github/skills/tsh-ui-verifying into .agents/skills/tsh-ui-verifying/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tsh-ui-verifying", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add TheSoftwareHouse/copilot-collections --skill tsh-ui-verifying -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install TheSoftwareHouse/copilot-collections tsh-ui-verifying --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TheSoftwareHouse/copilot-collections.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.github/skills/tsh-ui-verifying .cursor/skills/tsh-ui-verifying && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "tsh-ui-verifying" agent skill from https://github.com/TheSoftwareHouse/copilot-collections/tree/main/.github/skills/tsh-ui-verifying into .cursor/skills/tsh-ui-verifying/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tsh-ui-verifying", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/TheSoftwareHouse/copilot-collections.git --path .github/skills/tsh-ui-verifying--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add TheSoftwareHouse/copilot-collections --skill tsh-ui-verifying -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install TheSoftwareHouse/copilot-collections tsh-ui-verifying --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TheSoftwareHouse/copilot-collections.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.github/skills/tsh-ui-verifying .gemini/skills/tsh-ui-verifying && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "tsh-ui-verifying" agent skill from https://github.com/TheSoftwareHouse/copilot-collections/tree/main/.github/skills/tsh-ui-verifying into .gemini/skills/tsh-ui-verifying/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tsh-ui-verifying", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install TheSoftwareHouse/copilot-collections tsh-ui-verifyingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add TheSoftwareHouse/copilot-collections --skill tsh-ui-verifying -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/TheSoftwareHouse/copilot-collections.git skills-src && mkdir -p .github/skills && cp -r skills-src/.github/skills/tsh-ui-verifying .github/skills/tsh-ui-verifying && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "tsh-ui-verifying" agent skill from https://github.com/TheSoftwareHouse/copilot-collections/tree/main/.github/skills/tsh-ui-verifying into .github/skills/tsh-ui-verifying/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tsh-ui-verifying", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add TheSoftwareHouse/copilot-collections --skill tsh-ui-verifying -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install TheSoftwareHouse/copilot-collections tsh-ui-verifying --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TheSoftwareHouse/copilot-collections.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.github/skills/tsh-ui-verifying .opencode/skills/tsh-ui-verifying && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "tsh-ui-verifying" agent skill from https://github.com/TheSoftwareHouse/copilot-collections/tree/main/.github/skills/tsh-ui-verifying into .opencode/skills/tsh-ui-verifying/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tsh-ui-verifying", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
tsh-ui-verifyingUI 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. 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.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 2fbe51e. It shows what the files ask for, not the result of running them.
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.
Shell commands in SKILL.md call:
npxFrom the folder's file list and the shell code blocks in SKILL.md.
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.
Names these keys or tokens, usually read from environment variables:
NORMALIZED_FIELD_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
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.
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.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
al form. If it is, derive one repo-root `.env` var per required field from the live form using this order of precedenceogin. Add these exact vars to repo-root `.env` and tell me when the file is saved:e file, I will rerun capture and reload `.env` automatically."ne login and either populated the local `.env` contract derived from the real login form, completed the redirected reallocal env contract: in the target repo `.env` file, set one env var per required login field using the derived naming rthe user to populate the exact derived `.env` vars and confirm when the file is saved, then rerun capture with `.env` rAutomated 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.
The full file from TheSoftwareHouse/copilot-collections at commit 2fbe51e, republished under its MIT licence (© TheSoftwareHouse). 3,819 words, ~7,846 tokens.
.claude/skills/tsh-ui-verifying/SKILL.md (or your agent's skills folder).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.
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 reportStep 1: Validate inputs
Before starting verification, confirm:
.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:.env automatically."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.vscode/askQuestions, raise the blocker through that tool immediately rather than a freeform reply.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.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..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..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.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.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:
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.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.ENSURE-OR-FETCH: At the start of every pass, check whether a valid shared
figma-expected.png(a real design export) already exists atspecifications/<task-id>/ui-verification/figma-expected.pngfor the current verification item. If it is missing, export it now via thefigmaMCP (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 (thefigmaMCP is unavailable, Figma cannot be reached, the node cannot be resolved, or the file cannot be written) do you reportVERIFICATION NOT RUN, surface the blocker throughvscode/askQuestions, and stop. Never browser-scrape Figma, never save a browser/login/error screenshot asfigma-expected.png, and never proceed to compare against memory, source code, or the running app while a valid sharedfigma-expected.pngis 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:
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.
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:
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".state-save file outside specifications/**, for example in a git-ignored temp path supplied by the caller.mkdir -p "$ARTIFACT_DIR"."$ARTIFACT_DIR/<file>". Never rely on default output locations."$FIGMA_EXPECTED" before browser capture begins. If the shared reference export fails, stop as VERIFICATION NOT RUN before opening the app page.playwright-cli open -s <session-name>.playwright-cli resize <figma-width> 1080 -s <session-name>.playwright-cli goto <full-url> -s <session-name>.playwright-cli run-code -s <session-name> "async page => { await page.emulateMedia({ reducedMotion: 'reduce' }); await page.waitForLoadState('networkidle'); }"playwright-cli screenshot --filename="$ARTIFACT_DIR/actual.png" -s <session-name> (full page when supported).playwright-cli run-code -s <session-name> "async page => { await page.screenshot({ path: '$ARTIFACT_DIR/actual.png', fullPage: true }); }".playwright-cli --raw snapshot -s <session-name> > "$ARTIFACT_DIR/a11y-snapshot.yml".playwright-cli --raw eval -s <session-name> "JSON.stringify(...)" > "$ARTIFACT_DIR/computed-styles.json".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.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.
networkidle before capture.Store each verification pass under:
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.mdRequired 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.
playwright-cli open or playwright-cli goto non-zero: escalate immediately instead of silently continuing.0: evidence that the render is within the loose screenshot threshold; not the final verdict.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.
toHaveScreenshotUse this only as a non-blocking signal layer after the core CLI-first capture exists.
PLAYWRIGHT_HTML_OPEN=never npx playwright test --reporter=json.toHaveScreenshot with a loose threshold such as maxDiffPixelRatio, fullPage: true, and masks for known dynamic regions.pixel-gate/.0 or 1 is evidence for the reviewer brain. It never replaces the multimodal comparison and computed-style review.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.
| Check | Description |
|---|---|
| Container hierarchy | Does DOM structure match Figma's layer hierarchy? |
| Nesting depth | Are elements nested at the same level as in Figma? |
| Grouping | Are related elements grouped together as in design? |
| Element order | Is the visual order of elements the same? |
| Wrapper elements | Are there extra/missing wrapper divs that change layout? |
| Sections present | Are ALL sections from Figma present in implementation? |
| Check | Description |
|---|---|
| Flex/Grid direction | row vs column, wrap behavior |
| Alignment | justify-content, align-items values |
| Distribution | How space is distributed between elements |
| Positioning | relative, absolute, fixed - matches design intent? |
| Centering | Is content centered as in design? |
| Check | Description |
|---|---|
| Container width | max-width, fixed width constraints |
| Card/panel boundaries | Does card have same width as in Figma? |
| Content area vs viewport | Ratio of content width to available space |
| Width/Height | Fixed, percentage, auto, min/max constraints |
| Spacing | Padding, margin, gap between elements |
| Gaps | Space 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.
| Check | Description |
|---|---|
| Typography | font-family, size, weight, line-height, letter-spacing |
| Colors | Text, background, border colors |
| Radii | border-radius values |
| Shadows | box-shadow, drop-shadow |
| Backgrounds | Solid, gradient, image |
| Check | Description |
|---|---|
| Correct variants | Is the right variant of a component used? |
| Design tokens | Are correct tokens used (not hardcoded values)? |
| States | hover, focus, active, disabled states |
| Category | Tolerance | Notes |
|---|---|---|
| Structure | None | Any structural difference = FAIL |
| Layout direction | None | row vs column must match exactly |
| Alignment | None | Centering, justify, align must match |
| Dimensions | 1-2px | Only for browser rendering variance |
| Colors | Exact match | Must use correct design tokens |
| Typography | Exact match | Font properties must match |
| Spacing | 1-2px | Only for browser rendering variance |
| Severity | Description | Action |
|---|---|---|
| Critical | Structure/layout differences, wrong component used | Must fix immediately |
| Major | Dimensions off by >2px, wrong colors/typography | Must fix before merge |
| Minor | 1-2px browser rendering variance | Acceptable, document if recurring |
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:
FAIL and represent the items under Clarification Needed rather than as automatic fix items.If the content/data mismatch also changes structure, layout, or visual fidelity in a real way, report that underlying UI defect normally.
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:
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.computed-styles.json or a cited structural fact from a11y-snapshot.yml, not by impression.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:
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.
Before reporting PASS:
## 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.
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:
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.
tsh-implementing-frontend - for implementing fixes following design system patternstsh-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
Just SKILL.md in .github/skills/tsh-ui-verifying of TheSoftwareHouse/copilot-collections.
Open the folder on GitHubat commit 2fbe51e
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Tsh UI Verifying this skillTheSoftwareHouse/copilot-collections | 284 | — | ~7.8k | Automated safety check: Notes | MIT | |
| Prototype First UIDejavuMoe/Smoji | 114 | — | ~4.2k | Automated safety check: Pass | Apache-2.0 | |
| Teswiz Projectznsio/teswiz | 105 | — | ~977 | Automated safety check: Pass | MIT | |
| Phone HarnessShawnPana/phone-harness | 3.2k | — | ~4.3k | Automated safety check: Pass | MIT | |
| Maa Issue Log AnalysisMaaAssistantArknights/MaaAssistantArknights | 24k | — | ~4k | Automated safety check: Pass | AGPL-3.0 | |
| Sleek Design Mobile Appssleekdotdesign/agent-skills | 585 | — | ~2.1k | Automated safety check: Pass | MIT |
DejavuMoe/Smoji
Run a safe prototype-first UI/UX workflow across web, desktop, mobile, extensions, and multimodal design inputs.
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.
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.
MaaAssistantArknights/MaaAssistantArknights
分析 MaaAssistantArknights 上游仓库公开 Issue(https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/...
sleekdotdesign/agent-skills
Design mobile app screens with Sleek, edit Sleek projects, and implement their designs in React Native or HTML.
tloncorp/tlon-apps
Run a mobile QA checklist on a physical Android device over adb for tlon-apps, then triage what fails into fixes.
TheSoftwareHouse/copilot-collections
Create new skills (SKILL.md) for GitHub Copilot. An agent skill from TheSoftwareHouse/copilot-collections.
TheSoftwareHouse/copilot-collections
Frontend component patterns, composition, design token integration, barrel file organization, error handling, and Figma-to-code workflow.
TheSoftwareHouse/copilot-collections
Build reusable Terraform modules for AWS, Azure, and GCP infrastructure following infrastructure-as-code best practices.
TheSoftwareHouse/copilot-collections
Frontend rendering optimization, code splitting, memoization strategies, bundle size control, asset optimization, and memory management.
TheSoftwareHouse/copilot-collections
Frontend-specific code review criteria, component anti-patterns, hooks quality, rendering correctness, accessibility and performance spot-checks, and module organization issues.
TheSoftwareHouse/copilot-collections
Custom hook and composable patterns — naming, composition, stable return shapes, lifecycle cleanup, and testing strategies.
Works with
Categories
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.
Tsh UI Verifying fits situations like: verifying UI matches design; understanding what to check; determining acceptable differences.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.