refactor(design): typed slop catalog in lib/; AI_SLOP_BLACKLIST derived

lib/design-catalog.ts is the single source of truth for gstack's design
anti-pattern vocabulary: the 11 legacy blacklist lines (verbatim, flagged
`legacyBlacklist`), every one of impeccable's 61 registry ids with gstack
prose, tier, impact, confidence, grep heuristic, and /impeccable handoff,
plus the gstack-only tells the LLM pass judges (hero metrics, identical
cards, glassmorphism, missing states, unthemed browser surfaces, ...).

`impeccableId` is set only when the id exists in the registry fixture, and
`renderCatalog({style:'ids'})` brackets an id only then, so rendered prose
never shows an id the detector cannot emit. Role-scoped font lists
(OVERUSED_FONTS_DISPLAY, BANNED_FONTS, FONTS_BODY_UI_OK, FONTS_MONO_OK,
FONTS_VERIFIED_FREE) live beside the entries.

scripts/resolvers/constants.ts now derives AI_SLOP_BLACKLIST from the
catalog. Generated output is byte-identical (bun run gen:skill-docs is a
zero diff). Pure module: no I/O, no scripts/ imports, loading prints
nothing, so bin/ can import it at runtime on every host.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Garry Tan
2026-09-08 15:30:29 +00:00
co-authored by Claude Fable 5.1
parent 8ef842fc75
commit e34541c3bd
3 changed files with 924 additions and 17 deletions
+9 -17
View File
@@ -1,26 +1,18 @@
// ─── Shared Design Constants ────────────────────────────────
import { DESIGN_SLOP_CATALOG } from '../../lib/design-catalog';
/**
* gstack's AI slop anti-patterns — shared between DESIGN_METHODOLOGY and DESIGN_HARD_RULES.
*
* Overused fonts worth calling out in templates (not a pattern to blacklist, but a
* convergence risk): Inter, Roboto, Arial, Helvetica, Open Sans, Lato, Montserrat,
* Poppins, and increasingly Space Grotesk. Every AI design tool picks one of these.
* Design prompts should bias toward less-common display faces.
* Derived from the typed catalog in lib/design-catalog.ts: the 11 entries flagged
* `legacyBlacklist`, prose verbatim, in catalog order. Overused fonts live there
* too (OVERUSED_FONTS_DISPLAY), role-scoped: banned as the display voice, several
* still fine as body/UI on an Operate or Read surface.
*/
export const AI_SLOP_BLACKLIST = [
'Purple/violet/indigo gradient backgrounds or blue-to-purple color schemes',
'**The 3-column feature grid:** icon-in-colored-circle + bold title + 2-line description, repeated 3x symmetrically. THE most recognizable AI layout.',
'Icons in colored circles as section decoration (SaaS starter template look)',
'Centered everything (`text-align: center` on all headings, descriptions, cards)',
'Uniform bubbly border-radius on every element (same large radius on everything)',
'Decorative blobs, floating circles, wavy SVG dividers (if a section feels empty, it needs better content, not decoration)',
'Emoji as design elements (rockets in headings, emoji as bullet points)',
'Colored left-border on cards (`border-left: 3px solid <accent>`)',
'Generic hero copy ("Welcome to [X]", "Unlock the power of...", "Your all-in-one solution for...")',
'Cookie-cutter section rhythm (hero → 3 features → testimonials → pricing → CTA, every section same height)',
'system-ui or `-apple-system` as the PRIMARY display/body font — the "I gave up on typography" signal. Pick a real typeface.',
];
export const AI_SLOP_BLACKLIST: string[] = DESIGN_SLOP_CATALOG
.filter(e => e.legacyBlacklist)
.map(e => e.prose);
/** OpenAI hard rejection criteria (from "Designing Delightful Frontends with GPT-5.4", Mar 2026) */
export const OPENAI_HARD_REJECTIONS = [