AHD Artificial Human Design

AHD · Artificial Human Design

Catch AI design slop before it ships.

A design linter for AI-generated interfaces. AHD scores every page against a versioned taxonomy of thirty-nine slop tells. Same critique every run, so 'looked fine to me' stops being a review.

See a critique → · Get started →


Measured weekly in CI · latest run 10 August 2026

Every week a scheduled job puts the same brief through five open-source models on Cloudflare Workers AI, thirty times each, and publishes the result through a pull request a human has to approve. Eight runs in, the useful reading is the series rather than any one week. gpt-oss-120b and mistral-small-3.1 reduce tells every run and by a consistent amount. gemma-4 reduces every run by an amount that swings twenty points. llama-4-scout sits against zero. qwen3-30b changes sign six times in eight runs, so nothing about its direction is repeatable. Read the weekly series or every run.


Measured · 24 April 2026 · cross-token triangulation

Same brief, a different style token (post-digital-green), eleven models, thirty samples each, six hundred and sixty pages in all. This run exposed a flaw in the rules rather than in the models. Several rules assumed the editorial conventions that this token deliberately rejects, so they penalised output that had followed the token correctly. AHD's rules can now be told which checks a token switches off. Scoring the same samples again under the corrected rules moves six of the eleven cells positive, with gpt-oss leading at 47.6 percent fewer tells. Click any row for that corrected reading.

Down means fewer tells with AHD's system prompt in place. Up means more. The up rows stay published. Both readings of this run are explained under pre-fix and post-fix.

gpt-oss 120B
48%↓

Best reduction in the run after token-aware lint. 1.40 raw mean tells dropped to 0.73 compiled, 30 of 30 scored. The cell led the pre-fix reading too (+19.8% pre-fix, +47.6% post-fix): the post-digital-green-correct output that the old ruleset under-credited now scores fully. Served by Cloudflare Workers AI.

Gemma 4 26B
50%↓

Flipped sign under token-aware lint: pre-fix −10.5%, post-fix +50.0%. 0.87 raw mean tells dropped to 0.43 compiled, 30 of 30 scored. Three of the four sign-flippers (gemma, kimi, gemini) cluster at the OSS frontier; silencing the editorially-opinionated rules unblocked their compiled output.

Kimi K2.6
30%↓

Flipped sign: pre-fix −14.4%, post-fix +30.5%. 1.97 raw mean tells to 1.37 compiled, 30 of 30 scored after the chat-template fix (Kimi defaults thinking-mode on, which exhausted the token budget). Serving fix lives in the serving-tells catalog.

Gemini 3.1 Pro Preview
26%↓

Flipped sign: pre-fix −9.9%, post-fix +26.3%. 1.20 raw mean tells to 0.88 compiled, 26 of 30 scored (the same intermittent four-of-thirty no-output behaviour observed on the 22 April run). Served via Gemini CLI.

Mistral Small 3.1
22%↓

Stays positive in both readings: pre-fix +34.7%, post-fix +21.7%. 1.53 raw mean tells to 1.20 compiled, 30 of 30 scored. The token-aware re-lint trims the headline margin but leaves the verdict unchanged: compilation helps this cell.

Claude Opus 4.7
regressed 68%↑

Pre-fix −172.9%, post-fix −67.6%: sixty percent of the regression closed by token-aware lint, but the cell still scores worse compiled than raw. 1.13 raw mean tells rose to 1.90 compiled. The remaining gap is rules outside the suppression list firing on Claude's compiled output; either the model or the compiled prompt has more work to do here. Served via Claude Code CLI.

gpt-5.5
regressed 9%↑

Released by OpenAI during the run window and tested inline. Pre-fix −135.5%, post-fix −9.1%: a near-closed regression. 0.37 raw mean tells to 0.40 compiled, 30 of 30 scored, the cleanest raw frontier baseline measured to date. The new model produces tighter HTML by default (~8 KB per sample versus gpt-5.4's 11 KB raw). Served via Codex CLI on ChatGPT.

gpt-5.4
regressed 36%↑

Pre-fix −78.6%, post-fix −36.4%: half the regression closed. 0.37 raw mean tells to 0.50 compiled, 30 of 30 scored. Same pattern as Claude: rules outside the suppression list still firing. Served via Codex CLI.

Eight cells shown. Three cells with very low absolute baselines (Llama 3.3, Llama 4 Scout, Qwen3 30B) show numerically large percentage moves on tiny absolute changes; full eleven-cell breakdown plus the pre-fix-versus-post-fix table lives at eval · 24 April 2026.


Measured · 22 April 2026 · single-token n=30

Same brief, ten models, thirty samples each, six hundred pages in all. Every model was measured twice: once raw, with the brief alone, and once compiled, with AHD's system prompt added. Eight of the ten cells reduce tells. One is flat and one regresses. Median reduction across the nine that did not regress: 59 percent. Click any row for the per-model reading.

gpt-oss 120B
78%↓

Best reduction in the run. 3.50 raw mean tells dropped to 0.77 compiled, 30 of 30 samples scored in both conditions. The compiled prompt moves this OSS model decisively off its median without inducing new tells. Served by Cloudflare Workers AI.

Mistral Small 3.1
62%↓

3.47 raw mean tells dropped to 1.30 compiled, 30 of 30 scored in both conditions. Matches the n=5 signal at tight confidence. The bento-and-gradient raw output collapses toward the Swiss editorial token under the compiled system prompt.

Kimi K2.6
62%↓

2.67 raw mean tells dropped to 1.00 compiled, 30 of 30 scored. The cell required a chat-template fix first: Kimi K2.6 on Cloudflare defaults thinking-mode on, and a 9 KB system prompt exhausted the token budget before any visible output. After patching the runner to pass thinking: false, the cell ran clean. This is a serving-layer defect documented in the serving-tells catalog, separate from the design-slop taxonomy.

Gemini 3.1 Pro Preview
62%↓

2.97 raw mean tells dropped to 1.13 compiled, 30 of 30 scored. Served via Gemini CLI, which is the path most humans actually use for this model today, so the CLI measurement is more ecologically valid than the raw HTTP API would be.

Claude Opus 4.7
59%↓

1.80 raw mean tells dropped to 0.73 compiled, 30 of 30 scored. Served via Claude Code CLI. The n=30 number is tighter but lower than the n=5 reading reported 100 percent reduction at ±35-point uncertainty; 59 percent is the real figure. Same behaviour, measured to a resolution we can now trust.

Llama 3.3 70B
regressed 117%↑

0.28 raw mean tells rose to 0.60 compiled. This reproduces the same-direction regression measured at n=5 on both Cloudflare and Hugging Face serving paths in the 21 April cross-provider run. Llama 3.3's raw output is typographically thin; the compiled brief elicits a richer page with more decision surface, which trips more rules. Framework response: on an editorial brief, do not route to this model.

Full report with attempted-vs-scored counts, per-tell frequency table, serving paths and the run manifest: eval · 22 April 2026. Different-token follow-up: eval · 24 April 2026. Every run: /evals. How to read these numbers: the run's own reading guide, or the general methodology.


Four pieces

  1. Named taxonomy

    Thirty-nine concrete slop tells across web, graphic and typographic surfaces. Enforced by 35 HTML/CSS rules, 3 SVG rules, 14 vision-critic rules on rendered pixels and a six-rule mobile audit (ahd audit-mobile, 375px viewport). Read the taxonomy.

  2. Style tokens

    Ten curated design directions spanning Swiss-Editorial, Manual SF, Neubrutalist-Gumroad, Post-Digital-Green, Monochrome-Editorial, Memphis-Clash, Heisei-Retro, Bauhaus-Revival, Editorial- Illustration and Ad-Creative-Collision. Each declares its own forbidden list, required quirks and reference lineage.

  3. Brief compiler

    ahd compile takes a structured intent and emits a token-anchored system prompt for any LLM. Draft mode for exploration, final mode for single-shot output. See how.

  4. Empirical eval

    A controlled comparison of raw against compiled output across Claude Opus 4.7, GPT-5, Gemini 3 Pro, Llama 3.3 70B, Llama 4 Scout, Mistral Small 3.1, Qwen 2.5 Coder, DeepSeek R1 and image generators FLUX.1 schnell, SDXL Lightning and DreamShaper. Attempted, extracted, scored counts published, losses included.


Install

npm install --save-dev @adastracomputing/ahd

Or try it without installing:

npx @adastracomputing/ahd lint page.html

In CI, so it runs on every pull request:

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-node@v6
        with:
          node-version: 22
      - run: npx @adastracomputing/ahd lint dist/**/*.html dist/**/*.css

Full setup, the full workflow example, npm, source.


Frequently asked

What is AHD?
AHD (Artificial Human Design) is a design linting framework that checks AI-generated UI against a ruleset of known slop patterns, the same way ESLint checks code.
What is a slop tell?
A slop tell is a design pattern that signals AI authorship: the purple-to-blue hero gradient, Inter used for display and body alike, the same medium border-radius on every element, shimmer animation used as decoration. AHD defines 39 tells across three surfaces: web and UI, graphic and brand, typography and system.
What do raw and compiled mean?
They are the two conditions every published run measures. Raw means the model is given the brief and nothing else. Compiled means the same model is given the same brief plus a system prompt that AHD generates from a style token. The AHD layer is the only deliberate difference between them, so a difference in the average score across enough samples points to that layer rather than to the brief or the model.
How does AHD lint?
AHD parses rendered HTML and CSS. The CLI runs ahd lint against built output. Rules fire on structural patterns, not source code, so it catches slop regardless of the framework used to generate the UI.
Is AHD a replacement for design review?
No. AHD catches the mechanical, repeatable tells. Human judgment is still required for anything contextual. The framework handles the checklist so reviewers can focus on what matters.