Vision verify
Visually verify a rendered web page against a goal + rubric — screenshot it (reliable off-box render, NOT the flaky Chrome-MCP), then grade the pixels with an INDEPENDENT vision pass. Use for any UI/visual change before calling it done, or to confirm a fix landed on a live/preview page. Catches what verify-build + code review can't SEE: contrast, overlap, broken images, layout shift, duplicated elements.From its SKILL.md
npx -y skills add seldonframe/seldonframe --skill vision-verifyAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
SKILL.md
4.9 KB, ~1.2k tokens by cl100k_base, as published. Nobody here has run it
vision-verify — the visual gate
verify-build proves a change compiles and passes tests. It cannot prove the
page looks right — code review reasons about JSX/CSS, it never sees the result.
This skill closes that gap: render → screenshot → an independent visual grade
against a rubric. It is the visual complement to verify-build, not a
replacement — run both for UI-affecting work.
Proven 2026-07-05: caught a duplicate "Services" nav item on a live r1 site
that unit tests, tsc, next build, AND two code reviews all missed — then
confirmed the fix by re-screenshot. First bug on SF caught by seeing, not
reasoning about code.
When to use
- After ANY UI-affecting change, before "done" — especially landing/site render (hero, nav, sections), the dashboard shell, or anything themed.
- To confirm a fix visually landed on a live/preview URL (the found → fix → confirm loop).
Steps
-
Get a public URL to the page — a deployed
/w/<slug>, the<slug>.app.seldonframe.comsubdomain, or a Vercel preview URL. It must be publicly reachable (the renderer fetches it). If you just pushed a fix, first confirm the deploy is live:curl -s https://app.seldonframe.com/api/version→ theshashould be your commit (else wait for the deploy). -
Render (from
packages/crm), at desktop and — for anything responsive — mobile:node scripts/vision-shot.mjs <url> /tmp/vv-desktop.png 1280 node scripts/vision-shot.mjs <url> /tmp/vv-mobile.png 390It cache-busts so a just-deployed change is captured fresh. Prints the saved path. (Set
MICROLINK_API_KEYfor higher rate limits; the free endpoint works without it, but can rate-limit on rapid retries — space them out.) -
Grade — independent (maker ≠ checker), on
haiku— PINNED. Dispatch thevision-graderagent (Agent tool,subagent_type: "vision-grader"— its definition in.claude/agents/vision-grader.mdpinsmodel: haiku; do NOT pass a model override) — itReads the PNG and grades it against the goal + a rubric, returning{ pass: boolean, gaps: string[] }. Read-a-PNG→verdict is haiku work; a real session ran 4 graders on sonnet (~218k tokens — the session's biggest line item) purely because the model was left to dispatch-time habit. The pin lives in the agent definition so it can't drift. (If haiku ever provably misses what sonnet catches — run 10 known-good + 10 known-bad screenshots — change the pin there, on evidence, not per-dispatch.) Do NOT let the code's author grade its own pixels — a fresh grader sees only the artifact + the rubric, with no stake in the maker's reasoning. For a quick self-check inline,Readthe PNG yourself — but a real gate uses a separate grader. Prefer a before/after DIFF grade when a baseline exists: hand the grader both screenshots and ask "what changed — is the change the requested one, and did anything regress?" A visual diff is more sensitive to regressions (the duplicate-nav class) and less subjective than an absolute grade. -
Act. Pass → done. Gaps → feed each gap back to the maker → re-render → re-grade until pass or a hard iteration cap (an objective stop, like
/goal).
Rubric (adapt per surface)
Generic: renders with no broken images / empty sections; text is legible (contrast); nothing overlaps or overflows the viewport (no horizontal scroll); no duplicated nav/section elements; the specific change requested is visibly present; nothing is truncated mid-word in a jarring way.
Per-surface hints:
- Hero: headline hierarchy clear; subhead + CTAs legible; any lead-form-in-hero renders; a set background sits BEHIND text with a legibility veil (never washing out the copy).
- Nav: exactly one of each item (the duplicate-"Services" class of bug); wordmark + phone/CTA present.
- Pricing / tables: columns aligned; numbers tabular; no clipped cells.
- Dashboard shell: no sideways scroll; the summary reads before the detail.
Notes
- The Chrome-MCP
screenshotpath is unreliable here (CDPclip.scale+ backgrounded-tab 0-viewport) — usevision-shot.mjs. - Product version (next build): the same render+grade engine, server-side,
becomes SeldonChat's "confirm the edit looks right before I say done" and a
gate in the site-generation pipeline — the never-lies pillar made mechanical.
Spec:
docs/superpowers/specs/2026-07-05-vision-verify-spike.md.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.
Gives 0 of the 12 instructions most quality gates skills give in ~1.2k tokens
Counted across 1,524 of the 2,830 authors here whose files we hold, read 2026-09-06
- Read full output and check exit codein 45 of 1524, across 40 files
- Verify output confirms the claimin 44 of 1524, across 39 files
- Identify the command that proves the claimin 43 of 1524, across 39 files
- Execute the full verification commandin 36 of 1524, across 30 files
- Produce a verification reportin 34 of 1524, across 18 files
- Review git diff changesin 30 of 1524, across 16 files
- Fix build failures immediatelyin 29 of 1524, across 9 files
- Group findings by severityin 28 of 1524
- State claim only with evidencein 27 of 1524, across 22 files
- Verify regression tests with red-green cyclein 26 of 1524, across 22 files
- Run the full test suitein 26 of 1524, across 25 files
- Run test suite with coveragein 25 of 1524, across 10 files
Said here and by no other author read
- obtain a public URL for the page
- render screenshots at desktop and mobile widths
- use the vision-shot script for rendering
- dispatch the vision-grader agent for independent grading
- use a before and after diff grade when possible
- feed gaps back to the maker for iteration
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.