ui-tells
Skill4 starsChanged 20 days agoMITView on GitHub
Measure on the rendered page the markers that give away a model-generated interface: grids of three identical cards, small-caps eyebrows everywhere, the middle dot as a universal separator, browser windows drawn with divs, round filler figures and brochure verbs. Separates objective failures, which get fixed, from hints, which are the designer's judgement. Use when asked to iterate on or improve an already-built interface, when someone says a screen «parece hecha por IA», «queda genérica» or «parece una plantilla», or before showing a page to an outsider.
- Installs packages
In this repository46 other files it gives its agents.
- AGENTS.mdAGENTS.md
- add-repo-to-docsSkill
- adrSkill
- auth-bypass-localSkill
- before-afterSkill
- bug-huntSkill
- carry-envSkill
- code-healthSkill
- crux-doctorSkill
- crux-initSkill
- css-to-componentsSkill
- deploy-fallbackSkill
- deploy-watchSkill
- device-loopSkill
- drive-browserSkill
- e2eSkill
- end-sessionSkill
- eval-fixturesSkill
- explain-planSkill
- flowSkill
- grillSkill
- merge-conflictsSkill
- motion-videoSkill
- oauth-reauthorizeSkill
- prod-signalsSkill
- promote-to-docsSkill
- prose-checkSkill
- read-documentSkill
- render-loopSkill
- repo-mapSkill
- review-prSkill
- root-causeSkill
- runbookSkill
- security-auditSkill
- share-localSkill
- shipSkill
- skill-auditSkill
- skill-creatorSkill
- teachSkill
- ui-behaviourSkill
- visual-diffSkill
- visual-testSkill
- wizardSkill
- workspaceSkill
- write-testsSkill
- x-postsSkill
The file
We split this skill into the rules it gives an agent
3 rules. About 0 are common, 2 are distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 20
Before showing a page to a client or publishing it.
- Very specific: line 24
As an automatic gate: Do not put it in quality.gate: it would run on every crux ship and you would end up fighting it on changes that do …
- Distinctive: line 98
Turning the hints into rules: If you start banning three-column grids everywhere, you have swapped one generic design for another.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
ui-tells
A generated interface is recognised by its shape before its content, just like a generated text. The markers are few, concrete and can be counted. This skill measures them on the already-rendered page, which is where they are seen.
It is the sibling of prose-check for screens, and shares its main rule: count
and locate, do not fix. Deciding whether each case is surplus is up to you.
When to use
- You are asked to iterate on or polish an interface that already exists.
- Someone says a screen «parece hecha por IA», «queda muy genérica» or «parece una plantilla».
- Before showing a page to a client or publishing it.
When not to use
- As an automatic gate. Do not put it in
quality.gate: it would run on everycrux shipand you would end up fighting it on changes that do not touch the interface. It is invoked by hand, when it applies. - For accessibility or horizontal scroll. That is
visual-test, which runs axe-core for real. - To check that controls do something. That is
ui-behaviour. - To decide the design direction. This measures, it does not design.
Preconditions
The system Chrome and playwright-core in the directory you run from. Same as
visual-test:
npm i playwright-core
export CHROME_BIN=/usr/bin/google-chrome # if it is not at the usual pathThe page has to be served, locally or in production.
Usage
node scripts/ui-tells.mjs check <url> [url...] # the count
node scripts/ui-tells.mjs detail <url> # each case with its textIt exits with code 1 if there is any objective failure, so it works inside a script if you ever want to chain it.
The two groups, and why they are separate
Objective failures. They do not depend on anyone's taste: either the headline fits on the first screen or it does not.
| Marker | Why it is a failure |
| Em dash in visible text | The same tic prose-check catches, here in the interface |
| Headline or call to action outside the first screen | Whoever arrives does not see what this is or what to do |
| Navigation over 80px or on two lines | It eats the screen and shows the width was not thought through |
| Button label split over two lines | Reads badly and usually means the text is long |
100vh instead of 100dvh | On mobile the content jumps when the address bar hides |
Hints. They tell something real, but it may be exactly what the content calls for. They are reported separately and do not score.
Grid of three identical columns, density of small-caps eyebrows, lines with more
than one middle dot, numbered eyebrows (001 · Capabilities), browser windows
drawn with divs with no image inside, «scroll» texts, version labels on the
first screen, filler names (Acme, John Doe, Lorem), falsely round figures and
brochure verbs (impulsar, potenciar, unleash, seamless).
That separation is the same one prose-check makes with the em dash and the
colon, and for the same reason: an automatic measurement cannot tell a punchline
from an explanation.
How to read the result
The load is the objective failures. Zero is normal, and anything above it is fixed before delivering.
Hints have no threshold. They are for looking twice: if the front page has five grids of three identical cards, the problem is probably that all the sections look like each other, and not any one of them on its own.
Gotchas
Three false positives already solved in the script (how and why, in
<this-skill-directory>/references/why.md): do not reintroduce the height
comparison for split labels, the fake window with an image inside or navigation
rows by exact coordinate. The 100vh check only sees the domain's own CSS.
Anti-patterns
Turning the hints into rules. If you start banning three-column grids everywhere, you have swapped one generic design for another.
Measuring without looking. The skill does not see the composition, which is often the real reason something «looks AI-made». Run it, but open the page.
Adopting someone else's aesthetic. The thresholds here are neutral on purpose. The ones that depend on style (typefaces, palettes, symmetry) go in each project's conventions, not in the kernel.
Related
prose-check— the same method for text.visual-test— real accessibility, horizontal scroll, contrast.ui-behaviour— that controls do something.render-loop— iterate on a rendered output.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

