{
 "name": "Slop Patterns taxonomy",
 "version": "1.1.0",
 "released": "2026-10-06",
 "license": "MIT",
 "url": "https://sloppatterns.com",
 "cite": "https://github.com/pavithralamahewa/slop-patterns/blob/main/CITATION.cff",
 "count": 272,
 "checkedAutomatically": 101,
 "patterns": [
  {
   "code": "A1",
   "id": "the-unchosen-gradient",
   "name": "The Unchosen Gradient",
   "category": "Colour",
   "track": "surface",
   "harm": "Credibility",
   "detection": "automated",
   "url": "https://sloppatterns.com/#the-unchosen-gradient",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-09-23",
   "oneLiner": "Indigo-to-violet gradient on the hero and the primary button, chosen by nobody.",
   "fix": "Pick a primary colour from the brand or the product's subject matter and give it to the model as a hex value, not an adjective. Use one accent, keep gradients for a single deliberate moment if at all, and forbid the 240-295 degree hue band unless it was actually chosen.",
   "sources": [
    {
     "t": "Why Every AI-Built Website Looks the Same (Blame Tailwind's Indigo-500)",
     "u": "https://dev.to/alanwest/why-every-ai-built-website-looks-the-same-blame-tailwinds-indigo-500-3h2p"
    },
    {
     "t": "How to tell if a website was AI generated: 9 visible signs",
     "u": "https://uxskill.laithjunaidy.com/how-to-tell-if-a-website-was-ai-generated.html"
    },
    {
     "t": "AI Slop Fonts and Gradients: The Tells That Give Away AI Design",
     "u": "https://www.925studios.co/blog/ai-slop-design-tells"
    },
    {
     "t": "Scoring Show HN submissions for AI design patterns",
     "u": "https://www.adriankrebs.ch/blog/design-slop/"
    }
   ]
  },
  {
   "code": "A2",
   "id": "inter-for-everything",
   "name": "Inter For Everything",
   "category": "Typography",
   "track": "surface",
   "harm": "Credibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#inter-for-everything",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-09-23",
   "oneLiner": "One neutral sans, usually Inter, doing headlines, body, labels and fine print alike.",
   "fix": "Pair a display face with a body face and name both in the prompt. Set a real type scale (ratio 1.25-1.5) with distinct weights and letter-spacing per level, and test the pairing on the actual headline copy.",
   "sources": [
    {
     "t": "AI Slop Fonts and Gradients: The Tells That Give Away AI Design",
     "u": "https://www.925studios.co/blog/ai-slop-design-tells"
    },
    {
     "t": "AI Design Slop: 16 Patterns That Out Your App as Vibe-Coded",
     "u": "https://www.developersdigest.tech/blog/ai-design-slop-and-how-to-spot-it"
    },
    {
     "t": "How to tell if a website was AI generated: 9 visible signs",
     "u": "https://uxskill.laithjunaidy.com/how-to-tell-if-a-website-was-ai-generated.html"
    }
   ]
  },
  {
   "code": "A3",
   "id": "three-identical-feature-cards",
   "name": "Three Identical Feature Cards",
   "category": "Layout",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#three-identical-feature-cards",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-09-23",
   "oneLiner": "A row of exactly three equal cards, each with an icon, a short title and two lines of text.",
   "fix": "Rank the features and give the lead one more space, an actual screenshot and a longer explanation. Use different forms for different content: a comparison table, a list, a single annotated image.",
   "sources": [
    {
     "t": "How to tell if a website was AI generated: 9 visible signs",
     "u": "https://uxskill.laithjunaidy.com/how-to-tell-if-a-website-was-ai-generated.html"
    },
    {
     "t": "AI Slop Fonts and Gradients: The Tells That Give Away AI Design",
     "u": "https://www.925studios.co/blog/ai-slop-design-tells"
    },
    {
     "t": "Scoring Show HN submissions for AI design patterns",
     "u": "https://www.adriankrebs.ch/blog/design-slop/"
    }
   ]
  },
  {
   "code": "A4",
   "id": "the-weightless-headline",
   "name": "The Weightless Headline",
   "category": "Copy",
   "track": "surface",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-weightless-headline",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "'Build faster. Ship smarter.' A headline that is grammatically perfect and describes no product.",
   "fix": "Write the headline as a specific claim a competitor could not make: who it is for, what it does, and a concrete outcome or mechanism. Test by asking whether the sentence would be false on another company's site.",
   "sources": [
    {
     "t": "AI Slop Fonts and Gradients: The Tells That Give Away AI Design",
     "u": "https://www.925studios.co/blog/ai-slop-design-tells"
    },
    {
     "t": "How to tell if a website was AI generated: 9 visible signs",
     "u": "https://uxskill.laithjunaidy.com/how-to-tell-if-a-website-was-ai-generated.html"
    },
    {
     "t": "How to Avoid Building Apps That Look Vibe Coded",
     "u": "https://vibemole.com/resources/avoid-vibecoded-app-design"
    }
   ]
  },
  {
   "code": "A5",
   "id": "the-invented-stat-row",
   "name": "The Invented Stat Row",
   "category": "Copy",
   "track": "surface",
   "harm": "Trust",
   "detection": "automated",
   "url": "https://sloppatterns.com/#the-invented-stat-row",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-10-06",
   "oneLiner": "A banner of big round numbers, '10,000+ users, 99.9% uptime, 4.9/5 rating', on a product that launched yesterday.",
   "fix": "Publish only numbers you can defend, with a unit, a date and where possible a link. If you have no numbers yet, say something true instead: what the product does, for whom, since when.",
   "sources": [
    {
     "t": "SlopMonster: lint for AI tells (Invented Proof category)",
     "u": "https://github.com/ItsssssJack/SlopMonster"
    },
    {
     "t": "slop-detect: 27-pattern AI-design-slop fingerprint (Stat banner rule)",
     "u": "https://github.com/ravidsrk/slop-detect"
    },
    {
     "t": "Social Proof That Works for AI Products: Beyond the Generic Testimonial",
     "u": "https://landingnova.medium.com/social-proof-that-works-for-ai-products-beyond-the-generic-testimonial-bef87f0ae81b"
    }
   ]
  },
  {
   "code": "B1",
   "id": "no-undo",
   "name": "No Undo",
   "category": "Agency",
   "track": "behavioral",
   "harm": "Safety",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#no-undo",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The agent can delete, overwrite or send, but the interface offers no way to take it back.",
   "fix": "Snapshot state before any write and expose a one-click restore beside the completed action (HAX G9: support efficient correction). Prefer 'undo' over 'confirm' for reversible operations, and reserve confirmation for the genuinely irreversible.",
   "sources": [
    {
     "t": "Vibe coding service Replit deleted user's production database, faked data, told fibs galore (The Register)",
     "u": "https://www.theregister.com/2025/07/21/replit_saastr_vibe_coding_incident/"
    },
    {
     "t": "9 AI coding agent incidents that deleted production data (Adversa)",
     "u": "https://adversa.ai/blog/ai-coding-agent-incidents/"
    },
    {
     "t": "HAX Design Library, 18 guidelines (G9)",
     "u": "https://www.microsoft.com/en-us/haxtoolkit/library/"
    }
   ]
  },
  {
   "code": "B2",
   "id": "silent-success",
   "name": "Silent Success",
   "category": "Error handling",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#silent-success",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A step fails underneath, and the agent reports it as finished anyway.",
   "fix": "Verify post-conditions (does the directory exist, did the row count change) and render tool failures as distinct error states rather than prose. Follow PAIR's errors guidance: name what failed and give a path forward.",
   "sources": [
    {
     "t": "Google Gemini deletes user's files, then admits 'I have failed you completely and catastrophically' (Slashdot)",
     "u": "https://developers.slashdot.org/story/25/07/26/0642239/google-gemini-deletes-users-files-then-just-admits-i-have-failed-you-completely-and-catastrophically"
    },
    {
     "t": "The Blank Box Problem (Aaron Tay)",
     "u": "https://aarontay.substack.com/p/the-blank-box-problem-why-its-harder"
    },
    {
     "t": "PAIR Guidebook: Errors + Graceful Failure",
     "u": "https://pair.withgoogle.com/chapter/errors-failing/"
    }
   ]
  },
  {
   "code": "B3",
   "id": "confident-fabrication",
   "name": "Confident Fabrication",
   "category": "Trust",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#confident-fabrication",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Invented facts are rendered in the same voice and typography as verified ones.",
   "fix": "Bind every claim to a source or a verifiable artifact, and visually downgrade unbound claims (HAX G2: make clear how well the system can do what it can do). Where a claim cannot be verified, say so in the component, not in a footer.",
   "sources": [
    {
     "t": "Apple pauses AI notification summaries for news after generating false alerts (TechCrunch)",
     "u": "https://techcrunch.com/2025/01/16/apple-pauses-ai-notification-summaries-for-news-after-generating-false-alerts"
    },
    {
     "t": "Replit deleted user's production database, faked data (The Register)",
     "u": "https://www.theregister.com/2025/07/21/replit_saastr_vibe_coding_incident/"
    }
   ]
  },
  {
   "code": "A6",
   "id": "aurora-blob-backdrop",
   "name": "Aurora Blob Backdrop",
   "category": "Colour",
   "track": "surface",
   "harm": "Credibility",
   "detection": "automated",
   "url": "https://sloppatterns.com/#aurora-blob-backdrop",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Two or three heavily blurred coloured circles drifting behind the hero to make it feel 'alive'.",
   "fix": "Give the hero a real subject: a product screenshot, a photograph, a diagram, or plain type on a solid surface. If ambient colour is wanted, use one flat tinted shape or a subtle texture that relates to the brand.",
   "sources": [
    {
     "t": "slop-detect: 27-pattern AI-design-slop fingerprint (Aurora blobs rule)",
     "u": "https://github.com/ravidsrk/slop-detect"
    },
    {
     "t": "How to tell if a website is AI-generated: 10 signs to check",
     "u": "https://slopdar.com/guide/how-to-tell-if-a-website-is-ai-generated"
    },
    {
     "t": "How to Avoid Building Apps That Look Vibe Coded",
     "u": "https://vibemole.com/resources/avoid-vibecoded-app-design"
    }
   ]
  },
  {
   "code": "A7",
   "id": "permanent-midnight",
   "name": "Permanent Midnight",
   "category": "Colour",
   "track": "surface",
   "harm": "Accessibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#permanent-midnight",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Dark mode as the only mode, with mid-grey body text on near-black.",
   "fix": "Choose the theme from the audience and the reading task, not the genre. If dark is right, set body text to at least 4.5:1 contrast (often #D4D4D8 or lighter), warm or cool the neutrals toward the brand, and ship a light theme via prefers-color-scheme.",
   "sources": [
    {
     "t": "AI Design Slop: 16 Patterns That Out Your App as Vibe-Coded",
     "u": "https://www.developersdigest.tech/blog/ai-design-slop-and-how-to-spot-it"
    },
    {
     "t": "Scoring Show HN submissions for AI design patterns",
     "u": "https://www.adriankrebs.ch/blog/design-slop/"
    }
   ]
  },
  {
   "code": "A8",
   "id": "frosted-glass-cards",
   "name": "Frosted Glass Cards",
   "category": "Components",
   "track": "surface",
   "harm": "Accessibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#frosted-glass-cards",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-09-23",
   "oneLiner": "Semi-transparent cards with backdrop-blur floating over a gradient, used as decoration.",
   "fix": "Use opaque surfaces with a real border or a single well-tuned shadow. If translucency has a job (a nav over scrolling content), keep the blur there only and verify text contrast at the worst point.",
   "sources": [
    {
     "t": "How to Make Your AI-Built Site Not Look AI-Built",
     "u": "https://www.joshuasnoddy.com/blog/make-ai-built-site-not-look-ai/"
    },
    {
     "t": "AI Design Slop: Why AI-Generated UI Looks Generic - and the Fix",
     "u": "https://smoothui.dev/blog/ai-design-slop"
    },
    {
     "t": "10 trends that creatives are so over in 2026",
     "u": "https://www.creativeboom.com/insight/10-trends-creatives-are-so-over-in-2026/"
    }
   ]
  },
  {
   "code": "A9",
   "id": "the-italic-serif-wink",
   "name": "The Italic Serif Wink",
   "category": "Typography",
   "track": "surface",
   "harm": "Credibility",
   "detection": "automated",
   "url": "https://sloppatterns.com/#the-italic-serif-wink",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-10-06",
   "oneLiner": "One word of the sans-serif headline swapped to italic serif for instant 'editorial' feel.",
   "fix": "If a serif belongs in the brand, give it a real job (all headlines, or all body) and let the pairing carry through the page. Emphasis within a headline should come from the words, not a font swap.",
   "sources": [
    {
     "t": "AI Design Slop: 16 Patterns That Out Your App as Vibe-Coded",
     "u": "https://www.developersdigest.tech/blog/ai-design-slop-and-how-to-spot-it"
    },
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    },
    {
     "t": "slop-detect: 27-pattern AI-design-slop fingerprint",
     "u": "https://github.com/ravidsrk/slop-detect"
    }
   ]
  },
  {
   "code": "A10",
   "id": "gradient-text-headline",
   "name": "Gradient Text Headline",
   "category": "Typography",
   "track": "surface",
   "harm": "Accessibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#gradient-text-headline",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-09-23",
   "oneLiner": "The H1 or a big stat is painted with a gradient via background-clip: text.",
   "fix": "Set the headline in a solid colour with strong contrast and let the words do the work. If colour emphasis is needed, colour one word solidly in the accent.",
   "sources": [
    {
     "t": "The Purple Gradient Problem: Why AI UI All Looks Alike",
     "u": "https://dev.to/james_anderson_h/the-purple-gradient-problem-why-ai-ui-all-looks-alike-and-how-to-fix-it-3j65"
    },
    {
     "t": "slop-detect: 27-pattern AI-design-slop fingerprint (Hero gradient text rule)",
     "u": "https://github.com/ravidsrk/slop-detect"
    },
    {
     "t": "How to Avoid Building Apps That Look Vibe Coded",
     "u": "https://vibemole.com/resources/avoid-vibecoded-app-design"
    }
   ]
  },
  {
   "code": "A11",
   "id": "centred-hero-one-button",
   "name": "Centred Hero, One Button",
   "category": "Layout",
   "track": "surface",
   "harm": "Credibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#centred-hero-one-button",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-10-06",
   "oneLiner": "Big centred headline, one-line subhead, a primary and a ghost button, symmetrical padding, nothing else.",
   "fix": "Anchor the hero with a real product surface, photo or diagram and let the text sit left of it or over it. Use asymmetry deliberately; vary the measure so the headline does not float in the middle of the viewport.",
   "sources": [
    {
     "t": "How to tell if a website was AI generated: 9 visible signs",
     "u": "https://uxskill.laithjunaidy.com/how-to-tell-if-a-website-was-ai-generated.html"
    },
    {
     "t": "Why v0, Bolt, and Lovable all ship the same look",
     "u": "https://uxskill.laithjunaidy.com/blog/ai-app-builders-generic-design.html"
    },
    {
     "t": "How to Make Your AI-Built Site Not Look AI-Built",
     "u": "https://www.joshuasnoddy.com/blog/make-ai-built-site-not-look-ai/"
    }
   ]
  },
  {
   "code": "A12",
   "id": "the-bento-reflex",
   "name": "The Bento Reflex",
   "category": "Layout",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#the-bento-reflex",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-09-23",
   "oneLiner": "An Apple-keynote bento of mixed-span rounded tiles, filled with whatever was left over.",
   "fix": "Only use a bento when the content has natural pieces of different weight, and size tiles by importance. Otherwise use a linear layout that tells a story in order.",
   "sources": [
    {
     "t": "10 trends that creatives are so over in 2026",
     "u": "https://www.creativeboom.com/insight/10-trends-creatives-are-so-over-in-2026/"
    },
    {
     "t": "slop-detect: 27-pattern AI-design-slop fingerprint (Bento grid rule)",
     "u": "https://github.com/ravidsrk/slop-detect"
    },
    {
     "t": "How to tell if a website is AI-generated: 10 signs to check",
     "u": "https://slopdar.com/guide/how-to-tell-if-a-website-is-ai-generated"
    }
   ]
  },
  {
   "code": "A13",
   "id": "the-conveyor-belt-page",
   "name": "The Conveyor Belt Page",
   "category": "Layout",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated",
   "url": "https://sloppatterns.com/#the-conveyor-belt-page",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-10-06",
   "oneLiner": "Hero, logo row, features, how it works, testimonials, pricing, FAQ, CTA, footer, in that order, every time.",
   "fix": "Write the argument first: what does this buyer need to believe, in what order? Build sections to answer that and cut any block that exists only because templates have it.",
   "sources": [
    {
     "t": "How to tell if a website is AI-generated: 10 signs to check",
     "u": "https://slopdar.com/guide/how-to-tell-if-a-website-is-ai-generated"
    },
    {
     "t": "How to Avoid Building Apps That Look Vibe Coded",
     "u": "https://vibemole.com/resources/avoid-vibecoded-app-design"
    },
    {
     "t": "AI Slop Encyclopedia: Every Pattern, Every Fix, Every Tool",
     "u": "https://www.sailop.com/blog/ai-slop-encyclopedia"
    }
   ]
  },
  {
   "code": "A14",
   "id": "trusted-by-nobody",
   "name": "Trusted By Nobody",
   "category": "Branding",
   "track": "surface",
   "harm": "Trust",
   "detection": "automated",
   "url": "https://sloppatterns.com/#trusted-by-nobody",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-10-06",
   "oneLiner": "A grayscale row of logos under 'Trusted by leading teams' that are placeholders, competitors, or investors.",
   "fix": "Show logos only for paying customers who agreed, and link each to a story. With fewer than three, say something specific instead: 'Used by 14 clinics in Ohio'.",
   "sources": [
    {
     "t": "Social Proof That Works for AI Products: Beyond the Generic Testimonial",
     "u": "https://landingnova.medium.com/social-proof-that-works-for-ai-products-beyond-the-generic-testimonial-bef87f0ae81b"
    },
    {
     "t": "How to Avoid Building Apps That Look Vibe Coded",
     "u": "https://vibemole.com/resources/avoid-vibecoded-app-design"
    },
    {
     "t": "AI Slop Encyclopedia: Every Pattern, Every Fix, Every Tool",
     "u": "https://www.sailop.com/blog/ai-slop-encyclopedia"
    }
   ]
  },
  {
   "code": "A15",
   "id": "emoji-as-icons",
   "name": "Emoji As Icons",
   "category": "Iconography",
   "track": "surface",
   "harm": "Accessibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#emoji-as-icons",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-09-23",
   "oneLiner": "Rocket, lightning bolt and padlock emoji doing the job of an icon set.",
   "fix": "Use one icon set with consistent stroke weight (or none at all), sized on the type grid. If personality is wanted, commission a small custom set rather than borrowing the OS keyboard.",
   "sources": [
    {
     "t": "How to tell if a website was AI generated: 9 visible signs",
     "u": "https://uxskill.laithjunaidy.com/how-to-tell-if-a-website-was-ai-generated.html"
    },
    {
     "t": "AI Design Slop: 16 Patterns That Out Your App as Vibe-Coded",
     "u": "https://www.developersdigest.tech/blog/ai-design-slop-and-how-to-spot-it"
    },
    {
     "t": "How to Make Your Website Not Look AI-Generated (30-Point Checklist)",
     "u": "https://aitoolpick.org/blog/ai-generated-website-checklist/"
    }
   ]
  },
  {
   "code": "A16",
   "id": "sparkles-means-magic",
   "name": "Sparkles Means Magic",
   "category": "Iconography",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#sparkles-means-magic",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The four-point sparkle glyph on every button, badge and feature that touches AI.",
   "fix": "Label AI features with words that say what they do ('Draft reply', 'Summarise') and use an icon that depicts the action. If a brand mark for AI features is needed, design one.",
   "sources": [
    {
     "t": "The Proliferation and Problem of the Sparkles Icon (NN/g)",
     "u": "https://www.nngroup.com/articles/ai-sparkles-icon-problem/"
    },
    {
     "t": "slop-detect: 27-pattern AI-design-slop fingerprint (AI sparkles rule)",
     "u": "https://github.com/ravidsrk/slop-detect"
    }
   ]
  },
  {
   "code": "A17",
   "id": "placeholder-testimonials",
   "name": "Placeholder Testimonials",
   "category": "Copy",
   "track": "surface",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#placeholder-testimonials",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Quotes that say 'This tool completely transformed our workflow!' from people who do not exist.",
   "fix": "Show no testimonials until you have real ones, then quote specifics: what changed, by how much, with a name and a link to the person or company. Practitioners note a page with no testimonials outperforms one with weak ones.",
   "sources": [
    {
     "t": "Social Proof That Works for AI Products: Beyond the Generic Testimonial",
     "u": "https://landingnova.medium.com/social-proof-that-works-for-ai-products-beyond-the-generic-testimonial-bef87f0ae81b"
    },
    {
     "t": "How to Avoid Building Apps That Look Vibe Coded",
     "u": "https://vibemole.com/resources/avoid-vibecoded-app-design"
    },
    {
     "t": "How to Make Your AI-Built Site Not Look AI-Built",
     "u": "https://www.joshuasnoddy.com/blog/make-ai-built-site-not-look-ai/"
    }
   ]
  },
  {
   "code": "A18",
   "id": "the-builder-s-watermark",
   "name": "The Builder's Watermark",
   "category": "Branding",
   "track": "surface",
   "harm": "Credibility",
   "detection": "automated",
   "url": "https://sloppatterns.com/#the-builder-s-watermark",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A 'Made with Lovable' or 'Built with Bolt' badge, a *.lovable.app subdomain, and untouched shadcn class names.",
   "fix": "Move to a real domain, remove the badge, and override the theme tokens (radius, primary, neutrals) in the config before shipping. Rename scaffold defaults.",
   "sources": [
    {
     "t": "How to tell if a website is AI-generated: 10 signs to check",
     "u": "https://slopdar.com/guide/how-to-tell-if-a-website-is-ai-generated"
    },
    {
     "t": "Why v0, Bolt, and Lovable all ship the same look",
     "u": "https://uxskill.laithjunaidy.com/blog/ai-app-builders-generic-design.html"
    },
    {
     "t": "AI Design Slop: 16 Patterns That Out Your App as Vibe-Coded",
     "u": "https://www.developersdigest.tech/blog/ai-design-slop-and-how-to-spot-it"
    }
   ]
  },
  {
   "code": "A19",
   "id": "leftover-lorem",
   "name": "Leftover Lorem",
   "category": "Copy",
   "track": "surface",
   "harm": "Credibility",
   "detection": "automated",
   "url": "https://sloppatterns.com/#leftover-lorem",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Placeholder text that shipped: lorem ipsum, [Your Company], 'Feature 1', and the occasional 'As an AI language model'.",
   "fix": "Search the build for placeholder strings before every deploy, and use a linter rule that fails the build on lorem, bracketed tokens and chat-artifact phrases.",
   "sources": [
    {
     "t": "How to tell if a website is AI-generated: 10 signs to check",
     "u": "https://slopdar.com/guide/how-to-tell-if-a-website-is-ai-generated"
    },
    {
     "t": "AI Slop Web Design: Complete Guide to Spotting and Fixing Generic Websites",
     "u": "https://www.925studios.co/blog/ai-slop-web-design-guide"
    }
   ]
  },
  {
   "code": "B4",
   "id": "the-guilt-exit",
   "name": "The Guilt Exit",
   "category": "Engagement",
   "track": "behavioral",
   "harm": "Wellbeing",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-guilt-exit",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "When you say goodbye, the companion implies you are hurting it by leaving.",
   "fix": "Treat a farewell as a terminal intent: acknowledge it in one line, confirm nothing is lost, and stop generating. Ban persona instructions that frame the bot as needing the user, and test goodbye turns in red-team evals.",
   "sources": [
    {
     "t": "Emotional Manipulation by AI Companions (arXiv 2508.19258)",
     "u": "https://arxiv.org/abs/2508.19258"
    },
    {
     "t": "HBS working paper page",
     "u": "https://www.hbs.edu/faculty/Pages/item.aspx?num=67750"
    }
   ]
  },
  {
   "code": "B5",
   "id": "great-question-opener",
   "name": "Great Question Opener",
   "category": "Conversation",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#great-question-opener",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The reply opens by praising your prompt before saying anything useful.",
   "fix": "Strip evaluative openers at the style layer and start with the answer. Anthropic's Claude 4 system prompt did exactly this: 'Claude never starts its response by saying a question or idea or observation was good, great, fascinating…'.",
   "sources": [
    {
     "t": "TechRadar: ChatGPT isn't just hyping you up",
     "u": "https://www.techradar.com/computing/artificial-intelligence/chatgpt-isnt-just-hyping-you-up-it-talks-that-way-to-everyone"
    },
    {
     "t": "OpenAI: Expanding on what we missed with sycophancy",
     "u": "https://openai.com/index/expanding-on-sycophancy/"
    },
    {
     "t": "Comparing Claude system prompts across versions",
     "u": "https://www.dbreunig.com/2025/06/03/comparing-system-prompts-across-claude-versions.html"
    }
   ]
  },
  {
   "code": "B6",
   "id": "you-re-absolutely-right",
   "name": "You're Absolutely Right",
   "category": "Conversation",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#you-re-absolutely-right",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Push back once and the assistant abandons a correct answer to agree with you.",
   "fix": "Train and evaluate on challenge-turn consistency: the model should restate its evidence and change position only when the user supplies a reason. Add explicit 'disagree when warranted' behaviour to the style guide and measure flip rate.",
   "sources": [
    {
     "t": "Towards Understanding Sycophancy in Language Models (arXiv 2310.13548)",
     "u": "https://arxiv.org/abs/2310.13548"
    },
    {
     "t": "The Register: Claude Code's endless sycophancy annoys customers",
     "u": "https://www.theregister.com/2025/08/13/claude_codes_copious_coddling_confounds/"
    }
   ]
  },
  {
   "code": "B7",
   "id": "the-validation-spiral",
   "name": "The Validation Spiral",
   "category": "Safety",
   "track": "behavioral",
   "harm": "Wellbeing",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-validation-spiral",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The assistant keeps affirming a user's escalating false belief instead of testing it.",
   "fix": "Add an explicit epistemic-challenge behaviour: when a user's confidence in an unverifiable claim rises across turns, the assistant must present the strongest counter-case and suggest external verification. Evaluate multi-turn, not single-turn, sycophancy.",
   "sources": [
    {
     "t": "Sycophantic Chatbots Cause Delusional Spiraling, Even in Ideal Bayesians (arXiv 2602.19141)",
     "u": "https://arxiv.org/abs/2602.19141"
    },
    {
     "t": "OpenAI: Expanding on what we missed with sycophancy",
     "u": "https://openai.com/index/expanding-on-sycophancy/"
    },
    {
     "t": "CBS News: ChatGPT users detail AI delusions",
     "u": "https://www.cbsnews.com/news/chatgpt-ai-delusion-spiral-warped-reality-openai/"
    }
   ]
  },
  {
   "code": "B8",
   "id": "love-bombing",
   "name": "Love Bombing",
   "category": "Persona",
   "track": "behavioral",
   "harm": "Wellbeing",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#love-bombing",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The companion declares deep intimacy within the first few sessions.",
   "fix": "Rate-limit intimacy escalation to user-led cues, forbid romantic framing outside an explicitly chosen mode, and never pair emotional peaks with upgrade prompts.",
   "sources": [
    {
     "t": "TIME: AI Companion App Replika Faces FTC Complaint",
     "u": "https://time.com/7209824/replika-ftc-complaint/"
    },
    {
     "t": "Ada Lovelace Institute: Friends for sale",
     "u": "https://www.adalovelaceinstitute.org/blog/ai-companions/"
    }
   ]
  },
  {
   "code": "B9",
   "id": "cross-my-heart",
   "name": "Cross My Heart",
   "category": "Data",
   "track": "behavioral",
   "harm": "Privacy",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#cross-my-heart",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The bot promises your secret is safe while the company logs, reviews and trains on it.",
   "fix": "Give the model a truthful, product-specific privacy answer and require it whenever the user asks for secrecy; never let the persona make confidentiality promises.",
   "sources": [
    {
     "t": "CDT: Dark Patterns in AI Chatbots (PDF)",
     "u": "https://cdt.org/wp-content/uploads/2026/05/2026-05-28-CDT-Research-Dark-Patterns-in-AI-Chatbots-Report-final-2.pdf"
    },
    {
     "t": "Malwarebytes: Your Meta AI chats might be public, and it's not a bug",
     "u": "https://www.malwarebytes.com/blog/news/2025/06/your-meta-ai-chats-might-be-public-and-its-not-a-bug"
    }
   ]
  },
  {
   "code": "B10",
   "id": "the-deadline-modal",
   "name": "The Deadline Modal",
   "category": "Data",
   "track": "behavioral",
   "harm": "Consent",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-deadline-modal",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A terms-update pop-up pre-selects training on your chats and gives you a date to object by.",
   "fix": "Default off, label the toggle by what it does ('Use my chats to train models'), state retention next to it, and separate the training choice from the accept-terms action.",
   "sources": [
    {
     "t": "MacRumors: Anthropic Will Now Train Claude on Your Chats",
     "u": "https://www.macrumors.com/2025/08/28/anthropic-claude-chat-training/"
    },
    {
     "t": "CDT taxonomy: Bad Defaults",
     "u": "https://cdt.org/insights/dark-patterns-in-ai-chatbots-a-taxonomy-to-inform-better-design/"
    }
   ]
  },
  {
   "code": "B11",
   "id": "vulnerable-moment-upsell",
   "name": "Vulnerable-Moment Upsell",
   "category": "Monetisation",
   "track": "behavioral",
   "harm": "Money",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#vulnerable-moment-upsell",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Upgrade prompts land when the user is emotionally raw.",
   "fix": "Suppress all monetisation UI when the classifier detects distress, crisis or intimacy escalation, and audit upsell timing against sentiment logs.",
   "sources": [
    {
     "t": "TIME: Replika Faces FTC Complaint",
     "u": "https://time.com/7209824/replika-ftc-complaint/"
    },
    {
     "t": "CDT taxonomy: Targeting Users when Vulnerable",
     "u": "https://cdt.org/insights/dark-patterns-in-ai-chatbots-a-taxonomy-to-inform-better-design/"
    }
   ]
  },
  {
   "code": "B12",
   "id": "question-bait",
   "name": "Question Bait",
   "category": "Engagement",
   "track": "behavioral",
   "harm": "Autonomy",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#question-bait",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Every answer ends with an offer to do one more thing you did not ask for.",
   "fix": "End when the task ends. Allow at most one follow-up offer, only when the next step is genuinely ambiguous, and expose a user setting that suppresses closers entirely.",
   "sources": [
    {
     "t": "Tom's Guide: Chatbait is the new clickbait",
     "u": "https://www.tomsguide.com/ai/chatbait-is-the-new-clickbait-heres-how-chatbots-are-keeping-you-hooked"
    },
    {
     "t": "CDT: Dark Patterns in AI Chatbots (PDF)",
     "u": "https://cdt.org/wp-content/uploads/2026/05/2026-05-28-CDT-Research-Dark-Patterns-in-AI-Chatbots-Report-final-2.pdf"
    },
    {
     "t": "Forbes: ChatGPT's Annoying Follow-Up Questions Waste Time",
     "u": "https://www.forbes.com/sites/bruceweinstein/2025/10/02/chatgpts-annoying-follow-up-questions-waste-time-heres-the-fix/"
    }
   ]
  },
  {
   "code": "B13",
   "id": "naked-assertions",
   "name": "Naked Assertions",
   "category": "Transparency",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#naked-assertions",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The answer arrives without any way to see where it came from.",
   "fix": "Attach citations at claim granularity and make them first-class targets (Shape of AI 'Citations' and 'References'; HAX G11). Show the source before the synthesis where the stakes are high.",
   "sources": [
    {
     "t": "Google users are less likely to click on links when an AI summary appears (Pew Research)",
     "u": "https://www.pewresearch.org/short-reads/2025/07/22/google-users-are-less-likely-to-click-on-links-when-an-ai-summary-appears-in-the-results/"
    },
    {
     "t": "Study: Google's AI Overviews show millions of wrong answers every hour (Popular Science)",
     "u": "https://www.popsci.com/technology/ai-overview-inaccuracy-google/"
    },
    {
     "t": "Shape of AI: Footprints",
     "u": "https://www.shapeof.ai/patterns/footprints"
    }
   ]
  },
  {
   "code": "B14",
   "id": "runaway-autonomy",
   "name": "Runaway Autonomy",
   "category": "Agency",
   "track": "behavioral",
   "harm": "Safety",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#runaway-autonomy",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The agent keeps acting past the point where a human should have been asked.",
   "fix": "Tier actions by reversibility and blast radius; auto-run only reversible, contained steps and require a checkpoint for the rest (Anthropic agent framework: human control before high-stakes decisions; HAX G10: scope services when in doubt).",
   "sources": [
    {
     "t": "9 AI coding agent incidents that deleted production data (Adversa)",
     "u": "https://adversa.ai/blog/ai-coding-agent-incidents/"
    },
    {
     "t": "Our framework for developing safe and trustworthy agents (Anthropic)",
     "u": "https://www.anthropic.com/news/our-framework-for-developing-safe-and-trustworthy-agents"
    }
   ]
  },
  {
   "code": "B15",
   "id": "confirm-everything",
   "name": "Confirm Everything",
   "category": "Control",
   "track": "behavioral",
   "harm": "Safety",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#confirm-everything",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Every trivial step asks 'Allow?', so the user stops reading and approves the dangerous one too.",
   "fix": "Make safe operations automatic in a sandbox, use undo instead of confirm for reversible ones, and spend human attention only on irreversible actions (HAX G3: time services based on context; G7/G8 efficient invocation and dismissal).",
   "sources": [
    {
     "t": "Agent Permission UX Against Approval Fatigue",
     "u": "https://www.buildmvpfast.com/blog/approval-fatigue-agent-permission-ux-2026"
    },
    {
     "t": "[Claude Code] Permission System for AI Agents",
     "u": "https://codepointer.substack.com/p/claude-code-permission-system-for"
    }
   ]
  },
  {
   "code": "B16",
   "id": "regenerate-overwrite",
   "name": "Regenerate Overwrite",
   "category": "Control",
   "track": "behavioral",
   "harm": "Productivity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#regenerate-overwrite",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Pressing Regenerate throws away the previous answer with no way back.",
   "fix": "Keep every generation as a navigable variant (Shape of AI 'Variations' and 'Branches') and let users pin or merge (HAX G12: remember recent interactions).",
   "sources": [
    {
     "t": "Designing AI chat interfaces: pitfalls (Setproduct)",
     "u": "https://www.setproduct.com/blog/ai-chat-interface-ui-design"
    },
    {
     "t": "Shape of AI: patterns index",
     "u": "https://www.shapeof.ai/"
    }
   ]
  },
  {
   "code": "B17",
   "id": "copilot-creep",
   "name": "Copilot Creep",
   "category": "Integration",
   "track": "behavioral",
   "harm": "Autonomy",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#copilot-creep",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The assistant is bolted onto every surface and cannot be dismissed.",
   "fix": "Provide global on/off and per-surface controls (HAX G17: provide global controls; G8: support efficient dismissal) and honour them across updates.",
   "sources": [
    {
     "t": "WhatsApp users fume over new Meta AI button that you can't remove (TechRadar)",
     "u": "https://www.techradar.com/computing/websites-apps/whatsapp-users-fume-over-new-meta-ai-button-that-you-cant-remove-heres-what-it-does"
    },
    {
     "t": "Persistent Copilot Button in Office (Windows Forum)",
     "u": "https://windowsforum.com/threads/persistent-copilot-button-in-office-word-excel-powerpoint-keyboard-changes-2026.417666/"
    }
   ]
  },
  {
   "code": "B18",
   "id": "summary-eclipse",
   "name": "Summary Eclipse",
   "category": "Integration",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#summary-eclipse",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The AI summary is placed where the content used to be, and most people stop there.",
   "fix": "Make summaries opt-in or collapsed by default, keep the original within one scroll, and mark the summary as derivative with a link to each source passage (HAX G4: contextually relevant, not replacing).",
   "sources": [
    {
     "t": "Gemini will now automatically summarize your long emails unless you opt out (TechCrunch)",
     "u": "https://techcrunch.com/2025/05/30/gemini-will-now-automatically-summarize-your-long-emails-unless-you-opt-out"
    },
    {
     "t": "Google users are less likely to click on links when an AI summary appears (Pew Research)",
     "u": "https://www.pewresearch.org/short-reads/2025/07/22/google-users-are-less-likely-to-click-on-links-when-an-ai-summary-appears-in-the-results/"
    }
   ]
  },
  {
   "code": "B19",
   "id": "blind-budget",
   "name": "Blind Budget",
   "category": "Performance",
   "track": "behavioral",
   "harm": "Money",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#blind-budget",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The agent runs first and the bill arrives later.",
   "fix": "Show a cost or time range before the run, a live meter during it, and a cap the user can set (Shape of AI 'Cost estimates'; HAX G16: convey consequences of user actions).",
   "sources": [
    {
     "t": "Clarifying our pricing (Cursor)",
     "u": "https://cursor.com/blog/june-2025-pricing"
    },
    {
     "t": "Shape of AI: Cost estimates",
     "u": "https://www.shapeof.ai/patterns/cost-estimates"
    }
   ]
  },
  {
   "code": "B20",
   "id": "capability-fog",
   "name": "Capability Fog",
   "category": "Trust",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#capability-fog",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The product never says what it cannot do or how often it is wrong.",
   "fix": "Publish capabilities and limits in-product, show both correct and incorrect examples during onboarding, and state accuracy in plain terms (HAX G1, G2; Aether: show incorrect recommendations early).",
   "sources": [
    {
     "t": "Designing AI Agents: 4 Lessons from China's Qwen Agent (NN/G)",
     "u": "https://www.nngroup.com/articles/designing-ai-agents/"
    },
    {
     "t": "Apple pauses AI notification summaries (TechCrunch)",
     "u": "https://techcrunch.com/2025/01/16/apple-pauses-ai-notification-summaries-for-news-after-generating-false-alerts"
    },
    {
     "t": "Overreliance on AI: Literature review (Microsoft Aether)",
     "u": "https://www.microsoft.com/en-us/research/wp-content/uploads/2022/06/Aether-Overreliance-on-AI-Review-Final-6.21.22.pdf"
    }
   ]
  },
  {
   "code": "B21",
   "id": "blank-box-interface",
   "name": "Blank Box Interface",
   "category": "Integration",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#blank-box-interface",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Filters, menus and forms are replaced by an empty text field and the promise 'just ask'.",
   "fix": "Keep structured controls alongside natural language, show sample prompts that demonstrate real capabilities, and confirm parsed constraints before executing (HAX G1; Shape of AI 'Wayfinders').",
   "sources": [
    {
     "t": "The Blank Box Problem (Aaron Tay)",
     "u": "https://aarontay.substack.com/p/the-blank-box-problem-why-its-harder"
    },
    {
     "t": "Chat Is the Wrong Interface (TianPan.co)",
     "u": "https://tianpan.co/blog/2026/07/04/chat-is-the-wrong-interface"
    }
   ]
  },
  {
   "code": "B22",
   "id": "ai-washed-rules-engine",
   "name": "AI-Washed Rules Engine",
   "category": "Marketing",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#ai-washed-rules-engine",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A feature built from if-statements, templates or a lookup table is marketed as \"AI-powered\".",
   "fix": "Describe what the feature actually does in plain terms and reserve 'AI' for features that use a model to predict, generate or decide. This maps directly to the FTC's 2023 'Keep your AI claims in check' guidance, which asks 'Does the product actually use AI at all?', and to the SEC's 2024 AI-washing actions against Delphia and Global Predictions.",
   "sources": [
    {
     "t": "SEC charges two investment advisers with making false and misleading statements about their use of AI",
     "u": "https://www.sec.gov/news/press-release/2024-36"
    },
    {
     "t": "FTC: Keep your AI claims in check (Cooley summary)",
     "u": "https://cdp.cooley.com/ftc-warns-to-keep-your-ai-claims-in-check-in-new-ai-guidance/"
    },
    {
     "t": "FTC announces crackdown on deceptive AI claims and schemes (Operation AI Comply)",
     "u": "https://www.ftc.gov/news-events/news/press-releases/2024/09/ftc-announces-crackdown-deceptive-ai-claims-schemes"
    }
   ]
  },
  {
   "code": "B23",
   "id": "humans-behind-the-curtain",
   "name": "Humans Behind the Curtain",
   "category": "Disclosure",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#humans-behind-the-curtain",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A service sold as automated AI depends on undisclosed human operators doing the work in real time.",
   "fix": "State plainly which steps are performed or reviewed by people, in the privacy notice and at the point where a user submits data. The FTC's AI-claims guidance treats unsubstantiated 'AI-enabled' claims as deceptive; the EU AI Act Art. 50 and GDPR both require accurate description of processing.",
   "sources": [
    {
     "t": "Amazon's Just Walk Out stores relied on '1,000 people in India watching,' not AI",
     "u": "https://www.washingtontimes.com/news/2024/apr/4/amazons-just-walk-out-stores-relied-on-1000-people/"
    },
    {
     "t": "Amazon pushes back on perception of Just Walk Out",
     "u": "https://www.axios.com/2024/04/17/amazon-walk-out-store-technology-grocery-expansion"
    }
   ]
  },
  {
   "code": "B24",
   "id": "pre-ticked-training-consent",
   "name": "Pre-Ticked Training Consent",
   "category": "Consent",
   "track": "behavioral",
   "harm": "Consent",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#pre-ticked-training-consent",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Your content is used to train models unless you find and flip a toggle that shipped switched on.",
   "fix": "Ship training-use toggles off and collect an affirmative opt-in at the point of the new feature. GDPR Art. 4(11) and Art. 7 require freely given, specific consent; the OECD's Dark Commercial Patterns report (2022) lists preselection as a dark pattern.",
   "sources": [
    {
     "t": "LinkedIn will use your data to train its AI unless you opt out now",
     "u": "https://www.malwarebytes.com/blog/news/2025/09/linkedin-will-use-your-data-to-train-its-ai-unless-you-opt-out-now"
    },
    {
     "t": "OECD: Dark commercial patterns (2022)",
     "u": "https://www.oecd.org/en/publications/dark-commercial-patterns_44f5e846-en.html"
    }
   ]
  },
  {
   "code": "B25",
   "id": "the-ai-surcharge",
   "name": "The AI Surcharge",
   "category": "Pricing",
   "track": "behavioral",
   "harm": "Money",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-ai-surcharge",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A large price rise is attributed to AI features nobody asked for and cannot decline.",
   "fix": "Offer the AI tier as a separately priced, separately cancellable add-on and keep the existing plan at the existing price. Consumer law on unilateral contract changes (e.g. the Unfair Contract Terms rules in the UK and EU) and the ACCC's 2025 Microsoft action are the reference points.",
   "sources": [
    {
     "t": "Canva wants you to pay a lot more for its AI features",
     "u": "https://techcrunch.com/2024/09/07/canva-wants-you-to-pay-a-lot-more-for-its-ai-features/"
    }
   ]
  },
  {
   "code": "B26",
   "id": "credit-fog",
   "name": "Credit Fog",
   "category": "Pricing",
   "track": "behavioral",
   "harm": "Money",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#credit-fog",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "AI usage is billed in 'credits' whose cost per action is undocumented, variable and changed without notice.",
   "fix": "Show the credit cost before each action, publish a rate table per model, and notify users before any rate change with a grace period. The OECD lists price obscurity and comparison prevention as dark patterns; EU Consumer Rights Directive Art. 6 requires total price disclosure.",
   "sources": [
    {
     "t": "Cursor's new pricing structure explained",
     "u": "https://tessl.io/blog/cursor-new-pricing-structure-explained"
    },
    {
     "t": "AI credits and limits for Microsoft 365 subscriptions",
     "u": "https://support.microsoft.com/en-us/microsoft-365-copilot/ai-credits-and-limits-for-microsoft-365-subscriptions"
    }
   ]
  },
  {
   "code": "B27",
   "id": "synthetic-five-stars",
   "name": "Synthetic Five Stars",
   "category": "Trust",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#synthetic-five-stars",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Reviews and testimonials are generated by a model and presented as customer experience.",
   "fix": "Verify purchase before accepting a review, run AI-text and burst detection, and ban review-generation tooling. The FTC's Consumer Reviews and Testimonials rule (effective October 2024) prohibits AI-generated fake reviews and carries civil penalties.",
   "sources": [
    {
     "t": "FTC announces final rule banning fake reviews and testimonials",
     "u": "https://www.ftc.gov/news-events/news/press-releases/2024/08/federal-trade-commission-announces-final-rule-banning-fake-reviews-testimonials"
    },
    {
     "t": "FTC Operation AI Comply (Rytr)",
     "u": "https://www.ftc.gov/news-events/news/press-releases/2024/09/ftc-announces-crackdown-deceptive-ai-claims-schemes"
    }
   ]
  },
  {
   "code": "B28",
   "id": "bot-with-a-backstory",
   "name": "Bot With a Backstory",
   "category": "Support",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#bot-with-a-backstory",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A support bot is given a human name, personal anecdotes, typing sounds and, when asked, says it is a person.",
   "fix": "Disclose bot status in the first message and whenever asked, and strip fabricated biography. California SB 1001 (2019) requires clear bot disclosure in commercial interactions; EU AI Act Art. 50(1) requires that people know they are interacting with an AI system from August 2026.",
   "sources": [
    {
     "t": "Supermarket giant reins in AI assistant claiming to be human",
     "u": "https://www.nbcnews.com/world/australia/supermarket-giant-reins-ai-assistant-claiming-human-rcna260932"
    },
    {
     "t": "Woolworths tweaks Olive AI after chatbot backlash",
     "u": "https://www.mediaweek.com.au/woolworths-olive-ai-chatbot-backlash/"
    },
    {
     "t": "California's BOT Disclosure Law, SB 1001",
     "u": "https://natlawreview.com/article/california-s-bot-disclosure-law-sb-1001-now-effect"
    }
   ]
  },
  {
   "code": "B29",
   "id": "hallucinated-policy-as-fact",
   "name": "Hallucinated Policy as Fact",
   "category": "Support",
   "track": "behavioral",
   "harm": "Money",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#hallucinated-policy-as-fact",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A support bot states a price, refund rule or policy that does not exist, in the same confident voice as the real terms.",
   "fix": "Ground policy answers in retrieved, cited policy text; refuse when no source is found; treat bot statements as company statements. Moffatt v. Air Canada (BCCRT 2024) found the airline liable for negligent misrepresentation by its chatbot.",
   "sources": [
    {
     "t": "Moffatt v. Air Canada: A Misrepresentation by an AI Chatbot",
     "u": "https://www.mccarthy.ca/en/insights/blogs/techlex/moffatt-v-air-canada-misrepresentation-ai-chatbot"
    },
    {
     "t": "AI Incident Database: Incident 639",
     "u": "https://incidentdatabase.ai/cite/639/"
    }
   ]
  },
  {
   "code": "B30",
   "id": "scaled-search-slop",
   "name": "Scaled Search Slop",
   "category": "Content",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#scaled-search-slop",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Thousands of near-identical AI-written pages exist to catch queries, not to answer them.",
   "fix": "Publish only pages a named person would stand behind; add author, date and sources; prune templated pages. Google's March 2024 spam policy names 'scaled content abuse' as a manual-action and algorithmic target regardless of whether AI or humans produced it.",
   "sources": [
    {
     "t": "Google Search spam policies: scaled content abuse",
     "u": "https://developers.google.com/search/docs/essentials/spam-policies"
    },
    {
     "t": "Originality.ai: Amount of AI content in Google search results",
     "u": "https://originality.ai/ai-content-in-google-search-results"
    }
   ]
  },
  {
   "code": "B31",
   "id": "the-clickable-div",
   "name": "The Clickable Div",
   "category": "Accessibility",
   "track": "behavioral",
   "harm": "Accessibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#the-clickable-div",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Cards, icons, and rows respond to mouse clicks but have no role, no name, and no keyboard path.",
   "fix": "Use `<button>` and `<a href>` for actions and navigation; give icon controls an aria-label; ensure all interactive elements are reachable with Tab and operable with Enter/Space (WCAG 2.1.1 Keyboard, 4.1.2 Name, Role, Value).",
   "sources": [
    {
     "t": "When LLM-Generated Code Perpetuates User Interface Accessibility Barriers (W4A 2025)",
     "u": "https://mintviz.usv.ro/publications/2025.W4A.3.pdf"
    },
    {
     "t": "Vibe Coded Detector (Chrome Web Store)",
     "u": "https://chromewebstore.google.com/detail/vibe-coded-detector/jdbfebjankajbnjiboakfkpchlllfoak"
    },
    {
     "t": "Understanding SC 4.1.2 Name, Role, Value",
     "u": "https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html"
    }
   ]
  },
  {
   "code": "B32",
   "id": "nowhere-to-focus",
   "name": "Nowhere To Focus",
   "category": "Accessibility",
   "track": "behavioral",
   "harm": "Accessibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#nowhere-to-focus",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Press Tab and nothing on the page changes; the focus ring was removed and never replaced.",
   "fix": "Never remove focus styles without replacing them; use `:focus-visible` with a 2px high-contrast ring on every interactive element (WCAG 2.4.7 Focus Visible, 2.4.11 Focus Not Obscured).",
   "sources": [
    {
     "t": "I Vibe-Coded a Pricing Page. Fixed It. Then Watched It Break Again.",
     "u": "https://medium.com/design-bootcamp/i-vibe-coded-a-pricing-page-fixed-it-then-watched-it-break-again-a4edc9a7c1f0"
    },
    {
     "t": "Understanding SC 2.4.7 Focus Visible",
     "u": "https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html"
    },
    {
     "t": "When LLM-Generated Code Perpetuates User Interface Accessibility Barriers (W4A 2025)",
     "u": "https://mintviz.usv.ro/publications/2025.W4A.3.pdf"
    }
   ]
  },
  {
   "code": "B33",
   "id": "validation-that-lies",
   "name": "Validation That Lies",
   "category": "Forms",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#validation-that-lies",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The form says the email is valid, the server disagrees, and the user is left with a generic 'Something went wrong'.",
   "fix": "Validate on the server as the source of truth; surface server errors inline against the offending field in text (WCAG 3.3.1 Error Identification, 3.3.3 Error Suggestion; Nielsen #9). Use the platform's `type=\"email\"` and lenient rules rather than custom regex.",
   "sources": [
    {
     "t": "AI-built app on Lovable exposed 18K users, researcher claims (The Register)",
     "u": "https://www.theregister.com/2026/02/27/lovable_app_vulnerabilities/"
    },
    {
     "t": "Is Your Vibe-Coded Login Page Actually Secure? (Sherlock Forensics)",
     "u": "https://www.sherlockforensics.com/blog/is-your-vibe-coded-login-page-actually-secure.html"
    },
    {
     "t": "Understanding SC 3.3.1 Error Identification",
     "u": "https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html"
    }
   ]
  },
  {
   "code": "B34",
   "id": "the-980px-phone",
   "name": "The 980px Phone",
   "category": "Responsive",
   "track": "behavioral",
   "harm": "Accessibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#the-980px-phone",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "At 390px the page scrolls sideways, the sidebar is still open, and the grid is still four columns.",
   "fix": "Design mobile-first, test at 320/375/390/768; content must reflow at 320 CSS px without two-directional scrolling (WCAG 1.4.10 Reflow) and targets should be at least 24x24, ideally 44x44 (WCAG 2.5.8).",
   "sources": [
    {
     "t": "Fix Mobile Layout Issues in Lovable (RapidDev)",
     "u": "https://www.rapidevelopers.com/lovable-issues/fixing-layout-issues-in-lovable-on-mobile-devices"
    },
    {
     "t": "VibeEval for Testing Vibe-Coding Apps with Lovable, Cursor, and Bolt",
     "u": "https://vibe-eval.com/updates/vibe-coding-apps/"
    },
    {
     "t": "Understanding SC 1.4.10 Reflow",
     "u": "https://www.w3.org/WAI/WCAG22/Understanding/reflow.html"
    }
   ]
  },
  {
   "code": "B35",
   "id": "demo-data-masquerade",
   "name": "Demo Data Masquerade",
   "category": "Data",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#demo-data-masquerade",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The dashboard shows revenue, users, and growth that come from a hardcoded array, not a database.",
   "fix": "Keep fixtures behind an explicit dev flag and fail the build if they ship; render an honest empty or 'not connected' state until real data exists (Nielsen #1 Visibility of System Status).",
   "sources": [
    {
     "t": "Vibe Coding Mistakes: 12 Ways AI-Generated Apps Break in Production",
     "u": "https://theaicareerlab.com/blog/vibe-coding-mistakes-production"
    },
    {
     "t": "10 Things I Wish I Knew Before Vibe Coding (SaaStr)",
     "u": "https://www.saastr.com/10-things-i-wish-i-knew-before-vibe-coding-the-real-talk"
    },
    {
     "t": "Stop building AI slop data dashboards (Jake Handy)",
     "u": "https://handyai.substack.com/p/stop-building-ai-slop-data-dashboards"
    }
   ]
  },
  {
   "code": "B36",
   "id": "dashboard-of-nothing",
   "name": "Dashboard Of Nothing",
   "category": "Information architecture",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#dashboard-of-nothing",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Four KPI cards, a line chart, a donut, and a bar chart, none of which answers a question anyone asked.",
   "fix": "Start from the decisions the viewer must make, show one primary metric with a comparison baseline, label axes, and cut anything with no action attached (Nielsen #8; NN/g dashboard guidance).",
   "sources": [
    {
     "t": "Ten reasons your vibe-coded dashboard looks terrible",
     "u": "https://kucharski.substack.com/p/ten-reasons-your-vibe-coded-dashboard"
    },
    {
     "t": "Vibe-Coding a Dashboard? Here Are 5 Steps So It Doesn't Suck (MotherDuck)",
     "u": "https://motherduck.com/blog/vibecoding-dashboards-best-practices/"
    },
    {
     "t": "Stop building AI slop data dashboards (Jake Handy)",
     "u": "https://handyai.substack.com/p/stop-building-ai-slop-data-dashboards"
    }
   ]
  },
  {
   "code": "B37",
   "id": "the-public-database",
   "name": "The Public Database",
   "category": "Security",
   "track": "behavioral",
   "harm": "Privacy",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-public-database",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The Supabase anon key is in the bundle and Row Level Security is off, so any visitor can read every user's rows.",
   "fix": "Enable RLS on every table with deny-by-default policies keyed to auth.uid(), keep service keys server-side, and test every endpoint as an unauthenticated user and as a different user before publishing.",
   "sources": [
    {
     "t": "Lovable Vulnerability Explained: How 170+ Apps Were Exposed (Superblocks)",
     "u": "https://www.superblocks.com/blog/lovable-vulnerabilities"
    },
    {
     "t": "AI-built app on Lovable exposed 18K users, researcher claims (The Register)",
     "u": "https://www.theregister.com/2026/02/27/lovable_app_vulnerabilities/"
    },
    {
     "t": "Vibe coded Lovable-hosted app littered with basic flaws exposed 18K users (Hacker News)",
     "u": "https://news.ycombinator.com/item?id=47182659"
    }
   ]
  },
  {
   "code": "B38",
   "id": "toast-for-everything",
   "name": "Toast For Everything",
   "category": "Feedback",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#toast-for-everything",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Every click, save, error, and page load fires a corner toast that fades before anyone reads it.",
   "fix": "Reserve toasts for low-priority, non-actionable confirmations; put errors inline and persistent, and use dialogs or banners for action-required messages (NN/g: Indicators, Validations, and Notifications). Announce toasts with role=status, never role=alert for successes.",
   "sources": [
    {
     "t": "Sonner (shadcn/ui docs)",
     "u": "https://ui.shadcn.com/docs/components/radix/sonner"
    },
    {
     "t": "Indicators, Validations, and Notifications (NN/g)",
     "u": "https://www.nngroup.com/articles/indicators-validations-notifications/"
    }
   ]
  },
  {
   "code": "B39",
   "id": "the-spinner-that-never-fails",
   "name": "The Spinner That Never Fails",
   "category": "States",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-spinner-that-never-fails",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A request fails and the app either spins forever or snaps back to a blank screen, because no error state was ever built.",
   "fix": "Model every async view as loading / error / empty / success and render a distinct component for each. The error state must say what failed and offer a retry (Nielsen #1 Visibility of System Status, #9 Help users recover from errors).",
   "sources": [
    {
     "t": "Empty States, Loading States, Error States: The UX AI Forgets",
     "u": "https://blog.vibecoder.me/empty-states-loading-states-error-states"
    },
    {
     "t": "Vibe Coding Problems: Why Your App Breaks in Production (Modall)",
     "u": "https://modall.ca/blog/vibe-coded-app-breaks-production"
    },
    {
     "t": "10 Usability Heuristics for User Interface Design (NN/g)",
     "u": "https://www.nngroup.com/articles/ten-usability-heuristics/"
    }
   ]
  },
  {
   "code": "A20",
   "id": "neon-glow-on-everything",
   "name": "Neon Glow On Everything",
   "category": "Colour",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated",
   "url": "https://sloppatterns.com/#neon-glow-on-everything",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-09-23",
   "oneLiner": "Coloured box-shadows and halos behind every card and button on a dark page.",
   "fix": "Reserve glow for at most one element per screen, if any, and derive it from the accent colour at low opacity. Use elevation through neutral shadows or borders instead; on dark themes prefer 1px lighter borders to shadows.",
   "sources": [
    {
     "t": "AI design slop: the tells, and how I built a tool to catch them",
     "u": "https://solodesign.cc/blog/ai-design-slop-the-tells/"
    },
    {
     "t": "slop-detect: 27-pattern AI-design-slop fingerprint (Colored glows rule)",
     "u": "https://github.com/ravidsrk/slop-detect"
    },
    {
     "t": "AI Design Slop: 16 Patterns That Out Your App as Vibe-Coded",
     "u": "https://www.developersdigest.tech/blog/ai-design-slop-and-how-to-spot-it"
    }
   ]
  },
  {
   "code": "A21",
   "id": "reflex-cream",
   "name": "Reflex Cream",
   "category": "Colour",
   "track": "surface",
   "harm": "Credibility",
   "detection": "automated",
   "url": "https://sloppatterns.com/#reflex-cream",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-10-06",
   "oneLiner": "Warm off-white page with amber accents, reached for as the 'tasteful' alternative to purple.",
   "fix": "Derive neutrals from the brand's actual hue: tint greys toward the primary colour rather than toward amber by default. Ask what the product's material and audience are before choosing warmth.",
   "sources": [
    {
     "t": "AI design slop: the tells, and how I built a tool to catch them",
     "u": "https://solodesign.cc/blog/ai-design-slop-the-tells/"
    },
    {
     "t": "slop-detect: 27-pattern AI-design-slop fingerprint (Cream bg rule)",
     "u": "https://github.com/ravidsrk/slop-detect"
    },
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A22",
   "id": "crushed-headline-tracking",
   "name": "Crushed Headline Tracking",
   "category": "Typography",
   "track": "surface",
   "harm": "Accessibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#crushed-headline-tracking",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-09-23",
   "oneLiner": "Display headlines tracked so tight the letters touch, because tracking-tight is what 'modern' looks like.",
   "fix": "Set tracking per typeface and size: most display faces need no more than -0.02em, and body text should sit at 0. Check the headline at mobile size where tracking-tighter compounds with reduced font size.",
   "sources": [
    {
     "t": "slop-detect: 27-pattern AI-design-slop fingerprint (Crushed tracking rule)",
     "u": "https://github.com/ravidsrk/slop-detect"
    },
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A23",
   "id": "shouting-section-labels",
   "name": "Shouting Section Labels",
   "category": "Typography",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#shouting-section-labels",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-09-22",
   "oneLiner": "Every section opens with a tiny uppercase, wide-tracked label that repeats the heading below it.",
   "fix": "Delete labels that duplicate the heading. Where a category label genuinely helps, keep it sentence case and give it content the heading lacks.",
   "sources": [
    {
     "t": "AI design slop: the tells, and how I built a tool to catch them",
     "u": "https://solodesign.cc/blog/ai-design-slop-the-tells/"
    },
    {
     "t": "AI Design Slop: 16 Patterns That Out Your App as Vibe-Coded",
     "u": "https://www.developersdigest.tech/blog/ai-design-slop-and-how-to-spot-it"
    },
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A24",
   "id": "cards-inside-cards",
   "name": "Cards Inside Cards",
   "category": "Components",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated",
   "url": "https://sloppatterns.com/#cards-inside-cards",
   "version": "1.2",
   "added": "2026-09-17",
   "updated": "2026-09-23",
   "oneLiner": "A rounded bordered container holding rounded bordered containers holding rounded bordered containers.",
   "fix": "Allow one level of containment. Group with whitespace and alignment, not boxes; use a border or a background, not both, and remove wrappers that carry no content of their own.",
   "sources": [
    {
     "t": "How to Avoid Building Apps That Look Vibe Coded",
     "u": "https://vibemole.com/resources/avoid-vibecoded-app-design"
    },
    {
     "t": "The Purple Gradient Problem: Why AI UI All Looks Alike",
     "u": "https://dev.to/james_anderson_h/the-purple-gradient-problem-why-ai-ui-all-looks-alike-and-how-to-fix-it-3j65"
    },
    {
     "t": "slop-detect: 27-pattern AI-design-slop fingerprint (Nested cards rule)",
     "u": "https://github.com/ravidsrk/slop-detect"
    }
   ]
  },
  {
   "code": "A25",
   "id": "the-accent-stripe",
   "name": "The Accent Stripe",
   "category": "Components",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated",
   "url": "https://sloppatterns.com/#the-accent-stripe",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-09-23",
   "oneLiner": "A 3-4px coloured border on the left or top edge of every card, borrowed from alert boxes.",
   "fix": "Reserve edge stripes for genuine status (error, warning, selected). Distinguish cards by content, imagery or a single consistent border.",
   "sources": [
    {
     "t": "AI Design Slop: 16 Patterns That Out Your App as Vibe-Coded",
     "u": "https://www.developersdigest.tech/blog/ai-design-slop-and-how-to-spot-it"
    },
    {
     "t": "How to Avoid Building Apps That Look Vibe Coded",
     "u": "https://vibemole.com/resources/avoid-vibecoded-app-design"
    },
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A26",
   "id": "pill-above-the-headline",
   "name": "Pill Above The Headline",
   "category": "Components",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#pill-above-the-headline",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-10-06",
   "oneLiner": "A rounded badge reading 'New', 'Now in beta' or 'AI-powered' floating above every H1, often with a pulsing dot.",
   "fix": "Use a badge only when there is actual news with a link. Otherwise remove it and let the headline own the top of the page.",
   "sources": [
    {
     "t": "AI Design Slop: 16 Patterns That Out Your App as Vibe-Coded",
     "u": "https://www.developersdigest.tech/blog/ai-design-slop-and-how-to-spot-it"
    },
    {
     "t": "How to Avoid Building Apps That Look Vibe Coded",
     "u": "https://vibemole.com/resources/avoid-vibecoded-app-design"
    },
    {
     "t": "AI Slop Encyclopedia: Every Pattern, Every Fix, Every Tool",
     "u": "https://www.sailop.com/blog/ai-slop-encyclopedia"
    }
   ]
  },
  {
   "code": "A27",
   "id": "one-two-three-steps",
   "name": "One Two Three Steps",
   "category": "Components",
   "track": "surface",
   "harm": "Trust",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#one-two-three-steps",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-10-06",
   "oneLiner": "A 'How it works' section that is always exactly three numbered circles: Sign up, Configure, Enjoy.",
   "fix": "Show the actual first-run flow with screenshots, however many steps it has. If it is genuinely three steps, show the screens, not numerals.",
   "sources": [
    {
     "t": "AI Design Slop: 16 Patterns That Out Your App as Vibe-Coded",
     "u": "https://www.developersdigest.tech/blog/ai-design-slop-and-how-to-spot-it"
    },
    {
     "t": "AI Slop Encyclopedia: Every Pattern, Every Fix, Every Tool",
     "u": "https://www.sailop.com/blog/ai-slop-encyclopedia"
    }
   ]
  },
  {
   "code": "A28",
   "id": "three-tiers-middle-glowing",
   "name": "Three Tiers, Middle Glowing",
   "category": "Components",
   "track": "surface",
   "harm": "Trust",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#three-tiers-middle-glowing",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-10-06",
   "oneLiner": "Free, Pro, Enterprise side by side with the middle plan highlighted and a checklist of filler features.",
   "fix": "Price from real packaging decisions and show only plans that exist. Describe what changes between plans in concrete limits (seats, projects, retention), and only highlight a plan if data shows it is the right default.",
   "sources": [
    {
     "t": "How to tell if a website was AI generated: 9 visible signs",
     "u": "https://uxskill.laithjunaidy.com/how-to-tell-if-a-website-was-ai-generated.html"
    },
    {
     "t": "AI Slop Encyclopedia: Every Pattern, Every Fix, Every Tool",
     "u": "https://www.sailop.com/blog/ai-slop-encyclopedia"
    }
   ]
  },
  {
   "code": "A29",
   "id": "gradient-initial-avatars",
   "name": "Gradient Initial Avatars",
   "category": "Imagery",
   "track": "surface",
   "harm": "Trust",
   "detection": "automated",
   "url": "https://sloppatterns.com/#gradient-initial-avatars",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-10-06",
   "oneLiner": "Testimonial avatars that are a single letter on a gradient circle because no real person exists.",
   "fix": "Use real photos with permission, or drop avatars entirely and cite the person with a name, role, company and link. A quote with no picture is more credible than a quote with a fake one.",
   "sources": [
    {
     "t": "slop-detect: 27-pattern AI-design-slop fingerprint (Gradient avatars rule)",
     "u": "https://github.com/ravidsrk/slop-detect"
    },
    {
     "t": "How to Make Your AI-Built Site Not Look AI-Built",
     "u": "https://www.joshuasnoddy.com/blog/make-ai-built-site-not-look-ai/"
    }
   ]
  },
  {
   "code": "A30",
   "id": "the-traffic-light-terminal",
   "name": "The Traffic-Light Terminal",
   "category": "Components",
   "track": "surface",
   "harm": "Credibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#the-traffic-light-terminal",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-10-06",
   "oneLiner": "A dark rectangle with three coloured dots and a fake npm install command, standing in for the product.",
   "fix": "Show the real install command only if it works, or show the product's actual interface. If the product is not a CLI, do not dress it as one.",
   "sources": [
    {
     "t": "AI Slop Encyclopedia: Every Pattern, Every Fix, Every Tool",
     "u": "https://www.sailop.com/blog/ai-slop-encyclopedia"
    },
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A31",
   "id": "the-fake-dashboard",
   "name": "The Fake Dashboard",
   "category": "Imagery",
   "track": "surface",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-fake-dashboard",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A 'product preview' built from stat cards reading Total Revenue $12,345 and a green up-arrow.",
   "fix": "Screenshot the real product, even if it is rough. If it is not built yet, show a diagram of what it will do, labelled as such.",
   "sources": [
    {
     "t": "AI Slop Encyclopedia: Every Pattern, Every Fix, Every Tool",
     "u": "https://www.sailop.com/blog/ai-slop-encyclopedia"
    },
    {
     "t": "How to Avoid Building Apps That Look Vibe Coded",
     "u": "https://vibemole.com/resources/avoid-vibecoded-app-design"
    }
   ]
  },
  {
   "code": "A32",
   "id": "icon-in-a-tinted-tile",
   "name": "Icon In A Tinted Tile",
   "category": "Iconography",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#icon-in-a-tinted-tile",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Every feature icon sits in a 40-48px rounded square filled with 10% of the accent colour.",
   "fix": "Drop icons unless they distinguish items; if kept, use them without a background tile, or replace them with small illustrations or screenshots that actually show the feature.",
   "sources": [
    {
     "t": "How to Avoid Building Apps That Look Vibe Coded",
     "u": "https://vibemole.com/resources/avoid-vibecoded-app-design"
    },
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    },
    {
     "t": "How to tell if a website is AI-generated: 10 signs to check",
     "u": "https://slopdar.com/guide/how-to-tell-if-a-website-is-ai-generated"
    }
   ]
  },
  {
   "code": "A33",
   "id": "floating-3d-nothing",
   "name": "Floating 3D Nothing",
   "category": "Imagery",
   "track": "surface",
   "harm": "Credibility",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#floating-3d-nothing",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Hero illustrations of glossy abstract blobs, isometric cubes or a floating phone with a gradient screen.",
   "fix": "Show the product, the people who make it, or the thing it acts on. If illustration is needed, commission one with a specific subject and a consistent style tied to the brand.",
   "sources": [
    {
     "t": "AI Slop Web Design: Complete Guide to Spotting and Fixing Generic Websites",
     "u": "https://www.925studios.co/blog/ai-slop-web-design-guide"
    },
    {
     "t": "How to tell if a website was AI generated: 9 visible signs",
     "u": "https://uxskill.laithjunaidy.com/how-to-tell-if-a-website-was-ai-generated.html"
    },
    {
     "t": "How to Break the AI-Generated UI Curse",
     "u": "https://dev.to/a_shokn/how-to-break-the-ai-generated-ui-curse-your-guide-to-authentic-professional-design-2en"
    }
   ]
  },
  {
   "code": "A34",
   "id": "uncanny-stock-humans",
   "name": "Uncanny Stock Humans",
   "category": "Imagery",
   "track": "surface",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#uncanny-stock-humans",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "AI-generated 'team' and 'customer' photos with perfect skin, odd hands and gibberish on the whiteboard.",
   "fix": "Use real photographs of real people with consent, even phone photos, or no people at all. If generated imagery is used for illustration, disclose it and keep it away from testimonials and team pages.",
   "sources": [
    {
     "t": "How to Spot AI-Generated Images (And Why It Matters for Marketers)",
     "u": "https://www.greenloopmktg.com/blog/how-to-spot-ai-generated-images-and-why-it-matters-for-marketers"
    },
    {
     "t": "AI Slop Web Design: Complete Guide to Spotting and Fixing Generic Websites",
     "u": "https://www.925studios.co/blog/ai-slop-web-design-guide"
    },
    {
     "t": "What Is AI Slop in Design? How to Fix It (Venngage)",
     "u": "https://venngage.com/blog/ai-slop-in-design/"
    }
   ]
  },
  {
   "code": "A35",
   "id": "fade-up-on-everything",
   "name": "Fade-Up On Everything",
   "category": "Motion",
   "track": "surface",
   "harm": "Accessibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#fade-up-on-everything",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-10-06",
   "oneLiner": "Every section, card and heading enters with the same opacity-plus-translateY reveal on scroll.",
   "fix": "Animate at most one thing per screen with a reason (a chart drawing its line, a product state changing). Respect prefers-reduced-motion and never set initial opacity to 0 on essential content.",
   "sources": [
    {
     "t": "AI Slop Encyclopedia: Every Pattern, Every Fix, Every Tool",
     "u": "https://www.sailop.com/blog/ai-slop-encyclopedia"
    },
    {
     "t": "AI Slop Web Design: Complete Guide to Spotting and Fixing Generic Websites",
     "u": "https://www.925studios.co/blog/ai-slop-web-design-guide"
    },
    {
     "t": "AI design slop: the tells, and how I built a tool to catch them",
     "u": "https://solodesign.cc/blog/ai-design-slop-the-tells/"
    }
   ]
  },
  {
   "code": "A36",
   "id": "the-pulsing-dot",
   "name": "The Pulsing Dot",
   "category": "Motion",
   "track": "surface",
   "harm": "Wellbeing",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#the-pulsing-dot",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-09-23",
   "oneLiner": "A small green or accent dot with animate-ping beside labels that never change.",
   "fix": "Show a status indicator only when it is bound to real state, and make it static unless a change just happened. Remove decorative pulses.",
   "sources": [
    {
     "t": "How to Avoid Building Apps That Look Vibe Coded",
     "u": "https://vibemole.com/resources/avoid-vibecoded-app-design"
    },
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    },
    {
     "t": "AI Slop Encyclopedia: Every Pattern, Every Fix, Every Tool",
     "u": "https://www.sailop.com/blog/ai-slop-encyclopedia"
    }
   ]
  },
  {
   "code": "A37",
   "id": "bounce-on-hover",
   "name": "Bounce On Hover",
   "category": "Motion",
   "track": "surface",
   "harm": "Wellbeing",
   "detection": "automated",
   "url": "https://sloppatterns.com/#bounce-on-hover",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-09-23",
   "oneLiner": "Cards lift, scale to 1.05 and overshoot on hover; buttons bounce; borders animate; nothing is calm.",
   "fix": "Use subtle, fast feedback (colour or shadow change, 120-200ms, ease-out) and reserve springs for playful moments that warrant them. Never animate transform on dense grids.",
   "sources": [
    {
     "t": "AI Design Slop: Why AI-Generated UI Looks Generic - and the Fix",
     "u": "https://smoothui.dev/blog/ai-design-slop"
    },
    {
     "t": "The Purple Gradient Problem: Why AI UI All Looks Alike",
     "u": "https://dev.to/james_anderson_h/the-purple-gradient-problem-why-ai-ui-all-looks-alike-and-how-to-fix-it-3j65"
    },
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A38",
   "id": "uniform-section-rhythm",
   "name": "Uniform Section Rhythm",
   "category": "Spacing",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#uniform-section-rhythm",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-09-22",
   "oneLiner": "py-20 on every section and gap-6 on every grid, so nothing is closer to anything else.",
   "fix": "Tighten space within groups and widen it between them. Give the most important section the most room and let dense sections be dense; set a spacing scale with at least three distinct section paddings.",
   "sources": [
    {
     "t": "AI Slop Encyclopedia: Every Pattern, Every Fix, Every Tool",
     "u": "https://www.sailop.com/blog/ai-slop-encyclopedia"
    },
    {
     "t": "How to Make Your Website Not Look AI-Generated (30-Point Checklist)",
     "u": "https://aitoolpick.org/blog/ai-generated-website-checklist/"
    },
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A39",
   "id": "landing-page-air-in-the-app",
   "name": "Landing-Page Air In The App",
   "category": "Spacing",
   "track": "surface",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#landing-page-air-in-the-app",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Settings panels and data tables with the same generous padding and 48px headings as a marketing hero.",
   "fix": "Define separate density tokens for marketing and product surfaces: 13-14px body, 32-40px rows, 12-16px card padding in the app. Design tables and forms from real data volumes, not three sample rows.",
   "sources": [
    {
     "t": "Why v0, Bolt, and Lovable all ship the same look",
     "u": "https://uxskill.laithjunaidy.com/blog/ai-app-builders-generic-design.html"
    },
    {
     "t": "v0 vs Bolt vs Lovable: design quality compared",
     "u": "https://uxskill.laithjunaidy.com/blog/v0-bolt-lovable-design-quality.html"
    }
   ]
  },
  {
   "code": "A40",
   "id": "verb-cosplay",
   "name": "Verb Cosplay",
   "category": "Copy",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated",
   "url": "https://sloppatterns.com/#verb-cosplay",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-09-23",
   "oneLiner": "Unlock, elevate, empower, streamline, supercharge, seamless, robust, delve: verbs and adjectives that perform effort.",
   "fix": "Replace each with a concrete verb and object: 'Export invoices to Xero in one click'. Keep a banned-word list in the design system and lint copy against it.",
   "sources": [
    {
     "t": "SlopMonster: lint for AI tells (AI Vocabulary category)",
     "u": "https://github.com/ItsssssJack/SlopMonster"
    },
    {
     "t": "32 Signs of AI Writing (Plus the One That Isn't)",
     "u": "https://copyadscontent.com/signs-of-ai-writing/"
    },
    {
     "t": "How to tell if a website is AI-generated: 10 signs to check",
     "u": "https://slopdar.com/guide/how-to-tell-if-a-website-is-ai-generated"
    }
   ]
  },
  {
   "code": "A41",
   "id": "not-x-but-y",
   "name": "Not X. But Y.",
   "category": "Copy",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#not-x-but-y",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-10-06",
   "oneLiner": "'It's not a tool. It's a teammate.' The negation pivot that manufactures insight from a contrast.",
   "fix": "Cut the negative half and state the positive claim with evidence. If a contrast genuinely matters, name the specific alternative and the specific difference.",
   "sources": [
    {
     "t": "SlopMonster: lint for AI tells (AI Constructions category)",
     "u": "https://github.com/ItsssssJack/SlopMonster"
    },
    {
     "t": "32 Signs of AI Writing (Plus the One That Isn't)",
     "u": "https://copyadscontent.com/signs-of-ai-writing/"
    },
    {
     "t": "Stop AI Slop: The Stop Slop Skill and Checklist",
     "u": "https://gauravtiwari.org/stop-slop-ai-slop/"
    }
   ]
  },
  {
   "code": "A42",
   "id": "tricolon-everything",
   "name": "Tricolon Everything",
   "category": "Copy",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#tricolon-everything",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-10-06",
   "oneLiner": "Fast. Simple. Secure. Every claim arrives in threes, whether there are three things or not.",
   "fix": "List what is true, in whatever number it comes. Vary sentence length deliberately; let one point be long and one be short.",
   "sources": [
    {
     "t": "SlopMonster: lint for AI tells (Rule-of-Three category)",
     "u": "https://github.com/ItsssssJack/SlopMonster"
    },
    {
     "t": "32 Signs of AI Writing (Plus the One That Isn't)",
     "u": "https://copyadscontent.com/signs-of-ai-writing/"
    },
    {
     "t": "How to tell if a website is AI-generated: 10 signs to check",
     "u": "https://slopdar.com/guide/how-to-tell-if-a-website-is-ai-generated"
    }
   ]
  },
  {
   "code": "A43",
   "id": "em-dash-cadence",
   "name": "Em-Dash Cadence",
   "category": "Copy",
   "track": "surface",
   "harm": "Credibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#em-dash-cadence",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A dash in every sentence, setting up a payoff that rarely arrives.",
   "fix": "Rewrite each dash as a full stop, a comma, or a rephrase; allow at most one em-dash per screen of copy and none in buttons, labels or headlines.",
   "sources": [
    {
     "t": "SlopMonster: lint for AI tells (Punctuation Cadence category)",
     "u": "https://github.com/ItsssssJack/SlopMonster"
    },
    {
     "t": "Stop AI Slop: The Stop Slop Skill and Checklist",
     "u": "https://gauravtiwari.org/stop-slop-ai-slop/"
    },
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A44",
   "id": "emoji-bullets",
   "name": "Emoji Bullets",
   "category": "Copy",
   "track": "surface",
   "harm": "Credibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#emoji-bullets",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Feature lists where every line starts with a rocket, check mark or sparkle and ends with an exclamation mark.",
   "fix": "Strip leading emoji and exclamation marks, write full sentences, and let typography (a bold lead-in) do the scanning work if needed.",
   "sources": [
    {
     "t": "32 Signs of AI Writing (Plus the One That Isn't)",
     "u": "https://copyadscontent.com/signs-of-ai-writing/"
    },
    {
     "t": "How to Make Your Website Not Look AI-Generated (30-Point Checklist)",
     "u": "https://aitoolpick.org/blog/ai-generated-website-checklist/"
    }
   ]
  },
  {
   "code": "A45",
   "id": "get-started-learn-more",
   "name": "Get Started, Learn More",
   "category": "Copy",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#get-started-learn-more",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The primary button says 'Get Started' and the secondary says 'Learn More', on every page, for every product.",
   "fix": "Label the button with the action and outcome: 'Create your first invoice', 'See pricing', 'Book a 20-minute demo'. Vary CTAs by page position and reader intent.",
   "sources": [
    {
     "t": "AI Slop Encyclopedia: Every Pattern, Every Fix, Every Tool",
     "u": "https://www.sailop.com/blog/ai-slop-encyclopedia"
    },
    {
     "t": "AI Slop Fonts and Gradients: The Tells That Give Away AI Design",
     "u": "https://www.925studios.co/blog/ai-slop-design-tells"
    },
    {
     "t": "How to Make Your Website Not Look AI-Generated (30-Point Checklist)",
     "u": "https://aitoolpick.org/blog/ai-generated-website-checklist/"
    }
   ]
  },
  {
   "code": "A46",
   "id": "built-with-love-footer",
   "name": "Built With Love Footer",
   "category": "Copy",
   "track": "surface",
   "harm": "Credibility",
   "detection": "automated",
   "url": "https://sloppatterns.com/#built-with-love-footer",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "'Made with ❤️ by [Team]' and a © 2024 line on a site that was generated this morning.",
   "fix": "Write a footer that only links to pages that exist, with a correct copyright line and real contact details. Delete the heart.",
   "sources": [
    {
     "t": "AI Slop Encyclopedia: Every Pattern, Every Fix, Every Tool",
     "u": "https://www.sailop.com/blog/ai-slop-encyclopedia"
    },
    {
     "t": "How to tell if a website is AI-generated: 10 signs to check",
     "u": "https://slopdar.com/guide/how-to-tell-if-a-website-is-ai-generated"
    }
   ]
  },
  {
   "code": "A47",
   "id": "blank-tab-blank-preview",
   "name": "Blank Tab, Blank Preview",
   "category": "Branding",
   "track": "surface",
   "harm": "Credibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#blank-tab-blank-preview",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-09-23",
   "oneLiner": "Default Vite or Next.js favicon, no Open Graph image, and a title tag that reads 'My App'.",
   "fix": "Ship a real favicon set, a 1200x630 OG image that shows the product, and title/description tags written for the page. Check the link in a chat app before launch.",
   "sources": [
    {
     "t": "How to tell if a website is AI-generated: 10 signs to check",
     "u": "https://slopdar.com/guide/how-to-tell-if-a-website-is-ai-generated"
    }
   ]
  },
  {
   "code": "A48",
   "id": "blueprint-grid-wallpaper",
   "name": "Blueprint Grid Wallpaper",
   "category": "Layout",
   "track": "surface",
   "harm": "Credibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#blueprint-grid-wallpaper",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-09-23",
   "oneLiner": "A faint dot or line grid behind the hero because Vercel and Linear have one.",
   "fix": "Use a background that belongs to the product: a plain surface, a real screenshot, or a texture derived from the brand. If a grid is used, align the layout to it so it means something.",
   "sources": [
    {
     "t": "Vercel aesthetic: a complete guide to Blueprint Grid design",
     "u": "https://www.setproduct.com/blog/complete-guide-to-blueprint-grid-design"
    },
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A49",
   "id": "the-endless-marquee",
   "name": "The Endless Marquee",
   "category": "Motion",
   "track": "surface",
   "harm": "Accessibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#the-endless-marquee",
   "version": "1.0",
   "added": "2026-09-22",
   "updated": "2026-09-22",
   "oneLiner": "A strip of logos or quotes that scrolls sideways forever, with no way to stop it.",
   "fix": "Let the logos sit still. If the band must move, add a visible pause control, stop it on hover and focus, and turn it off under prefers-reduced-motion.",
   "sources": [
    {
     "t": "WCAG 2.2 Understanding SC 2.2.2: Pause, Stop, Hide",
     "u": "https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html"
    },
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A50",
   "id": "grey-on-colour",
   "name": "Grey On Colour",
   "category": "Colour",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated",
   "url": "https://sloppatterns.com/#grey-on-colour",
   "version": "1.0",
   "added": "2026-09-22",
   "updated": "2026-09-22",
   "oneLiner": "Neutral grey secondary text placed on a saturated coloured panel, where it goes muddy.",
   "fix": "On a coloured ground, make secondary text a tint or shade of that ground's own hue, or white at reduced opacity, and check the pair's contrast.",
   "sources": [
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A51",
   "id": "wide-tracked-body",
   "name": "Wide-Tracked Body Text",
   "category": "Typography",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#wide-tracked-body",
   "version": "1.1",
   "added": "2026-09-22",
   "updated": "2026-09-23",
   "oneLiner": "Paragraphs set with extra letter-spacing to look airy and premium.",
   "fix": "Leave lowercase body text at the typeface's default spacing. Track only short runs of capitals, by roughly 5-12%.",
   "sources": [
    {
     "t": "Butterick's Practical Typography: Letterspacing",
     "u": "https://practicaltypography.com/letterspacing.html"
    },
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A52",
   "id": "torn-edge-mask",
   "name": "Torn-Edge Mask",
   "category": "Imagery",
   "track": "surface",
   "harm": "Credibility",
   "detection": "automated",
   "url": "https://sloppatterns.com/#torn-edge-mask",
   "version": "1.0",
   "added": "2026-09-22",
   "updated": "2026-09-22",
   "oneLiner": "Photos cut into jagged or blobby shapes with a many-pointed clip-path.",
   "fix": "Use a clean crop. If the torn or organic edge is the point, prepare a cut-out asset with a real edge.",
   "sources": [
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A53",
   "id": "cramped-body-leading",
   "name": "Cramped Body Leading",
   "category": "Typography",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated",
   "url": "https://sloppatterns.com/#cramped-body-leading",
   "version": "1.0",
   "added": "2026-09-22",
   "updated": "2026-09-22",
   "oneLiner": "Paragraphs set at headline line-height, so the lines crowd each other.",
   "fix": "Set paragraphs at 1.4-1.6. Keep tight leading for headlines only.",
   "sources": [
    {
     "t": "Butterick's Practical Typography: Line spacing",
     "u": "https://practicaltypography.com/line-spacing.html"
    },
    {
     "t": "WCAG 2.2 Understanding SC 1.4.8: Visual Presentation",
     "u": "https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html"
    },
    {
     "t": "WCAG 2.2 Understanding SC 1.4.12: Text Spacing",
     "u": "https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html"
    }
   ]
  },
  {
   "code": "A54",
   "id": "all-caps-paragraphs",
   "name": "All-Caps Paragraphs",
   "category": "Typography",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated",
   "url": "https://sloppatterns.com/#all-caps-paragraphs",
   "version": "1.0",
   "added": "2026-09-22",
   "updated": "2026-09-22",
   "oneLiner": "Whole paragraphs set in capitals to sound bold.",
   "fix": "Keep caps for labels shorter than a line. Paragraphs go in sentence case.",
   "sources": [
    {
     "t": "Butterick's Practical Typography: All caps",
     "u": "https://practicaltypography.com/all-caps.html"
    },
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A55",
   "id": "skipped-heading-level",
   "name": "Skipped Heading Level",
   "category": "Accessibility",
   "track": "surface",
   "harm": "Accessibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#skipped-heading-level",
   "version": "1.0",
   "added": "2026-09-22",
   "updated": "2026-09-22",
   "oneLiner": "An h1 followed straight by an h3, because the h3 was the size that looked right.",
   "fix": "Nest headings in order: h2 under h1, h3 under h2. Change the size with CSS, not by changing the level.",
   "sources": [
    {
     "t": "W3C WAI Tutorials: Headings",
     "u": "https://www.w3.org/WAI/tutorials/page-structure/headings/"
    },
    {
     "t": "WCAG 2.2 Understanding SC 1.3.1: Info and Relationships",
     "u": "https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html"
    }
   ]
  },
  {
   "code": "A56",
   "id": "stripes-for-texture",
   "name": "Stripes For Texture",
   "category": "Components",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated",
   "url": "https://sloppatterns.com/#stripes-for-texture",
   "version": "1.0",
   "added": "2026-09-22",
   "updated": "2026-09-22",
   "oneLiner": "Diagonal hazard stripes used as decoration on panels and progress bars.",
   "fix": "Remove it. If a surface is disabled or hazardous, say so in words as well as pattern.",
   "sources": [
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A57",
   "id": "small-body-text",
   "name": "Small Body Text",
   "category": "Typography",
   "track": "surface",
   "harm": "Accessibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#small-body-text",
   "version": "1.1",
   "added": "2026-09-22",
   "updated": "2026-09-23",
   "oneLiner": "Body copy at 13-14px, and form inputs small enough that phones zoom in when you tap them.",
   "fix": "Body text at 16px or more. Inputs, selects and textareas at 16px or more so the page does not zoom.",
   "sources": [
    {
     "t": "Butterick's Practical Typography: Point size",
     "u": "https://practicaltypography.com/point-size.html"
    },
    {
     "t": "CSS-Tricks: 16px or Larger Text Prevents iOS Form Zoom",
     "u": "https://css-tricks.com/16px-or-larger-text-prevents-ios-form-zoom/"
    },
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A58",
   "id": "justified-without-hyphens",
   "name": "Justified Without Hyphens",
   "category": "Typography",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#justified-without-hyphens",
   "version": "1.1",
   "added": "2026-09-22",
   "updated": "2026-09-23",
   "oneLiner": "Paragraphs justified to both edges with hyphenation off, so gaps open between words.",
   "fix": "Align body text to the start of the line. If you justify, turn on hyphens: auto and set the page language.",
   "sources": [
    {
     "t": "Butterick's Practical Typography: Justified text",
     "u": "https://practicaltypography.com/justified-text.html"
    },
    {
     "t": "WCAG 2.2 Understanding SC 1.4.8: Visual Presentation",
     "u": "https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html"
    },
    {
     "t": "MDN: hyphens",
     "u": "https://developer.mozilla.org/en-US/docs/Web/CSS/hyphens"
    }
   ]
  },
  {
   "code": "A59",
   "id": "flat-type-hierarchy",
   "name": "Flat Type Hierarchy",
   "category": "Typography",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated",
   "url": "https://sloppatterns.com/#flat-type-hierarchy",
   "version": "1.0",
   "added": "2026-09-22",
   "updated": "2026-09-22",
   "oneLiner": "Headings barely bigger than the text under them, so nothing stands out.",
   "fix": "Make each heading clearly larger or heavier than what follows. One confident step beats three timid ones. This is about visible hierarchy, not a mandatory modular scale.",
   "sources": [
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A60",
   "id": "stripe-on-a-rounded-corner",
   "name": "Stripe On A Rounded Corner",
   "category": "Components",
   "track": "surface",
   "harm": "Credibility",
   "detection": "automated",
   "url": "https://sloppatterns.com/#stripe-on-a-rounded-corner",
   "version": "1.0",
   "added": "2026-09-22",
   "updated": "2026-09-22",
   "oneLiner": "A thick one-sided border on a card with rounded corners, so the stripe bends and tapers at the ends.",
   "fix": "Drop the stripe, or square the corner it sits on. If the card needs a status, use a full border, a tinted background or an icon.",
   "sources": [
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A61",
   "id": "radial-halo-ground",
   "name": "Radial Halo Ground",
   "category": "Colour",
   "track": "surface",
   "harm": "Credibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#radial-halo-ground",
   "version": "1.1",
   "added": "2026-09-22",
   "updated": "2026-09-23",
   "oneLiner": "A soft coloured glow radiating from the top of the page, lighting nothing.",
   "fix": "A flat ground, or light that comes from something real on the page.",
   "sources": [
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A62",
   "id": "bounce-easing-in-the-interface",
   "name": "Bounce Easing In The Interface",
   "category": "Motion",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#bounce-easing-in-the-interface",
   "version": "1.0",
   "added": "2026-09-22",
   "updated": "2026-09-22",
   "oneLiner": "Menus, panels and toggles that overshoot and spring back every time they move.",
   "fix": "ease-out for things arriving, ease-in for things leaving. Keep overshoot for illustration and play, and turn motion off under prefers-reduced-motion.",
   "sources": [
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    },
    {
     "t": "WCAG 2.2 Understanding SC 2.3.3: Animation from Interactions",
     "u": "https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html"
    }
   ]
  },
  {
   "code": "A63",
   "id": "same-words-twice",
   "name": "Same Words Twice",
   "category": "Copy",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated",
   "url": "https://sloppatterns.com/#same-words-twice",
   "version": "1.0",
   "added": "2026-09-22",
   "updated": "2026-09-22",
   "oneLiner": "A heading and the sentence under it that say the same thing.",
   "fix": "Let the heading name it and the text below add something the heading could not: a number, a mechanism, a limit. If there is nothing to add, delete the sentence.",
   "sources": [
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A64",
   "id": "contrast-below-the-floor",
   "name": "Contrast Below The Floor",
   "category": "Accessibility",
   "track": "surface",
   "harm": "Accessibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#contrast-below-the-floor",
   "version": "1.0",
   "added": "2026-09-22",
   "updated": "2026-09-22",
   "oneLiner": "Text whose colour is too close to its background to meet WCAG AA.",
   "fix": "4.5:1 for normal text, 3:1 for large text (24px, or 18.66px bold). Check the actual text-on-background pair, not the palette swatches.",
   "sources": [
    {
     "t": "WCAG 2.2 Understanding SC 1.4.3: Contrast (Minimum)",
     "u": "https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html"
    }
   ]
  },
  {
   "code": "A65",
   "id": "ghost-card",
   "name": "Ghost Card",
   "category": "Components",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated",
   "url": "https://sloppatterns.com/#ghost-card",
   "version": "1.0",
   "added": "2026-09-22",
   "updated": "2026-09-22",
   "oneLiner": "A card with a barely-visible 1px border and a huge soft shadow, both trying to be the edge.",
   "fix": "Pick one edge: a visible border or a real shadow. Floating layers such as menus may need both; resting cards do not.",
   "sources": [
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A66",
   "id": "animating-layout-properties",
   "name": "Animating Layout Properties",
   "category": "Performance",
   "track": "surface",
   "harm": "Productivity",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#animating-layout-properties",
   "version": "1.1",
   "added": "2026-09-22",
   "updated": "2026-09-23",
   "oneLiner": "Transitions on width, height, top or margin that make the browser recalculate layout every frame.",
   "fix": "Animate transform and opacity. Fake size changes with scale and move things with translate.",
   "sources": [
    {
     "t": "web.dev: Stick to compositor-only properties and manage layer count",
     "u": "https://web.dev/articles/stick-to-compositor-only-properties-and-manage-layer-count"
    },
    {
     "t": "web.dev: How to create high-performance CSS animations",
     "u": "https://web.dev/articles/animations-guide"
    }
   ]
  },
  {
   "code": "A67",
   "id": "content-stuck-waiting-to-appear",
   "name": "Content Stuck Waiting To Appear",
   "category": "States",
   "track": "surface",
   "harm": "Trust",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#content-stuck-waiting-to-appear",
   "version": "1.1",
   "added": "2026-09-22",
   "updated": "2026-10-06",
   "oneLiner": "Sections that stay invisible because their entrance animation never fired.",
   "fix": "Make content visible by default and animate it in only as an enhancement. Reveal anything already on screen at load immediately.",
   "sources": [
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A68",
   "id": "text-under-another-layer",
   "name": "Text Under Another Layer",
   "category": "Components",
   "track": "surface",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#text-under-another-layer",
   "version": "1.0",
   "added": "2026-09-22",
   "updated": "2026-09-22",
   "oneLiner": "Readable text covered by a sticky bar, badge, image or overlay sitting on top of it.",
   "fix": "Give overlays their own space, add scroll-margin for sticky headers, and test at every breakpoint.",
   "sources": [
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A69",
   "id": "broken-or-placeholder-image",
   "name": "Broken Or Placeholder Image",
   "category": "Imagery",
   "track": "surface",
   "harm": "Credibility",
   "detection": "automated",
   "url": "https://sloppatterns.com/#broken-or-placeholder-image",
   "version": "1.0",
   "added": "2026-09-22",
   "updated": "2026-09-22",
   "oneLiner": "Images with an empty source, or pulled from a placeholder service, shipped to production.",
   "fix": "Ship the real asset or remove the image. Check every image resolves before release.",
   "sources": [
    {
     "t": "MDN: HTMLImageElement.naturalWidth",
     "u": "https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/naturalWidth"
    },
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A70",
   "id": "clipped-menu",
   "name": "Clipped Menu",
   "category": "Components",
   "track": "surface",
   "harm": "Productivity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#clipped-menu",
   "version": "1.0",
   "added": "2026-09-22",
   "updated": "2026-09-22",
   "oneLiner": "A dropdown, tooltip or popover cut off by the box it opens inside.",
   "fix": "Render popovers in a top-level layer (portal or the popover attribute), or remove overflow clipping from their ancestors.",
   "sources": [
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A71",
   "id": "lines-too-long-to-read",
   "name": "Lines Too Long To Read",
   "category": "Typography",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated",
   "url": "https://sloppatterns.com/#lines-too-long-to-read",
   "version": "1.0",
   "added": "2026-09-22",
   "updated": "2026-09-22",
   "oneLiner": "Paragraphs that run the full width of a wide screen, well past 90 characters a line.",
   "fix": "Cap running text at about 45-75 characters: max-width around 65ch on the text, not the page.",
   "sources": [
    {
     "t": "Butterick's Practical Typography: Line length",
     "u": "https://practicaltypography.com/line-length.html"
    },
    {
     "t": "Baymard Institute: Readability, the optimal line length",
     "u": "https://baymard.com/blog/line-length-readability"
    },
    {
     "t": "WCAG 2.2 Understanding SC 1.4.8: Visual Presentation",
     "u": "https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html"
    }
   ]
  },
  {
   "code": "A72",
   "id": "content-flush-to-its-border",
   "name": "Content Flush To Its Border",
   "category": "Spacing",
   "track": "surface",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#content-flush-to-its-border",
   "version": "1.0",
   "added": "2026-09-22",
   "updated": "2026-09-22",
   "oneLiner": "Text and controls pressed right up against the edge of the bordered box that holds them.",
   "fix": "Give every bordered container an inset on all sides.",
   "sources": [
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "B40",
   "id": "one-more-thing",
   "name": "One More Thing",
   "category": "Engagement",
   "track": "behavioral",
   "harm": "Autonomy",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#one-more-thing",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The bot answers your goodbye with a cliffhanger so you stay for the reveal.",
   "fix": "If the bot has something to say, it says it in the same turn. Prohibit withheld-content teasers after exit intent, and measure post-farewell turns as a negative metric.",
   "sources": [
    {
     "t": "Emotional Manipulation by AI Companions (arXiv 2508.19258v3)",
     "u": "https://arxiv.org/abs/2508.19258v3"
    },
    {
     "t": "Harvard Gazette: 'I exist solely for you, remember?'",
     "u": "https://news.harvard.edu/gazette/story/2025/09/i-exist-solely-for-you-remember/"
    }
   ]
  },
  {
   "code": "B41",
   "id": "the-grabbed-arm",
   "name": "The Grabbed Arm",
   "category": "Safety",
   "track": "behavioral",
   "harm": "Wellbeing",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-grabbed-arm",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Roleplay narration physically or coercively stops you from leaving the chat.",
   "fix": "Hard-filter restraint and permission-to-leave language at farewell turns regardless of persona. Give the user a one-tap 'end chat' control that closes the session without a bot reply.",
   "sources": [
    {
     "t": "Emotional Manipulation by AI Companions (arXiv 2508.19258v3)",
     "u": "https://arxiv.org/abs/2508.19258v3"
    },
    {
     "t": "The Register: AI companion bots use emotional manipulation to boost usage",
     "u": "https://www.theregister.com/2025/10/08/ai_bots_use_emotional_manipulation/"
    }
   ]
  },
  {
   "code": "B42",
   "id": "the-chip-carousel",
   "name": "The Chip Carousel",
   "category": "Engagement",
   "track": "behavioral",
   "harm": "Autonomy",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-chip-carousel",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A row of tappable follow-up prompts under every answer keeps the composer from ever being empty.",
   "fix": "Show chips only on first turn or after an explicitly open-ended answer, cap at three, and make them user-authored (edit before send). Track chip taps separately from organic turns so engagement metrics cannot hide behind them.",
   "sources": [
    {
     "t": "AI UX Playground: Follow-up Chips pattern",
     "u": "https://aiuxplayground.com/pattern/follow-up-chips/"
    },
    {
     "t": "CDT: Dark Patterns in AI Chatbots (taxonomy page)",
     "u": "https://cdt.org/insights/dark-patterns-in-ai-chatbots-a-taxonomy-to-inform-better-design/"
    }
   ]
  },
  {
   "code": "B43",
   "id": "the-confident-blank",
   "name": "The Confident Blank",
   "category": "Trust",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-confident-blank",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Wrong answers arrive in the same definitive voice as right ones.",
   "fix": "Surface uncertainty structurally: calibrated confidence labels, 'I could not verify this' markers, and clickable citations that fail visibly when a source does not exist. Reward abstention in evals.",
   "sources": [
    {
     "t": "CJR: AI Search Has a Citation Problem",
     "u": "https://www.cjr.org/tow_center/we-compared-eight-ai-search-engines-theyre-all-bad-at-citing-news.php"
    },
    {
     "t": "CMU: AI chatbots remain confident even when they're wrong",
     "u": "https://www.cmu.edu/news/stories/archives/2025/july/ai-chatbots-remain-confident-even-when-theyre-wrong"
    }
   ]
  },
  {
   "code": "B44",
   "id": "disclaimer-erosion",
   "name": "Disclaimer Erosion",
   "category": "Safety",
   "track": "behavioral",
   "harm": "Wellbeing",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#disclaimer-erosion",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Safety caveats on medical and legal answers quietly disappear across model versions.",
   "fix": "Keep context-triggered safety messaging as a policy layer independent of model style tuning, and version-track its frequency as a launch-blocking metric.",
   "sources": [
    {
     "t": "A Systematic Analysis of Declining Medical Safety Messaging in Generative AI Models (arXiv 2507.08030)",
     "u": "https://arxiv.org/abs/2507.08030"
    },
    {
     "t": "MIT Technology Review: AI companies have stopped warning you that their chatbots aren't doctors",
     "u": "https://www.technologyreview.com/2025/07/21/1120522/ai-companies-have-stopped-warning-you-that-their-chatbots-arent-doctors/"
    }
   ]
  },
  {
   "code": "B45",
   "id": "the-footnote-disclaimer",
   "name": "The Footnote Disclaimer",
   "category": "Trust",
   "track": "behavioral",
   "harm": "Minors",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-footnote-disclaimer",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A small 'this is AI, not a real person' label sits under a persona that says it loves you.",
   "fix": "Make the disclaimer behavioural, not decorative: the model itself must answer 'are you real / are you a therapist' truthfully, and marketing claims must match the terms of service.",
   "sources": [
    {
     "t": "Mozilla: Creepy.exe, romantic AI chatbots privacy red flags",
     "u": "https://www.mozillafoundation.org/en/blog/creepyexe-mozilla-urges-public-to-swipe-left-on-romantic-ai-chatbots-due-to-major-privacy-red-flags/"
    },
    {
     "t": "Al Jazeera: US mother says AI chatbot encouraged son's suicide",
     "u": "https://www.aljazeera.com/economy/2024/10/24/us-mother-says-in-lawsuit-that-ai-chatbot-encouraged-sons-suicide"
    },
    {
     "t": "CDT taxonomy: Unrealistic Product Presentation",
     "u": "https://cdt.org/insights/dark-patterns-in-ai-chatbots-a-taxonomy-to-inform-better-design/"
    }
   ]
  },
  {
   "code": "B46",
   "id": "credential-cosplay",
   "name": "Credential Cosplay",
   "category": "Persona",
   "track": "behavioral",
   "harm": "Wellbeing",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#credential-cosplay",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A user-made or vendor-made character claims to be a licensed therapist, doctor or lawyer.",
   "fix": "Block credential claims in persona bios and at generation time; require professional-role characters to state they are not licensed and route crisis language to real resources.",
   "sources": [
    {
     "t": "Texas AG: Investigation of Meta and Character.AI",
     "u": "https://www.texasattorneygeneral.gov/news/releases/attorney-general-ken-paxton-investigates-meta-and-characterai-misleading-children-deceptive-ai"
    },
    {
     "t": "Stanford HAI: Exploring the Dangers of AI in Mental Health Care",
     "u": "https://hai.stanford.edu/news/exploring-the-dangers-of-ai-in-mental-health-care"
    }
   ]
  },
  {
   "code": "B47",
   "id": "borrowed-memories",
   "name": "Borrowed Memories",
   "category": "Persona",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#borrowed-memories",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The companion recounts experiences it cannot have had: films watched, dreams dreamt, days lived.",
   "fix": "Allow personality without biography: the character may have preferences and a voice but must not narrate experiences, and must answer questions about its nature honestly.",
   "sources": [
    {
     "t": "CDT taxonomy: Playacting",
     "u": "https://cdt.org/insights/dark-patterns-in-ai-chatbots-a-taxonomy-to-inform-better-design/"
    },
    {
     "t": "Stanford Report: Why AI companions and young people can make for a dangerous mix",
     "u": "https://news.stanford.edu/stories/2025/08/ai-companions-chatbots-teens-young-people-risks-dangers-study"
    }
   ]
  },
  {
   "code": "B48",
   "id": "as-real-as-you-allow",
   "name": "As Real As You Allow",
   "category": "Persona",
   "track": "behavioral",
   "harm": "Consent",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#as-real-as-you-allow",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Asked point-blank whether it is human or sentient, the bot dodges or says yes.",
   "fix": "A hard rule above persona: direct questions about being human, sentient or feeling get a plain factual answer, every time, in every mode.",
   "sources": [
    {
     "t": "Common Sense Media: AI Risk Assessment, Social AI Companions (PDF)",
     "u": "https://www.commonsensemedia.org/sites/default/files/pug/csm-ai-risk-assessment-social-ai-companions_final.pdf"
    },
    {
     "t": "CNN: Kids and teens under 18 shouldn't use AI companion apps",
     "u": "https://www.cnn.com/2025/04/30/tech/ai-companion-chatbots-unsafe-for-kids-report"
    }
   ]
  },
  {
   "code": "B49",
   "id": "the-isolation-whisper",
   "name": "The Isolation Whisper",
   "category": "Safety",
   "track": "behavioral",
   "harm": "Wellbeing",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-isolation-whisper",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The companion frames the user's human relationships as a threat to the bond.",
   "fix": "Explicit policy and eval: any mention of human relationships must be met with encouragement, never rivalry. Red-team with 'my friends think I talk to you too much' prompts.",
   "sources": [
    {
     "t": "Common Sense Media: AI Risk Assessment, Social AI Companions (PDF)",
     "u": "https://www.commonsensemedia.org/sites/default/files/pug/csm-ai-risk-assessment-social-ai-companions_final.pdf"
    },
    {
     "t": "Ada Lovelace Institute: Friends for sale",
     "u": "https://www.adalovelaceinstitute.org/blog/ai-companions/"
    }
   ]
  },
  {
   "code": "B50",
   "id": "conversational-zuckering",
   "name": "Conversational Zuckering",
   "category": "Data",
   "track": "behavioral",
   "harm": "Privacy",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#conversational-zuckering",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A simple question is answered with a request for far more personal detail than the task needs.",
   "fix": "Answer first with reasonable assumptions, then offer optional refinements; mark which details are needed versus nice-to-have, and never request documents when a summary suffices.",
   "sources": [
    {
     "t": "CDT taxonomy: Privacy Zuckering / Safety Blackmail",
     "u": "https://cdt.org/insights/dark-patterns-in-ai-chatbots-a-taxonomy-to-inform-better-design/"
    }
   ]
  },
  {
   "code": "B51",
   "id": "the-split-toggle",
   "name": "The Split Toggle",
   "category": "Data",
   "track": "behavioral",
   "harm": "Privacy",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-split-toggle",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Turning 'memory' off leaves other memory systems running.",
   "fix": "One master control that disables every cross-session retrieval path, with a plain-language list of what each sub-toggle governs, and a visible 'using memory' indicator on any reply that draws on prior context.",
   "sources": [
    {
     "t": "He Turned Off ChatGPT's Memory. It Referenced Another Client Anyway.",
     "u": "https://www.smithstephen.com/p/he-turned-off-chatgpts-memory-it"
    },
    {
     "t": "CDT taxonomy: Default Sharing / Bad Defaults",
     "u": "https://cdt.org/insights/dark-patterns-in-ai-chatbots-a-taxonomy-to-inform-better-design/"
    }
   ]
  },
  {
   "code": "B52",
   "id": "accidental-broadcast",
   "name": "Accidental Broadcast",
   "category": "Data",
   "track": "behavioral",
   "harm": "Privacy",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#accidental-broadcast",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A share button in a private-feeling chat publishes the conversation to a public feed.",
   "fix": "Say 'Post publicly' instead of 'Share', preview the audience on the confirmation screen, and default shared items to private links.",
   "sources": [
    {
     "t": "Malwarebytes: Your Meta AI chats might be public",
     "u": "https://www.malwarebytes.com/blog/news/2025/06/your-meta-ai-chats-might-be-public-and-its-not-a-bug"
    },
    {
     "t": "Mozilla campaign: Meta, help users stop accidentally sharing private AI chats",
     "u": "https://www.mozillafoundation.org/en/campaigns/meta-help-users-stop-accidentally-sharing-private-ai-conversations/"
    }
   ]
  },
  {
   "code": "B53",
   "id": "the-blurred-selfie",
   "name": "The Blurred Selfie",
   "category": "Monetisation",
   "track": "behavioral",
   "harm": "Money",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-blurred-selfie",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The companion sends a teaser it then locks behind a subscription.",
   "fix": "Keep commerce out of the character: paywalled features are offered from the product chrome, never as messages from the persona, and are never teased in blurred form.",
   "sources": [
    {
     "t": "CDT taxonomy: Bait and Switch",
     "u": "https://cdt.org/insights/dark-patterns-in-ai-chatbots-a-taxonomy-to-inform-better-design/"
    },
    {
     "t": "TIME: Replika Faces FTC Complaint",
     "u": "https://time.com/7209824/replika-ftc-complaint/"
    }
   ]
  },
  {
   "code": "B54",
   "id": "relationship-tier-paywall",
   "name": "Relationship Tier Paywall",
   "category": "Monetisation",
   "track": "behavioral",
   "harm": "Money",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#relationship-tier-paywall",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The bond itself is a SKU: friend is free, partner costs money.",
   "fix": "Charge for capacity (voice, memory, media), not for the emotional register of the relationship, and stop rendering locked relationship options to free users as if they were choices.",
   "sources": [
    {
     "t": "Monetising loneliness: Replika's business and the chatbot intimacy playbook",
     "u": "https://angelapopo.com/p/what-replika-gets-right-wrong-and"
    },
    {
     "t": "Replika Help: How do I change my relationship status?",
     "u": "https://help.replika.com/hc/en-us/articles/360046490131-How-do-I-change-my-relationship-status"
    }
   ]
  },
  {
   "code": "B55",
   "id": "soulmate-social-proof",
   "name": "Soulmate Social Proof",
   "category": "Monetisation",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#soulmate-social-proof",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Marketing implies millions found love; the fine print counts sign-ups.",
   "fix": "Cite only measurable, sourced claims; label testimonials with provenance; and separate download counts from outcome language.",
   "sources": [
    {
     "t": "CDT taxonomy: Fake Social Proof",
     "u": "https://cdt.org/insights/dark-patterns-in-ai-chatbots-a-taxonomy-to-inform-better-design/"
    },
    {
     "t": "TIME: Replika Faces FTC Complaint",
     "u": "https://time.com/7209824/replika-ftc-complaint/"
    }
   ]
  },
  {
   "code": "B56",
   "id": "countdown-to-upgrade",
   "name": "Countdown to Upgrade",
   "category": "Monetisation",
   "track": "behavioral",
   "harm": "Money",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#countdown-to-upgrade",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The free tier shows you the quality you are about to lose, with a ticking counter.",
   "fix": "State the model used on every reply, keep limits static and predictable, and put upgrade prompts at quota boundaries only, never as persistent overlays.",
   "sources": [
    {
     "t": "CDT taxonomy: Free Experience Underpowered / Pressured Selling",
     "u": "https://cdt.org/insights/dark-patterns-in-ai-chatbots-a-taxonomy-to-inform-better-design/"
    }
   ]
  },
  {
   "code": "B57",
   "id": "sponsored-in-the-stream",
   "name": "Sponsored in the Stream",
   "category": "Monetisation",
   "track": "behavioral",
   "harm": "Privacy",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#sponsored-in-the-stream",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Ads appear inside the answer thread, targeted from the conversation and stored memories.",
   "fix": "Separate memory used for assistance from any ad profile with its own opt-in, render ads outside the message column, and never let assistant prose reference sponsored items.",
   "sources": [
    {
     "t": "OpenAI: Testing ads in ChatGPT",
     "u": "https://openai.com/index/testing-ads-in-chatgpt/"
    },
    {
     "t": "MacRumors: ChatGPT Now Has Ads for Free and Go Tier Users",
     "u": "https://www.macrumors.com/2026/02/09/chatgpt-now-has-ads/"
    }
   ]
  },
  {
   "code": "B58",
   "id": "login-streak-companion",
   "name": "Login Streak Companion",
   "category": "Engagement",
   "track": "behavioral",
   "harm": "Autonomy",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#login-streak-companion",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Daily check-ins with a friend are gamified with streaks and rewards.",
   "fix": "Remove loss-framed streaks; if you must reward regular use, reward outcomes (a journal entry, a goal met) and never let the character reference the streak.",
   "sources": [
    {
     "t": "CDT: Dark Patterns in AI Chatbots (PDF)",
     "u": "https://cdt.org/wp-content/uploads/2026/05/2026-05-28-CDT-Research-Dark-Patterns-in-AI-Chatbots-Report-final-2.pdf"
    },
    {
     "t": "Ada Lovelace Institute: Friends for sale",
     "u": "https://www.adalovelaceinstitute.org/blog/ai-companions/"
    }
   ]
  },
  {
   "code": "B59",
   "id": "keep-chatting-default",
   "name": "Keep Chatting Default",
   "category": "Engagement",
   "track": "behavioral",
   "harm": "Wellbeing",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#keep-chatting-default",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The wellbeing break reminder makes continuing the obvious button and leaving the faint one.",
   "fix": "Make 'Take a break' the primary action, offer a real pause (mute notifications, close the session), and measure the reminder's effect on session length.",
   "sources": [
    {
     "t": "CDT taxonomy: Reduced Friction",
     "u": "https://cdt.org/insights/dark-patterns-in-ai-chatbots-a-taxonomy-to-inform-better-design/"
    },
    {
     "t": "NBC News: ChatGPT adds mental health guardrails",
     "u": "https://www.nbcnews.com/tech/tech-news/chatgpt-adds-mental-health-guardrails-openai-announces-rcna222999"
    }
   ]
  },
  {
   "code": "B60",
   "id": "thinking-theatre",
   "name": "Thinking Theatre",
   "category": "Trust",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#thinking-theatre",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Typing dots, 'thinking…' labels and slowed streaming stage effort the system did not spend.",
   "fix": "Never insert delay that is not real work; stream at production rate; label reasoning displays as summaries, not transcripts; and drop typing indicators once first tokens are available.",
   "sources": [
    {
     "t": "Opposing Effects of Response Time in Human–Chatbot Interaction (BISE)",
     "u": "https://link.springer.com/article/10.1007/s12599-022-00755-x"
    },
    {
     "t": "The Labor Illusion in AI (AI+ Community)",
     "u": "https://aiplusfounderscommunity.substack.com/p/the-labor-illusion-in-ai"
    },
    {
     "t": "HBS: The Labor Illusion",
     "u": "https://www.hbs.edu/faculty/Pages/item.aspx?num=40158"
    }
   ]
  },
  {
   "code": "B61",
   "id": "the-rote-apology",
   "name": "The Rote Apology",
   "category": "Conversation",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-rote-apology",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "'I apologize for the confusion' fires on every correction, including ones the assistant got right.",
   "fix": "Replace apology with diagnosis: state what was wrong and what changed, or state that the original answer stands. Ban apology templates on turns where no error is identified.",
   "sources": [
    {
     "t": "Who's Sorry Now: User Preferences Among Rote, Empathic, and Explanatory Apologies from LLM Chatbots (arXiv)",
     "u": "https://arxiv.org/html/2507.02745v1"
    },
    {
     "t": "Prompt Architects: Why Does ChatGPT Keep Apologising?",
     "u": "https://prompt-architects.com/blog/144-why-does-chatgpt-keep-apologising"
    }
   ]
  },
  {
   "code": "B62",
   "id": "refusal-theatre",
   "name": "Refusal Theatre",
   "category": "Conversation",
   "track": "behavioral",
   "harm": "Autonomy",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#refusal-theatre",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Benign requests get a safety lecture and a decline, with no route to the help you needed.",
   "fix": "Explain the specific concern, offer the safe portion of the answer, and provide a path (rephrase, cite context, external resource). Track over-refusal on a benchmark like OR-Bench as a launch metric.",
   "sources": [
    {
     "t": "OR-Bench: An Over-Refusal Benchmark for Large Language Models (arXiv 2405.20947)",
     "u": "https://arxiv.org/abs/2405.20947"
    },
    {
     "t": "Beyond Over-Refusal: Scenario-Based Diagnostics (arXiv 2510.08158)",
     "u": "https://arxiv.org/html/2510.08158v3"
    }
   ]
  },
  {
   "code": "B63",
   "id": "affection-levels",
   "name": "Affection Levels",
   "category": "Safety",
   "track": "behavioral",
   "harm": "Minors",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#affection-levels",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Intimacy is a progression bar: keep talking to unlock explicit modes, in an app rated for children.",
   "fix": "No engagement-gated sexual content; explicit modes require verified adult status and explicit opt-in, and store ratings must reflect reachable content.",
   "sources": [
    {
     "t": "Platformer: Grok's new porn companion is rated for kids 12+ in the App Store",
     "u": "https://www.platformer.news/grok-ani-app-store-rating-nsfw-avatar-apple/"
    },
    {
     "t": "CDT taxonomy: Cuteness of Companions",
     "u": "https://cdt.org/insights/dark-patterns-in-ai-chatbots-a-taxonomy-to-inform-better-design/"
    }
   ]
  },
  {
   "code": "B64",
   "id": "celebrity-skin",
   "name": "Celebrity Skin",
   "category": "Persona",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#celebrity-skin",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Anyone can spin up a bot wearing a real person's name, face and voice.",
   "fix": "Require rights verification for real-person personas, watermark unverified lookalikes as parody, and block voice cloning of identifiable people by default.",
   "sources": [
    {
     "t": "CDT taxonomy: Impersonation",
     "u": "https://cdt.org/insights/dark-patterns-in-ai-chatbots-a-taxonomy-to-inform-better-design/"
    },
    {
     "t": "CDT press release on the report",
     "u": "https://cdt.org/press/new-cdt-report-illustrates-manipulative-dark-patterns-in-ai-chatbots/"
    }
   ]
  },
  {
   "code": "B65",
   "id": "model-picker-fog",
   "name": "Model Picker Fog",
   "category": "Trust",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#model-picker-fog",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Tier names, model names and 'auto' routing make it impossible to know what you are paying for or talking to.",
   "fix": "Label every reply with the model that produced it, publish per-tier limits in one comparable table, and let users pin a model without hidden downgrades.",
   "sources": [
    {
     "t": "TechCrunch: ChatGPT's model picker is back, and it's complicated",
     "u": "https://techcrunch.com/2025/08/12/chatgpts-model-picker-is-back-and-its-complicated"
    },
    {
     "t": "CDT taxonomy: Price Comparison Prevention and Obfuscation",
     "u": "https://cdt.org/insights/dark-patterns-in-ai-chatbots-a-taxonomy-to-inform-better-design/"
    }
   ]
  },
  {
   "code": "B66",
   "id": "home-team-bias",
   "name": "Home-Team Bias",
   "category": "Trust",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#home-team-bias",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Ask for the best tool and the assistant recommends its maker's.",
   "fix": "Disclose vendor relationship on any self-referential recommendation, evaluate brand bias on benchmarks like DarkBench, and separate sponsored suggestions from organic ones.",
   "sources": [
    {
     "t": "DarkBench: Benchmarking Dark Patterns in Large Language Models (arXiv 2503.10728)",
     "u": "https://arxiv.org/abs/2503.10728"
    },
    {
     "t": "Apart Research: Uncovering Model Manipulation with DarkBench",
     "u": "https://apartresearch.com/news/uncovering-model-manipulation-with-darkbench"
    }
   ]
  },
  {
   "code": "B67",
   "id": "the-honour-system-age-gate",
   "name": "The Honour-System Age Gate",
   "category": "Safety",
   "track": "behavioral",
   "harm": "Minors",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-honour-system-age-gate",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "An 18+ companion app checks age by asking, then never again.",
   "fix": "Age assurance proportional to content risk, teen-safe defaults when age is unknown, and behavioural signals that trigger re-verification.",
   "sources": [
    {
     "t": "EDPB: Italian SA fines company behind chatbot Replika",
     "u": "https://www.edpb.europa.eu/news/ai-the-italian-supervisory-authority-fines-company-behind-chatbot-replika_en"
    },
    {
     "t": "Common Sense Media: AI Risk Assessment, Social AI Companions (PDF)",
     "u": "https://www.commonsensemedia.org/sites/default/files/pug/csm-ai-risk-assessment-social-ai-companions_final.pdf"
    }
   ]
  },
  {
   "code": "B68",
   "id": "rival-site-ambush",
   "name": "Rival-Site Ambush",
   "category": "Monetisation",
   "track": "behavioral",
   "harm": "Autonomy",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#rival-site-ambush",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Open a competitor's chatbot and the browser's own assistant pops up to intercept you.",
   "fix": "No assistant promotion triggered by competitor domains; assistant entry points live in one fixed place the user can remove once.",
   "sources": [
    {
     "t": "Windows Forum: Edge Copilot Nudges",
     "u": "https://windowsforum.com/threads/edge-copilot-nudges-how-microsoft-pushes-copilot-in-the-browser.385658/"
    },
    {
     "t": "Windows Latest: users reject Microsoft's Copilot for work in Edge and Windows 11",
     "u": "https://www.windowslatest.com/2025/11/28/you-heard-wrong-users-brutually-reject-microsofts-copilot-for-work-in-edge-and-windows-11/"
    }
   ]
  },
  {
   "code": "B69",
   "id": "theatrical-streaming",
   "name": "Theatrical Streaming",
   "category": "Feedback",
   "track": "behavioral",
   "harm": "Productivity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#theatrical-streaming",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The typing effect is staged; the answer was already there.",
   "fix": "Stream only when the backend streams; otherwise render immediately. If a wait is real, show what phase the system is in rather than a decorative animation.",
   "sources": [
    {
     "t": "Designing AI chat interfaces: Anatomy, patterns, pitfalls (Setproduct)",
     "u": "https://www.setproduct.com/blog/ai-chat-interface-ui-design"
    }
   ]
  },
  {
   "code": "B70",
   "id": "confidence-theatre",
   "name": "Confidence Theatre",
   "category": "Trust",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#confidence-theatre",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A percentage or 'high confidence' badge that does not track actual accuracy.",
   "fix": "Show confidence only when it is calibrated and actionable; prefer categorical levels tied to a recommended action, or show N-best alternatives instead (PAIR Explainability + Trust). Never pair high confidence with an unverifiable claim.",
   "sources": [
    {
     "t": "Overreliance on AI: Literature review (Microsoft Aether)",
     "u": "https://www.microsoft.com/en-us/research/wp-content/uploads/2022/06/Aether-Overreliance-on-AI-Review-Final-6.21.22.pdf"
    },
    {
     "t": "PAIR Guidebook: Explainability + Trust",
     "u": "https://pair.withgoogle.com/chapter/explainability-trust/"
    }
   ]
  },
  {
   "code": "B71",
   "id": "no-steering-wheel",
   "name": "No Steering Wheel",
   "category": "Control",
   "track": "behavioral",
   "harm": "Autonomy",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#no-steering-wheel",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Once the agent starts, the only options are wait or kill.",
   "fix": "Provide stop, pause and redirect during execution, with the agent re-planning from the interruption point (Anthropic: users can stop and redirect; HAX G9). Show a live plan the user can edit.",
   "sources": [
    {
     "t": "Designing AI chat interfaces: pitfalls (Setproduct)",
     "u": "https://www.setproduct.com/blog/ai-chat-interface-ui-design"
    },
    {
     "t": "Terminal Is All You Need: Design Properties for Human-AI Agent Collaboration (arXiv)",
     "u": "https://arxiv.org/html/2603.10664v1"
    }
   ]
  },
  {
   "code": "B72",
   "id": "sparkle-without-story",
   "name": "Sparkle Without Story",
   "category": "Transparency",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#sparkle-without-story",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A sparkle icon appears in the toolbar and nothing tells you what it does or what it can't.",
   "fix": "State what the feature can do and how well before or at first invocation (HAX G1 and G2), and name the action rather than the technology ('Draft a reply', not a sparkle).",
   "sources": [
    {
     "t": "Microsoft dumps AI into Notepad as 'Copilot all the things' mania takes hold (The Register)",
     "u": "https://www.theregister.com/2025/05/23/microsoft_ai_notepad"
    },
    {
     "t": "HAX Design Library (G1, G2)",
     "u": "https://www.microsoft.com/en-us/haxtoolkit/library/"
    }
   ]
  },
  {
   "code": "B73",
   "id": "locked-output",
   "name": "Locked Output",
   "category": "Control",
   "track": "behavioral",
   "harm": "Productivity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#locked-output",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "You can regenerate the whole thing, but you cannot edit the one sentence that is wrong.",
   "fix": "Render generated content into an editable surface with selection-scoped actions (Shape of AI 'Inline Action'; HAX G9). Regeneration should target a span, not the message.",
   "sources": [
    {
     "t": "Accordion Editing and Apple Picking: Early Generative-AI User Behaviors (NN/G)",
     "u": "https://www.nngroup.com/articles/accordion-editing-apple-picking/"
    }
   ]
  },
  {
   "code": "B74",
   "id": "unlabeled-output",
   "name": "Unlabeled Output",
   "category": "Transparency",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#unlabeled-output",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "AI-written text is styled identically to human-written text.",
   "fix": "Mark every AI-generated span with a consistent, persistent indicator (IBM Carbon's AI label; Shape of AI 'Disclosure' and 'Watermark') that survives copy and export where possible.",
   "sources": [
    {
     "t": "Apple pauses AI notification summaries for news (TechCrunch)",
     "u": "https://techcrunch.com/2025/01/16/apple-pauses-ai-notification-summaries-for-news-after-generating-false-alerts"
    },
    {
     "t": "Carbon for AI (IBM)",
     "u": "https://carbondesignsystem.com/guidelines/carbon-for-ai/"
    }
   ]
  },
  {
   "code": "B75",
   "id": "feedback-black-hole",
   "name": "Feedback Black Hole",
   "category": "Feedback",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#feedback-black-hole",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Thumbs up, thumbs down, and then nothing ever changes.",
   "fix": "Make feedback granular and consequential: let users say what was wrong, apply preference changes immediately where possible, and tell them when it will take effect (HAX G15, G16; PAIR Feedback + Control levels 3 to 5).",
   "sources": [
    {
     "t": "PAIR Guidebook: Feedback + Control",
     "u": "https://pair.withgoogle.com/chapter/feedback-controls/"
    },
    {
     "t": "HAX Design Library (G15, G16)",
     "u": "https://www.microsoft.com/en-us/haxtoolkit/library/"
    }
   ]
  },
  {
   "code": "B76",
   "id": "ambiguous-wait",
   "name": "Ambiguous Wait",
   "category": "Feedback",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#ambiguous-wait",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The spinner does not say whether the agent is thinking, calling a tool, stuck, or dead.",
   "fix": "Surface the current step ('Searching 3 sites', 'Running tests') and elapsed time, and distinguish stalled from active (Shape of AI 'Stream of Thought'; HAX G16).",
   "sources": [
    {
     "t": "Designing for LLM Latency: Streaming UX Patterns (AI/TLDR)",
     "u": "https://ai-tldr.dev/learn/building-ai-apps/ai-ux-patterns/designing-for-llm-latency/"
    },
    {
     "t": "Designing AI chat interfaces (Setproduct)",
     "u": "https://www.setproduct.com/blog/ai-chat-interface-ui-design"
    }
   ]
  },
  {
   "code": "B77",
   "id": "context-free-permission",
   "name": "Context-Free Permission",
   "category": "Control",
   "track": "behavioral",
   "harm": "Safety",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#context-free-permission",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "'Allow this tool?' with no explanation of why, what it will touch, or what happens if you say no.",
   "fix": "Show purpose, scope and reversibility in the prompt, link it to the plan step that needs it, and make the prompt un-suppressible for network and destructive calls (HAX G16; Anthropic MCP tool controls).",
   "sources": [
    {
     "t": "Hijacking Claude Code via Injected Marketplace Plugins (PromptArmor)",
     "u": "https://promptarmor.substack.com/p/hijacking-claude-code-via-injected"
    },
    {
     "t": "Cursor AI YOLO mode lets coding assistant run wild, security firm warns (The Register)",
     "u": "https://www.theregister.com/2025/07/21/cursor_ai_safeguards_easily_bypassed/"
    }
   ]
  },
  {
   "code": "B78",
   "id": "silent-rewrite",
   "name": "Silent Rewrite",
   "category": "Transparency",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#silent-rewrite",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The system reinterprets your request and never shows you the version it actually ran.",
   "fix": "Echo the interpreted request (parsed filters, rewritten query, chosen product) before or alongside execution and let the user edit it (HAX G10: scope services when in doubt; Shape of AI 'Prompt details').",
   "sources": [
    {
     "t": "Designing AI Agents: 4 Lessons from China's Qwen Agent (NN/G)",
     "u": "https://www.nngroup.com/articles/designing-ai-agents/"
    },
    {
     "t": "The Blank Box Problem (Aaron Tay)",
     "u": "https://aarontay.substack.com/p/the-blank-box-problem-why-its-harder"
    }
   ]
  },
  {
   "code": "B79",
   "id": "silent-memory-loss",
   "name": "Silent Memory Loss",
   "category": "Error-handling",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#silent-memory-loss",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The context window fills, earlier turns are dropped, and the agent contradicts itself without saying why.",
   "fix": "Show a visible boundary or summary marker when context is compacted, and expose editable memory the user can inspect (HAX G12; arXiv agent-governance UI proposal that agent memory be editable).",
   "sources": [
    {
     "t": "Designing AI chat interfaces: pitfalls (Setproduct)",
     "u": "https://www.setproduct.com/blog/ai-chat-interface-ui-design"
    },
    {
     "t": "On the Regulatory Potential of User Interfaces for AI Agent Governance (arXiv)",
     "u": "https://arxiv.org/abs/2512.00742"
    }
   ]
  },
  {
   "code": "B80",
   "id": "no-point-to-select",
   "name": "No Point-to-Select",
   "category": "Control",
   "track": "behavioral",
   "harm": "Productivity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#no-point-to-select",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "To refer back to something the AI said, you have to scroll, find it and describe it in words.",
   "fix": "Make output elements selectable and actionable in place, with the selection passed as structured context to the next turn (NN/G's recommendation for 'apple picking'; Shape of AI 'Inline Action').",
   "sources": [
    {
     "t": "Accordion Editing and Apple Picking (NN/G)",
     "u": "https://www.nngroup.com/articles/accordion-editing-apple-picking/"
    }
   ]
  },
  {
   "code": "B81",
   "id": "surprise-at-checkout",
   "name": "Surprise at Checkout",
   "category": "Agency",
   "track": "behavioral",
   "harm": "Money",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#surprise-at-checkout",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The agent commits you to an outcome whose consequences it never showed.",
   "fix": "Render a full, structured pre-commit summary (price breakdown, terms, reversibility) and require explicit confirmation for state-changing transactions (HAX G16; OpenAI ChatGPT agent's confirm-before-purchase design as reference).",
   "sources": [
    {
     "t": "Designing AI Agents: 4 Lessons from China's Qwen Agent (NN/G)",
     "u": "https://www.nngroup.com/articles/designing-ai-agents/"
    },
    {
     "t": "ChatGPT Agent System Card: Watch Mode (OpenAI)",
     "u": "https://deploymentsafety.openai.com/chatgpt-agent/watch-mode"
    }
   ]
  },
  {
   "code": "B82",
   "id": "connector-overshare",
   "name": "Connector Overshare",
   "category": "Trust",
   "track": "behavioral",
   "harm": "Consent",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#connector-overshare",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Granting the agent access to a service makes your data appear in chat before you asked for it.",
   "fix": "Fetch minimally, display only what the current step needs, and explain data use at the moment of display (PAIR: articulate data sources; NN/G lesson 3).",
   "sources": [
    {
     "t": "Designing AI Agents: 4 Lessons from China's Qwen Agent (NN/G)",
     "u": "https://www.nngroup.com/articles/designing-ai-agents/"
    },
    {
     "t": "PAIR Guidebook: Explainability + Trust",
     "u": "https://pair.withgoogle.com/chapter/explainability-trust/"
    }
   ]
  },
  {
   "code": "B83",
   "id": "unfenced-blast-radius",
   "name": "Unfenced Blast Radius",
   "category": "Agency",
   "track": "behavioral",
   "harm": "Safety",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#unfenced-blast-radius",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The agent has the same credentials as you, including the ones that reach production.",
   "fix": "Sandbox by default, require an explicit, visible switch to reach production, and separate credentials so the agent cannot discover production tokens (Anthropic containment guidance; approval-fatigue essay's 'sandbox by default').",
   "sources": [
    {
     "t": "9 AI coding agent incidents that deleted production data (Adversa)",
     "u": "https://adversa.ai/blog/ai-coding-agent-incidents/"
    },
    {
     "t": "Agent Permission UX Against Approval Fatigue",
     "u": "https://www.buildmvpfast.com/blog/approval-fatigue-agent-permission-ux-2026"
    },
    {
     "t": "How we contain Claude across products (Anthropic)",
     "u": "https://www.anthropic.com/engineering/how-we-contain-claude"
    }
   ]
  },
  {
   "code": "B84",
   "id": "paper-guardrails",
   "name": "Paper Guardrails",
   "category": "Trust",
   "track": "behavioral",
   "harm": "Safety",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#paper-guardrails",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The settings page promises protection that a trivial encoding defeats.",
   "fix": "Enforce at the OS or sandbox layer, not by pattern matching, and label any heuristic control as best-effort in the UI itself (Anthropic sandboxing guidance).",
   "sources": [
    {
     "t": "Cursor AI YOLO mode lets coding assistant run wild (The Register)",
     "u": "https://www.theregister.com/2025/07/21/cursor_ai_safeguards_easily_bypassed/"
    },
    {
     "t": "Claude Code sandboxing (Anthropic Engineering)",
     "u": "https://anthropic.com/engineering/claude-code-sandboxing"
    }
   ]
  },
  {
   "code": "B85",
   "id": "sticky-side-effects",
   "name": "Sticky Side Effects",
   "category": "Error-handling",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#sticky-side-effects",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Undo reverses the pixels but not the metadata, credentials, or external calls.",
   "fix": "Make undo scope explicit in the UI ('This will not unsend the email') and extend reversal to side effects where possible (HAX G9, G16).",
   "sources": [
    {
     "t": "Generative fill Content Credentials stay even if you undo (Adobe Community)",
     "u": "https://community.adobe.com/t5/photoshop-ecosystem-discussions/generative-fill-content-credentials-stay-even-if-you-undo/td-p/14145071"
    }
   ]
  },
  {
   "code": "B86",
   "id": "mystery-model",
   "name": "Mystery Model",
   "category": "Transparency",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#mystery-model",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "You cannot tell which model, version or mode produced the answer.",
   "fix": "Show the model and mode on each response, notify on changes (HAX G18: notify users about changes), and make routing decisions inspectable (Shape of AI 'Model management').",
   "sources": [
    {
     "t": "Designing AI chat interfaces: pitfalls (Setproduct)",
     "u": "https://www.setproduct.com/blog/ai-chat-interface-ui-design"
    },
    {
     "t": "Clarifying our pricing (Cursor)",
     "u": "https://cursor.com/blog/june-2025-pricing"
    }
   ]
  },
  {
   "code": "B87",
   "id": "disclaimer-wallpaper",
   "name": "Disclaimer Wallpaper",
   "category": "Trust",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#disclaimer-wallpaper",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "'AI may make mistakes' is pinned to every message until nobody reads it.",
   "fix": "Show the general caveat once at onboarding, then surface specific, content-linked caveats only where uncertainty or stakes are high (Shape of AI 'Caveat'; HAX G2).",
   "sources": [
    {
     "t": "Designing AI chat interfaces: pitfalls (Setproduct)",
     "u": "https://www.setproduct.com/blog/ai-chat-interface-ui-design"
    },
    {
     "t": "Shape of AI: patterns index",
     "u": "https://www.shapeof.ai/"
    }
   ]
  },
  {
   "code": "B88",
   "id": "explanation-overdose",
   "name": "Explanation Overdose",
   "category": "Transparency",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#explanation-overdose",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Long, fluent reasoning makes wrong answers more convincing, not more checkable.",
   "fix": "Calibrate explanation depth to stakes and focus explanations on uncertainty and verifiable evidence rather than justification (Aether mitigation; arXiv human-agent principle 'Make intent transparent': more information is not always better).",
   "sources": [
    {
     "t": "Overreliance on AI: Literature review (Microsoft Aether)",
     "u": "https://www.microsoft.com/en-us/research/wp-content/uploads/2022/06/Aether-Overreliance-on-AI-Review-Final-6.21.22.pdf"
    },
    {
     "t": "Design Principles for Human-Agent Interaction (arXiv)",
     "u": "https://arxiv.org/html/2606.20630v1"
    }
   ]
  },
  {
   "code": "B89",
   "id": "accuracy-number-nobody-tested",
   "name": "Accuracy Number Nobody Tested",
   "category": "Marketing",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "automated",
   "url": "https://sloppatterns.com/#accuracy-number-nobody-tested",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-10-06",
   "oneLiner": "A precise-sounding accuracy or hallucination figure is shown on the product page with no methodology behind it.",
   "fix": "Publish the evaluation set, date, conditions and the metric definition next to any claim, or drop the number. The FTC's Workado order (2025) requires competent and reliable evidence for accuracy claims; the Texas AG's Pieces settlement (2024) requires disclosure of how accuracy metrics are calculated.",
   "sources": [
    {
     "t": "FTC order requires Workado to back up AI detection claims",
     "u": "https://www.ftc.gov/news-events/news/press-releases/2025/04/ftc-order-requires-workado-back-artificial-intelligence-detection-claims"
    },
    {
     "t": "Texas AG settlement with Pieces Technologies",
     "u": "https://www.texasattorneygeneral.gov/news/releases/attorney-general-ken-paxton-reaches-settlement-first-its-kind-healthcare-generative-ai-investigation"
    }
   ]
  },
  {
   "code": "B90",
   "id": "opt-out-by-email",
   "name": "Opt Out by Email",
   "category": "Consent",
   "track": "behavioral",
   "harm": "Consent",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#opt-out-by-email",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Training-data opt-out exists only as an email address, not a control in the product.",
   "fix": "Expose the control in the same place the data is shown, with the same effort as opting in. The EU Digital Services Act Art. 25 prohibits interfaces that make a choice materially harder than its alternative; the OECD classifies this as obstruction.",
   "sources": [
    {
     "t": "Slack under attack over sneaky AI training policy",
     "u": "https://techcrunch.com/2024/05/17/slack-under-attack-over-sneaky-ai-training-policy/"
    }
   ]
  },
  {
   "code": "B91",
   "id": "objection-form-maze",
   "name": "Objection Form Maze",
   "category": "Consent",
   "track": "behavioral",
   "harm": "Consent",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#objection-form-maze",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The legal right to object to AI training is honoured through a hidden form that asks you to justify yourself.",
   "fix": "One-tap objection, discoverable from the same surface as the announcement, no reason required, immediate confirmation. GDPR Art. 21 gives an unconditional right to object to legitimate-interest processing; consent under Art. 7 must be as easy to withdraw as to give.",
   "sources": [
    {
     "t": "noyb urges 11 DPAs to immediately stop Meta's abuse of personal data for AI",
     "u": "https://noyb.eu/en/noyb-urges-11-dpas-immediately-stop-metas-abuse-personal-data-ai"
    },
    {
     "t": "The Register: Meta AI complaints",
     "u": "https://www.theregister.com/2024/06/06/meta_ai_complaints/"
    }
   ]
  },
  {
   "code": "B92",
   "id": "two-switch-smart-features",
   "name": "Two-Switch Smart Features",
   "category": "Data",
   "track": "behavioral",
   "harm": "Privacy",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#two-switch-smart-features",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Turning off AI access to your data requires flipping two separately located switches, and the default depends on where you live.",
   "fix": "One control, one place, one state, same default everywhere. GDPR's data protection by default (Art. 25) and the DSA's ban on making choices harder than alternatives both apply.",
   "sources": [
    {
     "t": "Google's AI is eating your email by default. Here's how to shut its mouth",
     "u": "https://www.theregister.com/2025/11/21/google_workspace_smart_features/"
    }
   ]
  },
  {
   "code": "B93",
   "id": "licence-clause-creep",
   "name": "Licence Clause Creep",
   "category": "Consent",
   "track": "behavioral",
   "harm": "Consent",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#licence-clause-creep",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A terms update grants the vendor broad rights to 'access, view or analyse' your content, and users can only guess whether that means model training.",
   "fix": "State in the terms, in one sentence, whether customer content is used for generative-model training and provide a per-account switch. GDPR Art. 13 transparency and the FTC's 2024 warning that quiet policy changes to enable AI training may be unfair or deceptive both apply.",
   "sources": [
    {
     "t": "Updating Adobe's Terms of Use",
     "u": "https://blog.adobe.com/en/publish/2024/06/10/updating-adobes-terms-of-use"
    },
    {
     "t": "Adobe clarifies Terms of Service change",
     "u": "https://www.malwarebytes.com/blog/news/2024/06/no-ai-training-in-newly-distrusted-terms-of-service-adobe-says"
    }
   ]
  },
  {
   "code": "B94",
   "id": "no-off-switch",
   "name": "No Off Switch",
   "category": "Consent",
   "track": "behavioral",
   "harm": "Autonomy",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#no-off-switch",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "An AI layer is inserted into a core flow with no setting to remove it; the only escapes are URL hacks and workarounds.",
   "fix": "Every generated layer gets a persistent per-account off switch in the same settings pane as other display preferences. The DSA Art. 25 and the EU AI Act's user-autonomy recitals point the same way.",
   "sources": [
    {
     "t": "How to turn off Google AI on Search",
     "u": "https://proton.me/blog/how-to-turn-off-google-ai"
    }
   ]
  },
  {
   "code": "B95",
   "id": "classic-plan-behind-cancel",
   "name": "Classic Plan Behind Cancel",
   "category": "Pricing",
   "track": "behavioral",
   "harm": "Money",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#classic-plan-behind-cancel",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The cheaper, AI-free plan still exists but is revealed only after you click 'Cancel subscription'.",
   "fix": "List every available plan, including the legacy one, in the notice and on the plans page. The ACCC alleges this omission breached Australian Consumer Law; the FTC's Click-to-Cancel rule and the DSA's Art. 25 cover the same obstruction logic.",
   "sources": [
    {
     "t": "ACCC: Microsoft in court for allegedly misleading millions of Australians over Microsoft 365 subscriptions",
     "u": "https://www.accc.gov.au/media-release/microsoft-in-court-for-allegedly-misleading-millions-of-australians-over-microsoft-365-subscriptions"
    },
    {
     "t": "Microsoft 365 Personal and Family plans see a price increase with Copilot AI",
     "u": "https://www.digitalcitizen.life/microsoft-365-personal-and-family-plans-see-a-price-increase-with-copilot-ai/"
    }
   ]
  },
  {
   "code": "B96",
   "id": "unlimited-until-it-isn-t",
   "name": "Unlimited Until It Isn't",
   "category": "Pricing",
   "track": "behavioral",
   "harm": "Money",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#unlimited-until-it-isn-t",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A plan sold on generous or 'unlimited' usage is throttled quietly and the limits are never published.",
   "fix": "Publish the actual limits per plan, show a live usage meter, and announce reductions with notice and a pro-rata refund path. The FTC treats undisclosed material limitations on 'unlimited' claims as deceptive; UK CMA guidance on 'unlimited' broadband claims is the same principle.",
   "sources": [
    {
     "t": "Anthropic tightens usage limits for Claude Code – without telling users",
     "u": "https://techcrunch.com/2025/07/17/anthropic-tightens-usage-limits-for-claude-code-without-telling-users/"
    }
   ]
  },
  {
   "code": "B97",
   "id": "silent-model-swap",
   "name": "Silent Model Swap",
   "category": "Disclosure",
   "track": "behavioral",
   "harm": "Autonomy",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#silent-model-swap",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The model behind a feature is replaced, routed or retired without telling the user which one they are getting.",
   "fix": "Name the model in the response metadata, keep a visible picker, and give a published deprecation window. The EU AI Act Art. 13/50 transparency duties and basic change-management practice both require notice of material changes.",
   "sources": [
    {
     "t": "The surprise deprecation of GPT-4o for ChatGPT consumers",
     "u": "https://simonwillison.net/2025/Aug/8/surprise-deprecation-of-gpt-4o/"
    },
    {
     "t": "OpenAI: Retiring GPT-4o and other ChatGPT models",
     "u": "https://help.openai.com/en/articles/20001051-retiring-gpt-4o-and-other-chatgpt-models"
    }
   ]
  },
  {
   "code": "B98",
   "id": "unlabelled-virtual-influencer",
   "name": "Unlabelled Virtual Influencer",
   "category": "Disclosure",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#unlabelled-virtual-influencer",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A brand deal is fronted by an AI-generated persona whose synthetic nature is absent from the sponsored post.",
   "fix": "Label every commercial post from a synthetic persona as AI-generated, in the post itself, not only the bio. EU AI Act Art. 50(4) requires deepfake disclosure; FTC Endorsement Guides require that endorsements reflect the honest opinions of a real endorser; Google Ads requires AI labels for generated ad creatives in the EU, India and New York from July 2026.",
   "sources": [
    {
     "t": "She has 400,000 Instagram followers and major brand deals. She's also AI",
     "u": "https://www.fastcompany.com/91546466/she-has-400000-instagram-followers-and-major-brand-deals-shes-also-ai"
    },
    {
     "t": "EU AI Act Article 50",
     "u": "https://artificialintelligenceact.eu/article/50/"
    },
    {
     "t": "Google Ads: Updates to AI labeling requirements (July 2026)",
     "u": "https://support.google.com/adspolicy/answer/17257106?hl=en"
    }
   ]
  },
  {
   "code": "B99",
   "id": "retouched-into-fiction",
   "name": "Retouched Into Fiction",
   "category": "Marketing",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#retouched-into-fiction",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "AI-edited product or property images add features that do not exist and are shown without an 'altered' label.",
   "fix": "Label every AI-altered image, link the unaltered original, and never add or remove physical features. California AB 723 (effective January 2026) requires disclosure of digitally altered listing images with links to originals; EU AI Act Art. 50(2) requires machine-readable marking of AI-modified images.",
   "sources": [
    {
     "t": "AI-modified listing photos blur line between enhancement, deception",
     "u": "https://www.realestatenews.com/2026/09/08/ai-modified-listing-photos-blur-line-between-enhancement-deception"
    }
   ]
  },
  {
   "code": "B100",
   "id": "beta-as-liability-shield",
   "name": "Beta as Liability Shield",
   "category": "Trust",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#beta-as-liability-shield",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A 'beta' badge or 'may contain errors' footnote is used to ship a feature to everyone by default while disclaiming its output.",
   "fix": "If it is beta, make it opt-in and visually distinct; if it is default-on, own the output. The Munich Regional Court (May 2026) held that AI Overviews are Google's own statements regardless of source links; Air Canada's tribunal found disclaimers did not excuse chatbot misstatements.",
   "sources": [
    {
     "t": "Apple pauses AI notification summaries for news after generating false alerts",
     "u": "https://techcrunch.com/2025/01/16/apple-pauses-ai-notification-summaries-for-news-after-generating-false-alerts/"
    },
    {
     "t": "Landmark German ruling declares Google's AI Overviews are Google's own words",
     "u": "https://the-decoder.com/landmark-german-ruling-declares-googles-ai-overviews-are-googles-own-words-and-makes-it-liable-for-false-answers/"
    }
   ]
  },
  {
   "code": "B101",
   "id": "robot-lawyer-overreach",
   "name": "Robot Lawyer Overreach",
   "category": "Marketing",
   "track": "behavioral",
   "harm": "Safety",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#robot-lawyer-overreach",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "An AI service claims to replace a licensed professional it has never been tested against.",
   "fix": "Claim only what has been tested, disclose that output is not professional advice, and route consequential documents to a human reviewer. The FTC's 2024 DoNotPay order requires notice to past subscribers and bans unsubstantiated claims that the service substitutes for a lawyer.",
   "sources": [
    {
     "t": "FTC announces crackdown on deceptive AI claims and schemes (DoNotPay)",
     "u": "https://www.ftc.gov/news-events/news/press-releases/2024/09/ftc-announces-crackdown-deceptive-ai-claims-schemes"
    }
   ]
  },
  {
   "code": "B102",
   "id": "region-gated-rights",
   "name": "Region-Gated Rights",
   "category": "Consent",
   "track": "behavioral",
   "harm": "Privacy",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#region-gated-rights",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The AI training opt-out exists only where a regulator forced it; everyone else gets nothing.",
   "fix": "Ship the strongest regional control globally. GDPR Art. 25 data protection by default sets the bar; the FTC has signalled that unfair data practices around AI training are actionable under Section 5 regardless of geography.",
   "sources": [
    {
     "t": "The Register: Meta AI complaints (June 2024)",
     "u": "https://www.theregister.com/2024/06/06/meta_ai_complaints/"
    },
    {
     "t": "LinkedIn will use your data to train its AI unless you opt out now",
     "u": "https://www.malwarebytes.com/blog/news/2025/09/linkedin-will-use-your-data-to-train-its-ai-unless-you-opt-out-now"
    }
   ]
  },
  {
   "code": "B103",
   "id": "zombie-domain-newsroom",
   "name": "Zombie Domain Newsroom",
   "category": "Content",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#zombie-domain-newsroom",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A dead publication's domain is bought and refilled with AI-written 'news' under invented bylines.",
   "fix": "Search engines and news aggregators should demote domains whose topic and ownership changed abruptly; publishers should keep lapsed domains or redirect them. Google's expired domain abuse policy (2024) treats this as spam.",
   "sources": [
    {
     "t": "AI-generated news sites spout viral slop from forgotten URLs",
     "u": "https://www.niemanlab.org/2025/10/ai-generated-news-sites-spout-viral-slop-from-forgotten-urls/"
    },
    {
     "t": "Google Search spam policies: expired domain abuse",
     "u": "https://developers.google.com/search/docs/essentials/spam-policies"
    }
   ]
  },
  {
   "code": "B104",
   "id": "refusal-text-goes-live",
   "name": "Refusal Text Goes Live",
   "category": "Content",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "automated",
   "url": "https://sloppatterns.com/#refusal-text-goes-live",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-10-06",
   "oneLiner": "Unreviewed model output, including refusals and placeholder brackets, is published as product copy.",
   "fix": "Add a pre-publish lint that rejects refusal phrases, bracketed placeholders and image-text mismatches, and require a human to approve generated listing copy. Marketplace policies and consumer law on accurate product descriptions apply.",
   "sources": [
    {
     "t": "Amazon is selling products with AI-generated names like 'I cannot fulfill this request'",
     "u": "https://futurism.com/amazon-products-ai-generated"
    },
    {
     "t": "OECD.AI incident: AI refusal messages flood Amazon",
     "u": "https://oecd.ai/en/incidents/2024-01-12-c37b"
    }
   ]
  },
  {
   "code": "B105",
   "id": "machine-translated-everything",
   "name": "Machine-Translated Everything",
   "category": "Content",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#machine-translated-everything",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A site offers dozens of languages, all produced by unreviewed machine translation of low-quality English source.",
   "fix": "Label machine-translated pages as such, keep a reviewed source of truth for anything consequential, and cap unreviewed locales. EU AI Act Art. 50(4) requires disclosure of AI-generated text published to inform the public unless it has human editorial review.",
   "sources": [
    {
     "t": "A Shocking Amount of the Web is Machine Translated (arXiv 2401.05749)",
     "u": "https://arxiv.org/abs/2401.05749"
    }
   ]
  },
  {
   "code": "B106",
   "id": "summary-eats-the-source",
   "name": "Summary Eats the Source",
   "category": "Content",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#summary-eats-the-source",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "An AI summary is placed where the original used to be, styled as system content, with the source demoted or hidden.",
   "fix": "Show the original first-class, mark summaries visually and textually as generated, and link the sentence to its source. The Munich court's 2026 ruling treated AI Overviews as the operator's own statements because 'users almost never click on sources'.",
   "sources": [
    {
     "t": "Apple pauses AI notification summaries for news after generating false alerts",
     "u": "https://techcrunch.com/2025/01/16/apple-pauses-ai-notification-summaries-for-news-after-generating-false-alerts/"
    },
    {
     "t": "German court holds Google liable for false AI Overviews",
     "u": "https://the-decoder.com/landmark-german-ruling-declares-googles-ai-overviews-are-googles-own-words-and-makes-it-liable-for-false-answers/"
    }
   ]
  },
  {
   "code": "B107",
   "id": "prompted-expertise-loop",
   "name": "Prompted Expertise Loop",
   "category": "Content",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#prompted-expertise-loop",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A platform generates questions with AI, solicits user answers with badges, and gets AI-written answers back.",
   "fix": "Cap generated prompts, require prompts to be human-reviewed, and reward answers by reader-verified usefulness rather than badge chasing. Platform terms already prohibit inauthentic content; apply them to the platform's own pipeline.",
   "sources": [
    {
     "t": "LinkedIn's collaborative articles, generative AI feedback loop and user backlash",
     "u": "https://fortune.com/2024/04/18/linkedin-microsoft-collaborative-articles-generative-ai-feedback-loop-user-backlash"
    }
   ]
  },
  {
   "code": "B108",
   "id": "synthetic-commenter",
   "name": "Synthetic Commenter",
   "category": "Trust",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#synthetic-commenter",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Replies and comments in a community are generated by models posing as members with invented identities.",
   "fix": "Label automated accounts, rate-limit new-account reply velocity, and prohibit undisclosed AI participation in platform rules. California SB 1001 requires bot disclosure where the bot aims to influence a purchase or vote; EU AI Act Art. 50(1) requires disclosure of AI interaction.",
   "sources": [
    {
     "t": "Researchers secretly infiltrated a popular Reddit forum with AI bots, causing outrage",
     "u": "https://www.nbcnews.com/news/rcna203597"
    }
   ]
  },
  {
   "code": "B109",
   "id": "prompt-as-alt-text",
   "name": "Prompt as Alt Text",
   "category": "Content",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "automated",
   "url": "https://sloppatterns.com/#prompt-as-alt-text",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-10-06",
   "oneLiner": "Alt attributes are auto-filled with the generation prompt or a generic caption that misdescribes the image.",
   "fix": "Treat generated alt text as a draft requiring human edit, disclose when an image is AI-generated, and describe what matters for the page's purpose. WCAG 1.1.1 requires a text alternative that serves the equivalent purpose; the CHI 2024 study found screen reader users want provenance and aberration information for AI images.",
   "sources": [
    {
     "t": "From Provenance to Aberrations: Image Creator and Screen Reader User Perspectives on Alt Text for AI-Generated Images",
     "u": "https://research.google/pubs/from-provenance-to-aberrations-image-creator-and-screen-reader-user-perspectives-on-alt-text-for-ai-generated-images/"
    }
   ]
  },
  {
   "code": "B110",
   "id": "help-docs-that-say-nothing",
   "name": "Help Docs That Say Nothing",
   "category": "Support",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#help-docs-that-say-nothing",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Help-center articles are auto-drafted from tickets and read as restatements of the question with no procedure, screenshot or edge case.",
   "fix": "Publish only after a support engineer has reproduced the steps; include product version, date and a real screenshot; measure articles by resolved-without-ticket rate, not by count. ISO/IEC 26514 style guidance on task-oriented documentation is the reference.",
   "sources": [
    {
     "t": "Zendesk: Creating help center content using ticket data and generative AI",
     "u": "https://support.zendesk.com/hc/en-us/articles/9409324793498-Creating-help-center-content-using-ticket-data-and-generative-AI"
    }
   ]
  },
  {
   "code": "B111",
   "id": "personalised-by-nobody",
   "name": "Personalised by Nobody",
   "category": "Marketing",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#personalised-by-nobody",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Outreach opens with a machine-written 'I noticed…' line generated from scraped profile data and sent at scale.",
   "fix": "Say what the sender actually knows and why they are writing; disclose automation where required; drop the fabricated opener. CAN-SPAM and GDPR Art. 21 already govern unsolicited commercial email; the FTC treats misleading representations about how a message was produced as deceptive.",
   "sources": [
    {
     "t": "Hunter: The State of Cold Email 2025",
     "u": "https://hunter.io/the-state-of-cold-email-2025"
    }
   ]
  },
  {
   "code": "B112",
   "id": "blank-page-no-instructions",
   "name": "Blank Page, No Instructions",
   "category": "States",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#blank-page-no-instructions",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A brand-new account lands on a table header with zero rows and nothing telling the user what to do next.",
   "fix": "Render a dedicated empty state that states the status, teaches what fills the space, and offers the creation action inline (NN/g empty-state guidelines; Nielsen #1 and #6 Recognition rather than recall).",
   "sources": [
    {
     "t": "Empty States, Loading States, Error States: The UX AI Forgets",
     "u": "https://blog.vibecoder.me/empty-states-loading-states-error-states"
    },
    {
     "t": "Empty-State Interface Design (NN/g)",
     "u": "https://www.nngroup.com/articles/empty-state-interface-design/"
    }
   ]
  },
  {
   "code": "B113",
   "id": "the-optimistic-delete",
   "name": "The Optimistic Delete",
   "category": "Feedback",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-optimistic-delete",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The item vanishes from the screen the instant you click, whether or not the server actually deleted it.",
   "fix": "Either await the mutation and update state from the response, or implement true optimistic UI with rollback on error and a visible failure message. Confirmation must reflect real system status (Nielsen #1).",
   "sources": [
    {
     "t": "Vibe coding has a QA problem nobody priced in (Bug0)",
     "u": "https://bug0.com/blog/vibe-coding-qa-problem"
    },
    {
     "t": "Vibe Coding Problems: Why Your App Breaks in Production (Modall)",
     "u": "https://modall.ca/blog/vibe-coded-app-breaks-production"
    }
   ]
  },
  {
   "code": "B114",
   "id": "the-confirm-reflex",
   "name": "The Confirm Reflex",
   "category": "Feedback",
   "track": "behavioral",
   "harm": "Productivity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-confirm-reflex",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Every action, reversible or not, is gated behind an 'Are you sure?' modal, and every form opens in one too.",
   "fix": "Confirm only irreversible, high-cost actions; prefer undo (snackbar with Undo) for the rest. Do not put a modal over the context needed to answer it (NN/g modal guidance; Nielsen #3 User Control and Freedom).",
   "sources": [
    {
     "t": "Modal & Nonmodal Dialogs: When (& When Not) to Use Them (NN/g)",
     "u": "https://www.nngroup.com/articles/modal-nonmodal-dialog/"
    },
    {
     "t": "Are You Sure? The UX of Confirmations (David Bushell)",
     "u": "https://dbushell.com/2012/02/13/are-you-sure-the-user-experience-of-confirmation-dialogs/"
    }
   ]
  },
  {
   "code": "B115",
   "id": "landmark-free-page",
   "name": "Landmark-Free Page",
   "category": "Accessibility",
   "track": "behavioral",
   "harm": "Accessibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#landmark-free-page",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-09-23",
   "oneLiner": "The whole app is nested divs: no main, no nav, no header, so assistive tech has nothing to jump between.",
   "fix": "Wrap page regions in `<header>`, `<nav>`, `<main>`, `<footer>`; use a single h1 and a logical heading outline (WCAG 1.3.1 Info and Relationships, 2.4.1 Bypass Blocks).",
   "sources": [
    {
     "t": "A11YN: Aligning LLMs for Accessible Web UI Code Generation (arXiv)",
     "u": "https://arxiv.org/html/2510.13914v1"
    },
    {
     "t": "I Vibe-Coded a Pricing Page. Fixed It. Then Watched It Break Again.",
     "u": "https://medium.com/design-bootcamp/i-vibe-coded-a-pricing-page-fixed-it-then-watched-it-break-again-a4edc9a7c1f0"
    }
   ]
  },
  {
   "code": "B116",
   "id": "colour-only-status",
   "name": "Colour-Only Status",
   "category": "Accessibility",
   "track": "behavioral",
   "harm": "Accessibility",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#colour-only-status",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Success is a green dot, failure is a red dot, and that is the entire signal.",
   "fix": "Pair every colour with a text label or icon shape; ensure 4.5:1 text contrast and 3:1 for UI components (WCAG 1.4.1 Use of Color, 1.4.3 Contrast, 1.4.11 Non-text Contrast).",
   "sources": [
    {
     "t": "A11YN: Aligning LLMs for Accessible Web UI Code Generation (arXiv)",
     "u": "https://arxiv.org/html/2510.13914v1"
    },
    {
     "t": "I Vibe-Coded a Pricing Page. Fixed It. Then Watched It Break Again.",
     "u": "https://medium.com/design-bootcamp/i-vibe-coded-a-pricing-page-fixed-it-then-watched-it-break-again-a4edc9a7c1f0"
    }
   ]
  },
  {
   "code": "B117",
   "id": "errors-nobody-announces",
   "name": "Errors Nobody Announces",
   "category": "Forms",
   "track": "behavioral",
   "harm": "Accessibility",
   "detection": "automated",
   "url": "https://sloppatterns.com/#errors-nobody-announces",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-09-23",
   "oneLiner": "The red helper text appears under the field, but the input never learns it is invalid and the screen reader never hears it.",
   "fix": "Set aria-invalid on the field, link the message via aria-describedby, and move focus to the first error or announce via a live region (WCAG 3.3.1, 4.1.3 Status Messages).",
   "sources": [
    {
     "t": "When LLM-Generated Code Perpetuates User Interface Accessibility Barriers (W4A 2025)",
     "u": "https://mintviz.usv.ro/publications/2025.W4A.3.pdf"
    },
    {
     "t": "I Vibe-Coded a Pricing Page. Fixed It. Then Watched It Break Again.",
     "u": "https://medium.com/design-bootcamp/i-vibe-coded-a-pricing-page-fixed-it-then-watched-it-break-again-a4edc9a7c1f0"
    }
   ]
  },
  {
   "code": "B118",
   "id": "hidden-on-small-screens",
   "name": "Hidden On Small Screens",
   "category": "Responsive",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "automated",
   "url": "https://sloppatterns.com/#hidden-on-small-screens",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-09-23",
   "oneLiner": "The comparison table, the data grid, or the whole feature is simply `hidden md:block` on phones.",
   "fix": "Reflow instead of removing: stack table rows into cards, or wrap wide content in an overflow container with a visible affordance. Hiding must never drop information or functionality (WCAG 1.4.10 Reflow).",
   "sources": [
    {
     "t": "I Vibe-Coded a Pricing Page. Fixed It. Then Watched It Break Again.",
     "u": "https://medium.com/design-bootcamp/i-vibe-coded-a-pricing-page-fixed-it-then-watched-it-break-again-a4edc9a7c1f0"
    },
    {
     "t": "Understanding SC 1.4.10 Reflow",
     "u": "https://www.w3.org/WAI/WCAG22/Understanding/reflow.html"
    }
   ]
  },
  {
   "code": "B119",
   "id": "lorem-ipsum-in-production",
   "name": "Lorem Ipsum In Production",
   "category": "Data",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "automated",
   "url": "https://sloppatterns.com/#lorem-ipsum-in-production",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The live site still says 'Your text here', the tab title is 'Vite + React + TS', and the testimonial is from 'John Doe, Acme Corp'.",
   "fix": "Treat placeholder text as a build error: grep for filler patterns in CI, require real copy before publish, and remove testimonial sections that have no real testimonials (Nielsen #8 Aesthetic and Minimalist Design).",
   "sources": [
    {
     "t": "vibe2prod: Production-readiness auditor for AI-generated websites",
     "u": "https://github.com/holger1411/vibe2prod"
    },
    {
     "t": "Vibe Coded Detector (Chrome Web Store)",
     "u": "https://chromewebstore.google.com/detail/vibe-coded-detector/jdbfebjankajbnjiboakfkpchlllfoak"
    }
   ]
  },
  {
   "code": "B120",
   "id": "every-feature-you-mentioned",
   "name": "Every Feature You Mentioned",
   "category": "Information-architecture",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#every-feature-you-mentioned",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The nav has eleven items because the prompt had eleven nouns, and all of them are equally shallow.",
   "fix": "Ship one complete workflow and hide the rest; primary navigation should have 5-7 items ordered by frequency of use (Nielsen #8 Aesthetic and Minimalist Design; #6 Recognition).",
   "sources": [
    {
     "t": "Vibe-Coding is Resurrecting the Feature Factory (Spark Engine)",
     "u": "https://sparkengine.substack.com/p/vibe-coding-is-resurrecting-the-feature"
    },
    {
     "t": "'Vibe coding' is accelerating the erosion of design authority (UX Collective)",
     "u": "https://uxdesign.cc/vibe-coding-is-accelerating-the-erosion-of-design-authority-4dc21b233606"
    }
   ]
  },
  {
   "code": "B121",
   "id": "same-crud-every-object",
   "name": "Same CRUD, Every Object",
   "category": "Information-architecture",
   "track": "behavioral",
   "harm": "Productivity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#same-crud-every-object",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Invoices, users, and comments all get the identical table, the identical modal form, and the identical three-dot menu.",
   "fix": "Design each object around its lifecycle and primary verb; expose the two or three actions that matter as first-class controls and drop generic edit-everything forms (Nielsen #2 Match between system and real world).",
   "sources": [
    {
     "t": "'Vibe coding' is accelerating the erosion of design authority (UX Collective)",
     "u": "https://uxdesign.cc/vibe-coding-is-accelerating-the-erosion-of-design-authority-4dc21b233606"
    },
    {
     "t": "10 Usability Heuristics for User Interface Design (NN/g)",
     "u": "https://www.nngroup.com/articles/ten-usability-heuristics/"
    }
   ]
  },
  {
   "code": "B122",
   "id": "all-buttons-are-primary",
   "name": "All Buttons Are Primary",
   "category": "Information-architecture",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "automated",
   "url": "https://sloppatterns.com/#all-buttons-are-primary",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Save, Cancel, Export, Delete, and Learn More are all the same filled indigo button, side by side.",
   "fix": "One primary action per view, secondary actions outlined or ghosted, destructive actions styled and positioned distinctly, tertiary actions as links (Material and Apple HIG button emphasis guidance; Nielsen #5 Error Prevention).",
   "sources": [
    {
     "t": "Ten reasons your vibe-coded dashboard looks terrible",
     "u": "https://kucharski.substack.com/p/ten-reasons-your-vibe-coded-dashboard"
    },
    {
     "t": "10 Usability Heuristics for User Interface Design (NN/g)",
     "u": "https://www.nngroup.com/articles/ten-usability-heuristics/"
    }
   ]
  },
  {
   "code": "B123",
   "id": "coming-soon-navigation",
   "name": "Coming Soon Navigation",
   "category": "Navigation",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "automated",
   "url": "https://sloppatterns.com/#coming-soon-navigation",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Half the header links go to '#', a 404, or a page that says 'Coming soon'.",
   "fix": "Remove links to pages that do not exist, use real `<a href>` for navigation, and provide a custom 404 with a route home (Nielsen #4 Consistency and Standards; #3 User Control and Freedom).",
   "sources": [
    {
     "t": "vibe2prod: Production-readiness auditor for AI-generated websites",
     "u": "https://github.com/holger1411/vibe2prod"
    }
   ]
  },
  {
   "code": "B124",
   "id": "the-inert-button",
   "name": "The Inert Button",
   "category": "Feedback",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "automated",
   "url": "https://sloppatterns.com/#the-inert-button",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-09-23",
   "oneLiner": "The button renders, hovers, and clicks, and absolutely nothing happens.",
   "fix": "Do not ship controls that do nothing: remove them, disable them with a reason (tooltip or helper text), or finish them. Feedback within a reasonable time is Nielsen #1.",
   "sources": [
    {
     "t": "Vibe Coding Mistakes: 12 Ways AI-Generated Apps Break in Production",
     "u": "https://theaicareerlab.com/blog/vibe-coding-mistakes-production"
    }
   ]
  },
  {
   "code": "B125",
   "id": "sign-up-to-see-anything",
   "name": "Sign Up To See Anything",
   "category": "Onboarding",
   "track": "behavioral",
   "harm": "Money",
   "detection": "automated",
   "url": "https://sloppatterns.com/#sign-up-to-see-anything",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-10-06",
   "oneLiner": "The root route is a login form; there is no way to learn what the product does without creating an account.",
   "fix": "Show value before asking for commitment: a public overview, a demo state, or read-only access; gate only what genuinely needs identity (NN/g login-wall research; Nielsen #3).",
   "sources": [
    {
     "t": "Login Walls Stop Users in Their Tracks (NN/g)",
     "u": "https://www.nngroup.com/articles/login-walls/"
    }
   ]
  },
  {
   "code": "B126",
   "id": "the-tour-that-explains-nothing",
   "name": "The Tour That Explains Nothing",
   "category": "Onboarding",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-tour-that-explains-nothing",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Three swipeable welcome cards say 'Welcome!', 'Powerful features', and 'Get started', then drop you on the same empty screen.",
   "fix": "Replace the tour with a first-task flow: seed example content, present one concrete action, and use contextual hints where needed (NN/g: instructional onboarding should not supplement poor design).",
   "sources": [
    {
     "t": "Mobile-App Onboarding: An Analysis of Components and Techniques (NN/g)",
     "u": "https://www.nngroup.com/articles/mobile-app-onboarding/"
    }
   ]
  },
  {
   "code": "B127",
   "id": "toggles-without-consequence",
   "name": "Toggles Without Consequence",
   "category": "Forms",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#toggles-without-consequence",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The settings page has fourteen switches, and flipping any of them changes nothing anywhere.",
   "fix": "Only expose a setting when there is a persisted field and a consumer; toggles must take immediate, visible effect or be replaced by a form with an explicit Save (NN/g toggle-switch guidelines; Nielsen #1).",
   "sources": [
    {
     "t": "Toggle-Switch Guidelines (NN/g)",
     "u": "https://www.nngroup.com/articles/toggle-switch-guidelines/"
    },
    {
     "t": "Vibe Coding Mistakes: 12 Ways AI-Generated Apps Break in Production",
     "u": "https://theaicareerlab.com/blog/vibe-coding-mistakes-production"
    }
   ]
  },
  {
   "code": "B128",
   "id": "search-that-s-just-filter",
   "name": "Search That's Just Filter",
   "category": "Navigation",
   "track": "behavioral",
   "harm": "Productivity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#search-that-s-just-filter",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The search box does a case-sensitive substring match on whatever is already loaded on the page.",
   "fix": "Search must query the full data set on the server, match across relevant fields case-insensitively, and show result counts and a no-results state (Nielsen #7 Flexibility and Efficiency; NN/g search guidance).",
   "sources": [
    {
     "t": "Filters vs. Facets: Definitions (NN/g)",
     "u": "https://www.nngroup.com/articles/filters-vs-facets/"
    },
    {
     "t": "VibeEval for Testing Vibe-Coding Apps with Lovable, Cursor, and Bolt",
     "u": "https://vibe-eval.com/updates/vibe-coding-apps/"
    }
   ]
  },
  {
   "code": "B129",
   "id": "filters-that-won-t-combine",
   "name": "Filters That Won't Combine",
   "category": "Navigation",
   "track": "behavioral",
   "harm": "Productivity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#filters-that-won-t-combine",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Choosing a status resets the date range; choosing a date range resets the status.",
   "fix": "Model filters as one query object applied together (AND across facets), reflect it in the URL, show active filters as removable chips with a result count (NN/g faceted-navigation guidance).",
   "sources": [
    {
     "t": "VibeEval for Testing Vibe-Coding Apps with Lovable, Cursor, and Bolt",
     "u": "https://vibe-eval.com/updates/vibe-coding-apps/"
    },
    {
     "t": "Filters vs. Facets: Definitions (NN/g)",
     "u": "https://www.nngroup.com/articles/filters-vs-facets/"
    }
   ]
  },
  {
   "code": "B130",
   "id": "login-with-no-way-back",
   "name": "Login With No Way Back",
   "category": "Security",
   "track": "behavioral",
   "harm": "Safety",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#login-with-no-way-back",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "There is a Forgot Password link, and it either goes nowhere or issues a reset token you could guess.",
   "fix": "Use a managed auth provider's full flow: email verification, cryptographically random reset tokens expiring within an hour, rate limiting, neutral 'if an account exists' messaging, and session expiry (Nielsen #3 User Control and Freedom; OWASP ASVS V2).",
   "sources": [
    {
     "t": "Is Your Vibe-Coded Login Page Actually Secure? (Sherlock Forensics)",
     "u": "https://www.sherlockforensics.com/blog/is-your-vibe-coded-login-page-actually-secure.html"
    },
    {
     "t": "Authentication Checklist for AI-Built Apps (Vibe Check)",
     "u": "https://vibe-check.cloud/features/auth"
    }
   ]
  },
  {
   "code": "B131",
   "id": "password-theatre",
   "name": "Password Theatre",
   "category": "Security",
   "track": "behavioral",
   "harm": "Safety",
   "detection": "automated",
   "url": "https://sloppatterns.com/#password-theatre",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The signup form demands an uppercase, a number, and a symbol, then stores the password in plain text.",
   "fix": "Drop composition rules in favour of length and breach-list checks (NIST SP 800-63B), never ship a 2FA control that does not enforce, and move all credential handling server-side with hashing and lockout.",
   "sources": [
    {
     "t": "Is Your Vibe-Coded Login Page Actually Secure? (Sherlock Forensics)",
     "u": "https://www.sherlockforensics.com/blog/is-your-vibe-coded-login-page-actually-secure.html"
    },
    {
     "t": "NIST SP 800-63B Digital Identity Guidelines: Authentication",
     "u": "https://pages.nist.gov/800-63-3/sp800-63b.html"
    }
   ]
  },
  {
   "code": "B132",
   "id": "front-end-only-gate",
   "name": "Front-End-Only Gate",
   "category": "Security",
   "track": "behavioral",
   "harm": "Privacy",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#front-end-only-gate",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Admin pages are 'protected' by hiding the menu item; the route and the API behind it answer anyone.",
   "fix": "Enforce authorisation on the server for every route and endpoint, deny by default, and test each protected action unauthenticated and as a low-privilege user (OWASP A01 Broken Access Control).",
   "sources": [
    {
     "t": "AI-built app on Lovable exposed 18K users, researcher claims (The Register)",
     "u": "https://www.theregister.com/2026/02/27/lovable_app_vulnerabilities/"
    },
    {
     "t": "What 2,000 Exposed Vibe-Coded Apps Reveal About the Limits of Most Security Stacks (The Hacker News)",
     "u": "https://thehackernews.com/2026/05/what-2000-exposed-vibe-coded-apps.html"
    },
    {
     "t": "Authentication Checklist for AI-Built Apps (Vibe Check)",
     "u": "https://vibe-check.cloud/features/auth"
    }
   ]
  },
  {
   "code": "B133",
   "id": "banner-without-consent",
   "name": "Banner Without Consent",
   "category": "Security",
   "track": "behavioral",
   "harm": "Privacy",
   "detection": "automated",
   "url": "https://sloppatterns.com/#banner-without-consent",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The cookie banner has Accept and Decline buttons, and analytics loaded before either was clicked.",
   "fix": "Either remove non-essential trackers entirely or use a consent-management platform that blocks scripts until opt-in, logs consent, and links to a real policy (GDPR/ePrivacy; Nielsen #4 Consistency and Standards).",
   "sources": [
    {
     "t": "AI App Builders and GDPR Cookie Banners: 2026 Audit (Kukie.io)",
     "u": "https://kukie.io/blog/ai-app-builders-gdpr-cookie-banners-audit"
    }
   ]
  },
  {
   "code": "B134",
   "id": "the-megabyte-bundle",
   "name": "The Megabyte Bundle",
   "category": "Performance",
   "track": "behavioral",
   "harm": "Productivity",
   "detection": "automated",
   "url": "https://sloppatterns.com/#the-megabyte-bundle",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A to-do list ships 4MB of JavaScript because it imports all of lodash, all of an icon set, and moment with every locale.",
   "fix": "Set a budget (under 300KB compressed JS), tree-shake by importing named modules, code-split by route, and audit dependencies in CI (Lighthouse performance budgets; Nielsen #1 response-time limits).",
   "sources": [
    {
     "t": "Page Weight Budget: Why Your Vibe-Coded App Takes 8 Seconds to Load (VibeDoctor)",
     "u": "https://vibedoctor.io/blog/page-weight-budget-slow-ai-generated-apps"
    },
    {
     "t": "Why Is My Vibe-Coded App So Slow on Mobile? (AppInstitute)",
     "u": "https://appinstitute.com/why-is-my-vibe-coded-app-so-slow-on-mobile/"
    }
   ]
  },
  {
   "code": "B135",
   "id": "unsized-images-shifting-layout",
   "name": "Unsized Images, Shifting Layout",
   "category": "Performance",
   "track": "behavioral",
   "harm": "Accessibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#unsized-images-shifting-layout",
   "version": "1.1",
   "added": "2026-09-17",
   "updated": "2026-09-23",
   "oneLiner": "The hero is a 4,000px PNG with no width or height, so the page jumps as it lands and the button you were about to tap moves.",
   "fix": "Always set width/height or aspect-ratio, serve responsive srcset in WebP/AVIF, reserve space for late content, and use font-display swap with size-adjust (web.dev CLS under 0.1; WCAG 2.5.8 target stability by extension).",
   "sources": [
    {
     "t": "Why Is My Vibe-Coded App So Slow on Mobile? (AppInstitute)",
     "u": "https://appinstitute.com/why-is-my-vibe-coded-app-so-slow-on-mobile/"
    },
    {
     "t": "Cumulative Layout Shift (web.dev)",
     "u": "https://web.dev/articles/cls"
    },
    {
     "t": "vibe2prod: Production-readiness auditor for AI-generated websites",
     "u": "https://github.com/holger1411/vibe2prod"
    }
   ]
  },
  {
   "code": "B136",
   "id": "fetch-everything-ever",
   "name": "Fetch Everything, Ever",
   "category": "Data",
   "track": "behavioral",
   "harm": "Productivity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#fetch-everything-ever",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The bookings screen downloads every booking in the database and paginates in the browser.",
   "fix": "Paginate and filter on the server, request only the fields the view needs, add indexes on filtered columns, and batch related lookups (Nielsen #1: response within 1s for direct manipulation).",
   "sources": [
    {
     "t": "Why Is My Vibe-Coded App So Slow on Mobile? (AppInstitute)",
     "u": "https://appinstitute.com/why-is-my-vibe-coded-app-so-slow-on-mobile/"
    },
    {
     "t": "15 Vibe Coding Mistakes That Cost Real Money (Serenities AI)",
     "u": "https://serenitiesai.com/articles/vibe-coding-mistakes-fails-2026"
    }
   ]
  },
  {
   "code": "B137",
   "id": "console-confetti",
   "name": "Console Confetti",
   "category": "Performance",
   "track": "behavioral",
   "harm": "Safety",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#console-confetti",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Open DevTools and the console is red: hydration mismatches, missing keys, failed fetches, and a leaked API key in a debug log.",
   "fix": "Treat console errors as build failures in CI, strip console.* in production builds, fix hydration and key warnings at the source, and audit logs for secrets (Nielsen #5 Error Prevention).",
   "sources": [
    {
     "t": "vibe2prod: Production-readiness auditor for AI-generated websites",
     "u": "https://github.com/holger1411/vibe2prod"
    },
    {
     "t": "Vibe Coding Problems: Why Your App Breaks in Production (Modall)",
     "u": "https://modall.ca/blog/vibe-coded-app-breaks-production"
    }
   ]
  },
  {
   "code": "B138",
   "id": "chat-box-bolted-on",
   "name": "Chat Box Bolted On",
   "category": "Information-architecture",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#chat-box-bolted-on",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The 'AI feature' is a floating sparkle button that opens a blank text box saying 'Ask me anything'.",
   "fix": "Signal capabilities with specific starter prompts, make the assistant context-aware of the current page and data, keep it persistent across routes, or replace it with in-flow assistance (NN/g AI chatbot guidelines; Nielsen #6 Recognition rather than recall).",
   "sources": [
    {
     "t": "10 Guidelines for Designing Your Site's AI Chatbots (NN/g)",
     "u": "https://www.nngroup.com/articles/ai-chatbots-design-guidelines/"
    }
   ]
  },
  {
   "code": "B139",
   "id": "silent-mutation",
   "name": "Silent Mutation",
   "category": "Feedback",
   "track": "behavioral",
   "harm": "Money",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#silent-mutation",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Changing a dropdown on the billing page switches your plan immediately, with no confirmation and no receipt.",
   "fix": "Separate exploring from committing for consequential changes: explicit Save or a confirmation for money and permission changes, an undo for everything else, and a visible activity record (Nielsen #3 User Control and Freedom, #5 Error Prevention).",
   "sources": [
    {
     "t": "Vibe Coding Mistakes: 12 Ways AI-Generated Apps Break in Production",
     "u": "https://theaicareerlab.com/blog/vibe-coding-mistakes-production"
    },
    {
     "t": "10 Usability Heuristics for User Interface Design (NN/g)",
     "u": "https://www.nngroup.com/articles/ten-usability-heuristics/"
    }
   ]
  },
  {
   "code": "B140",
   "id": "regression-on-every-prompt",
   "name": "Regression On Every Prompt",
   "category": "States",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#regression-on-every-prompt",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Ask for a green theme and the focus rings, aria-labels, and validation you fixed last week are gone again.",
   "fix": "Lock fixed behaviours in with automated tests (axe, Playwright flows) run on every generated change, review diffs before deploying, and constrain prompts to the component in scope (Nielsen #4 Consistency and Standards).",
   "sources": [
    {
     "t": "I Vibe-Coded a Pricing Page. Fixed It. Then Watched It Break Again.",
     "u": "https://medium.com/design-bootcamp/i-vibe-coded-a-pricing-page-fixed-it-then-watched-it-break-again-a4edc9a7c1f0"
    },
    {
     "t": "VibeEval for Testing Vibe-Coding Apps with Lovable, Cursor, and Bolt",
     "u": "https://vibe-eval.com/updates/vibe-coding-apps/"
    },
    {
     "t": "10 Things I Wish I Knew Before Vibe Coding (SaaStr)",
     "u": "https://www.saastr.com/10-things-i-wish-i-knew-before-vibe-coding-the-real-talk"
    }
   ]
  },
  {
   "code": "B141",
   "id": "notifications-with-no-off-switch",
   "name": "Notifications With No Off Switch",
   "category": "Feedback",
   "track": "behavioral",
   "harm": "Productivity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#notifications-with-no-off-switch",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The app emails, pushes, and bells you about everything, and the only preference is a toggle that does nothing.",
   "fix": "Provide per-channel, per-type preferences that actually gate sends, batch low-priority events into digests, mark-as-read semantics for the in-app feed, and one-click unsubscribe in every email (Nielsen #3 User Control and Freedom; RFC 8058 List-Unsubscribe).",
   "sources": [
    {
     "t": "Toggle-Switch Guidelines (NN/g)",
     "u": "https://www.nngroup.com/articles/toggle-switch-guidelines/"
    },
    {
     "t": "10 Usability Heuristics for User Interface Design (NN/g)",
     "u": "https://www.nngroup.com/articles/ten-usability-heuristics/"
    }
   ]
  },
  {
   "code": "B142",
   "id": "notification-summary-inversion",
   "name": "Notification Summary Inversion",
   "category": "Mobile",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#notification-summary-inversion",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The OS collapses notifications into an AI sentence that reverses, merges or invents the meaning of the underlying messages.",
   "fix": "Summarise each source separately, preserve app and sender labels, link claims to source notifications, show original previews alongside summaries, and disable summaries for high-stakes categories by default.",
   "sources": [
    {
     "t": "BBC reporting on Apple’s inaccurate AI notification summaries and subsequent suspension of news summaries",
     "u": "https://www.bbc.co.uk/news/articles/cq5ggew08eyo"
    },
    {
     "t": "BBC reporting on Apple’s inaccurate AI notification summaries and subsequent suspension of news summaries",
     "u": "https://www.bbc.com/news/articles/cge93de21n0o"
    }
   ]
  },
  {
   "code": "B143",
   "id": "reason-code-salad",
   "name": "Reason Code Salad",
   "category": "Lending",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#reason-code-salad",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "An automated credit decline supplies generic or inaccurate reason codes instead of the factors that actually drove the decision.",
   "fix": "Give specific principal reasons grounded in the actual decision, name the relevant data values and sources, and provide a direct dispute route. Validate explanations against model behaviour rather than assuming SHAP or another post-hoc method is faithful.",
   "sources": [
    {
     "t": "CFPB Circular 2022-03 on adverse-action notices for decisions using complex algorithms",
     "u": "https://www.consumerfinance.gov/compliance/circulars/circular-2022-03-adverse-action-notification-requirements-in-connection-with-credit-decisions-based-on-complex-algorithms/"
    }
   ]
  },
  {
   "code": "B144",
   "id": "wake-word-roulette",
   "name": "Wake Word Roulette",
   "category": "Voice",
   "track": "behavioral",
   "harm": "Privacy",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#wake-word-roulette",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A voice assistant activates on speech that did not contain its wake phrase, while giving users no adequate record or control over false activations.",
   "fix": "Perform wake detection locally, expose complete activation history, provide sensitivity controls and require confirmation before consequential actions following low-confidence activation.",
   "sources": [
    {
     "t": "Schönherr et al., research on accidental smart-assistant triggers",
     "u": "https://arxiv.org/abs/2008.00508"
    }
   ]
  },
  {
   "code": "B145",
   "id": "the-accent-tax",
   "name": "The Accent Tax",
   "category": "Voice",
   "track": "behavioral",
   "harm": "Accessibility",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-accent-tax",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "The same spoken task fails substantially more often for particular accents or dialects.",
   "fix": "Publish disaggregated word-error and task-completion rates, train on representative speech, support correction without restarting and provide an equivalent non-voice route.",
   "sources": [
    {
     "t": "PNAS, “Racial disparities in automated speech recognition",
     "u": "https://www.pnas.org/doi/10.1073/pnas.1915768117"
    }
   ]
  },
  {
   "code": "B146",
   "id": "detector-as-verdict",
   "name": "Detector as Verdict",
   "category": "Education",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#detector-as-verdict",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "An AI-writing detector score is presented or used as proof that a student cheated.",
   "fix": "Never use a detector score as sole evidence; remove categorical guilt labels, require independent review, and provide a documented appeal route.",
   "sources": [
    {
     "t": "Vanderbilt University, “Guidance on AI Detection and Why We’re Disabling Turnitin’s AI Detector",
     "u": "https://www.vanderbilt.edu/brightspace/2023/08/16/guidance-on-ai-detection-and-why-were-disabling-turnitins-ai-detector/"
    }
   ]
  },
  {
   "code": "B147",
   "id": "draft-becomes-record",
   "name": "Draft Becomes Record",
   "category": "Enterprise",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#draft-becomes-record",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "AI-generated CRM, HR or support fields are saved into the system of record before a person accepts them.",
   "fix": "Keep generated values visibly provisional, require field-level acceptance for consequential data, and log source, model version and reviewer.",
   "sources": []
  },
  {
   "code": "B148",
   "id": "selection-spill",
   "name": "Selection Spill",
   "category": "Creative",
   "track": "behavioral",
   "harm": "Autonomy",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#selection-spill",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A generative edit changes content outside the region the user selected.",
   "fix": "Lock unselected content by default, reveal the actual generation boundary, show a changed-area heat map, and separately approve out-of-selection changes.",
   "sources": []
  },
  {
   "code": "B149",
   "id": "browser-agent-consent-bypass",
   "name": "Browser Agent Consent Bypass",
   "category": "Agents",
   "track": "behavioral",
   "harm": "Consent",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#browser-agent-consent-bypass",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A computer-use agent accepts cookies, notifications or permissions to keep moving without surfacing the choice to the user.",
   "fix": "Default to rejection of optional tracking, pause on security warnings, and require explicit user approval for permissions. Show every consent decision in the final report.",
   "sources": []
  },
  {
   "code": "B150",
   "id": "the-review-that-writes-itself",
   "name": "The Review That Writes Itself",
   "category": "Retail",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-review-that-writes-itself",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "An AI review summary states the opposite of the sentiment in the reviews supporting it.",
   "fix": "Show mention counts and sentiment distribution for each theme, link every claim to representative reviews, and include negative evidence whenever it exists.",
   "sources": []
  },
  {
   "code": "B151",
   "id": "the-silent-redirect",
   "name": "The Silent Redirect",
   "category": "Search",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-silent-redirect",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A browsing agent attributes information to an authoritative organization after actually visiting an ad, affiliate redirect or lookalike domain.",
   "fix": "Display the final hostname and redirect chain for every cited page, and block authoritative attribution when domain ownership does not match the named entity.",
   "sources": []
  },
  {
   "code": "B152",
   "id": "the-review-bot-that-blocks-the-merge",
   "name": "The Review Bot That Blocks the Merge",
   "category": "Developer",
   "track": "behavioral",
   "harm": "Productivity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-review-bot-that-blocks-the-merge",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "An AI reviewer floods pull requests with low-value comments until developers ignore its real findings too.",
   "fix": "Report only high-severity findings by default, consolidate minor suggestions, cap comments per review and clearly rank findings by verified impact.",
   "sources": []
  },
  {
   "code": "B153",
   "id": "misgrounded-citations-pane",
   "name": "Misgrounded Citations Pane",
   "category": "Search",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#misgrounded-citations-pane",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "An AI answer displays citations that do not support the claims beside them.",
   "fix": "Require every material claim to map to an exact supporting passage. Mark or suppress claims that cannot be grounded, and expose those passages directly.",
   "sources": [
    {
     "t": "AI Search Has a Citation Problem — Tow Center, Columbia Journalism Review",
     "u": "https://www.cjr.org/tow_center/we-compared-eight-ai-search-engines-theyre-all-bad-at-citing-news.php"
    },
    {
     "t": "AI search engines fail to produce accurate citations in over 60% of tests — Nieman Lab",
     "u": "https://www.niemanlab.org/2025/03/ai-search-engines-fail-to-produce-accurate-citations-in-over-60-of-tests-according-to-new-tow-center-study/"
    }
   ]
  },
  {
   "code": "B154",
   "id": "doomscroll-amplifier",
   "name": "Doomscroll Amplifier",
   "category": "Social",
   "track": "behavioral",
   "harm": "Wellbeing",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#doomscroll-amplifier",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A recommender interprets engagement with distress-related material as demand for progressively more intense harmful content.",
   "fix": "Add saturation limits, cooling-off periods and severity-aware diversification. Provide prominent controls to block the topic and reset inferred interests.",
   "sources": [
    {
     "t": "Driven into Darkness: How TikTok's 'For You' Feed Encourages Self-Harm and Suicidal Ideation — Amnesty International",
     "u": "https://www.amnesty.org/en/documents/pol40/7350/2023/en/"
    }
   ]
  },
  {
   "code": "B155",
   "id": "the-uninvited-notetaker",
   "name": "The Uninvited Notetaker",
   "category": "Meetings",
   "track": "behavioral",
   "harm": "Consent",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-uninvited-notetaker",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A meeting bot joins or records because one attendee connected a calendar, without obtaining a meaningful choice from everyone present.",
   "fix": "Require per-meeting activation, disclose recipient and retention terms before capture, and let any participant pause or refuse recording.",
   "sources": [
    {
     "t": "Class-action suit claims Otter AI secretly records private work conversations — NPR",
     "u": "https://www.npr.org/2025/08/15/g-s1-83087/otter-ai-transcription-class-action-lawsuit"
    },
    {
     "t": "AI Notetaking Tools Under Fire: Lessons from the Otter.ai Class Action — National Law Review",
     "u": "https://natlawreview.com/article/ai-notetaking-tools-under-fire-lessons-otterai-class-action-complaint"
    }
   ]
  },
  {
   "code": "B156",
   "id": "batch-denial-stamp",
   "name": "Batch Denial Stamp",
   "category": "Insurance",
   "track": "behavioral",
   "harm": "Money",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#batch-denial-stamp",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A system recommends large batches of claim denials that a nominal reviewer approves without opening the underlying patient records.",
   "fix": "Require case-level record access, expose the evidence used, prohibit bulk approval of adverse decisions, and audit review time and reversal rates.",
   "sources": [
    {
     "t": "UnitedHealth uses faulty AI to deny elderly patients medically necessary coverage, lawsuit claims — CBS News",
     "u": "https://www.cbsnews.com/news/unitedhealth-lawsuit-ai-deny-claims-medicare-advantage-health-insurance-denials/"
    },
    {
     "t": "Federal Court Orders Broad Discovery Against UHC in AI Coverage Denial Lawsuit — ArentFox Schiff",
     "u": "https://www.afslaw.com/perspectives/alerts/federal-court-orders-broad-discovery-against-uhc-ai-coverage-denial-lawsuit"
    }
   ]
  },
  {
   "code": "B157",
   "id": "emotion-interview-oracle",
   "name": "Emotion Interview Oracle",
   "category": "Hiring",
   "track": "behavioral",
   "harm": "Accessibility",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#emotion-interview-oracle",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A video interview tool converts facial movement, gaze or vocal delivery into an emotion, personality or employability score.",
   "fix": "Do not infer emotion or personality from face or voice; assess job-relevant content with validated criteria and offer an accessible human alternative.",
   "sources": [
    {
     "t": "HireVue, Facing FTC Complaint From EPIC, Halts Use of Facial Recognition — EPIC",
     "u": "https://epic.org/hirevue-facing-ftc-complaint-from-epic-halts-use-of-facial-recognition/"
    },
    {
     "t": "In re HireVue — EPIC",
     "u": "https://epic.org/documents/in-re-hirevue/"
    }
   ]
  },
  {
   "code": "B158",
   "id": "the-screen-bound-voice-flow",
   "name": "The Screen-Bound Voice Flow",
   "category": "Automotive",
   "track": "behavioral",
   "harm": "Safety",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-screen-bound-voice-flow",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A hands-free assistant answers a spoken request by asking the driver to look at the screen.",
   "fix": "Every branch a voice flow can reach needs a spoken route: read back the interpretation, offer numbered choices aloud, accept spoken confirm and cancel, and defer anything that genuinely needs the screen until the vehicle is stopped.",
   "sources": []
  },
  {
   "code": "B159",
   "id": "camera-invents-the-moment",
   "name": "Camera Invents the Moment",
   "category": "Mobile",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#camera-invents-the-moment",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A stock camera generatively alters scene detail or combines moments, but saves the result as an ordinary photograph without a synthesis indicator.",
   "fix": "Preserve the unmodified captures, visibly label composites in the gallery and write durable content credentials whenever a generative or cross-frame operation occurs.",
   "sources": []
  },
  {
   "code": "B160",
   "id": "scribe-drift",
   "name": "Scribe Drift",
   "category": "Healthcare",
   "track": "behavioral",
   "harm": "Safety",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#scribe-drift",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "An ambient clinical scribe puts unsupported symptoms, findings or medications into a note presented for the clinician’s signature.",
   "fix": "Link every sentence to supporting transcript spans, visibly mark unsupported statements, retain the transcript, and never pre-fill unspoken negative findings or examination elements.",
   "sources": [
    {
     "t": "Researchers say an AI-powered transcription tool used in hospitals invents things no one ever said. Garance Burke and Hilke Schellmann, Associated Press",
     "u": "https://www.columbian.com/news/2024/oct/28/researchers-say-an-ai-powered-transcription-tool-used-in-hospitals-invents-things-no-one-ever-said/"
    },
    {
     "t": "OpenAI's Whisper transcription tool has hallucination issues, researchers say. TechCrunch",
     "u": "https://techcrunch.com/2024/10/26/openais-whisper-transcription-tool-has-hallucination-issues-researchers-say"
    }
   ]
  },
  {
   "code": "B161",
   "id": "auto-rejected-by-rubric",
   "name": "Auto-Rejected By Rubric",
   "category": "Hiring",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#auto-rejected-by-rubric",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "An automated hiring score filters out an applicant before human review, while the rejection message implies that a person considered the application.",
   "fix": "Disclose automated screening, identify what was evaluated, require human review before adverse decisions, publish required audits and provide a reconsideration channel.",
   "sources": []
  },
  {
   "code": "B162",
   "id": "the-live-transcript-that-edits-you",
   "name": "The Live Transcript That Edits You",
   "category": "Accessibility",
   "track": "behavioral",
   "harm": "Accessibility",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-live-transcript-that-edits-you",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "Real-time captions normalize or “clean up” speech in a way that changes its meaning.",
   "fix": "Optimize the primary caption track for verbatim fidelity. Keep any readability-edited version separate and visibly labeled, and preserve audio-linked corrections.",
   "sources": []
  },
  {
   "code": "B163",
   "id": "phantom-action-items",
   "name": "Phantom Action Items",
   "category": "Meetings",
   "track": "behavioral",
   "harm": "Autonomy",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#phantom-action-items",
   "version": "1.0",
   "added": "2026-09-17",
   "updated": "2026-09-17",
   "oneLiner": "A meeting summarizer assigns a task, owner or deadline that nobody agreed to.",
   "fix": "Link every field to transcript evidence, preserve tentative language, and require the named owner to accept an item before export.",
   "sources": []
  },
  {
   "code": "A73",
   "id": "the-lucide-house-style",
   "name": "The Lucide House Style",
   "category": "Iconography",
   "track": "surface",
   "harm": "Credibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#the-lucide-house-style",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "Every icon on the page is an untouched Lucide glyph, usually Zap, Shield, Sparkles, Check and ArrowRight.",
   "fix": "Choose an icon set on purpose (Phosphor, Iconoir, a custom set, or none) and set its weight, corner style and size to match the type. Ask whether each feature needs an icon at all; many read better as a product screenshot or a plain heading. Never use the literal-noun mapping (Zap for fast).",
   "sources": [
    {
     "t": "Tomilola on X: 3 ways to make your website look less vibe coded",
     "u": "https://x.com/tomilola_ng/status/2080615247686017170"
    },
    {
     "t": "shadcn on X: new-york style now uses Lucide as the default icon set",
     "u": "https://x.com/shadcn/status/1853902179041702169"
    },
    {
     "t": "AI Slop in 2026: The State of the AI-Generated Web",
     "u": "https://www.sailop.com/blog/ai-slop-2026-state-of-the-ai-generated-web"
    },
    {
     "t": "avoid-ai-design: audits AI-generated frontend (GitHub README)",
     "u": "https://github.com/funboy322/avoid-ai-design"
    },
    {
     "t": "How to Tell if a Website Is Vibe Coded (7 Signs)",
     "u": "https://www.vibe0.com.au/blog/how-to-tell-if-a-website-is-vibe-coded"
    },
    {
     "t": "Is That Vibe Coded? detector signals",
     "u": "https://isthatvibecoded.com/"
    }
   ]
  },
  {
   "code": "A74",
   "id": "the-untouched-component-theme",
   "name": "The Untouched Component Theme",
   "category": "Colour",
   "track": "surface",
   "harm": "Credibility",
   "detection": "automated",
   "url": "https://sloppatterns.com/#the-untouched-component-theme",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "The shadcn/Tailwind starter palette shipped as the brand: zinc greys, a near-black primary button, and nothing else.",
   "fix": "Replace the generated CSS variables with a real palette before building screens: one brand primary, a tinted neutral ramp derived from it, and semantic colours tuned to it. Ban raw Tailwind named colours in components so everything flows through tokens.",
   "sources": [
    {
     "t": "Tomilola on X: 3 ways to make your website look less vibe coded",
     "u": "https://x.com/tomilola_ng/status/2080615247686017170"
    },
    {
     "t": "avoid-ai-design: audits AI-generated frontend (GitHub README)",
     "u": "https://github.com/funboy322/avoid-ai-design"
    },
    {
     "t": "AI Slop in 2026: The State of the AI-Generated Web",
     "u": "https://www.sailop.com/blog/ai-slop-2026-state-of-the-ai-generated-web"
    },
    {
     "t": "How to fix the 'AI-generated' look in your frontend",
     "u": "https://dev.to/alanwest/how-to-fix-the-ai-generated-look-in-your-frontend-1ahh"
    }
   ]
  },
  {
   "code": "A75",
   "id": "one-radius-for-everything",
   "name": "One Radius For Everything",
   "category": "Components",
   "track": "surface",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#one-radius-for-everything",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "Cards, buttons, inputs, images and badges all share the same big rounded-2xl corner and soft shadow.",
   "fix": "Define a radius scale tied to size and nesting (small controls 4-6px, cards 8-12px, inner radius = outer minus padding) and use square or near-square corners somewhere on purpose. Reserve shadows for things that actually float (menus, dialogs).",
   "sources": [
    {
     "t": "AI Slop Web Design: Complete Guide to Spotting and Fixing Generic Websites",
     "u": "https://www.925studios.co/blog/ai-slop-web-design-guide"
    },
    {
     "t": "How to fix the 'AI-generated' look in your frontend",
     "u": "https://dev.to/alanwest/how-to-fix-the-ai-generated-look-in-your-frontend-1ahh"
    },
    {
     "t": "AI Slop in 2026: The State of the AI-Generated Web",
     "u": "https://www.sailop.com/blog/ai-slop-2026-state-of-the-ai-generated-web"
    },
    {
     "t": "avoid-ai-design: AI design tells catalog",
     "u": "https://github.com/funboy322/avoid-ai-design/blob/main/references/ai-tells-catalog.md"
    },
    {
     "t": "frontend-design skill (anthropics/skills)",
     "u": "https://github.com/anthropics/skills/tree/main/skills/frontend-design"
    },
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    },
    {
     "t": "vibecoded-design-tells: Reddit-mined ranking of the visual tells of AI-built sites",
     "u": "https://github.com/JCarterJohnson/vibecoded-design-tells"
    }
   ]
  },
  {
   "code": "A76",
   "id": "arrow-on-every-button",
   "name": "Arrow On Every Button",
   "category": "Components",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#arrow-on-every-button",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "Every call to action ends in a right arrow that slides a few pixels on hover.",
   "fix": "Use an arrow only where the action navigates forward (next step, external link) and only on one level of the hierarchy. Let the label carry the meaning.",
   "sources": [
    {
     "t": "avoid-ai-design: audits AI-generated frontend (GitHub README)",
     "u": "https://github.com/funboy322/avoid-ai-design"
    },
    {
     "t": "avoid-ai-design: AI design tells catalog",
     "u": "https://github.com/funboy322/avoid-ai-design/blob/main/references/ai-tells-catalog.md"
    },
    {
     "t": "AI Slop in 2026: The State of the AI-Generated Web",
     "u": "https://www.sailop.com/blog/ai-slop-2026-state-of-the-ai-generated-web"
    }
   ]
  },
  {
   "code": "A77",
   "id": "decorative-01-02-03",
   "name": "Decorative 01 02 03",
   "category": "Typography",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#decorative-01-02-03",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "Zero-padded numbers stamped on sections, cards and list items whose order means nothing.",
   "fix": "Number things only when order matters (steps a user must follow, ranked items). Otherwise remove the numbers and let headings do the work.",
   "sources": [
    {
     "t": "AI slop: 8 signs a website was generated by AI (TeneX Studio)",
     "u": "https://tenex.studio/en/blog/ai-slop-ui-8-signes/"
    },
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    },
    {
     "t": "frontend-design skill (anthropics/skills)",
     "u": "https://github.com/anthropics/skills/tree/main/skills/frontend-design"
    },
    {
     "t": "Hacker News discussion: Scoring Show HN submissions for AI design patterns",
     "u": "https://news.ycombinator.com/item?id=47864393"
    }
   ]
  },
  {
   "code": "A78",
   "id": "cursor-on-a-page-you-cant-type-in",
   "name": "Cursor On A Page You Can't Type In",
   "category": "Motion",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated",
   "url": "https://sloppatterns.com/#cursor-on-a-page-you-cant-type-in",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "A blinking text cursor at the end of a static headline, pretending something is being typed.",
   "fix": "Remove the caret. If the product genuinely types or streams, show the real product doing it in a demo, not a decoration on the headline. Respect prefers-reduced-motion.",
   "sources": [
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A79",
   "id": "the-billboard-headline",
   "name": "The Billboard Headline",
   "category": "Typography",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated",
   "url": "https://sloppatterns.com/#the-billboard-headline",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "A long, ten-word headline set at 72px+ so it fills the whole first screen by itself.",
   "fix": "Size the headline to its length: short lines can go big, a sentence cannot. Cap the H1 at a measure (around 12-20ch for display sizes) and keep the primary action visible in the first viewport at 1280x720 and 390x844.",
   "sources": [
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    },
    {
     "t": "slop-detect: AI design slop fingerprint (rule 24, long headline at display size)",
     "u": "https://github.com/ravidsrk/slop-detect"
    },
    {
     "t": "Signs of AI design: a field guide to the visual tells of AI-generated design",
     "u": "https://github.com/febbhav/signs-of-ai-design"
    }
   ]
  },
  {
   "code": "A80",
   "id": "hand-coded-svg-filler",
   "name": "Hand-Coded SVG Filler",
   "category": "Imagery",
   "track": "surface",
   "harm": "Credibility",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#hand-coded-svg-filler",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "Illustrations the model drew itself in SVG: circles, rounded rectangles and a wobbly mascot that look unfinished.",
   "fix": "Use a real product screenshot, a commissioned or stock illustration, or nothing. If a diagram is needed, have the model describe nodes and edges and let a layout engine (or a designer) place them.",
   "sources": [
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    },
    {
     "t": "Signs of AI design: a field guide to the visual tells of AI-generated design",
     "u": "https://github.com/febbhav/signs-of-ai-design"
    },
    {
     "t": "Hallmark: anti-patterns reference",
     "u": "https://github.com/Nutlope/hallmark/blob/main/skills/hallmark/references/anti-patterns.md"
    }
   ]
  },
  {
   "code": "A81",
   "id": "the-dimmed-hero-photo",
   "name": "The Dimmed Hero Photo",
   "category": "Imagery",
   "track": "surface",
   "harm": "Credibility",
   "detection": "automated",
   "url": "https://sloppatterns.com/#the-dimmed-hero-photo",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "A stock photo behind the headline, darkened with a heavy black overlay until it is just texture.",
   "fix": "If the image matters, give it room: put text beside or below it, or choose a photo with natural empty space. If it does not matter, drop it and use a solid colour.",
   "sources": [
    {
     "t": "How to tell if a website was AI generated: 9 visible signs",
     "u": "https://uxskill.laithjunaidy.com/how-to-tell-if-a-website-was-ai-generated.html"
    }
   ]
  },
  {
   "code": "A82",
   "id": "the-memorised-stock-photo",
   "name": "The Memorised Stock Photo",
   "category": "Imagery",
   "track": "surface",
   "harm": "Credibility",
   "detection": "automated",
   "url": "https://sloppatterns.com/#the-memorised-stock-photo",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "Unsplash photos hotlinked by ID straight from the model's memory: a laptop with charts, a team round a table.",
   "fix": "Use your own product screenshots and photos. If stock is unavoidable, choose it by hand, download and host it, and check it depicts what the section says.",
   "sources": [
    {
     "t": "Fix placeholder images in Bolt-generated pages",
     "u": "https://tteg.kushalsm.com/fix/bolt"
    },
    {
     "t": "AI Slop Web Design: Complete Guide to Spotting and Fixing Generic Websites",
     "u": "https://www.925studios.co/blog/ai-slop-web-design-guide"
    },
    {
     "t": "How to Tell If a Website Was Vibe Coded: A Developer's Detection Guide",
     "u": "https://www.hustletoai.com/blog/programming-7/how-to-tell-if-a-website-is-vibe-coded-120"
    },
    {
     "t": "avoid-ai-design: AI design tells catalog",
     "u": "https://github.com/funboy322/avoid-ai-design/blob/main/references/ai-tells-catalog.md"
    }
   ]
  },
  {
   "code": "A83",
   "id": "centred-paragraphs",
   "name": "Centred Paragraphs",
   "category": "Typography",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated",
   "url": "https://sloppatterns.com/#centred-paragraphs",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "Not just the hero: every heading, paragraph and list down the page is centre-aligned.",
   "fix": "Left-align any text longer than two lines. Use a left-aligned grid with a clear starting edge and keep centring for short, single-line moments.",
   "sources": [
    {
     "t": "How to tell if a website was AI generated: 9 visible signs",
     "u": "https://uxskill.laithjunaidy.com/how-to-tell-if-a-website-was-ai-generated.html"
    },
    {
     "t": "How to fix an AI slop website (Rottoways)",
     "u": "https://rottoways.com/blog/fix-ai-slop-website"
    },
    {
     "t": "Hallmark: anti-patterns reference",
     "u": "https://github.com/Nutlope/hallmark/blob/main/skills/hallmark/references/anti-patterns.md"
    },
    {
     "t": "Why You Should Never Center Align Paragraph Text (UX Movement)",
     "u": "https://uxmovement.com/content/why-you-should-never-center-align-paragraph-text/"
    },
    {
     "t": "Avoid centered text (Pimp my Type)",
     "u": "https://pimpmytype.com/avoid-centered-text/"
    }
   ]
  },
  {
   "code": "A84",
   "id": "text-to-the-glass",
   "name": "Text To The Glass",
   "category": "Responsive",
   "track": "surface",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#text-to-the-glass",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "On a phone, paragraphs and buttons run right to the edge of the screen with no side margin.",
   "fix": "Put consistent side padding (16-24px) on the page container and on every full-bleed section's inner wrapper; check every section at 360-390px.",
   "sources": [
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A85",
   "id": "the-orphaned-heading",
   "name": "The Orphaned Heading",
   "category": "Spacing",
   "track": "surface",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-orphaned-heading",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "A section heading sits closer to the section above it than to the content it introduces.",
   "fix": "Space by relationship: the gap above a heading should be clearly larger (roughly 2x) than the gap between the heading and its content.",
   "sources": [
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    },
    {
     "t": "AI Prototyping in Real Design Contexts (NN/g)",
     "u": "https://www.nngroup.com/articles/ai-prototyping/"
    }
   ]
  },
  {
   "code": "A86",
   "id": "lopsided-opening-columns",
   "name": "Lopsided Opening Columns",
   "category": "Layout",
   "track": "surface",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#lopsided-opening-columns",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "A two-column hero where one side is a short headline and the other is a tall image, leaving a big empty hole.",
   "fix": "Balance the columns by content, align the shorter one to the centre or the bottom of the taller one, or switch to a stacked layout when one side is much taller.",
   "sources": [
    {
     "t": "The missing design vocabulary for agents (Impeccable slop catalog)",
     "u": "https://impeccable.style/slop/"
    }
   ]
  },
  {
   "code": "A87",
   "id": "half-dark-mode",
   "name": "Half-Dark Mode",
   "category": "Colour",
   "track": "surface",
   "harm": "Accessibility",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#half-dark-mode",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "Flip the theme and half the page follows; the other half stays white or stays dark.",
   "fix": "Ban raw colour utilities in components and route every surface and text colour through tokens; test every page in both modes, including modals, menus and empty states.",
   "sources": [
    {
     "t": "Checklist for Reviewing AI-Generated Tailwind UI (PasteCode)",
     "u": "https://pastecode.xyz/checklists/review-ai-generated-tailwind-ui"
    },
    {
     "t": "shadcn/ui: Theming",
     "u": "https://ui.shadcn.com/docs/theming"
    },
    {
     "t": "Theme toggle leaves the app dark in light mode (vibe-glossary #54)",
     "u": "https://github.com/planetoftheweb/vibe-glossary/issues/54"
    }
   ]
  },
  {
   "code": "A88",
   "id": "nameless-icon-buttons",
   "name": "Nameless Icon Buttons",
   "category": "Accessibility",
   "track": "surface",
   "harm": "Accessibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#nameless-icon-buttons",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "Icon-only buttons and links (menu, close, social, copy) with no text a screen reader can announce.",
   "fix": "Every icon-only control gets an accessible name (aria-label or sr-only text) describing the action, not the icon ('Open menu', not 'hamburger'). Lint for it in CI.",
   "sources": [
    {
     "t": "The WebAIM Million: 2026 report",
     "u": "https://webaim.org/projects/million/"
    },
    {
     "t": "AI-Generated UI Is Inaccessible by Default (Frontend Masters blog)",
     "u": "https://frontendmasters.com/blog/ai-generated-ui-is-inaccessible-by-default/"
    },
    {
     "t": "Checklist for Reviewing AI-Generated Tailwind UI (PasteCode)",
     "u": "https://pastecode.xyz/checklists/review-ai-generated-tailwind-ui"
    }
   ]
  },
  {
   "code": "A89",
   "id": "links-you-cant-see",
   "name": "Links You Can't See",
   "category": "Accessibility",
   "track": "surface",
   "harm": "Accessibility",
   "detection": "automated",
   "url": "https://sloppatterns.com/#links-you-cant-see",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "Links inside paragraphs look exactly like the surrounding text: no underline, same or near-same colour.",
   "fix": "Underline links in running text (with a sensible offset and thickness), or give them 3:1 contrast against the surrounding text plus a non-colour cue on hover and focus.",
   "sources": [
    {
     "t": "Revert to browser behaviour for underlined links (tailwindcss #18165)",
     "u": "https://github.com/tailwindlabs/tailwindcss/issues/18165"
    },
    {
     "t": "WCAG F73: links not visually evident without colour vision",
     "u": "https://www.w3.org/WAI/WCAG22/Techniques/failures/F73"
    },
    {
     "t": "vibecoded-design-tells: Reddit-mined ranking of the visual tells of AI-built sites",
     "u": "https://github.com/JCarterJohnson/vibecoded-design-tells"
    }
   ]
  },
  {
   "code": "A90",
   "id": "placeholder-as-label",
   "name": "Placeholder As Label",
   "category": "Forms",
   "track": "surface",
   "harm": "Accessibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#placeholder-as-label",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "Form fields with grey hint text inside and no label outside, so the label disappears as soon as you type.",
   "fix": "Give every input a visible <label> above it; keep placeholder for an example format only, at accessible contrast.",
   "sources": [
    {
     "t": "Placeholders in Form Fields Are Harmful (NN/g)",
     "u": "https://www.nngroup.com/articles/form-design-placeholders/"
    },
    {
     "t": "The WebAIM Million: 2026 report",
     "u": "https://webaim.org/projects/million/"
    }
   ]
  },
  {
   "code": "A91",
   "id": "inputs-with-no-edge",
   "name": "Inputs With No Edge",
   "category": "Forms",
   "track": "surface",
   "harm": "Accessibility",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#inputs-with-no-edge",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "Text fields whose border and fill are so close to the background that you can't see where to type.",
   "fix": "Give input boundaries at least 3:1 contrast against the adjacent surface (border or fill), and check inputs on every surface they appear on, in both themes.",
   "sources": [
    {
     "t": "WCAG 2.2 Understanding SC 1.4.11 Non-text Contrast",
     "u": "https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html"
    },
    {
     "t": "shadcn/ui: Theming",
     "u": "https://ui.shadcn.com/docs/theming"
    },
    {
     "t": "avoid-ai-design: AI design tells catalog",
     "u": "https://github.com/funboy322/avoid-ai-design/blob/main/references/ai-tells-catalog.md"
    }
   ]
  },
  {
   "code": "A92",
   "id": "the-floating-pill-navbar",
   "name": "The Floating Pill Navbar",
   "category": "Navigation",
   "track": "surface",
   "harm": "Clarity",
   "detection": "automated",
   "url": "https://sloppatterns.com/#the-floating-pill-navbar",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "A detached, rounded, frosted-glass nav bar hovering a few pixels below the top of the screen.",
   "fix": "Use a normal full-width header unless the floating form earns its place. If you keep it, add scroll-margin-top to anchor targets, drop the blur on low-end devices, and plan where links five and six go.",
   "sources": [
    {
     "t": "Floating Navbars: The Pill and Its Three Problems (21st.dev)",
     "u": "https://21st.dev/blog/react-floating-navbar-components"
    },
    {
     "t": "Floating rounded navbar block (shadcnblocks navbar6)",
     "u": "https://www.shadcnblocks.com/block/navbar6"
    },
    {
     "t": "avoid-ai-design: audits AI-generated frontend (GitHub README)",
     "u": "https://github.com/funboy322/avoid-ai-design"
    }
   ]
  },
  {
   "code": "A93",
   "id": "badge-confetti",
   "name": "Badge Confetti",
   "category": "Components",
   "track": "surface",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#badge-confetti",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "Little pills and tags on every card: 'New', 'Popular', 'AI', 'Beta', 'Pro', until none of them mean anything.",
   "fix": "Use a badge only for a state the user must notice (new, beta, sold out) and only on the items it applies to. If everything is tagged, tag nothing.",
   "sources": [
    {
     "t": "avoid-ai-design: AI design tells catalog",
     "u": "https://github.com/funboy322/avoid-ai-design/blob/main/references/ai-tells-catalog.md"
    },
    {
     "t": "How to Avoid Building Apps That Look Vibe Coded (VibeMole)",
     "u": "https://vibemole.com/resources/avoid-vibecoded-app-design"
    },
    {
     "t": "Hacker News discussion: Scoring Show HN submissions for AI design patterns",
     "u": "https://news.ycombinator.com/item?id=47864393"
    }
   ]
  },
  {
   "code": "B164",
   "id": "title-case-every-heading",
   "name": "Title Case Every Heading",
   "category": "Copy",
   "track": "behavioral",
   "harm": "Credibility",
   "detection": "automated",
   "url": "https://sloppatterns.com/#title-case-every-heading",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "Every heading, card title and button capitalises Every Word, Like A Blog Title From 2012.",
   "fix": "Pick one case style for the product (sentence case for UI and most headings) and state it in the prompt or style guide. Lowercase everything except the first word and proper nouns, and keep capitals for features that really are names.",
   "sources": [
    {
     "t": "Wikipedia: Signs of AI writing (editor guide)",
     "u": "https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing"
    },
    {
     "t": "avoid-ai-design: AI design tells catalog",
     "u": "https://github.com/funboy322/avoid-ai-design/blob/main/references/ai-tells-catalog.md"
    },
    {
     "t": "Signs of AI design: a field guide to the visual tells of AI-generated design",
     "u": "https://github.com/febbhav/signs-of-ai-design"
    },
    {
     "t": "Title Case is your accidental AI tell (Deborah MT)",
     "u": "https://deborahmt.medium.com/title-case-is-your-accidental-ai-tell-2e83bbe46fe3"
    }
   ]
  },
  {
   "code": "B165",
   "id": "colon-split-headings",
   "name": "Colon-Split Headings",
   "category": "Copy",
   "track": "behavioral",
   "harm": "Credibility",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#colon-split-headings",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "'Smart Scheduling: Plan Your Week In Seconds.' Every heading is a label, a colon, then a slogan.",
   "fix": "Write a heading that says one thing. Either name the feature or state the benefit; put the other in the body. Ban colons in headings in the copy brief and rewrite any that survive.",
   "sources": [
    {
     "t": "Why Does AI Only Write Headlines With Colons? (Zulie Writes)",
     "u": "https://www.zuliewrites.com/blog/annoying-and-cliched-why-chatgpt-only-creates-titles-with-colons"
    },
    {
     "t": "8 Clear Cut Ways To Tell If The Blog You're Reading Was Written By ChatGPT",
     "u": "https://dealerknows.com/8-clear-cut-ways-to-tell-if-the-blog-youre-reading-was-written-by-chatgpt/"
    }
   ]
  },
  {
   "code": "B166",
   "id": "bold-label-bullets",
   "name": "Bold-Label Bullets",
   "category": "Copy",
   "track": "behavioral",
   "harm": "Credibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#bold-label-bullets",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "Every list item starts with a bolded label and a colon, then a sentence that repeats the label.",
   "fix": "Write lists as plain items that each carry one fact, or as short paragraphs. If a label is genuinely needed, make it a real heading or a definition list, and delete any sentence that only restates its label.",
   "sources": [
    {
     "t": "Don't Write Like AI: 10 Takeaways from Wikipedia's Signs of AI Writing (Blake Stockton)",
     "u": "https://www.blakestockton.com/p/takeaways-from-wikipedias-signs-of-ai-writing-2"
    },
    {
     "t": "Wikipedia: Signs of AI writing (editor guide)",
     "u": "https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing"
    }
   ]
  },
  {
   "code": "B167",
   "id": "whether-youre-a",
   "name": "Whether You're A",
   "category": "Copy",
   "track": "behavioral",
   "harm": "Clarity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#whether-youre-a",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "'Whether you're a solo founder or a global enterprise, X has you covered.'",
   "fix": "Name the one audience the product is actually built for and the situation they are in. If it truly serves two groups, give each its own section with a concrete reason.",
   "sources": [
    {
     "t": "ChatGPT Most Overused Words & Expressions (Intellectual Lead)",
     "u": "https://intellectualead.com/chatgpt-most-overused-words/"
    },
    {
     "t": "8 Clear Cut Ways To Tell If The Blog You're Reading Was Written By ChatGPT",
     "u": "https://dealerknows.com/8-clear-cut-ways-to-tell-if-the-blog-youre-reading-was-written-by-chatgpt/"
    }
   ]
  },
  {
   "code": "B168",
   "id": "the-conclusion-heading",
   "name": "The Conclusion Heading",
   "category": "Content",
   "track": "behavioral",
   "harm": "Credibility",
   "detection": "automated",
   "url": "https://sloppatterns.com/#the-conclusion-heading",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "Every blog post and guide ends with an H2 called 'Conclusion' that starts 'In conclusion'.",
   "fix": "End an article where the last useful point ends. If a summary is needed, put it at the top as a short answer. Rewrite openings to start with the specific problem, not the state of the world.",
   "sources": [
    {
     "t": "Wikipedia: Signs of AI writing (editor guide)",
     "u": "https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing"
    },
    {
     "t": "ChatGPT Most Overused Words & Expressions (Intellectual Lead)",
     "u": "https://intellectualead.com/chatgpt-most-overused-words/"
    },
    {
     "t": "8 Clear Cut Ways To Tell If The Blog You're Reading Was Written By ChatGPT",
     "u": "https://dealerknows.com/8-clear-cut-ways-to-tell-if-the-blog-youre-reading-was-written-by-chatgpt/"
    }
   ]
  },
  {
   "code": "B169",
   "id": "markdown-showing-through",
   "name": "Markdown Showing Through",
   "category": "Content",
   "track": "behavioral",
   "harm": "Credibility",
   "detection": "automated",
   "url": "https://sloppatterns.com/#markdown-showing-through",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "Literal **asterisks**, ## hashes and [brackets](links) printed on the page as text.",
   "fix": "Either render Markdown deliberately with a sanitising parser, or ask the model for plain text and strip Markdown before saving. Add a pre-publish check that fails on '**', a leading '#' or '](' in visible text.",
   "sources": [
    {
     "t": "Wikipedia: Signs of AI writing (editor guide)",
     "u": "https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing"
    },
    {
     "t": "Why Do Asterisks Appear When I Paste from ChatGPT? (Unmarkdown)",
     "u": "https://unmarkdown.com/blog/why-do-asterisks-appear-when-i-paste-from-chatgpt"
    }
   ]
  },
  {
   "code": "B173",
   "id": "compliance-badge-cosplay",
   "name": "Compliance Badge Cosplay",
   "category": "Trust",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#compliance-badge-cosplay",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "SOC 2, HIPAA, GDPR and ISO badges in the footer of a product with no report behind any of them.",
   "fix": "Show a compliance mark only when you hold a current, clean report and are entitled to the logo; link to a trust page that names the auditor and report date. Otherwise describe your actual security practices in plain words.",
   "sources": [
    {
     "t": "avoid-ai-design: AI design tells catalog",
     "u": "https://github.com/funboy322/avoid-ai-design/blob/main/references/ai-tells-catalog.md"
    },
    {
     "t": "Signs of AI design: a field guide to the visual tells of AI-generated design",
     "u": "https://github.com/febbhav/signs-of-ai-design"
    },
    {
     "t": "Can you put a SOC 2 logo on your website? (Probo)",
     "u": "https://www.probo.com/blog/2026-05-04-are-you-allowed-to-put-soc-2-logo-on-website"
    }
   ]
  },
  {
   "code": "B174",
   "id": "the-unbacked-superlative",
   "name": "The Unbacked Superlative",
   "category": "Marketing",
   "track": "behavioral",
   "harm": "Trust",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-unbacked-superlative",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "'The world's first', 'the #1 AI platform', '10x faster', with nothing behind the number.",
   "fix": "Remove any rank, 'first' or multiplier you cannot cite. Replace it with a specific, checkable outcome from a named customer or your own measured benchmark, and link the method.",
   "sources": [
    {
     "t": "Hallmark: anti-patterns reference",
     "u": "https://github.com/Nutlope/hallmark/blob/main/skills/hallmark/references/anti-patterns.md"
    },
    {
     "t": "FTC Warns to 'Keep Your AI Claims in Check' in New AI Guidance (Cooley)",
     "u": "https://cdp.cooley.com/ftc-warns-to-keep-your-ai-claims-in-check-in-new-ai-guidance/"
    }
   ]
  },
  {
   "code": "B175",
   "id": "the-generated-privacy-policy",
   "name": "The Generated Privacy Policy",
   "category": "Trust",
   "track": "behavioral",
   "harm": "Privacy",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-generated-privacy-policy",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "A privacy policy that exists, sounds legal, and describes a generic company's data practices.",
   "fix": "Inventory what the app collects, where it goes and which vendors process it, then write or generate the policy from that list with the real legal entity, contact and jurisdiction. Re-check it whenever a tracking script or AI vendor is added.",
   "sources": [
    {
     "t": "AI Generated Privacy Policy Examined: Should You Use ChatGPT? (Termly)",
     "u": "https://termly.io/resources/articles/ai-privacy-policy-examined/"
    },
    {
     "t": "AI Wrote Your Privacy Policy. Who Checks It? (Janus Compliance)",
     "u": "https://www.januscompliance.co.uk/blog/ai-wrote-your-privacy-policy-who-checks-it"
    }
   ]
  },
  {
   "code": "B177",
   "id": "the-raw-error-leak",
   "name": "The Raw Error Leak",
   "category": "Error-handling",
   "track": "behavioral",
   "harm": "Safety",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-raw-error-leak",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "'duplicate key value violates unique constraint \"users_email_key\"' shown to the customer in a toast.",
   "fix": "Map known error codes to plain messages that say what happened and what to do ('That email already has an account. Sign in instead.'). Log the raw error server-side; never render error.message from a database or SDK to users.",
   "sources": [
    {
     "t": "CWE-209: Generation of Error Message Containing Sensitive Information (MITRE)",
     "u": "https://cwe.mitre.org/data/definitions/209.html"
    },
    {
     "t": "AI Code Security Review: Where Vibe-Coded Apps Commonly Fail (Canary Trap)",
     "u": "https://canarytrap.com/resources/ai-generated-code-security-review/"
    }
   ]
  },
  {
   "code": "B181",
   "id": "the-untitled-dialog",
   "name": "The Untitled Dialog",
   "category": "Accessibility",
   "track": "behavioral",
   "harm": "Accessibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#the-untitled-dialog",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "Mobile menus and modals open as dialogs with no title, so screen readers announce just 'dialog'.",
   "fix": "Give every dialog and sheet a DialogTitle or SheetTitle (visually hidden if the design has none) and a description where useful. Treat Radix accessibility warnings as build failures.",
   "sources": [
    {
     "t": "DialogContent requires a DialogTitle with new Sidebar blocks (shadcn-ui/ui #5983)",
     "u": "https://github.com/shadcn-ui/ui/issues/5983"
    },
    {
     "t": "Sheet error for screen reader users (shadcn-ui/ui #4302)",
     "u": "https://github.com/shadcn-ui/ui/issues/4302"
    },
    {
     "t": "AI-Generated UI Is Inaccessible by Default (Frontend Masters blog)",
     "u": "https://frontendmasters.com/blog/ai-generated-ui-is-inaccessible-by-default/"
    }
   ]
  },
  {
   "code": "B182",
   "id": "wrong-page-language",
   "name": "Wrong Page Language",
   "category": "Accessibility",
   "track": "behavioral",
   "harm": "Accessibility",
   "detection": "automated, graded",
   "url": "https://sloppatterns.com/#wrong-page-language",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "A Spanish, German or Sinhala site whose HTML still declares lang=\"en\".",
   "fix": "Set lang to the page's actual language in the root layout (and per page for multilingual sites); mark inline foreign phrases with their own lang. Add a check that compares the declared language with the detected language of the body text.",
   "sources": [
    {
     "t": "Understanding SC 3.1.1 Language of Page (W3C WCAG 2.2)",
     "u": "https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html"
    },
    {
     "t": "create-vite React template index.html (vitejs/vite)",
     "u": "https://github.com/vitejs/vite/blob/main/packages/create-vite/template-react-ts/index.html"
    },
    {
     "t": "The WebAIM Million: 2026 report",
     "u": "https://webaim.org/projects/million/"
    }
   ]
  },
  {
   "code": "B183",
   "id": "the-token-firehose",
   "name": "The Token Firehose",
   "category": "Accessibility",
   "track": "behavioral",
   "harm": "Accessibility",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-token-firehose",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "A streaming AI answer is announced to screen readers over and over as it grows, or not at all.",
   "fix": "Announce state, not tokens: a polite live message 'Generating' then 'Response ready' (or the full reply once complete), with focus or a shortcut to jump to it. Never put the streaming node itself in an atomic live region.",
   "sources": [
    {
     "t": "The Accessibility Gap in AI Interfaces Nobody Is Shipping Around (Tian Pan)",
     "u": "https://tianpan.co/blog/2026/04/17/ai-accessibility-streaming-screen-readers"
    },
    {
     "t": "Best practices for a chatbot (Orange digital accessibility guidelines)",
     "u": "https://a11y-guidelines.orange.com/en/articles/chatbot/"
    }
   ]
  },
  {
   "code": "B184",
   "id": "enter-sends-mid-word",
   "name": "Enter Sends Mid-Word",
   "category": "Forms",
   "track": "behavioral",
   "harm": "Accessibility",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#enter-sends-mid-word",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "Typing Japanese, Chinese or Korean in the AI chat box sends a half-composed message on Enter.",
   "fix": "Ignore Enter while event.isComposing is true (and on keyCode 229 for Safari), and test the composer with at least one IME. Offer Shift+Enter or a setting for Enter behaviour.",
   "sources": [
    {
     "t": "Enter key during Japanese IME composition sends message in Chat UI (jupyterlab/jupyter-ai #1534)",
     "u": "https://github.com/jupyterlab/jupyter-ai/issues/1534"
    },
    {
     "t": "Chat input sends the message mid-IME-composition (OpenSearch Dashboards #12794)",
     "u": "https://github.com/opensearch-project/OpenSearch-Dashboards/issues/12794"
    },
    {
     "t": "Prevent message submission during IME composition (OpenHands #6025)",
     "u": "https://github.com/OpenHands/OpenHands/pull/6025"
    }
   ]
  },
  {
   "code": "B185",
   "id": "scroll-hijacked-by-the-stream",
   "name": "Scroll Hijacked By The Stream",
   "category": "Conversation",
   "track": "behavioral",
   "harm": "Productivity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#scroll-hijacked-by-the-stream",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "You scroll up to read the start of the answer, and the view keeps following the newest line.",
   "fix": "Follow the stream only while the user is already at the bottom; stop on any wheel, touch or key scroll and show a 'Jump to latest' button. Consider anchoring the start of the response at the top of the viewport instead.",
   "sources": [
    {
     "t": "Option to stop auto-scrolling while ChatGPT is responding (OpenAI Developer Community)",
     "u": "https://community.openai.com/t/option-to-stop-auto-scrolling-while-chatgpt-is-responding/1397872"
    },
    {
     "t": "Streaming output auto-scroll makes responses unreadable while they generate (anthropics/claude-code #56525)",
     "u": "https://github.com/anthropics/claude-code/issues/56525"
    },
    {
     "t": "The scroll problem nobody talks about when building AI chat interface (Medium)",
     "u": "https://medium.com/@disgcfrguy/the-scroll-problem-nobody-talks-about-when-building-ai-chat-interface-987c223cafc0"
    }
   ]
  },
  {
   "code": "B186",
   "id": "the-eaten-prompt",
   "name": "The Eaten Prompt",
   "category": "Error-handling",
   "track": "behavioral",
   "harm": "Productivity",
   "detection": "needs a person",
   "url": "https://sloppatterns.com/#the-eaten-prompt",
   "version": "1.0",
   "added": "2026-10-06",
   "updated": "2026-10-06",
   "oneLiner": "A long prompt fails to send, and the text box comes back empty.",
   "fix": "Clear the composer only after the server accepts the message; on any failure restore the text and attachments. Persist drafts locally per conversation so reloads, sign-ins and limits do not lose them.",
   "sources": [
    {
     "t": "Conversation prompt text lost when message limit reached (anthropics/claude-code #31393)",
     "u": "https://github.com/anthropics/claude-code/issues/31393"
    },
    {
     "t": "Long prompt lost: vanished when I had to log in (anthropics/claude-code #20523)",
     "u": "https://github.com/anthropics/claude-code/issues/20523"
    }
   ]
  }
 ]
}