# tilde-style: detect Scan for anti-patterns from the tilde.style list. Deterministic — no generation, just checks. ## Prefer `wiggle detect` when it's available If this project has a `wiggle` binary built (a `wiggle` executable at the project root, or a `tools/cmd/wiggle` directory — check for either before falling back to a manual read), run `wiggle detect` first. It implements the deterministic subset of this checklist — AP-04, AP-05, AP-06, AP-07, G-03, G-04, G-07 — as a real static-analysis tool (`golang.org/x/net/html` + `github.com/tdewolff/parse/v2/css`, not regex), following the same `styles//style.css` convention this skill already prescribes for any project, not something specific to one site. It will not exist in every project this skill is used on — it originated in, and is currently most complete for, `tilde.style`'s own repo — but check for it before doing these checks by hand. Whatever it doesn't cover (platform aesthetics, register collapse, dashboard-on-a-garden-site, and the rest below marked as needing judgment) still needs a manual read. ## Anti-pattern checklist For each item, report: found / not found / not applicable. If found, give the line or element and the correction. ### Universal (all tilde.style projects) | # | Anti-pattern | Signal to look for | |---|---|---| | AP-01 | Platform aesthetics imported wholesale | Substack-style wide-margin serif with nothing else; Notion toggles; Linear dark chrome | | AP-02 | AI-palette with no metaphor anchor | Purple gradients, slate+teal, glassmorphism without a grounding reference | | AP-03 | Conversational UI as the only surface | Single `` prompt as entire UI with no other navigation or spatial affordance | | AP-04 | Scale-first vocabulary | Component names: `feed`, `engagement`, `conversion`, `growth`, `metrics` | | AP-05 | Authorless generation | No `DESIGN.md` or `style.md`; no design intention on record | | AP-06 | Metaphor abandonment | `card`, `button`, `avatar` as primary component names when a metaphor is active | | AP-07 | Motion without a still state | `animation` or `transition` without `@media (prefers-reduced-motion: reduce)` counterpart | | AP-08 | Surveillance-shaped defaults | Tracking pixels, engagement dashboard, A/B split on every interaction | ### Gardening-specific (when Gardening style is active) | # | Anti-pattern | Signal to look for | |---|---|---| | G-01 | Dashboard on a garden site | Data table, metric grid, or KPI card in the Pond UX or Garden UX layer | | G-02 | Traffic-light health states | Red/green status instead of opacity-based health pills | | G-03 | Fast snap animations | `transition-duration` or `animation-duration` below `.15s` | | G-04 | Technology-named components | `chat_bubble`, `rag_result`, `embed_vector`, `message` instead of metaphor names | | G-05 | Register collapse | Status pills styled like pond bubbles; digest layer styled like chat layer | | G-06 | Single-mode dark-only | No Teich-Morgen (light) default; dark mode only | | G-07 | Raw hex instead of tokens | Hardcoded `#2d6a4f` instead of `var(--pond-mid)` | ## Reporting format ``` AP-07 FOUND: `welcome-fade` animation has no prefers-reduced-motion counterpart. File: src/chat.css, line 42 Fix: wrap in @media (prefers-reduced-motion: no-preference) { ... } and add: @media (prefers-reduced-motion: reduce) { .welcome-fade { animation: none; opacity: 1; } } G-04 FOUND: class name `message-bubble` on main chat turn element. File: src/chat.html, line 88 Fix: rename to `lernhappen` (knowledge surfacing from the pond) or `stone` (user message dropped in) AP-05 FOUND: No DESIGN.md or style.md present. Fix: run /tilde-style init ``` ## What detect does NOT check - Visual quality (run `tend` for metaphor-match review) - Contrast ratios (use impeccable's `audit` for a11y) - Whether the design is good (no tool can tell you that)