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/<name>/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 <input> 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
tendfor metaphor-match review) - Contrast ratios (use impeccable's
auditfor a11y) - Whether the design is good (no tool can tell you that)