# Anti-Checklist This file is the audit's quality gate. The categories below describe motion patterns to **flag** in audited code — AI-slop tells at the top (where most 2026 motion problems live), followed by perspective-specific anti-patterns from Emil, Jakub, and Jhey, then general motion mistakes and code-shaped red flags. When audited code matches a pattern here, the audit surfaces a finding and the agent generates a per-finding motion suggestion by reading the relevant philosophy reference (`emil-kowalski.md`, `jakub-krehel.md`, `jhey-tompkins.md`). The file frames patterns as "things to flag," not "mistakes to avoid" — language that makes the audit's adversarial posture explicit. --- ## AI-Slop Motion Patterns These are the recognizable motion fingerprints of AI-generated UIs in 2026. They're not always wrong in isolation — what makes them slop is *frequency* and *uniformity*. Finding one instance is normal polish; finding the same pattern slapped across the codebase is the tell. Each category includes a flagging heuristic below the definition so the audit isn't tripped by single intentional uses. --- ### Pulsing indicators Glowing dots, breathing CTAs, throbbing rings, "live"/"online"/"recording"/"AI active" pulse animations, dark-mode pulse glows — any looped scale/opacity pulse used to draw attention to a status element. **Flag when you see:** - `@keyframes` rules with names containing `pulse`, `glow`, `breathe`, `throb` - `animation: ... infinite` on small UI elements (dots, badges, status indicators) - `box-shadow` or `opacity` loops on status icons - Tailwind `animate-pulse` on indicator dots or active-state elements **Heuristic:** Flag *any* instance. Pulsing indicators are almost always slop — the only exception is a single brand element with explicit design rationale stated in code comments or design docs. **Fix lens:** Emil — purposeful restraint. See `references/emil-kowalski.md`. --- ### Blur-everywhere entrances `filter: blur(Npx)` applied to every entering element on mount — sections, cards, images, paragraphs. Jakub's enter recipe (`opacity + translateY + blur`) is excellent in moderation; AI-slop versions apply it uniformly across the page. **Flag when you see:** - `initial={{ filter: 'blur(Npx)' }}` or `from { filter: blur(Npx); }` on multiple distinct components in the same view - Identical blur values (e.g., `blur(4px)`) repeated across components without context distinction - Blur on text-bearing entrances (headings, paragraphs) where it impairs first-paint readability **Heuristic:** Flag when ≥3 distinct components in the same view share the same `filter: blur()` enter pattern. Single uses with intent (a hero element, a modal) are fine. **Fix lens:** Jakub — production polish, but selective. See `references/jakub-krehel.md`. --- ### Hover-scale-on-everything `transform: scale(1.0X)` on `:hover` applied to every card, button, and image without intent. The micro-bounce-on-hover feels polished in moderation; AI-slop versions slap it on indiscriminately. **Flag when you see:** - `transition` rules with `transform: scale(1.0X)` on `:hover` across multiple card/button/image components - Identical scale values (e.g., `scale(1.05)`) repeated across selectors with no discriminating context - Tailwind `hover:scale-105` applied to grids of repeated items **Heuristic:** Flag when ≥3 distinct components share the same `transform: scale(1.0X)` on `:hover` with no other discriminating selector context. Single intentional uses (e.g., a primary CTA) are fine. **Fix lens:** Emil for utility-shaped elements (none); Jakub for product-shaped elements (selective). See `references/emil-kowalski.md` and `references/jakub-krehel.md`. --- ### Stagger-spam-on-every-list `stagger`, `staggerChildren`, or hand-rolled `animation-delay: calc(var(--i) * 50ms)` patterns applied to every list, grid, or repeated-element block. Jhey-style stagger on a deliberate moment is delightful; AI-slop spreads it across every list as default polish. **Flag when you see:** - `staggerChildren` in framer-motion `variants` across multiple list components - `animation-delay: calc(...)` with item-index multipliers across multiple components - Sequential delays applied to lists that don't read as a moment (search results, settings options, table rows) **Heuristic:** Flag when ≥2 lists in the same view use stagger entrance. One intentional moment is fine; two or more is the tell. **Fix lens:** Emil for utility lists (no stagger); Jhey for delight moments (selective). See `references/emil-kowalski.md` and `references/jhey-tompkins.md`. --- ### Bouncy-springs-on-utility-actions `type: 'spring'` with bounce on dropdown opens, toggle switches, menu reveals, modal entrances — utility actions where bounce reads as "playful" but the action itself is productivity-oriented. **Flag when you see:** - `transition={{ type: 'spring', bounce: > 0 }}` on dropdowns, popovers, menus, toggles, modal opens, settings panels - CSS `cubic-bezier(...)` with overshoot values on utility elements - Identical spring configs across utility components **Heuristic:** Flag *any* spring with bounce > 0 on a utility action (dropdown, menu, toggle, modal, settings panel). Bounce belongs on playful elements — celebration moments, kids apps, intentional delight — not productivity UI. **Fix lens:** Emil — speed and purpose. See `references/emil-kowalski.md`. --- ### Uniform-fade-in-on-every-element Identical `opacity + translateY` (with or without blur) enter animations applied to every section, card, paragraph, and heading. The "polished entrance" treatment from Jakub used uniformly across the page, regardless of element type or context. **Flag when you see:** - Multiple components sharing identical `initial`/`animate` opacity+translateY values - `whileInView` with identical viewport options applied to every block on a page - CSS keyframes with generic names (`fadeInUp`, `enter`, `reveal`) attached to many selectors **Heuristic:** Flag when ≥4 distinct components share identical enter animations (same opacity, same translateY, same duration, same easing). Three is acceptable polish baseline; four is uniformity slop. **Fix lens:** Jakub — selective polish with hierarchy. See `references/jakub-krehel.md`. --- ### Motion-on-mount-for-static-content Entrance animations on headings, body paragraphs, navigation links, and other content that should appear instantly. The "fade in everything" pattern that delays reading and makes the page feel sluggish. **Flag when you see:** - `initial`/`animate` on `
`, `