mirror of
https://github.com/pbakaus/impeccable.git
synced 2026-09-11 21:57:14 +03:00
Compare commits
32
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f9fa46412c | ||
|
|
a20bbfc752 | ||
|
|
7501e67b55 | ||
|
|
9798bb7235 | ||
|
|
67e73f47a6 | ||
|
|
1fe9c41759 | ||
|
|
44c27a72af | ||
|
|
a82f02d1a1 | ||
|
|
e83e437cdd | ||
|
|
f604d31d54 | ||
|
|
f5c1bd65ae | ||
|
|
5844c40177 | ||
|
|
9dc97ce648 | ||
|
|
b3108c1697 | ||
|
|
4ac0348032 | ||
|
|
7f0262f809 | ||
|
|
1a3f5d78bd | ||
|
|
c979ac37c3 | ||
|
|
bcd16381cf | ||
|
|
19e0174da2 | ||
|
|
88227f7935 | ||
|
|
3590bf9e37 | ||
|
|
616820dcff | ||
|
|
a4ff58ef51 | ||
|
|
da2cda06ed | ||
|
|
467efe4632 | ||
|
|
2520317f94 | ||
|
|
b7d2ad5589 | ||
|
|
d2ab4ddee6 | ||
|
|
a031d5de92 | ||
|
|
867fab2188 | ||
|
|
609bbfbd5b |
@@ -1,7 +1,7 @@
|
||||
---
|
||||
name: impeccable
|
||||
description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks.
|
||||
version: 3.8.0
|
||||
version: 3.9.1
|
||||
---
|
||||
|
||||
Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft.
|
||||
@@ -93,6 +93,7 @@ Match-and-refuse. If you're about to write any of these, rewrite the element wit
|
||||
- **`border-radius: 32px+` on cards / sections / inputs.** You over-round. Cards top out at 12–16px; full-pill is fine for tags/buttons. Picking 24/28/32/40px on a card is the codex tell; no brand wants "insanely rounded".
|
||||
- **Hand-drawn / sketchy SVG illustrations.** Class names like `loose-sketch`, `*-sketch`, `doodle`, `wavy`; `feTurbulence` / `feDisplacementMap` "paper grain" filters; 5-to-30 path crude scenes meant to depict a tangible subject (an otter, a table-and-fork, an album cover). All of these read as amateurish, not whimsical. If you can't render the scene with real assets, ship no illustration. Don't attempt sketchy SVG as a fallback.
|
||||
- **`repeating-linear-gradient(...)` stripe backgrounds.** Diagonal stripes in `body:before` or section backgrounds are pure codex decoration. Don't.
|
||||
- **Decorative grid backgrounds.** Two-axis CSS grid overlays built from `linear-gradient(... 1px, transparent 1px)` plus `background-size` are a Codex tell unless the surface is an actual canvas, map, blueprint, or measurement tool. Use product structure, real artifacts, or a plain surface instead.
|
||||
- **Meta-criticism copy.** Naming a concept then layering an ironic modifier, or staging a strawman to "correct" it. Make the specific claim instead.
|
||||
|
||||
### The AI slop test
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
When asked for "bolder," AI defaults to the same tired tricks: cyan/purple gradients, glassmorphism, neon accents on dark backgrounds, gradient text on metrics. These are the opposite of bold. Reject them first, then increase visual impact and personality through stronger hierarchy, committed scale, and decisive type.
|
||||
When asked for "bolder," AI defaults to the same tired tricks: cyan/purple gradients, glassmorphism, neon accents on dark backgrounds, gradient text on metrics. These are the opposite of bold. Reject them first, then increase visual impact by making the existing design language more decisive, specific, and committed.
|
||||
|
||||
---
|
||||
|
||||
## Register
|
||||
|
||||
Brand: "bolder" means distinctive. Extreme scale, unexpected color, typographic risk, committed POV.
|
||||
Brand: "bolder" means distinctive. Express a stronger point of view through hierarchy, pacing, proportion, copy, evidence, and one committed visual idea.
|
||||
|
||||
Product: "bolder" rarely means theatrics; those undermine trust. It means stronger hierarchy, clearer weight contrast, one sharper accent, more committed density. The amplification is in clarity, not drama.
|
||||
Product: "bolder" rarely means theatrics; those undermine trust. It means stronger hierarchy, clearer weight contrast, sharper information density, and more decisive prioritization. The amplification is in clarity, not drama.
|
||||
|
||||
---
|
||||
|
||||
@@ -15,98 +15,105 @@ Product: "bolder" rarely means theatrics; those undermine trust. It means strong
|
||||
Analyze what makes the design feel too safe or boring:
|
||||
|
||||
1. **Identify weakness sources**:
|
||||
- **Generic choices**: System fonts, basic colors, standard layouts
|
||||
- **Timid scale**: Everything is medium-sized with no drama
|
||||
- **Low contrast**: Everything has similar visual weight
|
||||
- **Static**: No motion, no energy, no life
|
||||
- **Predictable**: Standard patterns with no surprises
|
||||
- **Flat hierarchy**: Nothing stands out or commands attention
|
||||
- **Generic choices**: The page could belong to any product in the category.
|
||||
- **Timid scale**: Everything is medium-sized with no clear lead.
|
||||
- **Low contrast**: Important and supporting elements have similar visual weight.
|
||||
- **Static**: The surface has no meaningful moment of emphasis.
|
||||
- **Predictable**: The composition follows a default pattern without a point of view.
|
||||
- **Flat hierarchy**: Nothing stands out or commands attention.
|
||||
|
||||
2. **Understand the context**:
|
||||
- What's the brand personality? (How far can we push?)
|
||||
- What's the purpose? (Marketing can be bolder than financial dashboards)
|
||||
- Who's the audience? (What will resonate?)
|
||||
- What are the constraints? (Brand guidelines, accessibility, performance)
|
||||
- What is the brand personality?
|
||||
- What is the purpose of this surface?
|
||||
- Who is the audience?
|
||||
- What design system, tokens, components, and visual conventions already exist?
|
||||
|
||||
If any of these are unclear from the codebase, STOP and use Codex's structured user-input/question tool when available; if unavailable, ask directly in chat to clarify what you cannot infer.
|
||||
|
||||
**CRITICAL**: "Bolder" doesn't mean chaotic or garish. It means distinctive, memorable, and confident. Think intentional drama, not random chaos.
|
||||
**CRITICAL**: "Bolder" does not mean chaotic or garish. It means distinctive, memorable, and confident. Think intentional drama, not random noise.
|
||||
|
||||
**WARNING - AI SLOP TRAP**: Review ALL the DON'T guidelines from the parent impeccable skill (already loaded in this context) before proceeding. Bold means distinctive, not "more effects."
|
||||
|
||||
## Design-System Lock
|
||||
|
||||
If the project has `DESIGN.md`, tokens, theme variables, or established component styles, treat that system as the boundary. Make the existing language stronger before adding new language.
|
||||
|
||||
Do not invent new colors, gradients, radii, shadows, fonts, decorative backgrounds, or effects just because the request says "bolder." A bolder pass should usually change emphasis, proportion, rhythm, density, contrast, copy, artifact specificity, and layout relationships while staying inside the documented system.
|
||||
|
||||
If the existing system is genuinely too limited to express the bolder direction, stop and ask the user before expanding it. Name the exact additions, the role each would play, and why the current system cannot do the job. If the user approves expansion, update the design system or tokens alongside the implementation.
|
||||
|
||||
## Plan Amplification
|
||||
|
||||
Create a strategy to increase impact while maintaining coherence:
|
||||
|
||||
- **Focal point**: What should be the hero moment? (Pick ONE, make it amazing)
|
||||
- **Personality direction**: Maximalist chaos? Elegant drama? Playful energy? Dark moody? Choose a lane.
|
||||
- **Risk budget**: How experimental can we be? Push boundaries within constraints.
|
||||
- **Hierarchy amplification**: Make big things BIGGER, small things smaller (increase contrast)
|
||||
- **Focal point**: Pick one thing the viewer should remember, then make the rest support it.
|
||||
- **System levers**: Identify which existing tokens, components, layout patterns, and copy structures can carry more weight.
|
||||
- **Risk budget**: Decide how far the surface can push while still feeling like the same product or brand.
|
||||
- **Hierarchy amplification**: Increase contrast between primary, secondary, and tertiary content instead of making every element louder.
|
||||
|
||||
**IMPORTANT**: Bold design must still be usable. Impact without function is just decoration.
|
||||
|
||||
## Amplify the Design
|
||||
|
||||
Systematically increase impact across these dimensions:
|
||||
Systematically increase impact through intention, not a menu of effects:
|
||||
|
||||
### Typography Amplification
|
||||
- **Replace generic fonts**: Swap system fonts for distinctive choices (see the parent skill's typography guidelines and the [Reference Material section of typeset.md](typeset.md#reference-material) for inspiration)
|
||||
- **Extreme scale**: Create dramatic size jumps (3x-5x differences, not 1.5x)
|
||||
- **Weight contrast**: Pair 900 weights with 200 weights, not 600 with 400
|
||||
- **Unexpected choices**: Variable fonts, display fonts for headlines, condensed/extended widths, monospace as intentional accent (not as lazy "dev tool" default)
|
||||
- Strengthen the existing type hierarchy before changing typefaces.
|
||||
- Make important text meaningfully more dominant, and make supporting text quieter.
|
||||
- Use weight, measure, spacing, and line breaks to sharpen the point of view.
|
||||
- Add or replace fonts only after user-approved design-system expansion.
|
||||
|
||||
### Color Intensification
|
||||
- **Increase saturation**: Shift to more vibrant, energetic colors (but not neon)
|
||||
- **Bold palette**: Introduce unexpected color combinations. Avoid the purple-blue gradient AI slop
|
||||
- **Dominant color strategy**: Let one bold color own 60% of the design
|
||||
- **Sharp accents**: High-contrast accent colors that pop
|
||||
- **Tinted neutrals**: Replace pure grays with tinted grays that harmonize with your palette
|
||||
- **Rich gradients**: Intentional multi-stop gradients (not generic purple-to-blue)
|
||||
### Color Amplification
|
||||
- Use the existing palette more decisively before adding colors.
|
||||
- Shift the proportion, placement, and contrast of documented colors to clarify meaning.
|
||||
- Treat any new color, gradient, or tint ramp as a design-system expansion that requires user approval.
|
||||
- Keep color tied to hierarchy, state, or brand meaning; do not use it as surface decoration.
|
||||
|
||||
### Spatial Drama
|
||||
- **Extreme scale jumps**: Make important elements 3-5x larger than surroundings
|
||||
- **Break the grid**: Let hero elements escape containers and cross boundaries
|
||||
- **Asymmetric layouts**: Replace centered, balanced layouts with tension-filled asymmetry
|
||||
- **Generous space**: Use white space dramatically (100-200px gaps, not 20-40px)
|
||||
- **Overlap**: Layer elements intentionally for depth
|
||||
### Spatial Amplification
|
||||
- Change proportion, density, alignment, and sequencing so the composition has a stronger point of view.
|
||||
- Create clearer contrast between dense evidence and open breathing room.
|
||||
- Let layout express priority and narrative order before adding ornament.
|
||||
- Preserve responsive behavior and avoid text overflow at every breakpoint.
|
||||
|
||||
### Visual Effects
|
||||
- **Dramatic shadows**: Large, soft shadows for elevation (but not generic drop shadows on rounded rectangles)
|
||||
- **Background treatments**: Mesh patterns, noise textures, geometric patterns, intentional gradients (not purple-to-blue)
|
||||
- **Texture & depth**: Grain, halftone, duotone, layered elements. NOT glassmorphism (it's overused AI slop)
|
||||
- **Borders & frames**: Thick borders, decorative frames, custom shapes (not rounded rectangles with colored border on one side)
|
||||
- **Custom elements**: Illustrative elements, custom icons, decorative details that reinforce brand
|
||||
### Surface Amplification
|
||||
- Use existing surface, border, radius, and shadow rules more deliberately.
|
||||
- Remove timid half-measures: either give an element a clear role or simplify it.
|
||||
- Add texture, depth, illustration, or decorative treatments only when already established by the system or explicitly approved.
|
||||
- Make real product artifacts, imagery, data, or copy carry attention before reaching for effects.
|
||||
|
||||
### Motion & Animation
|
||||
- **Hero moment**: One signature entrance, once. Not on every visit and not on every section.
|
||||
- **Micro-interactions**: Satisfying hover effects, click feedback, state changes.
|
||||
- **Transitions**: Smooth, noticeable transitions using ease-out-quart/quint/expo (not bounce or elastic, which cheapen the effect).
|
||||
- **Bolder ≠ scroll-fade-rise on every section.** That's the saturated AI default, the opposite of bold.
|
||||
- Design one meaningful moment of emphasis when motion genuinely supports the point.
|
||||
- Make interaction feedback feel more decisive without becoming distracting.
|
||||
- Keep transitions smooth and intentional.
|
||||
- **Bolder != scroll-fade-rise on every section.** That's the saturated AI default, the opposite of bold.
|
||||
|
||||
### Composition Boldness
|
||||
- **Hero moments**: Create clear focal points with dramatic treatment
|
||||
- **Diagonal flows**: Escape horizontal/vertical rigidity with diagonal arrangements
|
||||
- **Full-bleed elements**: Use full viewport width/height for impact
|
||||
- **Unexpected proportions**: Golden ratio? Throw it out. Try 70/30, 80/20 splits
|
||||
- Make the dominant idea unmistakable.
|
||||
- Use layout tension, sequencing, contrast, and restraint to create a stronger read.
|
||||
- Let the page's structure communicate priority before adding decorative layers.
|
||||
- If every element is louder, the composition is not bolder; it is flatter.
|
||||
|
||||
**NEVER**:
|
||||
- Add effects randomly without purpose (chaos ≠ bold)
|
||||
- Sacrifice readability for aesthetics (body text must be readable)
|
||||
- Make everything bold (then nothing is bold; you need contrast)
|
||||
- Ignore accessibility (bold design must still meet WCAG standards)
|
||||
- Overwhelm with motion (animation fatigue is real)
|
||||
- Copy trendy aesthetics blindly (bold means distinctive, not derivative)
|
||||
- Add undocumented design-system primitives without user approval
|
||||
- Add effects randomly without purpose
|
||||
- Hide weak hierarchy behind decoration
|
||||
- Sacrifice readability for aesthetics
|
||||
- Make everything bold; contrast is the point
|
||||
- Ignore accessibility
|
||||
- Overwhelm with motion
|
||||
- Copy trendy aesthetics blindly
|
||||
|
||||
## Verify Quality
|
||||
|
||||
Ensure amplification maintains usability and coherence:
|
||||
|
||||
- **System-faithful**: Did the pass make the existing design language stronger before adding anything new?
|
||||
- **No undocumented drift**: Are new colors, gradients, shadows, radii, fonts, and effects either absent or explicitly approved and documented?
|
||||
- **NOT AI slop**: Does this look like every other AI-generated "bold" design? If yes, start over.
|
||||
- **Still functional**: Can users accomplish tasks without distraction?
|
||||
- **Coherent**: Does everything feel intentional and unified?
|
||||
- **Memorable**: Will users remember this experience?
|
||||
- **Performant**: Do all these effects run smoothly?
|
||||
- **Accessible**: Does it still meet accessibility standards?
|
||||
- **Memorable**: Will users remember this experience for the intended reason?
|
||||
- **Performant and accessible**: Does the result stay fast, readable, responsive, and WCAG-conscious?
|
||||
|
||||
**The test**: If you showed this to someone and said "AI made this bolder," would they believe you immediately? If yes, you've failed. Bold means distinctive, not "more AI effects."
|
||||
|
||||
|
||||
@@ -5,8 +5,9 @@ Resolve one stable target, run two independent assessments, synthesize a design
|
||||
### Hard Invariants
|
||||
|
||||
- Assessment A (design review) and Assessment B (detector/browser evidence) are both required.
|
||||
- Assessment A and B MUST run as two isolated sub-agents whenever a sub-agent/Task tool is exposed. Running them inline in this context is "possible" but is NOT permitted; it is a degraded run. Inline is allowed ONLY when no sub-agent tool exists (or the user declined, on harnesses that ask).
|
||||
- If you degrade for any reason, the report's first line MUST be a banner: `⚠️ DEGRADED: single-context (<reason>)`. A silent degraded critique is a failed critique.
|
||||
- Assessment A must finish before detector findings enter the parent synthesis context. Detector output is deterministic, but it still anchors judgment.
|
||||
- If sub-agents are unavailable, fall back sequentially: finish and record Assessment A first, then run Assessment B, then synthesize.
|
||||
- A skipped detector is a failed critique run unless `detect.mjs` is missing or crashes after a real attempt.
|
||||
- Viewable targets require browser inspection when available.
|
||||
- Any local server started only for critique visualization must run in the background, have a recorded stop method, and be stopped before final reporting unless the user asks to keep it.
|
||||
@@ -27,14 +28,21 @@ Resolve one stable target, run two independent assessments, synthesize a design
|
||||
|
||||
### Assessment Orchestration
|
||||
|
||||
Delegate Assessment A and Assessment B to separate sub-agents when possible. They must not see each other's output. Do not show findings to the user until synthesis.
|
||||
Delegate Assessment A and Assessment B to separate sub-agents. They must not see each other's output. Do not show findings to the user until synthesis.
|
||||
|
||||
Codex sub-agent gate:
|
||||
Sub-agent gate (all harnesses):
|
||||
- Unless a harness-specific gate below overrides this, spawn A and B as two isolated, parallel sub-agents whenever a sub-agent/Task tool is exposed. This is the default and is mandatory; do not run them inline because it is faster.
|
||||
- "Unavailable" means exactly one thing: no sub-agent/Task tool is exposed in this session (or, on harnesses that ask, the user declined). It does not mean inconvenient.
|
||||
- If and only if sub-agents are unavailable, fall back sequentially: finish and record Assessment A, then run Assessment B, then synthesize, and emit the degraded banner.
|
||||
- Whichever path you take, declare it in the report header (see Report header provenance). Skipping sub-agents without the banner is the most common failure of this command.
|
||||
|
||||
Codex sub-agent gate (overrides the default above; Codex's permission model requires asking before spawning):
|
||||
- Asking is the normal path, not a degradation. Approving and spawning is the dual-agent path; do not emit the degraded banner just for asking.
|
||||
- If `spawn_agent` is exposed and the user explicitly allowed sub-agents, delegation, or parallel agent work, spawn A and B immediately.
|
||||
- If `spawn_agent` is exposed but the user did not explicitly allow sub-agents, ask exactly once: "Impeccable critique is designed to run two independent sub-agents for an unanchored assessment. May I use sub-agents for this critique?" Then stop until the user answers.
|
||||
- If allowed, spawn A and B. If declined, run sequentially and report `Assessment independence: degraded (sub-agents declined by user)`.
|
||||
- If `spawn_agent` is not exposed, do not ask; run sequentially and report `Assessment independence: degraded (spawn_agent unavailable in this session)`.
|
||||
- If spawning fails after permission, run sequentially and report `Assessment independence: degraded (sub-agent spawn failed: <exact error>)`.
|
||||
- If allowed, spawn A and B. If declined, run sequentially and lead the report with `⚠️ DEGRADED: single-context (sub-agents declined by user)`.
|
||||
- If `spawn_agent` is not exposed, do not ask; run sequentially and lead with `⚠️ DEGRADED: single-context (spawn_agent unavailable in this session)`.
|
||||
- If spawning fails after permission, run sequentially and lead with `⚠️ DEGRADED: single-context (sub-agent spawn failed: <exact error>)`.
|
||||
Prefer `fork_context: false` with self-contained prompts containing cwd, target, live URL, references, product context, and output contract. If using `fork_context: true`, omit `agent_type`, `model`, and `reasoning_effort`.
|
||||
|
||||
If browser automation is available, each assessment creates its own new tab. Never reuse an existing tab, even if it is already at the right URL.
|
||||
@@ -69,7 +77,7 @@ node .agents/skills/impeccable/scripts/detect.mjs --json [target]
|
||||
|
||||
Browser visualization is required for a viewable target when browser automation is available. Use a localhost dev/static URL for local files; avoid `file://` unless the available browser explicitly supports this workflow. Overlay flow:
|
||||
|
||||
1. Create a fresh tab and navigate.
|
||||
1. Create a fresh tab and navigate. Prefer the harness's native/browser-canvas screenshot path before hand-rolling a Playwright/Puppeteer script; only fall back to a custom script when no native browser tool is exposed.
|
||||
2. Preflight mutable injection by setting `document.title` and appending a `<script>` tag. Read-only evaluate APIs do not count.
|
||||
3. If mutation is unavailable, skip live server, browser presentation, and injection; report fallback signal.
|
||||
4. If mutation is available, start `node .agents/skills/impeccable/scripts/live-server.mjs --background`, present the browser if supported, label `[Human]`, scroll top, inject `http://localhost:PORT/detect.js`, wait 2-3 seconds, read `impeccable` console messages, then stop the live server.
|
||||
@@ -93,6 +101,12 @@ Codex final-answer note: `$impeccable critique` produces a report artifact, so t
|
||||
|
||||
Structure your feedback as a design director would:
|
||||
|
||||
#### Report header provenance
|
||||
|
||||
The report's first line MUST declare how the assessments were run, so a degraded run is never silent:
|
||||
- Dual-agent: `Method: dual-agent (A: <agent-id> · B: <agent-id>)`
|
||||
- Degraded: `⚠️ DEGRADED: single-context (<reason, e.g. no sub-agent tool exposed>)`
|
||||
|
||||
#### Design Health Score
|
||||
> *Consult the [Heuristics Scoring Guide](#heuristics-scoring-guide) section below.*
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Generate a `DESIGN.md` file at the project root that captures the current visual design system, so AI agents generating new screens stay on-brand.
|
||||
|
||||
DESIGN.md follows the [official Google Stitch DESIGN.md format](https://stitch.withgoogle.com/docs/design-md/format/): YAML frontmatter carrying machine-readable design tokens, followed by a markdown body with exactly six sections in a fixed order. **Tokens are normative; prose provides context for how to apply them.** Sections may be omitted when not relevant, but **do not reorder them and do not rename them**. Section headers must match the spec character-for-character so the file stays parseable by other DESIGN.md-aware tools (Stitch itself, awesome-design-md, skill-rest, etc.).
|
||||
DESIGN.md follows the [official DESIGN.md format spec](https://raw.githubusercontent.com/google-labs-code/design.md/main/docs/spec.md): YAML frontmatter carrying machine-readable design tokens, followed by a markdown body with exactly six sections in a fixed order. **Tokens are normative; prose provides context for how to apply them.** Sections may be omitted when not relevant, but **do not reorder them and do not rename them**. Section headers must match the spec character-for-character so the file stays parseable by other DESIGN.md-aware tools (Stitch itself, awesome-design-md, skill-rest, etc.).
|
||||
|
||||
## The frontmatter: token schema
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
The setup command for a project. One codebase crawl feeds everything it writes:
|
||||
|
||||
- **PRODUCT.md** (strategic): root project file for register, target users, product purpose, brand personality, anti-references, strategic design principles. Answers "who/what/why".
|
||||
- **DESIGN.md** (visual): root project file for visual theme, color palette, typography, components, layout. Follows the [Google Stitch DESIGN.md format](https://stitch.withgoogle.com/docs/design-md/format/). Answers "how it looks".
|
||||
- **DESIGN.md** (visual): root project file for visual theme, color palette, typography, components, layout. Follows the [DESIGN.md format spec](https://raw.githubusercontent.com/google-labs-code/design.md/main/docs/spec.md). Answers "how it looks".
|
||||
- **`.impeccable/live/config.json`** (live mode): pre-configured so `$impeccable live` boots straight into variant mode with no first-time detour.
|
||||
|
||||
It closes by pointing the user at the best command to run next. Every other impeccable command reads PRODUCT.md and DESIGN.md before doing any work.
|
||||
|
||||
@@ -478,6 +478,17 @@ const ANTIPATTERNS = [
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'repeating-gradient decorative stripes',
|
||||
},
|
||||
{
|
||||
id: 'codex-grid-background',
|
||||
category: 'slop',
|
||||
severity: 'advisory',
|
||||
gated: 'gpt',
|
||||
name: 'Decorative grid-line background',
|
||||
description:
|
||||
'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) is a recurring generated-UI signature. Reserve grid overlays for actual canvas, map, blueprint, or measurement surfaces; elsewhere use product structure or a plain surface.',
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'two-axis grid-line gradient background',
|
||||
},
|
||||
{
|
||||
id: 'theater-slop-phrase',
|
||||
category: 'slop',
|
||||
@@ -1172,6 +1183,42 @@ function checkHtmlPatterns(html) {
|
||||
findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' });
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): two-axis grid-line background (Codex/GPT) ---
|
||||
// The Codex grid tell is two hairline `linear-gradient(... <color> 1px,
|
||||
// transparent 1px)` layers (one per axis) tiled by a repeating
|
||||
// `background-size` cell. Both signals must co-occur in the SAME style block
|
||||
// (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a
|
||||
// tiling background-size is a fixed crosshair, not a grid, and a single
|
||||
// hairline is a legitimate ruled line. Scoping to one block also stops
|
||||
// unrelated single-axis rules on separate elements from adding up across the
|
||||
// page. Count hairlines only inside `background`/`background-image` values so
|
||||
// a hairline in an unrelated property (mask-image, border-image) can't stand
|
||||
// in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry
|
||||
// nested parens, so match the hairline stop directly rather than parsing
|
||||
// whole gradient layers.
|
||||
{
|
||||
const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi;
|
||||
const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i;
|
||||
const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi;
|
||||
const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi;
|
||||
let blk;
|
||||
while ((blk = blockRe.exec(html)) !== null) {
|
||||
const block = blk[1] || blk[2] || blk[3] || '';
|
||||
if (!gridSizeRe.test(block)) continue;
|
||||
let hairlineCount = 0;
|
||||
let bm;
|
||||
bgDeclRe.lastIndex = 0;
|
||||
while ((bm = bgDeclRe.exec(block)) !== null) {
|
||||
const stops = bm[1].match(hairlineRe);
|
||||
if (stops) hairlineCount += stops.length;
|
||||
}
|
||||
if (hairlineCount >= 2) {
|
||||
findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' });
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): "X theater" framing copy (GPT) ---
|
||||
// Lives here (regex-on-HTML) rather than in the text-content analyzers so it
|
||||
// runs in the bundled browser path too, not just the CLI/static path.
|
||||
|
||||
@@ -376,6 +376,17 @@ const ANTIPATTERNS = [
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'repeating-gradient decorative stripes',
|
||||
},
|
||||
{
|
||||
id: 'codex-grid-background',
|
||||
category: 'slop',
|
||||
severity: 'advisory',
|
||||
gated: 'gpt',
|
||||
name: 'Decorative grid-line background',
|
||||
description:
|
||||
'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) is a recurring generated-UI signature. Reserve grid overlays for actual canvas, map, blueprint, or measurement surfaces; elsewhere use product structure or a plain surface.',
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'two-axis grid-line gradient background',
|
||||
},
|
||||
{
|
||||
id: 'theater-slop-phrase',
|
||||
category: 'slop',
|
||||
|
||||
@@ -573,6 +573,42 @@ function checkHtmlPatterns(html) {
|
||||
findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' });
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): two-axis grid-line background (Codex/GPT) ---
|
||||
// The Codex grid tell is two hairline `linear-gradient(... <color> 1px,
|
||||
// transparent 1px)` layers (one per axis) tiled by a repeating
|
||||
// `background-size` cell. Both signals must co-occur in the SAME style block
|
||||
// (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a
|
||||
// tiling background-size is a fixed crosshair, not a grid, and a single
|
||||
// hairline is a legitimate ruled line. Scoping to one block also stops
|
||||
// unrelated single-axis rules on separate elements from adding up across the
|
||||
// page. Count hairlines only inside `background`/`background-image` values so
|
||||
// a hairline in an unrelated property (mask-image, border-image) can't stand
|
||||
// in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry
|
||||
// nested parens, so match the hairline stop directly rather than parsing
|
||||
// whole gradient layers.
|
||||
{
|
||||
const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi;
|
||||
const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i;
|
||||
const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi;
|
||||
const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi;
|
||||
let blk;
|
||||
while ((blk = blockRe.exec(html)) !== null) {
|
||||
const block = blk[1] || blk[2] || blk[3] || '';
|
||||
if (!gridSizeRe.test(block)) continue;
|
||||
let hairlineCount = 0;
|
||||
let bm;
|
||||
bgDeclRe.lastIndex = 0;
|
||||
while ((bm = bgDeclRe.exec(block)) !== null) {
|
||||
const stops = bm[1].match(hairlineRe);
|
||||
if (stops) hairlineCount += stops.length;
|
||||
}
|
||||
if (hairlineCount >= 2) {
|
||||
findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' });
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): "X theater" framing copy (GPT) ---
|
||||
// Lives here (regex-on-HTML) rather than in the text-content analyzers so it
|
||||
// runs in the bundled browser path too, not just the CLI/static path.
|
||||
|
||||
@@ -75,7 +75,6 @@ const HOOK_MANIFEST_TARGETS = [
|
||||
skillRel: '.agents/skills/impeccable',
|
||||
destRel: '.codex/hooks.json',
|
||||
manifest: () => ({
|
||||
description: 'Impeccable design detector: runs after Edit/Write/apply_patch on UI files and surfaces findings as system reminders.',
|
||||
hooks: {
|
||||
PostToolUse: [
|
||||
{
|
||||
@@ -83,7 +82,7 @@ const HOOK_MANIFEST_TARGETS = [
|
||||
hooks: [
|
||||
{
|
||||
type: 'command',
|
||||
command: 'node "$(git rev-parse --show-toplevel)/.agents/skills/impeccable/scripts/hook.mjs"',
|
||||
command: 'node ".agents/skills/impeccable/scripts/hook.mjs"',
|
||||
timeout: TIMEOUT_SECONDS,
|
||||
statusMessage: STATUS_MESSAGE,
|
||||
},
|
||||
|
||||
@@ -7928,7 +7928,7 @@ void main() {
|
||||
const barTopFromBottom = barRect && barRect.height > 0
|
||||
? Math.max(16, window.innerHeight - barRect.top + 12)
|
||||
: 16;
|
||||
toastEl = el('div', {
|
||||
const currentToast = el('div', {
|
||||
position: 'fixed', bottom: barTopFromBottom + 'px', left: '50%',
|
||||
transform: 'translateX(-50%) translateY(8px)',
|
||||
background: C.ink, color: C.white,
|
||||
@@ -7938,19 +7938,24 @@ void main() {
|
||||
transition: 'opacity 0.25s ' + EASE + ', transform 0.25s ' + EASE,
|
||||
pointerEvents: 'none', maxWidth: '420px', textAlign: 'center',
|
||||
});
|
||||
toastEl.id = PREFIX + '-toast';
|
||||
toastEl.textContent = message;
|
||||
uiAppend(toastEl);
|
||||
toastEl = currentToast;
|
||||
currentToast.id = PREFIX + '-toast';
|
||||
currentToast.textContent = message;
|
||||
uiAppend(currentToast);
|
||||
requestAnimationFrame(() => {
|
||||
toastEl.style.opacity = '1';
|
||||
toastEl.style.transform = 'translateX(-50%) translateY(0)';
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.style.opacity = '1';
|
||||
currentToast.style.transform = 'translateX(-50%) translateY(0)';
|
||||
});
|
||||
setTimeout(() => {
|
||||
if (toastEl) {
|
||||
toastEl.style.opacity = '0';
|
||||
toastEl.style.transform = 'translateX(-50%) translateY(8px)';
|
||||
setTimeout(() => { if (toastEl) { toastEl.remove(); toastEl = null; } }, 250);
|
||||
}
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.style.opacity = '0';
|
||||
currentToast.style.transform = 'translateX(-50%) translateY(8px)';
|
||||
setTimeout(() => {
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.remove();
|
||||
toastEl = null;
|
||||
}, 250);
|
||||
}, duration);
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
{
|
||||
"name": "impeccable",
|
||||
"description": "Design fluency for frontend development. 1 skill with 23 commands (/impeccable polish, /impeccable audit, /impeccable critique, etc.) and curated anti-pattern detection.",
|
||||
"version": "3.8.0",
|
||||
"version": "3.9.1",
|
||||
"author": {
|
||||
"name": "Paul Bakaus",
|
||||
"email": "paul@paulbakaus.com"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "impeccable",
|
||||
"description": "Design fluency for frontend development. 1 skill with 23 commands (/impeccable polish, /impeccable audit, /impeccable critique, etc.) and curated anti-pattern detection.",
|
||||
"version": "3.8.0",
|
||||
"version": "3.9.1",
|
||||
"author": {
|
||||
"name": "Paul Bakaus",
|
||||
"email": "paul@paulbakaus.com"
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
---
|
||||
name: impeccable
|
||||
description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks.
|
||||
version: 3.8.0
|
||||
version: 3.9.1
|
||||
user-invocable: true
|
||||
argument-hint: "[craft|shape · audit|critique · animate|bolder|colorize|delight|layout|overdrive|quieter|typeset · adapt|clarify|distill · harden|onboard|optimize|polish · init|document|extract|live] [target]"
|
||||
license: Apache 2.0
|
||||
allowed-tools:
|
||||
- Bash(npx impeccable *)
|
||||
- Bash(node .claude/skills/impeccable/scripts/*)
|
||||
---
|
||||
|
||||
Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft.
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
When asked for "bolder," AI defaults to the same tired tricks: cyan/purple gradients, glassmorphism, neon accents on dark backgrounds, gradient text on metrics. These are the opposite of bold. Reject them first, then increase visual impact and personality through stronger hierarchy, committed scale, and decisive type.
|
||||
When asked for "bolder," AI defaults to the same tired tricks: cyan/purple gradients, glassmorphism, neon accents on dark backgrounds, gradient text on metrics. These are the opposite of bold. Reject them first, then increase visual impact by making the existing design language more decisive, specific, and committed.
|
||||
|
||||
---
|
||||
|
||||
## Register
|
||||
|
||||
Brand: "bolder" means distinctive. Extreme scale, unexpected color, typographic risk, committed POV.
|
||||
Brand: "bolder" means distinctive. Express a stronger point of view through hierarchy, pacing, proportion, copy, evidence, and one committed visual idea.
|
||||
|
||||
Product: "bolder" rarely means theatrics; those undermine trust. It means stronger hierarchy, clearer weight contrast, one sharper accent, more committed density. The amplification is in clarity, not drama.
|
||||
Product: "bolder" rarely means theatrics; those undermine trust. It means stronger hierarchy, clearer weight contrast, sharper information density, and more decisive prioritization. The amplification is in clarity, not drama.
|
||||
|
||||
---
|
||||
|
||||
@@ -15,98 +15,105 @@ Product: "bolder" rarely means theatrics; those undermine trust. It means strong
|
||||
Analyze what makes the design feel too safe or boring:
|
||||
|
||||
1. **Identify weakness sources**:
|
||||
- **Generic choices**: System fonts, basic colors, standard layouts
|
||||
- **Timid scale**: Everything is medium-sized with no drama
|
||||
- **Low contrast**: Everything has similar visual weight
|
||||
- **Static**: No motion, no energy, no life
|
||||
- **Predictable**: Standard patterns with no surprises
|
||||
- **Flat hierarchy**: Nothing stands out or commands attention
|
||||
- **Generic choices**: The page could belong to any product in the category.
|
||||
- **Timid scale**: Everything is medium-sized with no clear lead.
|
||||
- **Low contrast**: Important and supporting elements have similar visual weight.
|
||||
- **Static**: The surface has no meaningful moment of emphasis.
|
||||
- **Predictable**: The composition follows a default pattern without a point of view.
|
||||
- **Flat hierarchy**: Nothing stands out or commands attention.
|
||||
|
||||
2. **Understand the context**:
|
||||
- What's the brand personality? (How far can we push?)
|
||||
- What's the purpose? (Marketing can be bolder than financial dashboards)
|
||||
- Who's the audience? (What will resonate?)
|
||||
- What are the constraints? (Brand guidelines, accessibility, performance)
|
||||
- What is the brand personality?
|
||||
- What is the purpose of this surface?
|
||||
- Who is the audience?
|
||||
- What design system, tokens, components, and visual conventions already exist?
|
||||
|
||||
If any of these are unclear from the codebase, STOP and call the AskUserQuestion tool to clarify.
|
||||
|
||||
**CRITICAL**: "Bolder" doesn't mean chaotic or garish. It means distinctive, memorable, and confident. Think intentional drama, not random chaos.
|
||||
**CRITICAL**: "Bolder" does not mean chaotic or garish. It means distinctive, memorable, and confident. Think intentional drama, not random noise.
|
||||
|
||||
**WARNING - AI SLOP TRAP**: Review ALL the DON'T guidelines from the parent impeccable skill (already loaded in this context) before proceeding. Bold means distinctive, not "more effects."
|
||||
|
||||
## Design-System Lock
|
||||
|
||||
If the project has `DESIGN.md`, tokens, theme variables, or established component styles, treat that system as the boundary. Make the existing language stronger before adding new language.
|
||||
|
||||
Do not invent new colors, gradients, radii, shadows, fonts, decorative backgrounds, or effects just because the request says "bolder." A bolder pass should usually change emphasis, proportion, rhythm, density, contrast, copy, artifact specificity, and layout relationships while staying inside the documented system.
|
||||
|
||||
If the existing system is genuinely too limited to express the bolder direction, stop and ask the user before expanding it. Name the exact additions, the role each would play, and why the current system cannot do the job. If the user approves expansion, update the design system or tokens alongside the implementation.
|
||||
|
||||
## Plan Amplification
|
||||
|
||||
Create a strategy to increase impact while maintaining coherence:
|
||||
|
||||
- **Focal point**: What should be the hero moment? (Pick ONE, make it amazing)
|
||||
- **Personality direction**: Maximalist chaos? Elegant drama? Playful energy? Dark moody? Choose a lane.
|
||||
- **Risk budget**: How experimental can we be? Push boundaries within constraints.
|
||||
- **Hierarchy amplification**: Make big things BIGGER, small things smaller (increase contrast)
|
||||
- **Focal point**: Pick one thing the viewer should remember, then make the rest support it.
|
||||
- **System levers**: Identify which existing tokens, components, layout patterns, and copy structures can carry more weight.
|
||||
- **Risk budget**: Decide how far the surface can push while still feeling like the same product or brand.
|
||||
- **Hierarchy amplification**: Increase contrast between primary, secondary, and tertiary content instead of making every element louder.
|
||||
|
||||
**IMPORTANT**: Bold design must still be usable. Impact without function is just decoration.
|
||||
|
||||
## Amplify the Design
|
||||
|
||||
Systematically increase impact across these dimensions:
|
||||
Systematically increase impact through intention, not a menu of effects:
|
||||
|
||||
### Typography Amplification
|
||||
- **Replace generic fonts**: Swap system fonts for distinctive choices (see the parent skill's typography guidelines and the [Reference Material section of typeset.md](typeset.md#reference-material) for inspiration)
|
||||
- **Extreme scale**: Create dramatic size jumps (3x-5x differences, not 1.5x)
|
||||
- **Weight contrast**: Pair 900 weights with 200 weights, not 600 with 400
|
||||
- **Unexpected choices**: Variable fonts, display fonts for headlines, condensed/extended widths, monospace as intentional accent (not as lazy "dev tool" default)
|
||||
- Strengthen the existing type hierarchy before changing typefaces.
|
||||
- Make important text meaningfully more dominant, and make supporting text quieter.
|
||||
- Use weight, measure, spacing, and line breaks to sharpen the point of view.
|
||||
- Add or replace fonts only after user-approved design-system expansion.
|
||||
|
||||
### Color Intensification
|
||||
- **Increase saturation**: Shift to more vibrant, energetic colors (but not neon)
|
||||
- **Bold palette**: Introduce unexpected color combinations. Avoid the purple-blue gradient AI slop
|
||||
- **Dominant color strategy**: Let one bold color own 60% of the design
|
||||
- **Sharp accents**: High-contrast accent colors that pop
|
||||
- **Tinted neutrals**: Replace pure grays with tinted grays that harmonize with your palette
|
||||
- **Rich gradients**: Intentional multi-stop gradients (not generic purple-to-blue)
|
||||
### Color Amplification
|
||||
- Use the existing palette more decisively before adding colors.
|
||||
- Shift the proportion, placement, and contrast of documented colors to clarify meaning.
|
||||
- Treat any new color, gradient, or tint ramp as a design-system expansion that requires user approval.
|
||||
- Keep color tied to hierarchy, state, or brand meaning; do not use it as surface decoration.
|
||||
|
||||
### Spatial Drama
|
||||
- **Extreme scale jumps**: Make important elements 3-5x larger than surroundings
|
||||
- **Break the grid**: Let hero elements escape containers and cross boundaries
|
||||
- **Asymmetric layouts**: Replace centered, balanced layouts with tension-filled asymmetry
|
||||
- **Generous space**: Use white space dramatically (100-200px gaps, not 20-40px)
|
||||
- **Overlap**: Layer elements intentionally for depth
|
||||
### Spatial Amplification
|
||||
- Change proportion, density, alignment, and sequencing so the composition has a stronger point of view.
|
||||
- Create clearer contrast between dense evidence and open breathing room.
|
||||
- Let layout express priority and narrative order before adding ornament.
|
||||
- Preserve responsive behavior and avoid text overflow at every breakpoint.
|
||||
|
||||
### Visual Effects
|
||||
- **Dramatic shadows**: Large, soft shadows for elevation (but not generic drop shadows on rounded rectangles)
|
||||
- **Background treatments**: Mesh patterns, noise textures, geometric patterns, intentional gradients (not purple-to-blue)
|
||||
- **Texture & depth**: Grain, halftone, duotone, layered elements. NOT glassmorphism (it's overused AI slop)
|
||||
- **Borders & frames**: Thick borders, decorative frames, custom shapes (not rounded rectangles with colored border on one side)
|
||||
- **Custom elements**: Illustrative elements, custom icons, decorative details that reinforce brand
|
||||
### Surface Amplification
|
||||
- Use existing surface, border, radius, and shadow rules more deliberately.
|
||||
- Remove timid half-measures: either give an element a clear role or simplify it.
|
||||
- Add texture, depth, illustration, or decorative treatments only when already established by the system or explicitly approved.
|
||||
- Make real product artifacts, imagery, data, or copy carry attention before reaching for effects.
|
||||
|
||||
### Motion & Animation
|
||||
- **Hero moment**: One signature entrance, once. Not on every visit and not on every section.
|
||||
- **Micro-interactions**: Satisfying hover effects, click feedback, state changes.
|
||||
- **Transitions**: Smooth, noticeable transitions using ease-out-quart/quint/expo (not bounce or elastic, which cheapen the effect).
|
||||
- **Bolder ≠ scroll-fade-rise on every section.** That's the saturated AI default, the opposite of bold.
|
||||
- Design one meaningful moment of emphasis when motion genuinely supports the point.
|
||||
- Make interaction feedback feel more decisive without becoming distracting.
|
||||
- Keep transitions smooth and intentional.
|
||||
- **Bolder != scroll-fade-rise on every section.** That's the saturated AI default, the opposite of bold.
|
||||
|
||||
### Composition Boldness
|
||||
- **Hero moments**: Create clear focal points with dramatic treatment
|
||||
- **Diagonal flows**: Escape horizontal/vertical rigidity with diagonal arrangements
|
||||
- **Full-bleed elements**: Use full viewport width/height for impact
|
||||
- **Unexpected proportions**: Golden ratio? Throw it out. Try 70/30, 80/20 splits
|
||||
- Make the dominant idea unmistakable.
|
||||
- Use layout tension, sequencing, contrast, and restraint to create a stronger read.
|
||||
- Let the page's structure communicate priority before adding decorative layers.
|
||||
- If every element is louder, the composition is not bolder; it is flatter.
|
||||
|
||||
**NEVER**:
|
||||
- Add effects randomly without purpose (chaos ≠ bold)
|
||||
- Sacrifice readability for aesthetics (body text must be readable)
|
||||
- Make everything bold (then nothing is bold; you need contrast)
|
||||
- Ignore accessibility (bold design must still meet WCAG standards)
|
||||
- Overwhelm with motion (animation fatigue is real)
|
||||
- Copy trendy aesthetics blindly (bold means distinctive, not derivative)
|
||||
- Add undocumented design-system primitives without user approval
|
||||
- Add effects randomly without purpose
|
||||
- Hide weak hierarchy behind decoration
|
||||
- Sacrifice readability for aesthetics
|
||||
- Make everything bold; contrast is the point
|
||||
- Ignore accessibility
|
||||
- Overwhelm with motion
|
||||
- Copy trendy aesthetics blindly
|
||||
|
||||
## Verify Quality
|
||||
|
||||
Ensure amplification maintains usability and coherence:
|
||||
|
||||
- **System-faithful**: Did the pass make the existing design language stronger before adding anything new?
|
||||
- **No undocumented drift**: Are new colors, gradients, shadows, radii, fonts, and effects either absent or explicitly approved and documented?
|
||||
- **NOT AI slop**: Does this look like every other AI-generated "bold" design? If yes, start over.
|
||||
- **Still functional**: Can users accomplish tasks without distraction?
|
||||
- **Coherent**: Does everything feel intentional and unified?
|
||||
- **Memorable**: Will users remember this experience?
|
||||
- **Performant**: Do all these effects run smoothly?
|
||||
- **Accessible**: Does it still meet accessibility standards?
|
||||
- **Memorable**: Will users remember this experience for the intended reason?
|
||||
- **Performant and accessible**: Does the result stay fast, readable, responsive, and WCAG-conscious?
|
||||
|
||||
**The test**: If you showed this to someone and said "AI made this bolder," would they believe you immediately? If yes, you've failed. Bold means distinctive, not "more AI effects."
|
||||
|
||||
|
||||
@@ -5,8 +5,9 @@ Resolve one stable target, run two independent assessments, synthesize a design
|
||||
### Hard Invariants
|
||||
|
||||
- Assessment A (design review) and Assessment B (detector/browser evidence) are both required.
|
||||
- Assessment A and B MUST run as two isolated sub-agents whenever a sub-agent/Task tool is exposed. Running them inline in this context is "possible" but is NOT permitted; it is a degraded run. Inline is allowed ONLY when no sub-agent tool exists (or the user declined, on harnesses that ask).
|
||||
- If you degrade for any reason, the report's first line MUST be a banner: `⚠️ DEGRADED: single-context (<reason>)`. A silent degraded critique is a failed critique.
|
||||
- Assessment A must finish before detector findings enter the parent synthesis context. Detector output is deterministic, but it still anchors judgment.
|
||||
- If sub-agents are unavailable, fall back sequentially: finish and record Assessment A first, then run Assessment B, then synthesize.
|
||||
- A skipped detector is a failed critique run unless `detect.mjs` is missing or crashes after a real attempt.
|
||||
- Viewable targets require browser inspection when available.
|
||||
- Any local server started only for critique visualization must run in the background, have a recorded stop method, and be stopped before final reporting unless the user asks to keep it.
|
||||
@@ -27,7 +28,13 @@ Resolve one stable target, run two independent assessments, synthesize a design
|
||||
|
||||
### Assessment Orchestration
|
||||
|
||||
Delegate Assessment A and Assessment B to separate sub-agents when possible. They must not see each other's output. Do not show findings to the user until synthesis.
|
||||
Delegate Assessment A and Assessment B to separate sub-agents. They must not see each other's output. Do not show findings to the user until synthesis.
|
||||
|
||||
Sub-agent gate (all harnesses):
|
||||
- Unless a harness-specific gate below overrides this, spawn A and B as two isolated, parallel sub-agents whenever a sub-agent/Task tool is exposed. This is the default and is mandatory; do not run them inline because it is faster.
|
||||
- "Unavailable" means exactly one thing: no sub-agent/Task tool is exposed in this session (or, on harnesses that ask, the user declined). It does not mean inconvenient.
|
||||
- If and only if sub-agents are unavailable, fall back sequentially: finish and record Assessment A, then run Assessment B, then synthesize, and emit the degraded banner.
|
||||
- Whichever path you take, declare it in the report header (see Report header provenance). Skipping sub-agents without the banner is the most common failure of this command.
|
||||
|
||||
If browser automation is available, each assessment creates its own new tab. Never reuse an existing tab, even if it is already at the right URL.
|
||||
|
||||
@@ -61,7 +68,7 @@ node .claude/skills/impeccable/scripts/detect.mjs --json [target]
|
||||
|
||||
Browser visualization is required for a viewable target when browser automation is available. Use a localhost dev/static URL for local files; avoid `file://` unless the available browser explicitly supports this workflow. Overlay flow:
|
||||
|
||||
1. Create a fresh tab and navigate.
|
||||
1. Create a fresh tab and navigate. Prefer the harness's native/browser-canvas screenshot path before hand-rolling a Playwright/Puppeteer script; only fall back to a custom script when no native browser tool is exposed.
|
||||
2. Preflight mutable injection by setting `document.title` and appending a `<script>` tag. Read-only evaluate APIs do not count.
|
||||
3. If mutation is unavailable, skip live server, browser presentation, and injection; report fallback signal.
|
||||
4. If mutation is available, start `node .claude/skills/impeccable/scripts/live-server.mjs --background`, present the browser if supported, label `[Human]`, scroll top, inject `http://localhost:PORT/detect.js`, wait 2-3 seconds, read `impeccable` console messages, then stop the live server.
|
||||
@@ -79,6 +86,12 @@ The chat response is the primary user-facing deliverable. Present the full struc
|
||||
|
||||
Structure your feedback as a design director would:
|
||||
|
||||
#### Report header provenance
|
||||
|
||||
The report's first line MUST declare how the assessments were run, so a degraded run is never silent:
|
||||
- Dual-agent: `Method: dual-agent (A: <agent-id> · B: <agent-id>)`
|
||||
- Degraded: `⚠️ DEGRADED: single-context (<reason, e.g. no sub-agent tool exposed>)`
|
||||
|
||||
#### Design Health Score
|
||||
> *Consult the [Heuristics Scoring Guide](#heuristics-scoring-guide) section below.*
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Generate a `DESIGN.md` file at the project root that captures the current visual design system, so AI agents generating new screens stay on-brand.
|
||||
|
||||
DESIGN.md follows the [official Google Stitch DESIGN.md format](https://stitch.withgoogle.com/docs/design-md/format/): YAML frontmatter carrying machine-readable design tokens, followed by a markdown body with exactly six sections in a fixed order. **Tokens are normative; prose provides context for how to apply them.** Sections may be omitted when not relevant, but **do not reorder them and do not rename them**. Section headers must match the spec character-for-character so the file stays parseable by other DESIGN.md-aware tools (Stitch itself, awesome-design-md, skill-rest, etc.).
|
||||
DESIGN.md follows the [official DESIGN.md format spec](https://raw.githubusercontent.com/google-labs-code/design.md/main/docs/spec.md): YAML frontmatter carrying machine-readable design tokens, followed by a markdown body with exactly six sections in a fixed order. **Tokens are normative; prose provides context for how to apply them.** Sections may be omitted when not relevant, but **do not reorder them and do not rename them**. Section headers must match the spec character-for-character so the file stays parseable by other DESIGN.md-aware tools (Stitch itself, awesome-design-md, skill-rest, etc.).
|
||||
|
||||
## The frontmatter: token schema
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
The setup command for a project. One codebase crawl feeds everything it writes:
|
||||
|
||||
- **PRODUCT.md** (strategic): root project file for register, target users, product purpose, brand personality, anti-references, strategic design principles. Answers "who/what/why".
|
||||
- **DESIGN.md** (visual): root project file for visual theme, color palette, typography, components, layout. Follows the [Google Stitch DESIGN.md format](https://stitch.withgoogle.com/docs/design-md/format/). Answers "how it looks".
|
||||
- **DESIGN.md** (visual): root project file for visual theme, color palette, typography, components, layout. Follows the [DESIGN.md format spec](https://raw.githubusercontent.com/google-labs-code/design.md/main/docs/spec.md). Answers "how it looks".
|
||||
- **`.impeccable/live/config.json`** (live mode): pre-configured so `/impeccable live` boots straight into variant mode with no first-time detour.
|
||||
|
||||
It closes by pointing the user at the best command to run next. Every other impeccable command reads PRODUCT.md and DESIGN.md before doing any work.
|
||||
|
||||
@@ -478,6 +478,17 @@ const ANTIPATTERNS = [
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'repeating-gradient decorative stripes',
|
||||
},
|
||||
{
|
||||
id: 'codex-grid-background',
|
||||
category: 'slop',
|
||||
severity: 'advisory',
|
||||
gated: 'gpt',
|
||||
name: 'Decorative grid-line background',
|
||||
description:
|
||||
'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) is a recurring generated-UI signature. Reserve grid overlays for actual canvas, map, blueprint, or measurement surfaces; elsewhere use product structure or a plain surface.',
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'two-axis grid-line gradient background',
|
||||
},
|
||||
{
|
||||
id: 'theater-slop-phrase',
|
||||
category: 'slop',
|
||||
@@ -1172,6 +1183,42 @@ function checkHtmlPatterns(html) {
|
||||
findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' });
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): two-axis grid-line background (Codex/GPT) ---
|
||||
// The Codex grid tell is two hairline `linear-gradient(... <color> 1px,
|
||||
// transparent 1px)` layers (one per axis) tiled by a repeating
|
||||
// `background-size` cell. Both signals must co-occur in the SAME style block
|
||||
// (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a
|
||||
// tiling background-size is a fixed crosshair, not a grid, and a single
|
||||
// hairline is a legitimate ruled line. Scoping to one block also stops
|
||||
// unrelated single-axis rules on separate elements from adding up across the
|
||||
// page. Count hairlines only inside `background`/`background-image` values so
|
||||
// a hairline in an unrelated property (mask-image, border-image) can't stand
|
||||
// in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry
|
||||
// nested parens, so match the hairline stop directly rather than parsing
|
||||
// whole gradient layers.
|
||||
{
|
||||
const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi;
|
||||
const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i;
|
||||
const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi;
|
||||
const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi;
|
||||
let blk;
|
||||
while ((blk = blockRe.exec(html)) !== null) {
|
||||
const block = blk[1] || blk[2] || blk[3] || '';
|
||||
if (!gridSizeRe.test(block)) continue;
|
||||
let hairlineCount = 0;
|
||||
let bm;
|
||||
bgDeclRe.lastIndex = 0;
|
||||
while ((bm = bgDeclRe.exec(block)) !== null) {
|
||||
const stops = bm[1].match(hairlineRe);
|
||||
if (stops) hairlineCount += stops.length;
|
||||
}
|
||||
if (hairlineCount >= 2) {
|
||||
findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' });
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): "X theater" framing copy (GPT) ---
|
||||
// Lives here (regex-on-HTML) rather than in the text-content analyzers so it
|
||||
// runs in the bundled browser path too, not just the CLI/static path.
|
||||
|
||||
@@ -376,6 +376,17 @@ const ANTIPATTERNS = [
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'repeating-gradient decorative stripes',
|
||||
},
|
||||
{
|
||||
id: 'codex-grid-background',
|
||||
category: 'slop',
|
||||
severity: 'advisory',
|
||||
gated: 'gpt',
|
||||
name: 'Decorative grid-line background',
|
||||
description:
|
||||
'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) is a recurring generated-UI signature. Reserve grid overlays for actual canvas, map, blueprint, or measurement surfaces; elsewhere use product structure or a plain surface.',
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'two-axis grid-line gradient background',
|
||||
},
|
||||
{
|
||||
id: 'theater-slop-phrase',
|
||||
category: 'slop',
|
||||
|
||||
@@ -573,6 +573,42 @@ function checkHtmlPatterns(html) {
|
||||
findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' });
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): two-axis grid-line background (Codex/GPT) ---
|
||||
// The Codex grid tell is two hairline `linear-gradient(... <color> 1px,
|
||||
// transparent 1px)` layers (one per axis) tiled by a repeating
|
||||
// `background-size` cell. Both signals must co-occur in the SAME style block
|
||||
// (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a
|
||||
// tiling background-size is a fixed crosshair, not a grid, and a single
|
||||
// hairline is a legitimate ruled line. Scoping to one block also stops
|
||||
// unrelated single-axis rules on separate elements from adding up across the
|
||||
// page. Count hairlines only inside `background`/`background-image` values so
|
||||
// a hairline in an unrelated property (mask-image, border-image) can't stand
|
||||
// in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry
|
||||
// nested parens, so match the hairline stop directly rather than parsing
|
||||
// whole gradient layers.
|
||||
{
|
||||
const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi;
|
||||
const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i;
|
||||
const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi;
|
||||
const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi;
|
||||
let blk;
|
||||
while ((blk = blockRe.exec(html)) !== null) {
|
||||
const block = blk[1] || blk[2] || blk[3] || '';
|
||||
if (!gridSizeRe.test(block)) continue;
|
||||
let hairlineCount = 0;
|
||||
let bm;
|
||||
bgDeclRe.lastIndex = 0;
|
||||
while ((bm = bgDeclRe.exec(block)) !== null) {
|
||||
const stops = bm[1].match(hairlineRe);
|
||||
if (stops) hairlineCount += stops.length;
|
||||
}
|
||||
if (hairlineCount >= 2) {
|
||||
findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' });
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): "X theater" framing copy (GPT) ---
|
||||
// Lives here (regex-on-HTML) rather than in the text-content analyzers so it
|
||||
// runs in the bundled browser path too, not just the CLI/static path.
|
||||
|
||||
@@ -75,7 +75,6 @@ const HOOK_MANIFEST_TARGETS = [
|
||||
skillRel: '.agents/skills/impeccable',
|
||||
destRel: '.codex/hooks.json',
|
||||
manifest: () => ({
|
||||
description: 'Impeccable design detector: runs after Edit/Write/apply_patch on UI files and surfaces findings as system reminders.',
|
||||
hooks: {
|
||||
PostToolUse: [
|
||||
{
|
||||
@@ -83,7 +82,7 @@ const HOOK_MANIFEST_TARGETS = [
|
||||
hooks: [
|
||||
{
|
||||
type: 'command',
|
||||
command: 'node "$(git rev-parse --show-toplevel)/.agents/skills/impeccable/scripts/hook.mjs"',
|
||||
command: 'node ".agents/skills/impeccable/scripts/hook.mjs"',
|
||||
timeout: TIMEOUT_SECONDS,
|
||||
statusMessage: STATUS_MESSAGE,
|
||||
},
|
||||
|
||||
@@ -7928,7 +7928,7 @@ void main() {
|
||||
const barTopFromBottom = barRect && barRect.height > 0
|
||||
? Math.max(16, window.innerHeight - barRect.top + 12)
|
||||
: 16;
|
||||
toastEl = el('div', {
|
||||
const currentToast = el('div', {
|
||||
position: 'fixed', bottom: barTopFromBottom + 'px', left: '50%',
|
||||
transform: 'translateX(-50%) translateY(8px)',
|
||||
background: C.ink, color: C.white,
|
||||
@@ -7938,19 +7938,24 @@ void main() {
|
||||
transition: 'opacity 0.25s ' + EASE + ', transform 0.25s ' + EASE,
|
||||
pointerEvents: 'none', maxWidth: '420px', textAlign: 'center',
|
||||
});
|
||||
toastEl.id = PREFIX + '-toast';
|
||||
toastEl.textContent = message;
|
||||
uiAppend(toastEl);
|
||||
toastEl = currentToast;
|
||||
currentToast.id = PREFIX + '-toast';
|
||||
currentToast.textContent = message;
|
||||
uiAppend(currentToast);
|
||||
requestAnimationFrame(() => {
|
||||
toastEl.style.opacity = '1';
|
||||
toastEl.style.transform = 'translateX(-50%) translateY(0)';
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.style.opacity = '1';
|
||||
currentToast.style.transform = 'translateX(-50%) translateY(0)';
|
||||
});
|
||||
setTimeout(() => {
|
||||
if (toastEl) {
|
||||
toastEl.style.opacity = '0';
|
||||
toastEl.style.transform = 'translateX(-50%) translateY(8px)';
|
||||
setTimeout(() => { if (toastEl) { toastEl.remove(); toastEl = null; } }, 250);
|
||||
}
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.style.opacity = '0';
|
||||
currentToast.style.transform = 'translateX(-50%) translateY(8px)';
|
||||
setTimeout(() => {
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.remove();
|
||||
toastEl = null;
|
||||
}, 250);
|
||||
}, duration);
|
||||
}
|
||||
|
||||
|
||||
+1
-2
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"description": "Impeccable design detector: runs after Edit/Write/apply_patch on UI files and surfaces findings as system reminders.",
|
||||
"hooks": {
|
||||
"PostToolUse": [
|
||||
{
|
||||
@@ -7,7 +6,7 @@
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node \"$(git rev-parse --show-toplevel)/.agents/skills/impeccable/scripts/hook.mjs\"",
|
||||
"command": "node \".agents/skills/impeccable/scripts/hook.mjs\"",
|
||||
"timeout": 5,
|
||||
"statusMessage": "Checking UI changes"
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
name: impeccable
|
||||
description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks.
|
||||
version: 3.8.0
|
||||
version: 3.9.1
|
||||
license: Apache 2.0
|
||||
---
|
||||
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
When asked for "bolder," AI defaults to the same tired tricks: cyan/purple gradients, glassmorphism, neon accents on dark backgrounds, gradient text on metrics. These are the opposite of bold. Reject them first, then increase visual impact and personality through stronger hierarchy, committed scale, and decisive type.
|
||||
When asked for "bolder," AI defaults to the same tired tricks: cyan/purple gradients, glassmorphism, neon accents on dark backgrounds, gradient text on metrics. These are the opposite of bold. Reject them first, then increase visual impact by making the existing design language more decisive, specific, and committed.
|
||||
|
||||
---
|
||||
|
||||
## Register
|
||||
|
||||
Brand: "bolder" means distinctive. Extreme scale, unexpected color, typographic risk, committed POV.
|
||||
Brand: "bolder" means distinctive. Express a stronger point of view through hierarchy, pacing, proportion, copy, evidence, and one committed visual idea.
|
||||
|
||||
Product: "bolder" rarely means theatrics; those undermine trust. It means stronger hierarchy, clearer weight contrast, one sharper accent, more committed density. The amplification is in clarity, not drama.
|
||||
Product: "bolder" rarely means theatrics; those undermine trust. It means stronger hierarchy, clearer weight contrast, sharper information density, and more decisive prioritization. The amplification is in clarity, not drama.
|
||||
|
||||
---
|
||||
|
||||
@@ -15,98 +15,105 @@ Product: "bolder" rarely means theatrics; those undermine trust. It means strong
|
||||
Analyze what makes the design feel too safe or boring:
|
||||
|
||||
1. **Identify weakness sources**:
|
||||
- **Generic choices**: System fonts, basic colors, standard layouts
|
||||
- **Timid scale**: Everything is medium-sized with no drama
|
||||
- **Low contrast**: Everything has similar visual weight
|
||||
- **Static**: No motion, no energy, no life
|
||||
- **Predictable**: Standard patterns with no surprises
|
||||
- **Flat hierarchy**: Nothing stands out or commands attention
|
||||
- **Generic choices**: The page could belong to any product in the category.
|
||||
- **Timid scale**: Everything is medium-sized with no clear lead.
|
||||
- **Low contrast**: Important and supporting elements have similar visual weight.
|
||||
- **Static**: The surface has no meaningful moment of emphasis.
|
||||
- **Predictable**: The composition follows a default pattern without a point of view.
|
||||
- **Flat hierarchy**: Nothing stands out or commands attention.
|
||||
|
||||
2. **Understand the context**:
|
||||
- What's the brand personality? (How far can we push?)
|
||||
- What's the purpose? (Marketing can be bolder than financial dashboards)
|
||||
- Who's the audience? (What will resonate?)
|
||||
- What are the constraints? (Brand guidelines, accessibility, performance)
|
||||
- What is the brand personality?
|
||||
- What is the purpose of this surface?
|
||||
- Who is the audience?
|
||||
- What design system, tokens, components, and visual conventions already exist?
|
||||
|
||||
If any of these are unclear from the codebase, ask the user directly to clarify what you cannot infer.
|
||||
|
||||
**CRITICAL**: "Bolder" doesn't mean chaotic or garish. It means distinctive, memorable, and confident. Think intentional drama, not random chaos.
|
||||
**CRITICAL**: "Bolder" does not mean chaotic or garish. It means distinctive, memorable, and confident. Think intentional drama, not random noise.
|
||||
|
||||
**WARNING - AI SLOP TRAP**: Review ALL the DON'T guidelines from the parent impeccable skill (already loaded in this context) before proceeding. Bold means distinctive, not "more effects."
|
||||
|
||||
## Design-System Lock
|
||||
|
||||
If the project has `DESIGN.md`, tokens, theme variables, or established component styles, treat that system as the boundary. Make the existing language stronger before adding new language.
|
||||
|
||||
Do not invent new colors, gradients, radii, shadows, fonts, decorative backgrounds, or effects just because the request says "bolder." A bolder pass should usually change emphasis, proportion, rhythm, density, contrast, copy, artifact specificity, and layout relationships while staying inside the documented system.
|
||||
|
||||
If the existing system is genuinely too limited to express the bolder direction, stop and ask the user before expanding it. Name the exact additions, the role each would play, and why the current system cannot do the job. If the user approves expansion, update the design system or tokens alongside the implementation.
|
||||
|
||||
## Plan Amplification
|
||||
|
||||
Create a strategy to increase impact while maintaining coherence:
|
||||
|
||||
- **Focal point**: What should be the hero moment? (Pick ONE, make it amazing)
|
||||
- **Personality direction**: Maximalist chaos? Elegant drama? Playful energy? Dark moody? Choose a lane.
|
||||
- **Risk budget**: How experimental can we be? Push boundaries within constraints.
|
||||
- **Hierarchy amplification**: Make big things BIGGER, small things smaller (increase contrast)
|
||||
- **Focal point**: Pick one thing the viewer should remember, then make the rest support it.
|
||||
- **System levers**: Identify which existing tokens, components, layout patterns, and copy structures can carry more weight.
|
||||
- **Risk budget**: Decide how far the surface can push while still feeling like the same product or brand.
|
||||
- **Hierarchy amplification**: Increase contrast between primary, secondary, and tertiary content instead of making every element louder.
|
||||
|
||||
**IMPORTANT**: Bold design must still be usable. Impact without function is just decoration.
|
||||
|
||||
## Amplify the Design
|
||||
|
||||
Systematically increase impact across these dimensions:
|
||||
Systematically increase impact through intention, not a menu of effects:
|
||||
|
||||
### Typography Amplification
|
||||
- **Replace generic fonts**: Swap system fonts for distinctive choices (see the parent skill's typography guidelines and the [Reference Material section of typeset.md](typeset.md#reference-material) for inspiration)
|
||||
- **Extreme scale**: Create dramatic size jumps (3x-5x differences, not 1.5x)
|
||||
- **Weight contrast**: Pair 900 weights with 200 weights, not 600 with 400
|
||||
- **Unexpected choices**: Variable fonts, display fonts for headlines, condensed/extended widths, monospace as intentional accent (not as lazy "dev tool" default)
|
||||
- Strengthen the existing type hierarchy before changing typefaces.
|
||||
- Make important text meaningfully more dominant, and make supporting text quieter.
|
||||
- Use weight, measure, spacing, and line breaks to sharpen the point of view.
|
||||
- Add or replace fonts only after user-approved design-system expansion.
|
||||
|
||||
### Color Intensification
|
||||
- **Increase saturation**: Shift to more vibrant, energetic colors (but not neon)
|
||||
- **Bold palette**: Introduce unexpected color combinations. Avoid the purple-blue gradient AI slop
|
||||
- **Dominant color strategy**: Let one bold color own 60% of the design
|
||||
- **Sharp accents**: High-contrast accent colors that pop
|
||||
- **Tinted neutrals**: Replace pure grays with tinted grays that harmonize with your palette
|
||||
- **Rich gradients**: Intentional multi-stop gradients (not generic purple-to-blue)
|
||||
### Color Amplification
|
||||
- Use the existing palette more decisively before adding colors.
|
||||
- Shift the proportion, placement, and contrast of documented colors to clarify meaning.
|
||||
- Treat any new color, gradient, or tint ramp as a design-system expansion that requires user approval.
|
||||
- Keep color tied to hierarchy, state, or brand meaning; do not use it as surface decoration.
|
||||
|
||||
### Spatial Drama
|
||||
- **Extreme scale jumps**: Make important elements 3-5x larger than surroundings
|
||||
- **Break the grid**: Let hero elements escape containers and cross boundaries
|
||||
- **Asymmetric layouts**: Replace centered, balanced layouts with tension-filled asymmetry
|
||||
- **Generous space**: Use white space dramatically (100-200px gaps, not 20-40px)
|
||||
- **Overlap**: Layer elements intentionally for depth
|
||||
### Spatial Amplification
|
||||
- Change proportion, density, alignment, and sequencing so the composition has a stronger point of view.
|
||||
- Create clearer contrast between dense evidence and open breathing room.
|
||||
- Let layout express priority and narrative order before adding ornament.
|
||||
- Preserve responsive behavior and avoid text overflow at every breakpoint.
|
||||
|
||||
### Visual Effects
|
||||
- **Dramatic shadows**: Large, soft shadows for elevation (but not generic drop shadows on rounded rectangles)
|
||||
- **Background treatments**: Mesh patterns, noise textures, geometric patterns, intentional gradients (not purple-to-blue)
|
||||
- **Texture & depth**: Grain, halftone, duotone, layered elements. NOT glassmorphism (it's overused AI slop)
|
||||
- **Borders & frames**: Thick borders, decorative frames, custom shapes (not rounded rectangles with colored border on one side)
|
||||
- **Custom elements**: Illustrative elements, custom icons, decorative details that reinforce brand
|
||||
### Surface Amplification
|
||||
- Use existing surface, border, radius, and shadow rules more deliberately.
|
||||
- Remove timid half-measures: either give an element a clear role or simplify it.
|
||||
- Add texture, depth, illustration, or decorative treatments only when already established by the system or explicitly approved.
|
||||
- Make real product artifacts, imagery, data, or copy carry attention before reaching for effects.
|
||||
|
||||
### Motion & Animation
|
||||
- **Hero moment**: One signature entrance, once. Not on every visit and not on every section.
|
||||
- **Micro-interactions**: Satisfying hover effects, click feedback, state changes.
|
||||
- **Transitions**: Smooth, noticeable transitions using ease-out-quart/quint/expo (not bounce or elastic, which cheapen the effect).
|
||||
- **Bolder ≠ scroll-fade-rise on every section.** That's the saturated AI default, the opposite of bold.
|
||||
- Design one meaningful moment of emphasis when motion genuinely supports the point.
|
||||
- Make interaction feedback feel more decisive without becoming distracting.
|
||||
- Keep transitions smooth and intentional.
|
||||
- **Bolder != scroll-fade-rise on every section.** That's the saturated AI default, the opposite of bold.
|
||||
|
||||
### Composition Boldness
|
||||
- **Hero moments**: Create clear focal points with dramatic treatment
|
||||
- **Diagonal flows**: Escape horizontal/vertical rigidity with diagonal arrangements
|
||||
- **Full-bleed elements**: Use full viewport width/height for impact
|
||||
- **Unexpected proportions**: Golden ratio? Throw it out. Try 70/30, 80/20 splits
|
||||
- Make the dominant idea unmistakable.
|
||||
- Use layout tension, sequencing, contrast, and restraint to create a stronger read.
|
||||
- Let the page's structure communicate priority before adding decorative layers.
|
||||
- If every element is louder, the composition is not bolder; it is flatter.
|
||||
|
||||
**NEVER**:
|
||||
- Add effects randomly without purpose (chaos ≠ bold)
|
||||
- Sacrifice readability for aesthetics (body text must be readable)
|
||||
- Make everything bold (then nothing is bold; you need contrast)
|
||||
- Ignore accessibility (bold design must still meet WCAG standards)
|
||||
- Overwhelm with motion (animation fatigue is real)
|
||||
- Copy trendy aesthetics blindly (bold means distinctive, not derivative)
|
||||
- Add undocumented design-system primitives without user approval
|
||||
- Add effects randomly without purpose
|
||||
- Hide weak hierarchy behind decoration
|
||||
- Sacrifice readability for aesthetics
|
||||
- Make everything bold; contrast is the point
|
||||
- Ignore accessibility
|
||||
- Overwhelm with motion
|
||||
- Copy trendy aesthetics blindly
|
||||
|
||||
## Verify Quality
|
||||
|
||||
Ensure amplification maintains usability and coherence:
|
||||
|
||||
- **System-faithful**: Did the pass make the existing design language stronger before adding anything new?
|
||||
- **No undocumented drift**: Are new colors, gradients, shadows, radii, fonts, and effects either absent or explicitly approved and documented?
|
||||
- **NOT AI slop**: Does this look like every other AI-generated "bold" design? If yes, start over.
|
||||
- **Still functional**: Can users accomplish tasks without distraction?
|
||||
- **Coherent**: Does everything feel intentional and unified?
|
||||
- **Memorable**: Will users remember this experience?
|
||||
- **Performant**: Do all these effects run smoothly?
|
||||
- **Accessible**: Does it still meet accessibility standards?
|
||||
- **Memorable**: Will users remember this experience for the intended reason?
|
||||
- **Performant and accessible**: Does the result stay fast, readable, responsive, and WCAG-conscious?
|
||||
|
||||
**The test**: If you showed this to someone and said "AI made this bolder," would they believe you immediately? If yes, you've failed. Bold means distinctive, not "more AI effects."
|
||||
|
||||
|
||||
@@ -5,8 +5,9 @@ Resolve one stable target, run two independent assessments, synthesize a design
|
||||
### Hard Invariants
|
||||
|
||||
- Assessment A (design review) and Assessment B (detector/browser evidence) are both required.
|
||||
- Assessment A and B MUST run as two isolated sub-agents whenever a sub-agent/Task tool is exposed. Running them inline in this context is "possible" but is NOT permitted; it is a degraded run. Inline is allowed ONLY when no sub-agent tool exists (or the user declined, on harnesses that ask).
|
||||
- If you degrade for any reason, the report's first line MUST be a banner: `⚠️ DEGRADED: single-context (<reason>)`. A silent degraded critique is a failed critique.
|
||||
- Assessment A must finish before detector findings enter the parent synthesis context. Detector output is deterministic, but it still anchors judgment.
|
||||
- If sub-agents are unavailable, fall back sequentially: finish and record Assessment A first, then run Assessment B, then synthesize.
|
||||
- A skipped detector is a failed critique run unless `detect.mjs` is missing or crashes after a real attempt.
|
||||
- Viewable targets require browser inspection when available.
|
||||
- Any local server started only for critique visualization must run in the background, have a recorded stop method, and be stopped before final reporting unless the user asks to keep it.
|
||||
@@ -27,7 +28,13 @@ Resolve one stable target, run two independent assessments, synthesize a design
|
||||
|
||||
### Assessment Orchestration
|
||||
|
||||
Delegate Assessment A and Assessment B to separate sub-agents when possible. They must not see each other's output. Do not show findings to the user until synthesis.
|
||||
Delegate Assessment A and Assessment B to separate sub-agents. They must not see each other's output. Do not show findings to the user until synthesis.
|
||||
|
||||
Sub-agent gate (all harnesses):
|
||||
- Unless a harness-specific gate below overrides this, spawn A and B as two isolated, parallel sub-agents whenever a sub-agent/Task tool is exposed. This is the default and is mandatory; do not run them inline because it is faster.
|
||||
- "Unavailable" means exactly one thing: no sub-agent/Task tool is exposed in this session (or, on harnesses that ask, the user declined). It does not mean inconvenient.
|
||||
- If and only if sub-agents are unavailable, fall back sequentially: finish and record Assessment A, then run Assessment B, then synthesize, and emit the degraded banner.
|
||||
- Whichever path you take, declare it in the report header (see Report header provenance). Skipping sub-agents without the banner is the most common failure of this command.
|
||||
|
||||
If browser automation is available, each assessment creates its own new tab. Never reuse an existing tab, even if it is already at the right URL.
|
||||
|
||||
@@ -61,7 +68,7 @@ node .cursor/skills/impeccable/scripts/detect.mjs --json [target]
|
||||
|
||||
Browser visualization is required for a viewable target when browser automation is available. Use a localhost dev/static URL for local files; avoid `file://` unless the available browser explicitly supports this workflow. Overlay flow:
|
||||
|
||||
1. Create a fresh tab and navigate.
|
||||
1. Create a fresh tab and navigate. Prefer the harness's native/browser-canvas screenshot path before hand-rolling a Playwright/Puppeteer script; only fall back to a custom script when no native browser tool is exposed.
|
||||
2. Preflight mutable injection by setting `document.title` and appending a `<script>` tag. Read-only evaluate APIs do not count.
|
||||
3. If mutation is unavailable, skip live server, browser presentation, and injection; report fallback signal.
|
||||
4. If mutation is available, start `node .cursor/skills/impeccable/scripts/live-server.mjs --background`, present the browser if supported, label `[Human]`, scroll top, inject `http://localhost:PORT/detect.js`, wait 2-3 seconds, read `impeccable` console messages, then stop the live server.
|
||||
@@ -79,6 +86,12 @@ The chat response is the primary user-facing deliverable. Present the full struc
|
||||
|
||||
Structure your feedback as a design director would:
|
||||
|
||||
#### Report header provenance
|
||||
|
||||
The report's first line MUST declare how the assessments were run, so a degraded run is never silent:
|
||||
- Dual-agent: `Method: dual-agent (A: <agent-id> · B: <agent-id>)`
|
||||
- Degraded: `⚠️ DEGRADED: single-context (<reason, e.g. no sub-agent tool exposed>)`
|
||||
|
||||
#### Design Health Score
|
||||
> *Consult the [Heuristics Scoring Guide](#heuristics-scoring-guide) section below.*
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Generate a `DESIGN.md` file at the project root that captures the current visual design system, so AI agents generating new screens stay on-brand.
|
||||
|
||||
DESIGN.md follows the [official Google Stitch DESIGN.md format](https://stitch.withgoogle.com/docs/design-md/format/): YAML frontmatter carrying machine-readable design tokens, followed by a markdown body with exactly six sections in a fixed order. **Tokens are normative; prose provides context for how to apply them.** Sections may be omitted when not relevant, but **do not reorder them and do not rename them**. Section headers must match the spec character-for-character so the file stays parseable by other DESIGN.md-aware tools (Stitch itself, awesome-design-md, skill-rest, etc.).
|
||||
DESIGN.md follows the [official DESIGN.md format spec](https://raw.githubusercontent.com/google-labs-code/design.md/main/docs/spec.md): YAML frontmatter carrying machine-readable design tokens, followed by a markdown body with exactly six sections in a fixed order. **Tokens are normative; prose provides context for how to apply them.** Sections may be omitted when not relevant, but **do not reorder them and do not rename them**. Section headers must match the spec character-for-character so the file stays parseable by other DESIGN.md-aware tools (Stitch itself, awesome-design-md, skill-rest, etc.).
|
||||
|
||||
## The frontmatter: token schema
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
The setup command for a project. One codebase crawl feeds everything it writes:
|
||||
|
||||
- **PRODUCT.md** (strategic): root project file for register, target users, product purpose, brand personality, anti-references, strategic design principles. Answers "who/what/why".
|
||||
- **DESIGN.md** (visual): root project file for visual theme, color palette, typography, components, layout. Follows the [Google Stitch DESIGN.md format](https://stitch.withgoogle.com/docs/design-md/format/). Answers "how it looks".
|
||||
- **DESIGN.md** (visual): root project file for visual theme, color palette, typography, components, layout. Follows the [DESIGN.md format spec](https://raw.githubusercontent.com/google-labs-code/design.md/main/docs/spec.md). Answers "how it looks".
|
||||
- **`.impeccable/live/config.json`** (live mode): pre-configured so `/impeccable live` boots straight into variant mode with no first-time detour.
|
||||
|
||||
It closes by pointing the user at the best command to run next. Every other impeccable command reads PRODUCT.md and DESIGN.md before doing any work.
|
||||
|
||||
@@ -478,6 +478,17 @@ const ANTIPATTERNS = [
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'repeating-gradient decorative stripes',
|
||||
},
|
||||
{
|
||||
id: 'codex-grid-background',
|
||||
category: 'slop',
|
||||
severity: 'advisory',
|
||||
gated: 'gpt',
|
||||
name: 'Decorative grid-line background',
|
||||
description:
|
||||
'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) is a recurring generated-UI signature. Reserve grid overlays for actual canvas, map, blueprint, or measurement surfaces; elsewhere use product structure or a plain surface.',
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'two-axis grid-line gradient background',
|
||||
},
|
||||
{
|
||||
id: 'theater-slop-phrase',
|
||||
category: 'slop',
|
||||
@@ -1172,6 +1183,42 @@ function checkHtmlPatterns(html) {
|
||||
findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' });
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): two-axis grid-line background (Codex/GPT) ---
|
||||
// The Codex grid tell is two hairline `linear-gradient(... <color> 1px,
|
||||
// transparent 1px)` layers (one per axis) tiled by a repeating
|
||||
// `background-size` cell. Both signals must co-occur in the SAME style block
|
||||
// (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a
|
||||
// tiling background-size is a fixed crosshair, not a grid, and a single
|
||||
// hairline is a legitimate ruled line. Scoping to one block also stops
|
||||
// unrelated single-axis rules on separate elements from adding up across the
|
||||
// page. Count hairlines only inside `background`/`background-image` values so
|
||||
// a hairline in an unrelated property (mask-image, border-image) can't stand
|
||||
// in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry
|
||||
// nested parens, so match the hairline stop directly rather than parsing
|
||||
// whole gradient layers.
|
||||
{
|
||||
const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi;
|
||||
const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i;
|
||||
const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi;
|
||||
const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi;
|
||||
let blk;
|
||||
while ((blk = blockRe.exec(html)) !== null) {
|
||||
const block = blk[1] || blk[2] || blk[3] || '';
|
||||
if (!gridSizeRe.test(block)) continue;
|
||||
let hairlineCount = 0;
|
||||
let bm;
|
||||
bgDeclRe.lastIndex = 0;
|
||||
while ((bm = bgDeclRe.exec(block)) !== null) {
|
||||
const stops = bm[1].match(hairlineRe);
|
||||
if (stops) hairlineCount += stops.length;
|
||||
}
|
||||
if (hairlineCount >= 2) {
|
||||
findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' });
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): "X theater" framing copy (GPT) ---
|
||||
// Lives here (regex-on-HTML) rather than in the text-content analyzers so it
|
||||
// runs in the bundled browser path too, not just the CLI/static path.
|
||||
|
||||
@@ -376,6 +376,17 @@ const ANTIPATTERNS = [
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'repeating-gradient decorative stripes',
|
||||
},
|
||||
{
|
||||
id: 'codex-grid-background',
|
||||
category: 'slop',
|
||||
severity: 'advisory',
|
||||
gated: 'gpt',
|
||||
name: 'Decorative grid-line background',
|
||||
description:
|
||||
'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) is a recurring generated-UI signature. Reserve grid overlays for actual canvas, map, blueprint, or measurement surfaces; elsewhere use product structure or a plain surface.',
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'two-axis grid-line gradient background',
|
||||
},
|
||||
{
|
||||
id: 'theater-slop-phrase',
|
||||
category: 'slop',
|
||||
|
||||
@@ -573,6 +573,42 @@ function checkHtmlPatterns(html) {
|
||||
findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' });
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): two-axis grid-line background (Codex/GPT) ---
|
||||
// The Codex grid tell is two hairline `linear-gradient(... <color> 1px,
|
||||
// transparent 1px)` layers (one per axis) tiled by a repeating
|
||||
// `background-size` cell. Both signals must co-occur in the SAME style block
|
||||
// (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a
|
||||
// tiling background-size is a fixed crosshair, not a grid, and a single
|
||||
// hairline is a legitimate ruled line. Scoping to one block also stops
|
||||
// unrelated single-axis rules on separate elements from adding up across the
|
||||
// page. Count hairlines only inside `background`/`background-image` values so
|
||||
// a hairline in an unrelated property (mask-image, border-image) can't stand
|
||||
// in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry
|
||||
// nested parens, so match the hairline stop directly rather than parsing
|
||||
// whole gradient layers.
|
||||
{
|
||||
const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi;
|
||||
const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i;
|
||||
const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi;
|
||||
const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi;
|
||||
let blk;
|
||||
while ((blk = blockRe.exec(html)) !== null) {
|
||||
const block = blk[1] || blk[2] || blk[3] || '';
|
||||
if (!gridSizeRe.test(block)) continue;
|
||||
let hairlineCount = 0;
|
||||
let bm;
|
||||
bgDeclRe.lastIndex = 0;
|
||||
while ((bm = bgDeclRe.exec(block)) !== null) {
|
||||
const stops = bm[1].match(hairlineRe);
|
||||
if (stops) hairlineCount += stops.length;
|
||||
}
|
||||
if (hairlineCount >= 2) {
|
||||
findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' });
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): "X theater" framing copy (GPT) ---
|
||||
// Lives here (regex-on-HTML) rather than in the text-content analyzers so it
|
||||
// runs in the bundled browser path too, not just the CLI/static path.
|
||||
|
||||
@@ -75,7 +75,6 @@ const HOOK_MANIFEST_TARGETS = [
|
||||
skillRel: '.agents/skills/impeccable',
|
||||
destRel: '.codex/hooks.json',
|
||||
manifest: () => ({
|
||||
description: 'Impeccable design detector: runs after Edit/Write/apply_patch on UI files and surfaces findings as system reminders.',
|
||||
hooks: {
|
||||
PostToolUse: [
|
||||
{
|
||||
@@ -83,7 +82,7 @@ const HOOK_MANIFEST_TARGETS = [
|
||||
hooks: [
|
||||
{
|
||||
type: 'command',
|
||||
command: 'node "$(git rev-parse --show-toplevel)/.agents/skills/impeccable/scripts/hook.mjs"',
|
||||
command: 'node ".agents/skills/impeccable/scripts/hook.mjs"',
|
||||
timeout: TIMEOUT_SECONDS,
|
||||
statusMessage: STATUS_MESSAGE,
|
||||
},
|
||||
|
||||
@@ -7928,7 +7928,7 @@ void main() {
|
||||
const barTopFromBottom = barRect && barRect.height > 0
|
||||
? Math.max(16, window.innerHeight - barRect.top + 12)
|
||||
: 16;
|
||||
toastEl = el('div', {
|
||||
const currentToast = el('div', {
|
||||
position: 'fixed', bottom: barTopFromBottom + 'px', left: '50%',
|
||||
transform: 'translateX(-50%) translateY(8px)',
|
||||
background: C.ink, color: C.white,
|
||||
@@ -7938,19 +7938,24 @@ void main() {
|
||||
transition: 'opacity 0.25s ' + EASE + ', transform 0.25s ' + EASE,
|
||||
pointerEvents: 'none', maxWidth: '420px', textAlign: 'center',
|
||||
});
|
||||
toastEl.id = PREFIX + '-toast';
|
||||
toastEl.textContent = message;
|
||||
uiAppend(toastEl);
|
||||
toastEl = currentToast;
|
||||
currentToast.id = PREFIX + '-toast';
|
||||
currentToast.textContent = message;
|
||||
uiAppend(currentToast);
|
||||
requestAnimationFrame(() => {
|
||||
toastEl.style.opacity = '1';
|
||||
toastEl.style.transform = 'translateX(-50%) translateY(0)';
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.style.opacity = '1';
|
||||
currentToast.style.transform = 'translateX(-50%) translateY(0)';
|
||||
});
|
||||
setTimeout(() => {
|
||||
if (toastEl) {
|
||||
toastEl.style.opacity = '0';
|
||||
toastEl.style.transform = 'translateX(-50%) translateY(8px)';
|
||||
setTimeout(() => { if (toastEl) { toastEl.remove(); toastEl = null; } }, 250);
|
||||
}
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.style.opacity = '0';
|
||||
currentToast.style.transform = 'translateX(-50%) translateY(8px)';
|
||||
setTimeout(() => {
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.remove();
|
||||
toastEl = null;
|
||||
}, 250);
|
||||
}, duration);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
name: impeccable
|
||||
description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks.
|
||||
version: 3.8.0
|
||||
version: 3.9.1
|
||||
---
|
||||
|
||||
Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft.
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
When asked for "bolder," AI defaults to the same tired tricks: cyan/purple gradients, glassmorphism, neon accents on dark backgrounds, gradient text on metrics. These are the opposite of bold. Reject them first, then increase visual impact and personality through stronger hierarchy, committed scale, and decisive type.
|
||||
When asked for "bolder," AI defaults to the same tired tricks: cyan/purple gradients, glassmorphism, neon accents on dark backgrounds, gradient text on metrics. These are the opposite of bold. Reject them first, then increase visual impact by making the existing design language more decisive, specific, and committed.
|
||||
|
||||
---
|
||||
|
||||
## Register
|
||||
|
||||
Brand: "bolder" means distinctive. Extreme scale, unexpected color, typographic risk, committed POV.
|
||||
Brand: "bolder" means distinctive. Express a stronger point of view through hierarchy, pacing, proportion, copy, evidence, and one committed visual idea.
|
||||
|
||||
Product: "bolder" rarely means theatrics; those undermine trust. It means stronger hierarchy, clearer weight contrast, one sharper accent, more committed density. The amplification is in clarity, not drama.
|
||||
Product: "bolder" rarely means theatrics; those undermine trust. It means stronger hierarchy, clearer weight contrast, sharper information density, and more decisive prioritization. The amplification is in clarity, not drama.
|
||||
|
||||
---
|
||||
|
||||
@@ -15,98 +15,105 @@ Product: "bolder" rarely means theatrics; those undermine trust. It means strong
|
||||
Analyze what makes the design feel too safe or boring:
|
||||
|
||||
1. **Identify weakness sources**:
|
||||
- **Generic choices**: System fonts, basic colors, standard layouts
|
||||
- **Timid scale**: Everything is medium-sized with no drama
|
||||
- **Low contrast**: Everything has similar visual weight
|
||||
- **Static**: No motion, no energy, no life
|
||||
- **Predictable**: Standard patterns with no surprises
|
||||
- **Flat hierarchy**: Nothing stands out or commands attention
|
||||
- **Generic choices**: The page could belong to any product in the category.
|
||||
- **Timid scale**: Everything is medium-sized with no clear lead.
|
||||
- **Low contrast**: Important and supporting elements have similar visual weight.
|
||||
- **Static**: The surface has no meaningful moment of emphasis.
|
||||
- **Predictable**: The composition follows a default pattern without a point of view.
|
||||
- **Flat hierarchy**: Nothing stands out or commands attention.
|
||||
|
||||
2. **Understand the context**:
|
||||
- What's the brand personality? (How far can we push?)
|
||||
- What's the purpose? (Marketing can be bolder than financial dashboards)
|
||||
- Who's the audience? (What will resonate?)
|
||||
- What are the constraints? (Brand guidelines, accessibility, performance)
|
||||
- What is the brand personality?
|
||||
- What is the purpose of this surface?
|
||||
- Who is the audience?
|
||||
- What design system, tokens, components, and visual conventions already exist?
|
||||
|
||||
If any of these are unclear from the codebase, ask the user directly to clarify what you cannot infer.
|
||||
|
||||
**CRITICAL**: "Bolder" doesn't mean chaotic or garish. It means distinctive, memorable, and confident. Think intentional drama, not random chaos.
|
||||
**CRITICAL**: "Bolder" does not mean chaotic or garish. It means distinctive, memorable, and confident. Think intentional drama, not random noise.
|
||||
|
||||
**WARNING - AI SLOP TRAP**: Review ALL the DON'T guidelines from the parent impeccable skill (already loaded in this context) before proceeding. Bold means distinctive, not "more effects."
|
||||
|
||||
## Design-System Lock
|
||||
|
||||
If the project has `DESIGN.md`, tokens, theme variables, or established component styles, treat that system as the boundary. Make the existing language stronger before adding new language.
|
||||
|
||||
Do not invent new colors, gradients, radii, shadows, fonts, decorative backgrounds, or effects just because the request says "bolder." A bolder pass should usually change emphasis, proportion, rhythm, density, contrast, copy, artifact specificity, and layout relationships while staying inside the documented system.
|
||||
|
||||
If the existing system is genuinely too limited to express the bolder direction, stop and ask the user before expanding it. Name the exact additions, the role each would play, and why the current system cannot do the job. If the user approves expansion, update the design system or tokens alongside the implementation.
|
||||
|
||||
## Plan Amplification
|
||||
|
||||
Create a strategy to increase impact while maintaining coherence:
|
||||
|
||||
- **Focal point**: What should be the hero moment? (Pick ONE, make it amazing)
|
||||
- **Personality direction**: Maximalist chaos? Elegant drama? Playful energy? Dark moody? Choose a lane.
|
||||
- **Risk budget**: How experimental can we be? Push boundaries within constraints.
|
||||
- **Hierarchy amplification**: Make big things BIGGER, small things smaller (increase contrast)
|
||||
- **Focal point**: Pick one thing the viewer should remember, then make the rest support it.
|
||||
- **System levers**: Identify which existing tokens, components, layout patterns, and copy structures can carry more weight.
|
||||
- **Risk budget**: Decide how far the surface can push while still feeling like the same product or brand.
|
||||
- **Hierarchy amplification**: Increase contrast between primary, secondary, and tertiary content instead of making every element louder.
|
||||
|
||||
**IMPORTANT**: Bold design must still be usable. Impact without function is just decoration.
|
||||
|
||||
## Amplify the Design
|
||||
|
||||
Systematically increase impact across these dimensions:
|
||||
Systematically increase impact through intention, not a menu of effects:
|
||||
|
||||
### Typography Amplification
|
||||
- **Replace generic fonts**: Swap system fonts for distinctive choices (see the parent skill's typography guidelines and the [Reference Material section of typeset.md](typeset.md#reference-material) for inspiration)
|
||||
- **Extreme scale**: Create dramatic size jumps (3x-5x differences, not 1.5x)
|
||||
- **Weight contrast**: Pair 900 weights with 200 weights, not 600 with 400
|
||||
- **Unexpected choices**: Variable fonts, display fonts for headlines, condensed/extended widths, monospace as intentional accent (not as lazy "dev tool" default)
|
||||
- Strengthen the existing type hierarchy before changing typefaces.
|
||||
- Make important text meaningfully more dominant, and make supporting text quieter.
|
||||
- Use weight, measure, spacing, and line breaks to sharpen the point of view.
|
||||
- Add or replace fonts only after user-approved design-system expansion.
|
||||
|
||||
### Color Intensification
|
||||
- **Increase saturation**: Shift to more vibrant, energetic colors (but not neon)
|
||||
- **Bold palette**: Introduce unexpected color combinations. Avoid the purple-blue gradient AI slop
|
||||
- **Dominant color strategy**: Let one bold color own 60% of the design
|
||||
- **Sharp accents**: High-contrast accent colors that pop
|
||||
- **Tinted neutrals**: Replace pure grays with tinted grays that harmonize with your palette
|
||||
- **Rich gradients**: Intentional multi-stop gradients (not generic purple-to-blue)
|
||||
### Color Amplification
|
||||
- Use the existing palette more decisively before adding colors.
|
||||
- Shift the proportion, placement, and contrast of documented colors to clarify meaning.
|
||||
- Treat any new color, gradient, or tint ramp as a design-system expansion that requires user approval.
|
||||
- Keep color tied to hierarchy, state, or brand meaning; do not use it as surface decoration.
|
||||
|
||||
### Spatial Drama
|
||||
- **Extreme scale jumps**: Make important elements 3-5x larger than surroundings
|
||||
- **Break the grid**: Let hero elements escape containers and cross boundaries
|
||||
- **Asymmetric layouts**: Replace centered, balanced layouts with tension-filled asymmetry
|
||||
- **Generous space**: Use white space dramatically (100-200px gaps, not 20-40px)
|
||||
- **Overlap**: Layer elements intentionally for depth
|
||||
### Spatial Amplification
|
||||
- Change proportion, density, alignment, and sequencing so the composition has a stronger point of view.
|
||||
- Create clearer contrast between dense evidence and open breathing room.
|
||||
- Let layout express priority and narrative order before adding ornament.
|
||||
- Preserve responsive behavior and avoid text overflow at every breakpoint.
|
||||
|
||||
### Visual Effects
|
||||
- **Dramatic shadows**: Large, soft shadows for elevation (but not generic drop shadows on rounded rectangles)
|
||||
- **Background treatments**: Mesh patterns, noise textures, geometric patterns, intentional gradients (not purple-to-blue)
|
||||
- **Texture & depth**: Grain, halftone, duotone, layered elements. NOT glassmorphism (it's overused AI slop)
|
||||
- **Borders & frames**: Thick borders, decorative frames, custom shapes (not rounded rectangles with colored border on one side)
|
||||
- **Custom elements**: Illustrative elements, custom icons, decorative details that reinforce brand
|
||||
### Surface Amplification
|
||||
- Use existing surface, border, radius, and shadow rules more deliberately.
|
||||
- Remove timid half-measures: either give an element a clear role or simplify it.
|
||||
- Add texture, depth, illustration, or decorative treatments only when already established by the system or explicitly approved.
|
||||
- Make real product artifacts, imagery, data, or copy carry attention before reaching for effects.
|
||||
|
||||
### Motion & Animation
|
||||
- **Hero moment**: One signature entrance, once. Not on every visit and not on every section.
|
||||
- **Micro-interactions**: Satisfying hover effects, click feedback, state changes.
|
||||
- **Transitions**: Smooth, noticeable transitions using ease-out-quart/quint/expo (not bounce or elastic, which cheapen the effect).
|
||||
- **Bolder ≠ scroll-fade-rise on every section.** That's the saturated AI default, the opposite of bold.
|
||||
- Design one meaningful moment of emphasis when motion genuinely supports the point.
|
||||
- Make interaction feedback feel more decisive without becoming distracting.
|
||||
- Keep transitions smooth and intentional.
|
||||
- **Bolder != scroll-fade-rise on every section.** That's the saturated AI default, the opposite of bold.
|
||||
|
||||
### Composition Boldness
|
||||
- **Hero moments**: Create clear focal points with dramatic treatment
|
||||
- **Diagonal flows**: Escape horizontal/vertical rigidity with diagonal arrangements
|
||||
- **Full-bleed elements**: Use full viewport width/height for impact
|
||||
- **Unexpected proportions**: Golden ratio? Throw it out. Try 70/30, 80/20 splits
|
||||
- Make the dominant idea unmistakable.
|
||||
- Use layout tension, sequencing, contrast, and restraint to create a stronger read.
|
||||
- Let the page's structure communicate priority before adding decorative layers.
|
||||
- If every element is louder, the composition is not bolder; it is flatter.
|
||||
|
||||
**NEVER**:
|
||||
- Add effects randomly without purpose (chaos ≠ bold)
|
||||
- Sacrifice readability for aesthetics (body text must be readable)
|
||||
- Make everything bold (then nothing is bold; you need contrast)
|
||||
- Ignore accessibility (bold design must still meet WCAG standards)
|
||||
- Overwhelm with motion (animation fatigue is real)
|
||||
- Copy trendy aesthetics blindly (bold means distinctive, not derivative)
|
||||
- Add undocumented design-system primitives without user approval
|
||||
- Add effects randomly without purpose
|
||||
- Hide weak hierarchy behind decoration
|
||||
- Sacrifice readability for aesthetics
|
||||
- Make everything bold; contrast is the point
|
||||
- Ignore accessibility
|
||||
- Overwhelm with motion
|
||||
- Copy trendy aesthetics blindly
|
||||
|
||||
## Verify Quality
|
||||
|
||||
Ensure amplification maintains usability and coherence:
|
||||
|
||||
- **System-faithful**: Did the pass make the existing design language stronger before adding anything new?
|
||||
- **No undocumented drift**: Are new colors, gradients, shadows, radii, fonts, and effects either absent or explicitly approved and documented?
|
||||
- **NOT AI slop**: Does this look like every other AI-generated "bold" design? If yes, start over.
|
||||
- **Still functional**: Can users accomplish tasks without distraction?
|
||||
- **Coherent**: Does everything feel intentional and unified?
|
||||
- **Memorable**: Will users remember this experience?
|
||||
- **Performant**: Do all these effects run smoothly?
|
||||
- **Accessible**: Does it still meet accessibility standards?
|
||||
- **Memorable**: Will users remember this experience for the intended reason?
|
||||
- **Performant and accessible**: Does the result stay fast, readable, responsive, and WCAG-conscious?
|
||||
|
||||
**The test**: If you showed this to someone and said "AI made this bolder," would they believe you immediately? If yes, you've failed. Bold means distinctive, not "more AI effects."
|
||||
|
||||
|
||||
@@ -5,8 +5,9 @@ Resolve one stable target, run two independent assessments, synthesize a design
|
||||
### Hard Invariants
|
||||
|
||||
- Assessment A (design review) and Assessment B (detector/browser evidence) are both required.
|
||||
- Assessment A and B MUST run as two isolated sub-agents whenever a sub-agent/Task tool is exposed. Running them inline in this context is "possible" but is NOT permitted; it is a degraded run. Inline is allowed ONLY when no sub-agent tool exists (or the user declined, on harnesses that ask).
|
||||
- If you degrade for any reason, the report's first line MUST be a banner: `⚠️ DEGRADED: single-context (<reason>)`. A silent degraded critique is a failed critique.
|
||||
- Assessment A must finish before detector findings enter the parent synthesis context. Detector output is deterministic, but it still anchors judgment.
|
||||
- If sub-agents are unavailable, fall back sequentially: finish and record Assessment A first, then run Assessment B, then synthesize.
|
||||
- A skipped detector is a failed critique run unless `detect.mjs` is missing or crashes after a real attempt.
|
||||
- Viewable targets require browser inspection when available.
|
||||
- Any local server started only for critique visualization must run in the background, have a recorded stop method, and be stopped before final reporting unless the user asks to keep it.
|
||||
@@ -27,7 +28,13 @@ Resolve one stable target, run two independent assessments, synthesize a design
|
||||
|
||||
### Assessment Orchestration
|
||||
|
||||
Delegate Assessment A and Assessment B to separate sub-agents when possible. They must not see each other's output. Do not show findings to the user until synthesis.
|
||||
Delegate Assessment A and Assessment B to separate sub-agents. They must not see each other's output. Do not show findings to the user until synthesis.
|
||||
|
||||
Sub-agent gate (all harnesses):
|
||||
- Unless a harness-specific gate below overrides this, spawn A and B as two isolated, parallel sub-agents whenever a sub-agent/Task tool is exposed. This is the default and is mandatory; do not run them inline because it is faster.
|
||||
- "Unavailable" means exactly one thing: no sub-agent/Task tool is exposed in this session (or, on harnesses that ask, the user declined). It does not mean inconvenient.
|
||||
- If and only if sub-agents are unavailable, fall back sequentially: finish and record Assessment A, then run Assessment B, then synthesize, and emit the degraded banner.
|
||||
- Whichever path you take, declare it in the report header (see Report header provenance). Skipping sub-agents without the banner is the most common failure of this command.
|
||||
|
||||
If browser automation is available, each assessment creates its own new tab. Never reuse an existing tab, even if it is already at the right URL.
|
||||
|
||||
@@ -61,7 +68,7 @@ node .gemini/skills/impeccable/scripts/detect.mjs --json [target]
|
||||
|
||||
Browser visualization is required for a viewable target when browser automation is available. Use a localhost dev/static URL for local files; avoid `file://` unless the available browser explicitly supports this workflow. Overlay flow:
|
||||
|
||||
1. Create a fresh tab and navigate.
|
||||
1. Create a fresh tab and navigate. Prefer the harness's native/browser-canvas screenshot path before hand-rolling a Playwright/Puppeteer script; only fall back to a custom script when no native browser tool is exposed.
|
||||
2. Preflight mutable injection by setting `document.title` and appending a `<script>` tag. Read-only evaluate APIs do not count.
|
||||
3. If mutation is unavailable, skip live server, browser presentation, and injection; report fallback signal.
|
||||
4. If mutation is available, start `node .gemini/skills/impeccable/scripts/live-server.mjs --background`, present the browser if supported, label `[Human]`, scroll top, inject `http://localhost:PORT/detect.js`, wait 2-3 seconds, read `impeccable` console messages, then stop the live server.
|
||||
@@ -79,6 +86,12 @@ The chat response is the primary user-facing deliverable. Present the full struc
|
||||
|
||||
Structure your feedback as a design director would:
|
||||
|
||||
#### Report header provenance
|
||||
|
||||
The report's first line MUST declare how the assessments were run, so a degraded run is never silent:
|
||||
- Dual-agent: `Method: dual-agent (A: <agent-id> · B: <agent-id>)`
|
||||
- Degraded: `⚠️ DEGRADED: single-context (<reason, e.g. no sub-agent tool exposed>)`
|
||||
|
||||
#### Design Health Score
|
||||
> *Consult the [Heuristics Scoring Guide](#heuristics-scoring-guide) section below.*
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Generate a `DESIGN.md` file at the project root that captures the current visual design system, so AI agents generating new screens stay on-brand.
|
||||
|
||||
DESIGN.md follows the [official Google Stitch DESIGN.md format](https://stitch.withgoogle.com/docs/design-md/format/): YAML frontmatter carrying machine-readable design tokens, followed by a markdown body with exactly six sections in a fixed order. **Tokens are normative; prose provides context for how to apply them.** Sections may be omitted when not relevant, but **do not reorder them and do not rename them**. Section headers must match the spec character-for-character so the file stays parseable by other DESIGN.md-aware tools (Stitch itself, awesome-design-md, skill-rest, etc.).
|
||||
DESIGN.md follows the [official DESIGN.md format spec](https://raw.githubusercontent.com/google-labs-code/design.md/main/docs/spec.md): YAML frontmatter carrying machine-readable design tokens, followed by a markdown body with exactly six sections in a fixed order. **Tokens are normative; prose provides context for how to apply them.** Sections may be omitted when not relevant, but **do not reorder them and do not rename them**. Section headers must match the spec character-for-character so the file stays parseable by other DESIGN.md-aware tools (Stitch itself, awesome-design-md, skill-rest, etc.).
|
||||
|
||||
## The frontmatter: token schema
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
The setup command for a project. One codebase crawl feeds everything it writes:
|
||||
|
||||
- **PRODUCT.md** (strategic): root project file for register, target users, product purpose, brand personality, anti-references, strategic design principles. Answers "who/what/why".
|
||||
- **DESIGN.md** (visual): root project file for visual theme, color palette, typography, components, layout. Follows the [Google Stitch DESIGN.md format](https://stitch.withgoogle.com/docs/design-md/format/). Answers "how it looks".
|
||||
- **DESIGN.md** (visual): root project file for visual theme, color palette, typography, components, layout. Follows the [DESIGN.md format spec](https://raw.githubusercontent.com/google-labs-code/design.md/main/docs/spec.md). Answers "how it looks".
|
||||
- **`.impeccable/live/config.json`** (live mode): pre-configured so `/impeccable live` boots straight into variant mode with no first-time detour.
|
||||
|
||||
It closes by pointing the user at the best command to run next. Every other impeccable command reads PRODUCT.md and DESIGN.md before doing any work.
|
||||
|
||||
@@ -478,6 +478,17 @@ const ANTIPATTERNS = [
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'repeating-gradient decorative stripes',
|
||||
},
|
||||
{
|
||||
id: 'codex-grid-background',
|
||||
category: 'slop',
|
||||
severity: 'advisory',
|
||||
gated: 'gpt',
|
||||
name: 'Decorative grid-line background',
|
||||
description:
|
||||
'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) is a recurring generated-UI signature. Reserve grid overlays for actual canvas, map, blueprint, or measurement surfaces; elsewhere use product structure or a plain surface.',
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'two-axis grid-line gradient background',
|
||||
},
|
||||
{
|
||||
id: 'theater-slop-phrase',
|
||||
category: 'slop',
|
||||
@@ -1172,6 +1183,42 @@ function checkHtmlPatterns(html) {
|
||||
findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' });
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): two-axis grid-line background (Codex/GPT) ---
|
||||
// The Codex grid tell is two hairline `linear-gradient(... <color> 1px,
|
||||
// transparent 1px)` layers (one per axis) tiled by a repeating
|
||||
// `background-size` cell. Both signals must co-occur in the SAME style block
|
||||
// (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a
|
||||
// tiling background-size is a fixed crosshair, not a grid, and a single
|
||||
// hairline is a legitimate ruled line. Scoping to one block also stops
|
||||
// unrelated single-axis rules on separate elements from adding up across the
|
||||
// page. Count hairlines only inside `background`/`background-image` values so
|
||||
// a hairline in an unrelated property (mask-image, border-image) can't stand
|
||||
// in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry
|
||||
// nested parens, so match the hairline stop directly rather than parsing
|
||||
// whole gradient layers.
|
||||
{
|
||||
const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi;
|
||||
const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i;
|
||||
const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi;
|
||||
const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi;
|
||||
let blk;
|
||||
while ((blk = blockRe.exec(html)) !== null) {
|
||||
const block = blk[1] || blk[2] || blk[3] || '';
|
||||
if (!gridSizeRe.test(block)) continue;
|
||||
let hairlineCount = 0;
|
||||
let bm;
|
||||
bgDeclRe.lastIndex = 0;
|
||||
while ((bm = bgDeclRe.exec(block)) !== null) {
|
||||
const stops = bm[1].match(hairlineRe);
|
||||
if (stops) hairlineCount += stops.length;
|
||||
}
|
||||
if (hairlineCount >= 2) {
|
||||
findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' });
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): "X theater" framing copy (GPT) ---
|
||||
// Lives here (regex-on-HTML) rather than in the text-content analyzers so it
|
||||
// runs in the bundled browser path too, not just the CLI/static path.
|
||||
|
||||
@@ -376,6 +376,17 @@ const ANTIPATTERNS = [
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'repeating-gradient decorative stripes',
|
||||
},
|
||||
{
|
||||
id: 'codex-grid-background',
|
||||
category: 'slop',
|
||||
severity: 'advisory',
|
||||
gated: 'gpt',
|
||||
name: 'Decorative grid-line background',
|
||||
description:
|
||||
'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) is a recurring generated-UI signature. Reserve grid overlays for actual canvas, map, blueprint, or measurement surfaces; elsewhere use product structure or a plain surface.',
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'two-axis grid-line gradient background',
|
||||
},
|
||||
{
|
||||
id: 'theater-slop-phrase',
|
||||
category: 'slop',
|
||||
|
||||
@@ -573,6 +573,42 @@ function checkHtmlPatterns(html) {
|
||||
findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' });
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): two-axis grid-line background (Codex/GPT) ---
|
||||
// The Codex grid tell is two hairline `linear-gradient(... <color> 1px,
|
||||
// transparent 1px)` layers (one per axis) tiled by a repeating
|
||||
// `background-size` cell. Both signals must co-occur in the SAME style block
|
||||
// (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a
|
||||
// tiling background-size is a fixed crosshair, not a grid, and a single
|
||||
// hairline is a legitimate ruled line. Scoping to one block also stops
|
||||
// unrelated single-axis rules on separate elements from adding up across the
|
||||
// page. Count hairlines only inside `background`/`background-image` values so
|
||||
// a hairline in an unrelated property (mask-image, border-image) can't stand
|
||||
// in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry
|
||||
// nested parens, so match the hairline stop directly rather than parsing
|
||||
// whole gradient layers.
|
||||
{
|
||||
const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi;
|
||||
const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i;
|
||||
const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi;
|
||||
const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi;
|
||||
let blk;
|
||||
while ((blk = blockRe.exec(html)) !== null) {
|
||||
const block = blk[1] || blk[2] || blk[3] || '';
|
||||
if (!gridSizeRe.test(block)) continue;
|
||||
let hairlineCount = 0;
|
||||
let bm;
|
||||
bgDeclRe.lastIndex = 0;
|
||||
while ((bm = bgDeclRe.exec(block)) !== null) {
|
||||
const stops = bm[1].match(hairlineRe);
|
||||
if (stops) hairlineCount += stops.length;
|
||||
}
|
||||
if (hairlineCount >= 2) {
|
||||
findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' });
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): "X theater" framing copy (GPT) ---
|
||||
// Lives here (regex-on-HTML) rather than in the text-content analyzers so it
|
||||
// runs in the bundled browser path too, not just the CLI/static path.
|
||||
|
||||
@@ -75,7 +75,6 @@ const HOOK_MANIFEST_TARGETS = [
|
||||
skillRel: '.agents/skills/impeccable',
|
||||
destRel: '.codex/hooks.json',
|
||||
manifest: () => ({
|
||||
description: 'Impeccable design detector: runs after Edit/Write/apply_patch on UI files and surfaces findings as system reminders.',
|
||||
hooks: {
|
||||
PostToolUse: [
|
||||
{
|
||||
@@ -83,7 +82,7 @@ const HOOK_MANIFEST_TARGETS = [
|
||||
hooks: [
|
||||
{
|
||||
type: 'command',
|
||||
command: 'node "$(git rev-parse --show-toplevel)/.agents/skills/impeccable/scripts/hook.mjs"',
|
||||
command: 'node ".agents/skills/impeccable/scripts/hook.mjs"',
|
||||
timeout: TIMEOUT_SECONDS,
|
||||
statusMessage: STATUS_MESSAGE,
|
||||
},
|
||||
|
||||
@@ -7928,7 +7928,7 @@ void main() {
|
||||
const barTopFromBottom = barRect && barRect.height > 0
|
||||
? Math.max(16, window.innerHeight - barRect.top + 12)
|
||||
: 16;
|
||||
toastEl = el('div', {
|
||||
const currentToast = el('div', {
|
||||
position: 'fixed', bottom: barTopFromBottom + 'px', left: '50%',
|
||||
transform: 'translateX(-50%) translateY(8px)',
|
||||
background: C.ink, color: C.white,
|
||||
@@ -7938,19 +7938,24 @@ void main() {
|
||||
transition: 'opacity 0.25s ' + EASE + ', transform 0.25s ' + EASE,
|
||||
pointerEvents: 'none', maxWidth: '420px', textAlign: 'center',
|
||||
});
|
||||
toastEl.id = PREFIX + '-toast';
|
||||
toastEl.textContent = message;
|
||||
uiAppend(toastEl);
|
||||
toastEl = currentToast;
|
||||
currentToast.id = PREFIX + '-toast';
|
||||
currentToast.textContent = message;
|
||||
uiAppend(currentToast);
|
||||
requestAnimationFrame(() => {
|
||||
toastEl.style.opacity = '1';
|
||||
toastEl.style.transform = 'translateX(-50%) translateY(0)';
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.style.opacity = '1';
|
||||
currentToast.style.transform = 'translateX(-50%) translateY(0)';
|
||||
});
|
||||
setTimeout(() => {
|
||||
if (toastEl) {
|
||||
toastEl.style.opacity = '0';
|
||||
toastEl.style.transform = 'translateX(-50%) translateY(8px)';
|
||||
setTimeout(() => { if (toastEl) { toastEl.remove(); toastEl = null; } }, 250);
|
||||
}
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.style.opacity = '0';
|
||||
currentToast.style.transform = 'translateX(-50%) translateY(8px)';
|
||||
setTimeout(() => {
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.remove();
|
||||
toastEl = null;
|
||||
}, 250);
|
||||
}, duration);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
name: impeccable
|
||||
description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks.
|
||||
version: 3.8.0
|
||||
version: 3.9.1
|
||||
user-invocable: true
|
||||
argument-hint: "[craft|shape · audit|critique · animate|bolder|colorize|delight|layout|overdrive|quieter|typeset · adapt|clarify|distill · harden|onboard|optimize|polish · init|document|extract|live] [target]"
|
||||
license: Apache 2.0
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
When asked for "bolder," AI defaults to the same tired tricks: cyan/purple gradients, glassmorphism, neon accents on dark backgrounds, gradient text on metrics. These are the opposite of bold. Reject them first, then increase visual impact and personality through stronger hierarchy, committed scale, and decisive type.
|
||||
When asked for "bolder," AI defaults to the same tired tricks: cyan/purple gradients, glassmorphism, neon accents on dark backgrounds, gradient text on metrics. These are the opposite of bold. Reject them first, then increase visual impact by making the existing design language more decisive, specific, and committed.
|
||||
|
||||
---
|
||||
|
||||
## Register
|
||||
|
||||
Brand: "bolder" means distinctive. Extreme scale, unexpected color, typographic risk, committed POV.
|
||||
Brand: "bolder" means distinctive. Express a stronger point of view through hierarchy, pacing, proportion, copy, evidence, and one committed visual idea.
|
||||
|
||||
Product: "bolder" rarely means theatrics; those undermine trust. It means stronger hierarchy, clearer weight contrast, one sharper accent, more committed density. The amplification is in clarity, not drama.
|
||||
Product: "bolder" rarely means theatrics; those undermine trust. It means stronger hierarchy, clearer weight contrast, sharper information density, and more decisive prioritization. The amplification is in clarity, not drama.
|
||||
|
||||
---
|
||||
|
||||
@@ -15,98 +15,105 @@ Product: "bolder" rarely means theatrics; those undermine trust. It means strong
|
||||
Analyze what makes the design feel too safe or boring:
|
||||
|
||||
1. **Identify weakness sources**:
|
||||
- **Generic choices**: System fonts, basic colors, standard layouts
|
||||
- **Timid scale**: Everything is medium-sized with no drama
|
||||
- **Low contrast**: Everything has similar visual weight
|
||||
- **Static**: No motion, no energy, no life
|
||||
- **Predictable**: Standard patterns with no surprises
|
||||
- **Flat hierarchy**: Nothing stands out or commands attention
|
||||
- **Generic choices**: The page could belong to any product in the category.
|
||||
- **Timid scale**: Everything is medium-sized with no clear lead.
|
||||
- **Low contrast**: Important and supporting elements have similar visual weight.
|
||||
- **Static**: The surface has no meaningful moment of emphasis.
|
||||
- **Predictable**: The composition follows a default pattern without a point of view.
|
||||
- **Flat hierarchy**: Nothing stands out or commands attention.
|
||||
|
||||
2. **Understand the context**:
|
||||
- What's the brand personality? (How far can we push?)
|
||||
- What's the purpose? (Marketing can be bolder than financial dashboards)
|
||||
- Who's the audience? (What will resonate?)
|
||||
- What are the constraints? (Brand guidelines, accessibility, performance)
|
||||
- What is the brand personality?
|
||||
- What is the purpose of this surface?
|
||||
- Who is the audience?
|
||||
- What design system, tokens, components, and visual conventions already exist?
|
||||
|
||||
If any of these are unclear from the codebase, ask the user directly to clarify what you cannot infer.
|
||||
|
||||
**CRITICAL**: "Bolder" doesn't mean chaotic or garish. It means distinctive, memorable, and confident. Think intentional drama, not random chaos.
|
||||
**CRITICAL**: "Bolder" does not mean chaotic or garish. It means distinctive, memorable, and confident. Think intentional drama, not random noise.
|
||||
|
||||
**WARNING - AI SLOP TRAP**: Review ALL the DON'T guidelines from the parent impeccable skill (already loaded in this context) before proceeding. Bold means distinctive, not "more effects."
|
||||
|
||||
## Design-System Lock
|
||||
|
||||
If the project has `DESIGN.md`, tokens, theme variables, or established component styles, treat that system as the boundary. Make the existing language stronger before adding new language.
|
||||
|
||||
Do not invent new colors, gradients, radii, shadows, fonts, decorative backgrounds, or effects just because the request says "bolder." A bolder pass should usually change emphasis, proportion, rhythm, density, contrast, copy, artifact specificity, and layout relationships while staying inside the documented system.
|
||||
|
||||
If the existing system is genuinely too limited to express the bolder direction, stop and ask the user before expanding it. Name the exact additions, the role each would play, and why the current system cannot do the job. If the user approves expansion, update the design system or tokens alongside the implementation.
|
||||
|
||||
## Plan Amplification
|
||||
|
||||
Create a strategy to increase impact while maintaining coherence:
|
||||
|
||||
- **Focal point**: What should be the hero moment? (Pick ONE, make it amazing)
|
||||
- **Personality direction**: Maximalist chaos? Elegant drama? Playful energy? Dark moody? Choose a lane.
|
||||
- **Risk budget**: How experimental can we be? Push boundaries within constraints.
|
||||
- **Hierarchy amplification**: Make big things BIGGER, small things smaller (increase contrast)
|
||||
- **Focal point**: Pick one thing the viewer should remember, then make the rest support it.
|
||||
- **System levers**: Identify which existing tokens, components, layout patterns, and copy structures can carry more weight.
|
||||
- **Risk budget**: Decide how far the surface can push while still feeling like the same product or brand.
|
||||
- **Hierarchy amplification**: Increase contrast between primary, secondary, and tertiary content instead of making every element louder.
|
||||
|
||||
**IMPORTANT**: Bold design must still be usable. Impact without function is just decoration.
|
||||
|
||||
## Amplify the Design
|
||||
|
||||
Systematically increase impact across these dimensions:
|
||||
Systematically increase impact through intention, not a menu of effects:
|
||||
|
||||
### Typography Amplification
|
||||
- **Replace generic fonts**: Swap system fonts for distinctive choices (see the parent skill's typography guidelines and the [Reference Material section of typeset.md](typeset.md#reference-material) for inspiration)
|
||||
- **Extreme scale**: Create dramatic size jumps (3x-5x differences, not 1.5x)
|
||||
- **Weight contrast**: Pair 900 weights with 200 weights, not 600 with 400
|
||||
- **Unexpected choices**: Variable fonts, display fonts for headlines, condensed/extended widths, monospace as intentional accent (not as lazy "dev tool" default)
|
||||
- Strengthen the existing type hierarchy before changing typefaces.
|
||||
- Make important text meaningfully more dominant, and make supporting text quieter.
|
||||
- Use weight, measure, spacing, and line breaks to sharpen the point of view.
|
||||
- Add or replace fonts only after user-approved design-system expansion.
|
||||
|
||||
### Color Intensification
|
||||
- **Increase saturation**: Shift to more vibrant, energetic colors (but not neon)
|
||||
- **Bold palette**: Introduce unexpected color combinations. Avoid the purple-blue gradient AI slop
|
||||
- **Dominant color strategy**: Let one bold color own 60% of the design
|
||||
- **Sharp accents**: High-contrast accent colors that pop
|
||||
- **Tinted neutrals**: Replace pure grays with tinted grays that harmonize with your palette
|
||||
- **Rich gradients**: Intentional multi-stop gradients (not generic purple-to-blue)
|
||||
### Color Amplification
|
||||
- Use the existing palette more decisively before adding colors.
|
||||
- Shift the proportion, placement, and contrast of documented colors to clarify meaning.
|
||||
- Treat any new color, gradient, or tint ramp as a design-system expansion that requires user approval.
|
||||
- Keep color tied to hierarchy, state, or brand meaning; do not use it as surface decoration.
|
||||
|
||||
### Spatial Drama
|
||||
- **Extreme scale jumps**: Make important elements 3-5x larger than surroundings
|
||||
- **Break the grid**: Let hero elements escape containers and cross boundaries
|
||||
- **Asymmetric layouts**: Replace centered, balanced layouts with tension-filled asymmetry
|
||||
- **Generous space**: Use white space dramatically (100-200px gaps, not 20-40px)
|
||||
- **Overlap**: Layer elements intentionally for depth
|
||||
### Spatial Amplification
|
||||
- Change proportion, density, alignment, and sequencing so the composition has a stronger point of view.
|
||||
- Create clearer contrast between dense evidence and open breathing room.
|
||||
- Let layout express priority and narrative order before adding ornament.
|
||||
- Preserve responsive behavior and avoid text overflow at every breakpoint.
|
||||
|
||||
### Visual Effects
|
||||
- **Dramatic shadows**: Large, soft shadows for elevation (but not generic drop shadows on rounded rectangles)
|
||||
- **Background treatments**: Mesh patterns, noise textures, geometric patterns, intentional gradients (not purple-to-blue)
|
||||
- **Texture & depth**: Grain, halftone, duotone, layered elements. NOT glassmorphism (it's overused AI slop)
|
||||
- **Borders & frames**: Thick borders, decorative frames, custom shapes (not rounded rectangles with colored border on one side)
|
||||
- **Custom elements**: Illustrative elements, custom icons, decorative details that reinforce brand
|
||||
### Surface Amplification
|
||||
- Use existing surface, border, radius, and shadow rules more deliberately.
|
||||
- Remove timid half-measures: either give an element a clear role or simplify it.
|
||||
- Add texture, depth, illustration, or decorative treatments only when already established by the system or explicitly approved.
|
||||
- Make real product artifacts, imagery, data, or copy carry attention before reaching for effects.
|
||||
|
||||
### Motion & Animation
|
||||
- **Hero moment**: One signature entrance, once. Not on every visit and not on every section.
|
||||
- **Micro-interactions**: Satisfying hover effects, click feedback, state changes.
|
||||
- **Transitions**: Smooth, noticeable transitions using ease-out-quart/quint/expo (not bounce or elastic, which cheapen the effect).
|
||||
- **Bolder ≠ scroll-fade-rise on every section.** That's the saturated AI default, the opposite of bold.
|
||||
- Design one meaningful moment of emphasis when motion genuinely supports the point.
|
||||
- Make interaction feedback feel more decisive without becoming distracting.
|
||||
- Keep transitions smooth and intentional.
|
||||
- **Bolder != scroll-fade-rise on every section.** That's the saturated AI default, the opposite of bold.
|
||||
|
||||
### Composition Boldness
|
||||
- **Hero moments**: Create clear focal points with dramatic treatment
|
||||
- **Diagonal flows**: Escape horizontal/vertical rigidity with diagonal arrangements
|
||||
- **Full-bleed elements**: Use full viewport width/height for impact
|
||||
- **Unexpected proportions**: Golden ratio? Throw it out. Try 70/30, 80/20 splits
|
||||
- Make the dominant idea unmistakable.
|
||||
- Use layout tension, sequencing, contrast, and restraint to create a stronger read.
|
||||
- Let the page's structure communicate priority before adding decorative layers.
|
||||
- If every element is louder, the composition is not bolder; it is flatter.
|
||||
|
||||
**NEVER**:
|
||||
- Add effects randomly without purpose (chaos ≠ bold)
|
||||
- Sacrifice readability for aesthetics (body text must be readable)
|
||||
- Make everything bold (then nothing is bold; you need contrast)
|
||||
- Ignore accessibility (bold design must still meet WCAG standards)
|
||||
- Overwhelm with motion (animation fatigue is real)
|
||||
- Copy trendy aesthetics blindly (bold means distinctive, not derivative)
|
||||
- Add undocumented design-system primitives without user approval
|
||||
- Add effects randomly without purpose
|
||||
- Hide weak hierarchy behind decoration
|
||||
- Sacrifice readability for aesthetics
|
||||
- Make everything bold; contrast is the point
|
||||
- Ignore accessibility
|
||||
- Overwhelm with motion
|
||||
- Copy trendy aesthetics blindly
|
||||
|
||||
## Verify Quality
|
||||
|
||||
Ensure amplification maintains usability and coherence:
|
||||
|
||||
- **System-faithful**: Did the pass make the existing design language stronger before adding anything new?
|
||||
- **No undocumented drift**: Are new colors, gradients, shadows, radii, fonts, and effects either absent or explicitly approved and documented?
|
||||
- **NOT AI slop**: Does this look like every other AI-generated "bold" design? If yes, start over.
|
||||
- **Still functional**: Can users accomplish tasks without distraction?
|
||||
- **Coherent**: Does everything feel intentional and unified?
|
||||
- **Memorable**: Will users remember this experience?
|
||||
- **Performant**: Do all these effects run smoothly?
|
||||
- **Accessible**: Does it still meet accessibility standards?
|
||||
- **Memorable**: Will users remember this experience for the intended reason?
|
||||
- **Performant and accessible**: Does the result stay fast, readable, responsive, and WCAG-conscious?
|
||||
|
||||
**The test**: If you showed this to someone and said "AI made this bolder," would they believe you immediately? If yes, you've failed. Bold means distinctive, not "more AI effects."
|
||||
|
||||
|
||||
@@ -5,8 +5,9 @@ Resolve one stable target, run two independent assessments, synthesize a design
|
||||
### Hard Invariants
|
||||
|
||||
- Assessment A (design review) and Assessment B (detector/browser evidence) are both required.
|
||||
- Assessment A and B MUST run as two isolated sub-agents whenever a sub-agent/Task tool is exposed. Running them inline in this context is "possible" but is NOT permitted; it is a degraded run. Inline is allowed ONLY when no sub-agent tool exists (or the user declined, on harnesses that ask).
|
||||
- If you degrade for any reason, the report's first line MUST be a banner: `⚠️ DEGRADED: single-context (<reason>)`. A silent degraded critique is a failed critique.
|
||||
- Assessment A must finish before detector findings enter the parent synthesis context. Detector output is deterministic, but it still anchors judgment.
|
||||
- If sub-agents are unavailable, fall back sequentially: finish and record Assessment A first, then run Assessment B, then synthesize.
|
||||
- A skipped detector is a failed critique run unless `detect.mjs` is missing or crashes after a real attempt.
|
||||
- Viewable targets require browser inspection when available.
|
||||
- Any local server started only for critique visualization must run in the background, have a recorded stop method, and be stopped before final reporting unless the user asks to keep it.
|
||||
@@ -27,7 +28,13 @@ Resolve one stable target, run two independent assessments, synthesize a design
|
||||
|
||||
### Assessment Orchestration
|
||||
|
||||
Delegate Assessment A and Assessment B to separate sub-agents when possible. They must not see each other's output. Do not show findings to the user until synthesis.
|
||||
Delegate Assessment A and Assessment B to separate sub-agents. They must not see each other's output. Do not show findings to the user until synthesis.
|
||||
|
||||
Sub-agent gate (all harnesses):
|
||||
- Unless a harness-specific gate below overrides this, spawn A and B as two isolated, parallel sub-agents whenever a sub-agent/Task tool is exposed. This is the default and is mandatory; do not run them inline because it is faster.
|
||||
- "Unavailable" means exactly one thing: no sub-agent/Task tool is exposed in this session (or, on harnesses that ask, the user declined). It does not mean inconvenient.
|
||||
- If and only if sub-agents are unavailable, fall back sequentially: finish and record Assessment A, then run Assessment B, then synthesize, and emit the degraded banner.
|
||||
- Whichever path you take, declare it in the report header (see Report header provenance). Skipping sub-agents without the banner is the most common failure of this command.
|
||||
|
||||
If browser automation is available, each assessment creates its own new tab. Never reuse an existing tab, even if it is already at the right URL.
|
||||
|
||||
@@ -61,7 +68,7 @@ node .github/skills/impeccable/scripts/detect.mjs --json [target]
|
||||
|
||||
Browser visualization is required for a viewable target when browser automation is available. Use a localhost dev/static URL for local files; avoid `file://` unless the available browser explicitly supports this workflow. Overlay flow:
|
||||
|
||||
1. Create a fresh tab and navigate.
|
||||
1. Create a fresh tab and navigate. Prefer the harness's native/browser-canvas screenshot path before hand-rolling a Playwright/Puppeteer script; only fall back to a custom script when no native browser tool is exposed.
|
||||
2. Preflight mutable injection by setting `document.title` and appending a `<script>` tag. Read-only evaluate APIs do not count.
|
||||
3. If mutation is unavailable, skip live server, browser presentation, and injection; report fallback signal.
|
||||
4. If mutation is available, start `node .github/skills/impeccable/scripts/live-server.mjs --background`, present the browser if supported, label `[Human]`, scroll top, inject `http://localhost:PORT/detect.js`, wait 2-3 seconds, read `impeccable` console messages, then stop the live server.
|
||||
@@ -79,6 +86,12 @@ The chat response is the primary user-facing deliverable. Present the full struc
|
||||
|
||||
Structure your feedback as a design director would:
|
||||
|
||||
#### Report header provenance
|
||||
|
||||
The report's first line MUST declare how the assessments were run, so a degraded run is never silent:
|
||||
- Dual-agent: `Method: dual-agent (A: <agent-id> · B: <agent-id>)`
|
||||
- Degraded: `⚠️ DEGRADED: single-context (<reason, e.g. no sub-agent tool exposed>)`
|
||||
|
||||
#### Design Health Score
|
||||
> *Consult the [Heuristics Scoring Guide](#heuristics-scoring-guide) section below.*
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Generate a `DESIGN.md` file at the project root that captures the current visual design system, so AI agents generating new screens stay on-brand.
|
||||
|
||||
DESIGN.md follows the [official Google Stitch DESIGN.md format](https://stitch.withgoogle.com/docs/design-md/format/): YAML frontmatter carrying machine-readable design tokens, followed by a markdown body with exactly six sections in a fixed order. **Tokens are normative; prose provides context for how to apply them.** Sections may be omitted when not relevant, but **do not reorder them and do not rename them**. Section headers must match the spec character-for-character so the file stays parseable by other DESIGN.md-aware tools (Stitch itself, awesome-design-md, skill-rest, etc.).
|
||||
DESIGN.md follows the [official DESIGN.md format spec](https://raw.githubusercontent.com/google-labs-code/design.md/main/docs/spec.md): YAML frontmatter carrying machine-readable design tokens, followed by a markdown body with exactly six sections in a fixed order. **Tokens are normative; prose provides context for how to apply them.** Sections may be omitted when not relevant, but **do not reorder them and do not rename them**. Section headers must match the spec character-for-character so the file stays parseable by other DESIGN.md-aware tools (Stitch itself, awesome-design-md, skill-rest, etc.).
|
||||
|
||||
## The frontmatter: token schema
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
The setup command for a project. One codebase crawl feeds everything it writes:
|
||||
|
||||
- **PRODUCT.md** (strategic): root project file for register, target users, product purpose, brand personality, anti-references, strategic design principles. Answers "who/what/why".
|
||||
- **DESIGN.md** (visual): root project file for visual theme, color palette, typography, components, layout. Follows the [Google Stitch DESIGN.md format](https://stitch.withgoogle.com/docs/design-md/format/). Answers "how it looks".
|
||||
- **DESIGN.md** (visual): root project file for visual theme, color palette, typography, components, layout. Follows the [DESIGN.md format spec](https://raw.githubusercontent.com/google-labs-code/design.md/main/docs/spec.md). Answers "how it looks".
|
||||
- **`.impeccable/live/config.json`** (live mode): pre-configured so `/impeccable live` boots straight into variant mode with no first-time detour.
|
||||
|
||||
It closes by pointing the user at the best command to run next. Every other impeccable command reads PRODUCT.md and DESIGN.md before doing any work.
|
||||
|
||||
@@ -478,6 +478,17 @@ const ANTIPATTERNS = [
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'repeating-gradient decorative stripes',
|
||||
},
|
||||
{
|
||||
id: 'codex-grid-background',
|
||||
category: 'slop',
|
||||
severity: 'advisory',
|
||||
gated: 'gpt',
|
||||
name: 'Decorative grid-line background',
|
||||
description:
|
||||
'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) is a recurring generated-UI signature. Reserve grid overlays for actual canvas, map, blueprint, or measurement surfaces; elsewhere use product structure or a plain surface.',
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'two-axis grid-line gradient background',
|
||||
},
|
||||
{
|
||||
id: 'theater-slop-phrase',
|
||||
category: 'slop',
|
||||
@@ -1172,6 +1183,42 @@ function checkHtmlPatterns(html) {
|
||||
findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' });
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): two-axis grid-line background (Codex/GPT) ---
|
||||
// The Codex grid tell is two hairline `linear-gradient(... <color> 1px,
|
||||
// transparent 1px)` layers (one per axis) tiled by a repeating
|
||||
// `background-size` cell. Both signals must co-occur in the SAME style block
|
||||
// (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a
|
||||
// tiling background-size is a fixed crosshair, not a grid, and a single
|
||||
// hairline is a legitimate ruled line. Scoping to one block also stops
|
||||
// unrelated single-axis rules on separate elements from adding up across the
|
||||
// page. Count hairlines only inside `background`/`background-image` values so
|
||||
// a hairline in an unrelated property (mask-image, border-image) can't stand
|
||||
// in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry
|
||||
// nested parens, so match the hairline stop directly rather than parsing
|
||||
// whole gradient layers.
|
||||
{
|
||||
const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi;
|
||||
const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i;
|
||||
const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi;
|
||||
const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi;
|
||||
let blk;
|
||||
while ((blk = blockRe.exec(html)) !== null) {
|
||||
const block = blk[1] || blk[2] || blk[3] || '';
|
||||
if (!gridSizeRe.test(block)) continue;
|
||||
let hairlineCount = 0;
|
||||
let bm;
|
||||
bgDeclRe.lastIndex = 0;
|
||||
while ((bm = bgDeclRe.exec(block)) !== null) {
|
||||
const stops = bm[1].match(hairlineRe);
|
||||
if (stops) hairlineCount += stops.length;
|
||||
}
|
||||
if (hairlineCount >= 2) {
|
||||
findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' });
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): "X theater" framing copy (GPT) ---
|
||||
// Lives here (regex-on-HTML) rather than in the text-content analyzers so it
|
||||
// runs in the bundled browser path too, not just the CLI/static path.
|
||||
|
||||
@@ -376,6 +376,17 @@ const ANTIPATTERNS = [
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'repeating-gradient decorative stripes',
|
||||
},
|
||||
{
|
||||
id: 'codex-grid-background',
|
||||
category: 'slop',
|
||||
severity: 'advisory',
|
||||
gated: 'gpt',
|
||||
name: 'Decorative grid-line background',
|
||||
description:
|
||||
'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) is a recurring generated-UI signature. Reserve grid overlays for actual canvas, map, blueprint, or measurement surfaces; elsewhere use product structure or a plain surface.',
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'two-axis grid-line gradient background',
|
||||
},
|
||||
{
|
||||
id: 'theater-slop-phrase',
|
||||
category: 'slop',
|
||||
|
||||
@@ -573,6 +573,42 @@ function checkHtmlPatterns(html) {
|
||||
findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' });
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): two-axis grid-line background (Codex/GPT) ---
|
||||
// The Codex grid tell is two hairline `linear-gradient(... <color> 1px,
|
||||
// transparent 1px)` layers (one per axis) tiled by a repeating
|
||||
// `background-size` cell. Both signals must co-occur in the SAME style block
|
||||
// (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a
|
||||
// tiling background-size is a fixed crosshair, not a grid, and a single
|
||||
// hairline is a legitimate ruled line. Scoping to one block also stops
|
||||
// unrelated single-axis rules on separate elements from adding up across the
|
||||
// page. Count hairlines only inside `background`/`background-image` values so
|
||||
// a hairline in an unrelated property (mask-image, border-image) can't stand
|
||||
// in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry
|
||||
// nested parens, so match the hairline stop directly rather than parsing
|
||||
// whole gradient layers.
|
||||
{
|
||||
const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi;
|
||||
const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i;
|
||||
const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi;
|
||||
const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi;
|
||||
let blk;
|
||||
while ((blk = blockRe.exec(html)) !== null) {
|
||||
const block = blk[1] || blk[2] || blk[3] || '';
|
||||
if (!gridSizeRe.test(block)) continue;
|
||||
let hairlineCount = 0;
|
||||
let bm;
|
||||
bgDeclRe.lastIndex = 0;
|
||||
while ((bm = bgDeclRe.exec(block)) !== null) {
|
||||
const stops = bm[1].match(hairlineRe);
|
||||
if (stops) hairlineCount += stops.length;
|
||||
}
|
||||
if (hairlineCount >= 2) {
|
||||
findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' });
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): "X theater" framing copy (GPT) ---
|
||||
// Lives here (regex-on-HTML) rather than in the text-content analyzers so it
|
||||
// runs in the bundled browser path too, not just the CLI/static path.
|
||||
|
||||
@@ -75,7 +75,6 @@ const HOOK_MANIFEST_TARGETS = [
|
||||
skillRel: '.agents/skills/impeccable',
|
||||
destRel: '.codex/hooks.json',
|
||||
manifest: () => ({
|
||||
description: 'Impeccable design detector: runs after Edit/Write/apply_patch on UI files and surfaces findings as system reminders.',
|
||||
hooks: {
|
||||
PostToolUse: [
|
||||
{
|
||||
@@ -83,7 +82,7 @@ const HOOK_MANIFEST_TARGETS = [
|
||||
hooks: [
|
||||
{
|
||||
type: 'command',
|
||||
command: 'node "$(git rev-parse --show-toplevel)/.agents/skills/impeccable/scripts/hook.mjs"',
|
||||
command: 'node ".agents/skills/impeccable/scripts/hook.mjs"',
|
||||
timeout: TIMEOUT_SECONDS,
|
||||
statusMessage: STATUS_MESSAGE,
|
||||
},
|
||||
|
||||
@@ -7928,7 +7928,7 @@ void main() {
|
||||
const barTopFromBottom = barRect && barRect.height > 0
|
||||
? Math.max(16, window.innerHeight - barRect.top + 12)
|
||||
: 16;
|
||||
toastEl = el('div', {
|
||||
const currentToast = el('div', {
|
||||
position: 'fixed', bottom: barTopFromBottom + 'px', left: '50%',
|
||||
transform: 'translateX(-50%) translateY(8px)',
|
||||
background: C.ink, color: C.white,
|
||||
@@ -7938,19 +7938,24 @@ void main() {
|
||||
transition: 'opacity 0.25s ' + EASE + ', transform 0.25s ' + EASE,
|
||||
pointerEvents: 'none', maxWidth: '420px', textAlign: 'center',
|
||||
});
|
||||
toastEl.id = PREFIX + '-toast';
|
||||
toastEl.textContent = message;
|
||||
uiAppend(toastEl);
|
||||
toastEl = currentToast;
|
||||
currentToast.id = PREFIX + '-toast';
|
||||
currentToast.textContent = message;
|
||||
uiAppend(currentToast);
|
||||
requestAnimationFrame(() => {
|
||||
toastEl.style.opacity = '1';
|
||||
toastEl.style.transform = 'translateX(-50%) translateY(0)';
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.style.opacity = '1';
|
||||
currentToast.style.transform = 'translateX(-50%) translateY(0)';
|
||||
});
|
||||
setTimeout(() => {
|
||||
if (toastEl) {
|
||||
toastEl.style.opacity = '0';
|
||||
toastEl.style.transform = 'translateX(-50%) translateY(8px)';
|
||||
setTimeout(() => { if (toastEl) { toastEl.remove(); toastEl = null; } }, 250);
|
||||
}
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.style.opacity = '0';
|
||||
currentToast.style.transform = 'translateX(-50%) translateY(8px)';
|
||||
setTimeout(() => {
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.remove();
|
||||
toastEl = null;
|
||||
}, 250);
|
||||
}, duration);
|
||||
}
|
||||
|
||||
|
||||
+16
-16
@@ -26,7 +26,7 @@ jobs:
|
||||
live_svelte_adapter_deepseek: ${{ steps.plan.outputs.live_svelte_adapter_deepseek }}
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
@@ -46,7 +46,7 @@ jobs:
|
||||
needs: changes
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v6
|
||||
@@ -117,7 +117,7 @@ jobs:
|
||||
if: needs.changes.outputs.cli_remote_e2e == 'true'
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v6
|
||||
@@ -151,7 +151,7 @@ jobs:
|
||||
fixtures: vite8-react-css-modules,vite8-react-insert,vite8-react-plain
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v6
|
||||
@@ -164,7 +164,7 @@ jobs:
|
||||
bun-version: latest
|
||||
|
||||
- name: Cache fixture npm downloads
|
||||
uses: actions/cache@v5
|
||||
uses: actions/cache@v6
|
||||
with:
|
||||
path: ~/.npm
|
||||
key: ${{ runner.os }}-fixture-npm-${{ hashFiles('tests/framework-fixtures/**/files/package.json') }}
|
||||
@@ -172,7 +172,7 @@ jobs:
|
||||
${{ runner.os }}-fixture-npm-
|
||||
|
||||
- name: Cache Playwright Chromium
|
||||
uses: actions/cache@v5
|
||||
uses: actions/cache@v6
|
||||
with:
|
||||
path: ~/.cache/ms-playwright
|
||||
key: ${{ runner.os }}-playwright-chromium-${{ hashFiles('package.json', 'bun.lock') }}
|
||||
@@ -225,7 +225,7 @@ jobs:
|
||||
fixtures: vite8-react-tailwindv3,vite8-react-tailwindv4,vite8-react-ts,vite8-react-tsx-repeated-aside,vite8-react-unocss,vite8-react-vanilla-extract
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v6
|
||||
@@ -238,7 +238,7 @@ jobs:
|
||||
bun-version: latest
|
||||
|
||||
- name: Cache fixture npm downloads
|
||||
uses: actions/cache@v5
|
||||
uses: actions/cache@v6
|
||||
with:
|
||||
path: ~/.npm
|
||||
key: ${{ runner.os }}-fixture-npm-${{ hashFiles('tests/framework-fixtures/**/files/package.json') }}
|
||||
@@ -246,7 +246,7 @@ jobs:
|
||||
${{ runner.os }}-fixture-npm-
|
||||
|
||||
- name: Cache Playwright Chromium
|
||||
uses: actions/cache@v5
|
||||
uses: actions/cache@v6
|
||||
with:
|
||||
path: ~/.cache/ms-playwright
|
||||
key: ${{ runner.os }}-playwright-chromium-${{ hashFiles('package.json', 'bun.lock') }}
|
||||
@@ -291,7 +291,7 @@ jobs:
|
||||
|
||||
- name: Checkout repository
|
||||
if: ${{ env.ANTHROPIC_API_KEY != '' || env.DEEPSEEK_API_KEY != '' }}
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
|
||||
- name: Setup Node
|
||||
if: ${{ env.ANTHROPIC_API_KEY != '' || env.DEEPSEEK_API_KEY != '' }}
|
||||
@@ -307,7 +307,7 @@ jobs:
|
||||
|
||||
- name: Cache fixture npm downloads
|
||||
if: ${{ env.ANTHROPIC_API_KEY != '' || env.DEEPSEEK_API_KEY != '' }}
|
||||
uses: actions/cache@v5
|
||||
uses: actions/cache@v6
|
||||
with:
|
||||
path: ~/.npm
|
||||
key: ${{ runner.os }}-fixture-npm-${{ hashFiles('tests/framework-fixtures/**/files/package.json') }}
|
||||
@@ -316,7 +316,7 @@ jobs:
|
||||
|
||||
- name: Cache Playwright Chromium
|
||||
if: ${{ env.ANTHROPIC_API_KEY != '' || env.DEEPSEEK_API_KEY != '' }}
|
||||
uses: actions/cache@v5
|
||||
uses: actions/cache@v6
|
||||
with:
|
||||
path: ~/.cache/ms-playwright
|
||||
key: ${{ runner.os }}-playwright-chromium-${{ hashFiles('package.json', 'bun.lock') }}
|
||||
@@ -355,7 +355,7 @@ jobs:
|
||||
|
||||
- name: Checkout repository
|
||||
if: ${{ env.DEEPSEEK_API_KEY != '' }}
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
|
||||
- name: Setup Node
|
||||
if: ${{ env.DEEPSEEK_API_KEY != '' }}
|
||||
@@ -371,7 +371,7 @@ jobs:
|
||||
|
||||
- name: Cache fixture npm downloads
|
||||
if: ${{ env.DEEPSEEK_API_KEY != '' }}
|
||||
uses: actions/cache@v5
|
||||
uses: actions/cache@v6
|
||||
with:
|
||||
path: ~/.npm
|
||||
key: ${{ runner.os }}-fixture-npm-${{ hashFiles('tests/framework-fixtures/**/files/package.json') }}
|
||||
@@ -380,7 +380,7 @@ jobs:
|
||||
|
||||
- name: Cache Playwright Chromium
|
||||
if: ${{ env.DEEPSEEK_API_KEY != '' }}
|
||||
uses: actions/cache@v5
|
||||
uses: actions/cache@v6
|
||||
with:
|
||||
path: ~/.cache/ms-playwright
|
||||
key: ${{ runner.os }}-playwright-chromium-${{ hashFiles('package.json', 'bun.lock') }}
|
||||
@@ -409,7 +409,7 @@ jobs:
|
||||
GOOGLE_CLOUD_API_KEY: ${{ secrets.GOOGLE_CLOUD_API_KEY }}
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v6
|
||||
|
||||
@@ -40,7 +40,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
fetch-depth: 0
|
||||
# Optional PAT or GitHub App token. With the default GITHUB_TOKEN,
|
||||
|
||||
+5
-2
@@ -40,7 +40,10 @@ Thumbs.db
|
||||
# Impeccable-owned project files are split: generated sidecars/config may be
|
||||
# tracked, but runtime recovery state and local assets should stay local.
|
||||
.impeccable/live/server.json
|
||||
.impeccable/hook.cache.json
|
||||
# Ephemeral hook cache/state, at the project root and inside generated harness
|
||||
# skill dirs (**/skills/impeccable/scripts/.impeccable/). Anchored patterns
|
||||
# would miss the nested copies the build/hook writes.
|
||||
**/.impeccable/hook.cache.json
|
||||
.impeccable/live/sessions/
|
||||
.impeccable/live/previews/
|
||||
.impeccable/live/annotations/
|
||||
@@ -52,7 +55,7 @@ Thumbs.db
|
||||
.impeccable/live/deferred-svelte-component-accepts.json
|
||||
.impeccable/history/
|
||||
.impeccable/config.local.json
|
||||
.impeccable/hook.pending.json
|
||||
**/.impeccable/hook.pending.json
|
||||
.impeccable/provider-smoke/
|
||||
src/__impeccable_provider_smoke_*.html
|
||||
# Per-run critique snapshots are local artifacts. ignore.md (also under
|
||||
|
||||
@@ -174,15 +174,15 @@
|
||||
"typographyMeta": {
|
||||
"wordmark": {
|
||||
"displayName": "Wordmark",
|
||||
"purpose": "IMPECCABLE lockup only. Solid Alumni Sans, not pinstripe."
|
||||
"purpose": "IMPECCABLE lockup only. Alumni Sans at weight 400."
|
||||
},
|
||||
"display": {
|
||||
"displayName": "Display",
|
||||
"purpose": "Hero h1. Alumni Sans Pinstripe, weight 300."
|
||||
"purpose": "Hero h1. Alumni Sans, weight 100."
|
||||
},
|
||||
"headline": {
|
||||
"displayName": "Headline",
|
||||
"purpose": "Section h2. Pinstripe at weight 600, heavier than display."
|
||||
"purpose": "Section h2. Alumni Sans at weight 300, heavier than display."
|
||||
},
|
||||
"title": {
|
||||
"displayName": "Title",
|
||||
@@ -360,12 +360,12 @@
|
||||
{
|
||||
"name": "The Weight-Inversion Rule",
|
||||
"section": "typography",
|
||||
"body": "Section h2s read heavier (600) than the hero h1 (300). This is deliberate: the hero is elegant and thin so the page can breathe; section anchors carry more weight to ground each block."
|
||||
"body": "Section h2s read heavier (300) than the hero h1 (100). This is deliberate: the hero is elegant and thin so the page can breathe; section anchors carry more weight to ground each block."
|
||||
},
|
||||
{
|
||||
"name": "The Two-Face Rule",
|
||||
"section": "typography",
|
||||
"body": "Display sizes use Alumni Sans Pinstripe. Anything sized below 1.2rem uses Albert Sans. Pinstripe at small sizes loses its identity and reads as a bad rendering."
|
||||
"body": "Display sizes use Alumni Sans — thin (100) for the h1, heavier (300) for h2s. Anything sized below 1.2rem uses Albert Sans. The thin display cut reads too light at small sizes, so it never carries body or UI text."
|
||||
},
|
||||
{
|
||||
"name": "The Tracked Labels Are Short Rule",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
name: impeccable
|
||||
description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks.
|
||||
version: 3.8.0
|
||||
version: 3.9.1
|
||||
license: Apache 2.0
|
||||
---
|
||||
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
When asked for "bolder," AI defaults to the same tired tricks: cyan/purple gradients, glassmorphism, neon accents on dark backgrounds, gradient text on metrics. These are the opposite of bold. Reject them first, then increase visual impact and personality through stronger hierarchy, committed scale, and decisive type.
|
||||
When asked for "bolder," AI defaults to the same tired tricks: cyan/purple gradients, glassmorphism, neon accents on dark backgrounds, gradient text on metrics. These are the opposite of bold. Reject them first, then increase visual impact by making the existing design language more decisive, specific, and committed.
|
||||
|
||||
---
|
||||
|
||||
## Register
|
||||
|
||||
Brand: "bolder" means distinctive. Extreme scale, unexpected color, typographic risk, committed POV.
|
||||
Brand: "bolder" means distinctive. Express a stronger point of view through hierarchy, pacing, proportion, copy, evidence, and one committed visual idea.
|
||||
|
||||
Product: "bolder" rarely means theatrics; those undermine trust. It means stronger hierarchy, clearer weight contrast, one sharper accent, more committed density. The amplification is in clarity, not drama.
|
||||
Product: "bolder" rarely means theatrics; those undermine trust. It means stronger hierarchy, clearer weight contrast, sharper information density, and more decisive prioritization. The amplification is in clarity, not drama.
|
||||
|
||||
---
|
||||
|
||||
@@ -15,98 +15,105 @@ Product: "bolder" rarely means theatrics; those undermine trust. It means strong
|
||||
Analyze what makes the design feel too safe or boring:
|
||||
|
||||
1. **Identify weakness sources**:
|
||||
- **Generic choices**: System fonts, basic colors, standard layouts
|
||||
- **Timid scale**: Everything is medium-sized with no drama
|
||||
- **Low contrast**: Everything has similar visual weight
|
||||
- **Static**: No motion, no energy, no life
|
||||
- **Predictable**: Standard patterns with no surprises
|
||||
- **Flat hierarchy**: Nothing stands out or commands attention
|
||||
- **Generic choices**: The page could belong to any product in the category.
|
||||
- **Timid scale**: Everything is medium-sized with no clear lead.
|
||||
- **Low contrast**: Important and supporting elements have similar visual weight.
|
||||
- **Static**: The surface has no meaningful moment of emphasis.
|
||||
- **Predictable**: The composition follows a default pattern without a point of view.
|
||||
- **Flat hierarchy**: Nothing stands out or commands attention.
|
||||
|
||||
2. **Understand the context**:
|
||||
- What's the brand personality? (How far can we push?)
|
||||
- What's the purpose? (Marketing can be bolder than financial dashboards)
|
||||
- Who's the audience? (What will resonate?)
|
||||
- What are the constraints? (Brand guidelines, accessibility, performance)
|
||||
- What is the brand personality?
|
||||
- What is the purpose of this surface?
|
||||
- Who is the audience?
|
||||
- What design system, tokens, components, and visual conventions already exist?
|
||||
|
||||
If any of these are unclear from the codebase, ask the user directly to clarify what you cannot infer.
|
||||
|
||||
**CRITICAL**: "Bolder" doesn't mean chaotic or garish. It means distinctive, memorable, and confident. Think intentional drama, not random chaos.
|
||||
**CRITICAL**: "Bolder" does not mean chaotic or garish. It means distinctive, memorable, and confident. Think intentional drama, not random noise.
|
||||
|
||||
**WARNING - AI SLOP TRAP**: Review ALL the DON'T guidelines from the parent impeccable skill (already loaded in this context) before proceeding. Bold means distinctive, not "more effects."
|
||||
|
||||
## Design-System Lock
|
||||
|
||||
If the project has `DESIGN.md`, tokens, theme variables, or established component styles, treat that system as the boundary. Make the existing language stronger before adding new language.
|
||||
|
||||
Do not invent new colors, gradients, radii, shadows, fonts, decorative backgrounds, or effects just because the request says "bolder." A bolder pass should usually change emphasis, proportion, rhythm, density, contrast, copy, artifact specificity, and layout relationships while staying inside the documented system.
|
||||
|
||||
If the existing system is genuinely too limited to express the bolder direction, stop and ask the user before expanding it. Name the exact additions, the role each would play, and why the current system cannot do the job. If the user approves expansion, update the design system or tokens alongside the implementation.
|
||||
|
||||
## Plan Amplification
|
||||
|
||||
Create a strategy to increase impact while maintaining coherence:
|
||||
|
||||
- **Focal point**: What should be the hero moment? (Pick ONE, make it amazing)
|
||||
- **Personality direction**: Maximalist chaos? Elegant drama? Playful energy? Dark moody? Choose a lane.
|
||||
- **Risk budget**: How experimental can we be? Push boundaries within constraints.
|
||||
- **Hierarchy amplification**: Make big things BIGGER, small things smaller (increase contrast)
|
||||
- **Focal point**: Pick one thing the viewer should remember, then make the rest support it.
|
||||
- **System levers**: Identify which existing tokens, components, layout patterns, and copy structures can carry more weight.
|
||||
- **Risk budget**: Decide how far the surface can push while still feeling like the same product or brand.
|
||||
- **Hierarchy amplification**: Increase contrast between primary, secondary, and tertiary content instead of making every element louder.
|
||||
|
||||
**IMPORTANT**: Bold design must still be usable. Impact without function is just decoration.
|
||||
|
||||
## Amplify the Design
|
||||
|
||||
Systematically increase impact across these dimensions:
|
||||
Systematically increase impact through intention, not a menu of effects:
|
||||
|
||||
### Typography Amplification
|
||||
- **Replace generic fonts**: Swap system fonts for distinctive choices (see the parent skill's typography guidelines and the [Reference Material section of typeset.md](typeset.md#reference-material) for inspiration)
|
||||
- **Extreme scale**: Create dramatic size jumps (3x-5x differences, not 1.5x)
|
||||
- **Weight contrast**: Pair 900 weights with 200 weights, not 600 with 400
|
||||
- **Unexpected choices**: Variable fonts, display fonts for headlines, condensed/extended widths, monospace as intentional accent (not as lazy "dev tool" default)
|
||||
- Strengthen the existing type hierarchy before changing typefaces.
|
||||
- Make important text meaningfully more dominant, and make supporting text quieter.
|
||||
- Use weight, measure, spacing, and line breaks to sharpen the point of view.
|
||||
- Add or replace fonts only after user-approved design-system expansion.
|
||||
|
||||
### Color Intensification
|
||||
- **Increase saturation**: Shift to more vibrant, energetic colors (but not neon)
|
||||
- **Bold palette**: Introduce unexpected color combinations. Avoid the purple-blue gradient AI slop
|
||||
- **Dominant color strategy**: Let one bold color own 60% of the design
|
||||
- **Sharp accents**: High-contrast accent colors that pop
|
||||
- **Tinted neutrals**: Replace pure grays with tinted grays that harmonize with your palette
|
||||
- **Rich gradients**: Intentional multi-stop gradients (not generic purple-to-blue)
|
||||
### Color Amplification
|
||||
- Use the existing palette more decisively before adding colors.
|
||||
- Shift the proportion, placement, and contrast of documented colors to clarify meaning.
|
||||
- Treat any new color, gradient, or tint ramp as a design-system expansion that requires user approval.
|
||||
- Keep color tied to hierarchy, state, or brand meaning; do not use it as surface decoration.
|
||||
|
||||
### Spatial Drama
|
||||
- **Extreme scale jumps**: Make important elements 3-5x larger than surroundings
|
||||
- **Break the grid**: Let hero elements escape containers and cross boundaries
|
||||
- **Asymmetric layouts**: Replace centered, balanced layouts with tension-filled asymmetry
|
||||
- **Generous space**: Use white space dramatically (100-200px gaps, not 20-40px)
|
||||
- **Overlap**: Layer elements intentionally for depth
|
||||
### Spatial Amplification
|
||||
- Change proportion, density, alignment, and sequencing so the composition has a stronger point of view.
|
||||
- Create clearer contrast between dense evidence and open breathing room.
|
||||
- Let layout express priority and narrative order before adding ornament.
|
||||
- Preserve responsive behavior and avoid text overflow at every breakpoint.
|
||||
|
||||
### Visual Effects
|
||||
- **Dramatic shadows**: Large, soft shadows for elevation (but not generic drop shadows on rounded rectangles)
|
||||
- **Background treatments**: Mesh patterns, noise textures, geometric patterns, intentional gradients (not purple-to-blue)
|
||||
- **Texture & depth**: Grain, halftone, duotone, layered elements. NOT glassmorphism (it's overused AI slop)
|
||||
- **Borders & frames**: Thick borders, decorative frames, custom shapes (not rounded rectangles with colored border on one side)
|
||||
- **Custom elements**: Illustrative elements, custom icons, decorative details that reinforce brand
|
||||
### Surface Amplification
|
||||
- Use existing surface, border, radius, and shadow rules more deliberately.
|
||||
- Remove timid half-measures: either give an element a clear role or simplify it.
|
||||
- Add texture, depth, illustration, or decorative treatments only when already established by the system or explicitly approved.
|
||||
- Make real product artifacts, imagery, data, or copy carry attention before reaching for effects.
|
||||
|
||||
### Motion & Animation
|
||||
- **Hero moment**: One signature entrance, once. Not on every visit and not on every section.
|
||||
- **Micro-interactions**: Satisfying hover effects, click feedback, state changes.
|
||||
- **Transitions**: Smooth, noticeable transitions using ease-out-quart/quint/expo (not bounce or elastic, which cheapen the effect).
|
||||
- **Bolder ≠ scroll-fade-rise on every section.** That's the saturated AI default, the opposite of bold.
|
||||
- Design one meaningful moment of emphasis when motion genuinely supports the point.
|
||||
- Make interaction feedback feel more decisive without becoming distracting.
|
||||
- Keep transitions smooth and intentional.
|
||||
- **Bolder != scroll-fade-rise on every section.** That's the saturated AI default, the opposite of bold.
|
||||
|
||||
### Composition Boldness
|
||||
- **Hero moments**: Create clear focal points with dramatic treatment
|
||||
- **Diagonal flows**: Escape horizontal/vertical rigidity with diagonal arrangements
|
||||
- **Full-bleed elements**: Use full viewport width/height for impact
|
||||
- **Unexpected proportions**: Golden ratio? Throw it out. Try 70/30, 80/20 splits
|
||||
- Make the dominant idea unmistakable.
|
||||
- Use layout tension, sequencing, contrast, and restraint to create a stronger read.
|
||||
- Let the page's structure communicate priority before adding decorative layers.
|
||||
- If every element is louder, the composition is not bolder; it is flatter.
|
||||
|
||||
**NEVER**:
|
||||
- Add effects randomly without purpose (chaos ≠ bold)
|
||||
- Sacrifice readability for aesthetics (body text must be readable)
|
||||
- Make everything bold (then nothing is bold; you need contrast)
|
||||
- Ignore accessibility (bold design must still meet WCAG standards)
|
||||
- Overwhelm with motion (animation fatigue is real)
|
||||
- Copy trendy aesthetics blindly (bold means distinctive, not derivative)
|
||||
- Add undocumented design-system primitives without user approval
|
||||
- Add effects randomly without purpose
|
||||
- Hide weak hierarchy behind decoration
|
||||
- Sacrifice readability for aesthetics
|
||||
- Make everything bold; contrast is the point
|
||||
- Ignore accessibility
|
||||
- Overwhelm with motion
|
||||
- Copy trendy aesthetics blindly
|
||||
|
||||
## Verify Quality
|
||||
|
||||
Ensure amplification maintains usability and coherence:
|
||||
|
||||
- **System-faithful**: Did the pass make the existing design language stronger before adding anything new?
|
||||
- **No undocumented drift**: Are new colors, gradients, shadows, radii, fonts, and effects either absent or explicitly approved and documented?
|
||||
- **NOT AI slop**: Does this look like every other AI-generated "bold" design? If yes, start over.
|
||||
- **Still functional**: Can users accomplish tasks without distraction?
|
||||
- **Coherent**: Does everything feel intentional and unified?
|
||||
- **Memorable**: Will users remember this experience?
|
||||
- **Performant**: Do all these effects run smoothly?
|
||||
- **Accessible**: Does it still meet accessibility standards?
|
||||
- **Memorable**: Will users remember this experience for the intended reason?
|
||||
- **Performant and accessible**: Does the result stay fast, readable, responsive, and WCAG-conscious?
|
||||
|
||||
**The test**: If you showed this to someone and said "AI made this bolder," would they believe you immediately? If yes, you've failed. Bold means distinctive, not "more AI effects."
|
||||
|
||||
|
||||
@@ -5,8 +5,9 @@ Resolve one stable target, run two independent assessments, synthesize a design
|
||||
### Hard Invariants
|
||||
|
||||
- Assessment A (design review) and Assessment B (detector/browser evidence) are both required.
|
||||
- Assessment A and B MUST run as two isolated sub-agents whenever a sub-agent/Task tool is exposed. Running them inline in this context is "possible" but is NOT permitted; it is a degraded run. Inline is allowed ONLY when no sub-agent tool exists (or the user declined, on harnesses that ask).
|
||||
- If you degrade for any reason, the report's first line MUST be a banner: `⚠️ DEGRADED: single-context (<reason>)`. A silent degraded critique is a failed critique.
|
||||
- Assessment A must finish before detector findings enter the parent synthesis context. Detector output is deterministic, but it still anchors judgment.
|
||||
- If sub-agents are unavailable, fall back sequentially: finish and record Assessment A first, then run Assessment B, then synthesize.
|
||||
- A skipped detector is a failed critique run unless `detect.mjs` is missing or crashes after a real attempt.
|
||||
- Viewable targets require browser inspection when available.
|
||||
- Any local server started only for critique visualization must run in the background, have a recorded stop method, and be stopped before final reporting unless the user asks to keep it.
|
||||
@@ -27,7 +28,13 @@ Resolve one stable target, run two independent assessments, synthesize a design
|
||||
|
||||
### Assessment Orchestration
|
||||
|
||||
Delegate Assessment A and Assessment B to separate sub-agents when possible. They must not see each other's output. Do not show findings to the user until synthesis.
|
||||
Delegate Assessment A and Assessment B to separate sub-agents. They must not see each other's output. Do not show findings to the user until synthesis.
|
||||
|
||||
Sub-agent gate (all harnesses):
|
||||
- Unless a harness-specific gate below overrides this, spawn A and B as two isolated, parallel sub-agents whenever a sub-agent/Task tool is exposed. This is the default and is mandatory; do not run them inline because it is faster.
|
||||
- "Unavailable" means exactly one thing: no sub-agent/Task tool is exposed in this session (or, on harnesses that ask, the user declined). It does not mean inconvenient.
|
||||
- If and only if sub-agents are unavailable, fall back sequentially: finish and record Assessment A, then run Assessment B, then synthesize, and emit the degraded banner.
|
||||
- Whichever path you take, declare it in the report header (see Report header provenance). Skipping sub-agents without the banner is the most common failure of this command.
|
||||
|
||||
If browser automation is available, each assessment creates its own new tab. Never reuse an existing tab, even if it is already at the right URL.
|
||||
|
||||
@@ -61,7 +68,7 @@ node .kiro/skills/impeccable/scripts/detect.mjs --json [target]
|
||||
|
||||
Browser visualization is required for a viewable target when browser automation is available. Use a localhost dev/static URL for local files; avoid `file://` unless the available browser explicitly supports this workflow. Overlay flow:
|
||||
|
||||
1. Create a fresh tab and navigate.
|
||||
1. Create a fresh tab and navigate. Prefer the harness's native/browser-canvas screenshot path before hand-rolling a Playwright/Puppeteer script; only fall back to a custom script when no native browser tool is exposed.
|
||||
2. Preflight mutable injection by setting `document.title` and appending a `<script>` tag. Read-only evaluate APIs do not count.
|
||||
3. If mutation is unavailable, skip live server, browser presentation, and injection; report fallback signal.
|
||||
4. If mutation is available, start `node .kiro/skills/impeccable/scripts/live-server.mjs --background`, present the browser if supported, label `[Human]`, scroll top, inject `http://localhost:PORT/detect.js`, wait 2-3 seconds, read `impeccable` console messages, then stop the live server.
|
||||
@@ -79,6 +86,12 @@ The chat response is the primary user-facing deliverable. Present the full struc
|
||||
|
||||
Structure your feedback as a design director would:
|
||||
|
||||
#### Report header provenance
|
||||
|
||||
The report's first line MUST declare how the assessments were run, so a degraded run is never silent:
|
||||
- Dual-agent: `Method: dual-agent (A: <agent-id> · B: <agent-id>)`
|
||||
- Degraded: `⚠️ DEGRADED: single-context (<reason, e.g. no sub-agent tool exposed>)`
|
||||
|
||||
#### Design Health Score
|
||||
> *Consult the [Heuristics Scoring Guide](#heuristics-scoring-guide) section below.*
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Generate a `DESIGN.md` file at the project root that captures the current visual design system, so AI agents generating new screens stay on-brand.
|
||||
|
||||
DESIGN.md follows the [official Google Stitch DESIGN.md format](https://stitch.withgoogle.com/docs/design-md/format/): YAML frontmatter carrying machine-readable design tokens, followed by a markdown body with exactly six sections in a fixed order. **Tokens are normative; prose provides context for how to apply them.** Sections may be omitted when not relevant, but **do not reorder them and do not rename them**. Section headers must match the spec character-for-character so the file stays parseable by other DESIGN.md-aware tools (Stitch itself, awesome-design-md, skill-rest, etc.).
|
||||
DESIGN.md follows the [official DESIGN.md format spec](https://raw.githubusercontent.com/google-labs-code/design.md/main/docs/spec.md): YAML frontmatter carrying machine-readable design tokens, followed by a markdown body with exactly six sections in a fixed order. **Tokens are normative; prose provides context for how to apply them.** Sections may be omitted when not relevant, but **do not reorder them and do not rename them**. Section headers must match the spec character-for-character so the file stays parseable by other DESIGN.md-aware tools (Stitch itself, awesome-design-md, skill-rest, etc.).
|
||||
|
||||
## The frontmatter: token schema
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
The setup command for a project. One codebase crawl feeds everything it writes:
|
||||
|
||||
- **PRODUCT.md** (strategic): root project file for register, target users, product purpose, brand personality, anti-references, strategic design principles. Answers "who/what/why".
|
||||
- **DESIGN.md** (visual): root project file for visual theme, color palette, typography, components, layout. Follows the [Google Stitch DESIGN.md format](https://stitch.withgoogle.com/docs/design-md/format/). Answers "how it looks".
|
||||
- **DESIGN.md** (visual): root project file for visual theme, color palette, typography, components, layout. Follows the [DESIGN.md format spec](https://raw.githubusercontent.com/google-labs-code/design.md/main/docs/spec.md). Answers "how it looks".
|
||||
- **`.impeccable/live/config.json`** (live mode): pre-configured so `/impeccable live` boots straight into variant mode with no first-time detour.
|
||||
|
||||
It closes by pointing the user at the best command to run next. Every other impeccable command reads PRODUCT.md and DESIGN.md before doing any work.
|
||||
|
||||
@@ -478,6 +478,17 @@ const ANTIPATTERNS = [
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'repeating-gradient decorative stripes',
|
||||
},
|
||||
{
|
||||
id: 'codex-grid-background',
|
||||
category: 'slop',
|
||||
severity: 'advisory',
|
||||
gated: 'gpt',
|
||||
name: 'Decorative grid-line background',
|
||||
description:
|
||||
'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) is a recurring generated-UI signature. Reserve grid overlays for actual canvas, map, blueprint, or measurement surfaces; elsewhere use product structure or a plain surface.',
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'two-axis grid-line gradient background',
|
||||
},
|
||||
{
|
||||
id: 'theater-slop-phrase',
|
||||
category: 'slop',
|
||||
@@ -1172,6 +1183,42 @@ function checkHtmlPatterns(html) {
|
||||
findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' });
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): two-axis grid-line background (Codex/GPT) ---
|
||||
// The Codex grid tell is two hairline `linear-gradient(... <color> 1px,
|
||||
// transparent 1px)` layers (one per axis) tiled by a repeating
|
||||
// `background-size` cell. Both signals must co-occur in the SAME style block
|
||||
// (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a
|
||||
// tiling background-size is a fixed crosshair, not a grid, and a single
|
||||
// hairline is a legitimate ruled line. Scoping to one block also stops
|
||||
// unrelated single-axis rules on separate elements from adding up across the
|
||||
// page. Count hairlines only inside `background`/`background-image` values so
|
||||
// a hairline in an unrelated property (mask-image, border-image) can't stand
|
||||
// in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry
|
||||
// nested parens, so match the hairline stop directly rather than parsing
|
||||
// whole gradient layers.
|
||||
{
|
||||
const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi;
|
||||
const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i;
|
||||
const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi;
|
||||
const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi;
|
||||
let blk;
|
||||
while ((blk = blockRe.exec(html)) !== null) {
|
||||
const block = blk[1] || blk[2] || blk[3] || '';
|
||||
if (!gridSizeRe.test(block)) continue;
|
||||
let hairlineCount = 0;
|
||||
let bm;
|
||||
bgDeclRe.lastIndex = 0;
|
||||
while ((bm = bgDeclRe.exec(block)) !== null) {
|
||||
const stops = bm[1].match(hairlineRe);
|
||||
if (stops) hairlineCount += stops.length;
|
||||
}
|
||||
if (hairlineCount >= 2) {
|
||||
findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' });
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): "X theater" framing copy (GPT) ---
|
||||
// Lives here (regex-on-HTML) rather than in the text-content analyzers so it
|
||||
// runs in the bundled browser path too, not just the CLI/static path.
|
||||
|
||||
@@ -376,6 +376,17 @@ const ANTIPATTERNS = [
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'repeating-gradient decorative stripes',
|
||||
},
|
||||
{
|
||||
id: 'codex-grid-background',
|
||||
category: 'slop',
|
||||
severity: 'advisory',
|
||||
gated: 'gpt',
|
||||
name: 'Decorative grid-line background',
|
||||
description:
|
||||
'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) is a recurring generated-UI signature. Reserve grid overlays for actual canvas, map, blueprint, or measurement surfaces; elsewhere use product structure or a plain surface.',
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'two-axis grid-line gradient background',
|
||||
},
|
||||
{
|
||||
id: 'theater-slop-phrase',
|
||||
category: 'slop',
|
||||
|
||||
@@ -573,6 +573,42 @@ function checkHtmlPatterns(html) {
|
||||
findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' });
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): two-axis grid-line background (Codex/GPT) ---
|
||||
// The Codex grid tell is two hairline `linear-gradient(... <color> 1px,
|
||||
// transparent 1px)` layers (one per axis) tiled by a repeating
|
||||
// `background-size` cell. Both signals must co-occur in the SAME style block
|
||||
// (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a
|
||||
// tiling background-size is a fixed crosshair, not a grid, and a single
|
||||
// hairline is a legitimate ruled line. Scoping to one block also stops
|
||||
// unrelated single-axis rules on separate elements from adding up across the
|
||||
// page. Count hairlines only inside `background`/`background-image` values so
|
||||
// a hairline in an unrelated property (mask-image, border-image) can't stand
|
||||
// in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry
|
||||
// nested parens, so match the hairline stop directly rather than parsing
|
||||
// whole gradient layers.
|
||||
{
|
||||
const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi;
|
||||
const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i;
|
||||
const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi;
|
||||
const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi;
|
||||
let blk;
|
||||
while ((blk = blockRe.exec(html)) !== null) {
|
||||
const block = blk[1] || blk[2] || blk[3] || '';
|
||||
if (!gridSizeRe.test(block)) continue;
|
||||
let hairlineCount = 0;
|
||||
let bm;
|
||||
bgDeclRe.lastIndex = 0;
|
||||
while ((bm = bgDeclRe.exec(block)) !== null) {
|
||||
const stops = bm[1].match(hairlineRe);
|
||||
if (stops) hairlineCount += stops.length;
|
||||
}
|
||||
if (hairlineCount >= 2) {
|
||||
findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' });
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): "X theater" framing copy (GPT) ---
|
||||
// Lives here (regex-on-HTML) rather than in the text-content analyzers so it
|
||||
// runs in the bundled browser path too, not just the CLI/static path.
|
||||
|
||||
@@ -75,7 +75,6 @@ const HOOK_MANIFEST_TARGETS = [
|
||||
skillRel: '.agents/skills/impeccable',
|
||||
destRel: '.codex/hooks.json',
|
||||
manifest: () => ({
|
||||
description: 'Impeccable design detector: runs after Edit/Write/apply_patch on UI files and surfaces findings as system reminders.',
|
||||
hooks: {
|
||||
PostToolUse: [
|
||||
{
|
||||
@@ -83,7 +82,7 @@ const HOOK_MANIFEST_TARGETS = [
|
||||
hooks: [
|
||||
{
|
||||
type: 'command',
|
||||
command: 'node "$(git rev-parse --show-toplevel)/.agents/skills/impeccable/scripts/hook.mjs"',
|
||||
command: 'node ".agents/skills/impeccable/scripts/hook.mjs"',
|
||||
timeout: TIMEOUT_SECONDS,
|
||||
statusMessage: STATUS_MESSAGE,
|
||||
},
|
||||
|
||||
@@ -7928,7 +7928,7 @@ void main() {
|
||||
const barTopFromBottom = barRect && barRect.height > 0
|
||||
? Math.max(16, window.innerHeight - barRect.top + 12)
|
||||
: 16;
|
||||
toastEl = el('div', {
|
||||
const currentToast = el('div', {
|
||||
position: 'fixed', bottom: barTopFromBottom + 'px', left: '50%',
|
||||
transform: 'translateX(-50%) translateY(8px)',
|
||||
background: C.ink, color: C.white,
|
||||
@@ -7938,19 +7938,24 @@ void main() {
|
||||
transition: 'opacity 0.25s ' + EASE + ', transform 0.25s ' + EASE,
|
||||
pointerEvents: 'none', maxWidth: '420px', textAlign: 'center',
|
||||
});
|
||||
toastEl.id = PREFIX + '-toast';
|
||||
toastEl.textContent = message;
|
||||
uiAppend(toastEl);
|
||||
toastEl = currentToast;
|
||||
currentToast.id = PREFIX + '-toast';
|
||||
currentToast.textContent = message;
|
||||
uiAppend(currentToast);
|
||||
requestAnimationFrame(() => {
|
||||
toastEl.style.opacity = '1';
|
||||
toastEl.style.transform = 'translateX(-50%) translateY(0)';
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.style.opacity = '1';
|
||||
currentToast.style.transform = 'translateX(-50%) translateY(0)';
|
||||
});
|
||||
setTimeout(() => {
|
||||
if (toastEl) {
|
||||
toastEl.style.opacity = '0';
|
||||
toastEl.style.transform = 'translateX(-50%) translateY(8px)';
|
||||
setTimeout(() => { if (toastEl) { toastEl.remove(); toastEl = null; } }, 250);
|
||||
}
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.style.opacity = '0';
|
||||
currentToast.style.transform = 'translateX(-50%) translateY(8px)';
|
||||
setTimeout(() => {
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.remove();
|
||||
toastEl = null;
|
||||
}, 250);
|
||||
}, duration);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
---
|
||||
name: impeccable
|
||||
description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks.
|
||||
version: 3.8.0
|
||||
version: 3.9.1
|
||||
user-invocable: true
|
||||
argument-hint: "[craft|shape · audit|critique · animate|bolder|colorize|delight|layout|overdrive|quieter|typeset · adapt|clarify|distill · harden|onboard|optimize|polish · init|document|extract|live] [target]"
|
||||
license: Apache 2.0
|
||||
allowed-tools:
|
||||
- Bash(npx impeccable *)
|
||||
- Bash(node .opencode/skills/impeccable/scripts/*)
|
||||
---
|
||||
|
||||
Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft.
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
When asked for "bolder," AI defaults to the same tired tricks: cyan/purple gradients, glassmorphism, neon accents on dark backgrounds, gradient text on metrics. These are the opposite of bold. Reject them first, then increase visual impact and personality through stronger hierarchy, committed scale, and decisive type.
|
||||
When asked for "bolder," AI defaults to the same tired tricks: cyan/purple gradients, glassmorphism, neon accents on dark backgrounds, gradient text on metrics. These are the opposite of bold. Reject them first, then increase visual impact by making the existing design language more decisive, specific, and committed.
|
||||
|
||||
---
|
||||
|
||||
## Register
|
||||
|
||||
Brand: "bolder" means distinctive. Extreme scale, unexpected color, typographic risk, committed POV.
|
||||
Brand: "bolder" means distinctive. Express a stronger point of view through hierarchy, pacing, proportion, copy, evidence, and one committed visual idea.
|
||||
|
||||
Product: "bolder" rarely means theatrics; those undermine trust. It means stronger hierarchy, clearer weight contrast, one sharper accent, more committed density. The amplification is in clarity, not drama.
|
||||
Product: "bolder" rarely means theatrics; those undermine trust. It means stronger hierarchy, clearer weight contrast, sharper information density, and more decisive prioritization. The amplification is in clarity, not drama.
|
||||
|
||||
---
|
||||
|
||||
@@ -15,98 +15,105 @@ Product: "bolder" rarely means theatrics; those undermine trust. It means strong
|
||||
Analyze what makes the design feel too safe or boring:
|
||||
|
||||
1. **Identify weakness sources**:
|
||||
- **Generic choices**: System fonts, basic colors, standard layouts
|
||||
- **Timid scale**: Everything is medium-sized with no drama
|
||||
- **Low contrast**: Everything has similar visual weight
|
||||
- **Static**: No motion, no energy, no life
|
||||
- **Predictable**: Standard patterns with no surprises
|
||||
- **Flat hierarchy**: Nothing stands out or commands attention
|
||||
- **Generic choices**: The page could belong to any product in the category.
|
||||
- **Timid scale**: Everything is medium-sized with no clear lead.
|
||||
- **Low contrast**: Important and supporting elements have similar visual weight.
|
||||
- **Static**: The surface has no meaningful moment of emphasis.
|
||||
- **Predictable**: The composition follows a default pattern without a point of view.
|
||||
- **Flat hierarchy**: Nothing stands out or commands attention.
|
||||
|
||||
2. **Understand the context**:
|
||||
- What's the brand personality? (How far can we push?)
|
||||
- What's the purpose? (Marketing can be bolder than financial dashboards)
|
||||
- Who's the audience? (What will resonate?)
|
||||
- What are the constraints? (Brand guidelines, accessibility, performance)
|
||||
- What is the brand personality?
|
||||
- What is the purpose of this surface?
|
||||
- Who is the audience?
|
||||
- What design system, tokens, components, and visual conventions already exist?
|
||||
|
||||
If any of these are unclear from the codebase, STOP and call the `question` tool to clarify.
|
||||
|
||||
**CRITICAL**: "Bolder" doesn't mean chaotic or garish. It means distinctive, memorable, and confident. Think intentional drama, not random chaos.
|
||||
**CRITICAL**: "Bolder" does not mean chaotic or garish. It means distinctive, memorable, and confident. Think intentional drama, not random noise.
|
||||
|
||||
**WARNING - AI SLOP TRAP**: Review ALL the DON'T guidelines from the parent impeccable skill (already loaded in this context) before proceeding. Bold means distinctive, not "more effects."
|
||||
|
||||
## Design-System Lock
|
||||
|
||||
If the project has `DESIGN.md`, tokens, theme variables, or established component styles, treat that system as the boundary. Make the existing language stronger before adding new language.
|
||||
|
||||
Do not invent new colors, gradients, radii, shadows, fonts, decorative backgrounds, or effects just because the request says "bolder." A bolder pass should usually change emphasis, proportion, rhythm, density, contrast, copy, artifact specificity, and layout relationships while staying inside the documented system.
|
||||
|
||||
If the existing system is genuinely too limited to express the bolder direction, stop and ask the user before expanding it. Name the exact additions, the role each would play, and why the current system cannot do the job. If the user approves expansion, update the design system or tokens alongside the implementation.
|
||||
|
||||
## Plan Amplification
|
||||
|
||||
Create a strategy to increase impact while maintaining coherence:
|
||||
|
||||
- **Focal point**: What should be the hero moment? (Pick ONE, make it amazing)
|
||||
- **Personality direction**: Maximalist chaos? Elegant drama? Playful energy? Dark moody? Choose a lane.
|
||||
- **Risk budget**: How experimental can we be? Push boundaries within constraints.
|
||||
- **Hierarchy amplification**: Make big things BIGGER, small things smaller (increase contrast)
|
||||
- **Focal point**: Pick one thing the viewer should remember, then make the rest support it.
|
||||
- **System levers**: Identify which existing tokens, components, layout patterns, and copy structures can carry more weight.
|
||||
- **Risk budget**: Decide how far the surface can push while still feeling like the same product or brand.
|
||||
- **Hierarchy amplification**: Increase contrast between primary, secondary, and tertiary content instead of making every element louder.
|
||||
|
||||
**IMPORTANT**: Bold design must still be usable. Impact without function is just decoration.
|
||||
|
||||
## Amplify the Design
|
||||
|
||||
Systematically increase impact across these dimensions:
|
||||
Systematically increase impact through intention, not a menu of effects:
|
||||
|
||||
### Typography Amplification
|
||||
- **Replace generic fonts**: Swap system fonts for distinctive choices (see the parent skill's typography guidelines and the [Reference Material section of typeset.md](typeset.md#reference-material) for inspiration)
|
||||
- **Extreme scale**: Create dramatic size jumps (3x-5x differences, not 1.5x)
|
||||
- **Weight contrast**: Pair 900 weights with 200 weights, not 600 with 400
|
||||
- **Unexpected choices**: Variable fonts, display fonts for headlines, condensed/extended widths, monospace as intentional accent (not as lazy "dev tool" default)
|
||||
- Strengthen the existing type hierarchy before changing typefaces.
|
||||
- Make important text meaningfully more dominant, and make supporting text quieter.
|
||||
- Use weight, measure, spacing, and line breaks to sharpen the point of view.
|
||||
- Add or replace fonts only after user-approved design-system expansion.
|
||||
|
||||
### Color Intensification
|
||||
- **Increase saturation**: Shift to more vibrant, energetic colors (but not neon)
|
||||
- **Bold palette**: Introduce unexpected color combinations. Avoid the purple-blue gradient AI slop
|
||||
- **Dominant color strategy**: Let one bold color own 60% of the design
|
||||
- **Sharp accents**: High-contrast accent colors that pop
|
||||
- **Tinted neutrals**: Replace pure grays with tinted grays that harmonize with your palette
|
||||
- **Rich gradients**: Intentional multi-stop gradients (not generic purple-to-blue)
|
||||
### Color Amplification
|
||||
- Use the existing palette more decisively before adding colors.
|
||||
- Shift the proportion, placement, and contrast of documented colors to clarify meaning.
|
||||
- Treat any new color, gradient, or tint ramp as a design-system expansion that requires user approval.
|
||||
- Keep color tied to hierarchy, state, or brand meaning; do not use it as surface decoration.
|
||||
|
||||
### Spatial Drama
|
||||
- **Extreme scale jumps**: Make important elements 3-5x larger than surroundings
|
||||
- **Break the grid**: Let hero elements escape containers and cross boundaries
|
||||
- **Asymmetric layouts**: Replace centered, balanced layouts with tension-filled asymmetry
|
||||
- **Generous space**: Use white space dramatically (100-200px gaps, not 20-40px)
|
||||
- **Overlap**: Layer elements intentionally for depth
|
||||
### Spatial Amplification
|
||||
- Change proportion, density, alignment, and sequencing so the composition has a stronger point of view.
|
||||
- Create clearer contrast between dense evidence and open breathing room.
|
||||
- Let layout express priority and narrative order before adding ornament.
|
||||
- Preserve responsive behavior and avoid text overflow at every breakpoint.
|
||||
|
||||
### Visual Effects
|
||||
- **Dramatic shadows**: Large, soft shadows for elevation (but not generic drop shadows on rounded rectangles)
|
||||
- **Background treatments**: Mesh patterns, noise textures, geometric patterns, intentional gradients (not purple-to-blue)
|
||||
- **Texture & depth**: Grain, halftone, duotone, layered elements. NOT glassmorphism (it's overused AI slop)
|
||||
- **Borders & frames**: Thick borders, decorative frames, custom shapes (not rounded rectangles with colored border on one side)
|
||||
- **Custom elements**: Illustrative elements, custom icons, decorative details that reinforce brand
|
||||
### Surface Amplification
|
||||
- Use existing surface, border, radius, and shadow rules more deliberately.
|
||||
- Remove timid half-measures: either give an element a clear role or simplify it.
|
||||
- Add texture, depth, illustration, or decorative treatments only when already established by the system or explicitly approved.
|
||||
- Make real product artifacts, imagery, data, or copy carry attention before reaching for effects.
|
||||
|
||||
### Motion & Animation
|
||||
- **Hero moment**: One signature entrance, once. Not on every visit and not on every section.
|
||||
- **Micro-interactions**: Satisfying hover effects, click feedback, state changes.
|
||||
- **Transitions**: Smooth, noticeable transitions using ease-out-quart/quint/expo (not bounce or elastic, which cheapen the effect).
|
||||
- **Bolder ≠ scroll-fade-rise on every section.** That's the saturated AI default, the opposite of bold.
|
||||
- Design one meaningful moment of emphasis when motion genuinely supports the point.
|
||||
- Make interaction feedback feel more decisive without becoming distracting.
|
||||
- Keep transitions smooth and intentional.
|
||||
- **Bolder != scroll-fade-rise on every section.** That's the saturated AI default, the opposite of bold.
|
||||
|
||||
### Composition Boldness
|
||||
- **Hero moments**: Create clear focal points with dramatic treatment
|
||||
- **Diagonal flows**: Escape horizontal/vertical rigidity with diagonal arrangements
|
||||
- **Full-bleed elements**: Use full viewport width/height for impact
|
||||
- **Unexpected proportions**: Golden ratio? Throw it out. Try 70/30, 80/20 splits
|
||||
- Make the dominant idea unmistakable.
|
||||
- Use layout tension, sequencing, contrast, and restraint to create a stronger read.
|
||||
- Let the page's structure communicate priority before adding decorative layers.
|
||||
- If every element is louder, the composition is not bolder; it is flatter.
|
||||
|
||||
**NEVER**:
|
||||
- Add effects randomly without purpose (chaos ≠ bold)
|
||||
- Sacrifice readability for aesthetics (body text must be readable)
|
||||
- Make everything bold (then nothing is bold; you need contrast)
|
||||
- Ignore accessibility (bold design must still meet WCAG standards)
|
||||
- Overwhelm with motion (animation fatigue is real)
|
||||
- Copy trendy aesthetics blindly (bold means distinctive, not derivative)
|
||||
- Add undocumented design-system primitives without user approval
|
||||
- Add effects randomly without purpose
|
||||
- Hide weak hierarchy behind decoration
|
||||
- Sacrifice readability for aesthetics
|
||||
- Make everything bold; contrast is the point
|
||||
- Ignore accessibility
|
||||
- Overwhelm with motion
|
||||
- Copy trendy aesthetics blindly
|
||||
|
||||
## Verify Quality
|
||||
|
||||
Ensure amplification maintains usability and coherence:
|
||||
|
||||
- **System-faithful**: Did the pass make the existing design language stronger before adding anything new?
|
||||
- **No undocumented drift**: Are new colors, gradients, shadows, radii, fonts, and effects either absent or explicitly approved and documented?
|
||||
- **NOT AI slop**: Does this look like every other AI-generated "bold" design? If yes, start over.
|
||||
- **Still functional**: Can users accomplish tasks without distraction?
|
||||
- **Coherent**: Does everything feel intentional and unified?
|
||||
- **Memorable**: Will users remember this experience?
|
||||
- **Performant**: Do all these effects run smoothly?
|
||||
- **Accessible**: Does it still meet accessibility standards?
|
||||
- **Memorable**: Will users remember this experience for the intended reason?
|
||||
- **Performant and accessible**: Does the result stay fast, readable, responsive, and WCAG-conscious?
|
||||
|
||||
**The test**: If you showed this to someone and said "AI made this bolder," would they believe you immediately? If yes, you've failed. Bold means distinctive, not "more AI effects."
|
||||
|
||||
|
||||
@@ -5,8 +5,9 @@ Resolve one stable target, run two independent assessments, synthesize a design
|
||||
### Hard Invariants
|
||||
|
||||
- Assessment A (design review) and Assessment B (detector/browser evidence) are both required.
|
||||
- Assessment A and B MUST run as two isolated sub-agents whenever a sub-agent/Task tool is exposed. Running them inline in this context is "possible" but is NOT permitted; it is a degraded run. Inline is allowed ONLY when no sub-agent tool exists (or the user declined, on harnesses that ask).
|
||||
- If you degrade for any reason, the report's first line MUST be a banner: `⚠️ DEGRADED: single-context (<reason>)`. A silent degraded critique is a failed critique.
|
||||
- Assessment A must finish before detector findings enter the parent synthesis context. Detector output is deterministic, but it still anchors judgment.
|
||||
- If sub-agents are unavailable, fall back sequentially: finish and record Assessment A first, then run Assessment B, then synthesize.
|
||||
- A skipped detector is a failed critique run unless `detect.mjs` is missing or crashes after a real attempt.
|
||||
- Viewable targets require browser inspection when available.
|
||||
- Any local server started only for critique visualization must run in the background, have a recorded stop method, and be stopped before final reporting unless the user asks to keep it.
|
||||
@@ -27,7 +28,13 @@ Resolve one stable target, run two independent assessments, synthesize a design
|
||||
|
||||
### Assessment Orchestration
|
||||
|
||||
Delegate Assessment A and Assessment B to separate sub-agents when possible. They must not see each other's output. Do not show findings to the user until synthesis.
|
||||
Delegate Assessment A and Assessment B to separate sub-agents. They must not see each other's output. Do not show findings to the user until synthesis.
|
||||
|
||||
Sub-agent gate (all harnesses):
|
||||
- Unless a harness-specific gate below overrides this, spawn A and B as two isolated, parallel sub-agents whenever a sub-agent/Task tool is exposed. This is the default and is mandatory; do not run them inline because it is faster.
|
||||
- "Unavailable" means exactly one thing: no sub-agent/Task tool is exposed in this session (or, on harnesses that ask, the user declined). It does not mean inconvenient.
|
||||
- If and only if sub-agents are unavailable, fall back sequentially: finish and record Assessment A, then run Assessment B, then synthesize, and emit the degraded banner.
|
||||
- Whichever path you take, declare it in the report header (see Report header provenance). Skipping sub-agents without the banner is the most common failure of this command.
|
||||
|
||||
If browser automation is available, each assessment creates its own new tab. Never reuse an existing tab, even if it is already at the right URL.
|
||||
|
||||
@@ -61,7 +68,7 @@ node .opencode/skills/impeccable/scripts/detect.mjs --json [target]
|
||||
|
||||
Browser visualization is required for a viewable target when browser automation is available. Use a localhost dev/static URL for local files; avoid `file://` unless the available browser explicitly supports this workflow. Overlay flow:
|
||||
|
||||
1. Create a fresh tab and navigate.
|
||||
1. Create a fresh tab and navigate. Prefer the harness's native/browser-canvas screenshot path before hand-rolling a Playwright/Puppeteer script; only fall back to a custom script when no native browser tool is exposed.
|
||||
2. Preflight mutable injection by setting `document.title` and appending a `<script>` tag. Read-only evaluate APIs do not count.
|
||||
3. If mutation is unavailable, skip live server, browser presentation, and injection; report fallback signal.
|
||||
4. If mutation is available, start `node .opencode/skills/impeccable/scripts/live-server.mjs --background`, present the browser if supported, label `[Human]`, scroll top, inject `http://localhost:PORT/detect.js`, wait 2-3 seconds, read `impeccable` console messages, then stop the live server.
|
||||
@@ -79,6 +86,12 @@ The chat response is the primary user-facing deliverable. Present the full struc
|
||||
|
||||
Structure your feedback as a design director would:
|
||||
|
||||
#### Report header provenance
|
||||
|
||||
The report's first line MUST declare how the assessments were run, so a degraded run is never silent:
|
||||
- Dual-agent: `Method: dual-agent (A: <agent-id> · B: <agent-id>)`
|
||||
- Degraded: `⚠️ DEGRADED: single-context (<reason, e.g. no sub-agent tool exposed>)`
|
||||
|
||||
#### Design Health Score
|
||||
> *Consult the [Heuristics Scoring Guide](#heuristics-scoring-guide) section below.*
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Generate a `DESIGN.md` file at the project root that captures the current visual design system, so AI agents generating new screens stay on-brand.
|
||||
|
||||
DESIGN.md follows the [official Google Stitch DESIGN.md format](https://stitch.withgoogle.com/docs/design-md/format/): YAML frontmatter carrying machine-readable design tokens, followed by a markdown body with exactly six sections in a fixed order. **Tokens are normative; prose provides context for how to apply them.** Sections may be omitted when not relevant, but **do not reorder them and do not rename them**. Section headers must match the spec character-for-character so the file stays parseable by other DESIGN.md-aware tools (Stitch itself, awesome-design-md, skill-rest, etc.).
|
||||
DESIGN.md follows the [official DESIGN.md format spec](https://raw.githubusercontent.com/google-labs-code/design.md/main/docs/spec.md): YAML frontmatter carrying machine-readable design tokens, followed by a markdown body with exactly six sections in a fixed order. **Tokens are normative; prose provides context for how to apply them.** Sections may be omitted when not relevant, but **do not reorder them and do not rename them**. Section headers must match the spec character-for-character so the file stays parseable by other DESIGN.md-aware tools (Stitch itself, awesome-design-md, skill-rest, etc.).
|
||||
|
||||
## The frontmatter: token schema
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
The setup command for a project. One codebase crawl feeds everything it writes:
|
||||
|
||||
- **PRODUCT.md** (strategic): root project file for register, target users, product purpose, brand personality, anti-references, strategic design principles. Answers "who/what/why".
|
||||
- **DESIGN.md** (visual): root project file for visual theme, color palette, typography, components, layout. Follows the [Google Stitch DESIGN.md format](https://stitch.withgoogle.com/docs/design-md/format/). Answers "how it looks".
|
||||
- **DESIGN.md** (visual): root project file for visual theme, color palette, typography, components, layout. Follows the [DESIGN.md format spec](https://raw.githubusercontent.com/google-labs-code/design.md/main/docs/spec.md). Answers "how it looks".
|
||||
- **`.impeccable/live/config.json`** (live mode): pre-configured so `/impeccable live` boots straight into variant mode with no first-time detour.
|
||||
|
||||
It closes by pointing the user at the best command to run next. Every other impeccable command reads PRODUCT.md and DESIGN.md before doing any work.
|
||||
|
||||
@@ -478,6 +478,17 @@ const ANTIPATTERNS = [
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'repeating-gradient decorative stripes',
|
||||
},
|
||||
{
|
||||
id: 'codex-grid-background',
|
||||
category: 'slop',
|
||||
severity: 'advisory',
|
||||
gated: 'gpt',
|
||||
name: 'Decorative grid-line background',
|
||||
description:
|
||||
'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) is a recurring generated-UI signature. Reserve grid overlays for actual canvas, map, blueprint, or measurement surfaces; elsewhere use product structure or a plain surface.',
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'two-axis grid-line gradient background',
|
||||
},
|
||||
{
|
||||
id: 'theater-slop-phrase',
|
||||
category: 'slop',
|
||||
@@ -1172,6 +1183,42 @@ function checkHtmlPatterns(html) {
|
||||
findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' });
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): two-axis grid-line background (Codex/GPT) ---
|
||||
// The Codex grid tell is two hairline `linear-gradient(... <color> 1px,
|
||||
// transparent 1px)` layers (one per axis) tiled by a repeating
|
||||
// `background-size` cell. Both signals must co-occur in the SAME style block
|
||||
// (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a
|
||||
// tiling background-size is a fixed crosshair, not a grid, and a single
|
||||
// hairline is a legitimate ruled line. Scoping to one block also stops
|
||||
// unrelated single-axis rules on separate elements from adding up across the
|
||||
// page. Count hairlines only inside `background`/`background-image` values so
|
||||
// a hairline in an unrelated property (mask-image, border-image) can't stand
|
||||
// in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry
|
||||
// nested parens, so match the hairline stop directly rather than parsing
|
||||
// whole gradient layers.
|
||||
{
|
||||
const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi;
|
||||
const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i;
|
||||
const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi;
|
||||
const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi;
|
||||
let blk;
|
||||
while ((blk = blockRe.exec(html)) !== null) {
|
||||
const block = blk[1] || blk[2] || blk[3] || '';
|
||||
if (!gridSizeRe.test(block)) continue;
|
||||
let hairlineCount = 0;
|
||||
let bm;
|
||||
bgDeclRe.lastIndex = 0;
|
||||
while ((bm = bgDeclRe.exec(block)) !== null) {
|
||||
const stops = bm[1].match(hairlineRe);
|
||||
if (stops) hairlineCount += stops.length;
|
||||
}
|
||||
if (hairlineCount >= 2) {
|
||||
findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' });
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): "X theater" framing copy (GPT) ---
|
||||
// Lives here (regex-on-HTML) rather than in the text-content analyzers so it
|
||||
// runs in the bundled browser path too, not just the CLI/static path.
|
||||
|
||||
@@ -376,6 +376,17 @@ const ANTIPATTERNS = [
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'repeating-gradient decorative stripes',
|
||||
},
|
||||
{
|
||||
id: 'codex-grid-background',
|
||||
category: 'slop',
|
||||
severity: 'advisory',
|
||||
gated: 'gpt',
|
||||
name: 'Decorative grid-line background',
|
||||
description:
|
||||
'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) is a recurring generated-UI signature. Reserve grid overlays for actual canvas, map, blueprint, or measurement surfaces; elsewhere use product structure or a plain surface.',
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'two-axis grid-line gradient background',
|
||||
},
|
||||
{
|
||||
id: 'theater-slop-phrase',
|
||||
category: 'slop',
|
||||
|
||||
@@ -573,6 +573,42 @@ function checkHtmlPatterns(html) {
|
||||
findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' });
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): two-axis grid-line background (Codex/GPT) ---
|
||||
// The Codex grid tell is two hairline `linear-gradient(... <color> 1px,
|
||||
// transparent 1px)` layers (one per axis) tiled by a repeating
|
||||
// `background-size` cell. Both signals must co-occur in the SAME style block
|
||||
// (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a
|
||||
// tiling background-size is a fixed crosshair, not a grid, and a single
|
||||
// hairline is a legitimate ruled line. Scoping to one block also stops
|
||||
// unrelated single-axis rules on separate elements from adding up across the
|
||||
// page. Count hairlines only inside `background`/`background-image` values so
|
||||
// a hairline in an unrelated property (mask-image, border-image) can't stand
|
||||
// in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry
|
||||
// nested parens, so match the hairline stop directly rather than parsing
|
||||
// whole gradient layers.
|
||||
{
|
||||
const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi;
|
||||
const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i;
|
||||
const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi;
|
||||
const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi;
|
||||
let blk;
|
||||
while ((blk = blockRe.exec(html)) !== null) {
|
||||
const block = blk[1] || blk[2] || blk[3] || '';
|
||||
if (!gridSizeRe.test(block)) continue;
|
||||
let hairlineCount = 0;
|
||||
let bm;
|
||||
bgDeclRe.lastIndex = 0;
|
||||
while ((bm = bgDeclRe.exec(block)) !== null) {
|
||||
const stops = bm[1].match(hairlineRe);
|
||||
if (stops) hairlineCount += stops.length;
|
||||
}
|
||||
if (hairlineCount >= 2) {
|
||||
findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' });
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): "X theater" framing copy (GPT) ---
|
||||
// Lives here (regex-on-HTML) rather than in the text-content analyzers so it
|
||||
// runs in the bundled browser path too, not just the CLI/static path.
|
||||
|
||||
@@ -75,7 +75,6 @@ const HOOK_MANIFEST_TARGETS = [
|
||||
skillRel: '.agents/skills/impeccable',
|
||||
destRel: '.codex/hooks.json',
|
||||
manifest: () => ({
|
||||
description: 'Impeccable design detector: runs after Edit/Write/apply_patch on UI files and surfaces findings as system reminders.',
|
||||
hooks: {
|
||||
PostToolUse: [
|
||||
{
|
||||
@@ -83,7 +82,7 @@ const HOOK_MANIFEST_TARGETS = [
|
||||
hooks: [
|
||||
{
|
||||
type: 'command',
|
||||
command: 'node "$(git rev-parse --show-toplevel)/.agents/skills/impeccable/scripts/hook.mjs"',
|
||||
command: 'node ".agents/skills/impeccable/scripts/hook.mjs"',
|
||||
timeout: TIMEOUT_SECONDS,
|
||||
statusMessage: STATUS_MESSAGE,
|
||||
},
|
||||
|
||||
@@ -7928,7 +7928,7 @@ void main() {
|
||||
const barTopFromBottom = barRect && barRect.height > 0
|
||||
? Math.max(16, window.innerHeight - barRect.top + 12)
|
||||
: 16;
|
||||
toastEl = el('div', {
|
||||
const currentToast = el('div', {
|
||||
position: 'fixed', bottom: barTopFromBottom + 'px', left: '50%',
|
||||
transform: 'translateX(-50%) translateY(8px)',
|
||||
background: C.ink, color: C.white,
|
||||
@@ -7938,19 +7938,24 @@ void main() {
|
||||
transition: 'opacity 0.25s ' + EASE + ', transform 0.25s ' + EASE,
|
||||
pointerEvents: 'none', maxWidth: '420px', textAlign: 'center',
|
||||
});
|
||||
toastEl.id = PREFIX + '-toast';
|
||||
toastEl.textContent = message;
|
||||
uiAppend(toastEl);
|
||||
toastEl = currentToast;
|
||||
currentToast.id = PREFIX + '-toast';
|
||||
currentToast.textContent = message;
|
||||
uiAppend(currentToast);
|
||||
requestAnimationFrame(() => {
|
||||
toastEl.style.opacity = '1';
|
||||
toastEl.style.transform = 'translateX(-50%) translateY(0)';
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.style.opacity = '1';
|
||||
currentToast.style.transform = 'translateX(-50%) translateY(0)';
|
||||
});
|
||||
setTimeout(() => {
|
||||
if (toastEl) {
|
||||
toastEl.style.opacity = '0';
|
||||
toastEl.style.transform = 'translateX(-50%) translateY(8px)';
|
||||
setTimeout(() => { if (toastEl) { toastEl.remove(); toastEl = null; } }, 250);
|
||||
}
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.style.opacity = '0';
|
||||
currentToast.style.transform = 'translateX(-50%) translateY(8px)';
|
||||
setTimeout(() => {
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.remove();
|
||||
toastEl = null;
|
||||
}, 250);
|
||||
}, duration);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
---
|
||||
name: impeccable
|
||||
description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks.
|
||||
version: 3.8.0
|
||||
version: 3.9.1
|
||||
license: Apache 2.0
|
||||
allowed-tools:
|
||||
- Bash(npx impeccable *)
|
||||
- Bash(node .pi/skills/impeccable/scripts/*)
|
||||
---
|
||||
|
||||
Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft.
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
When asked for "bolder," AI defaults to the same tired tricks: cyan/purple gradients, glassmorphism, neon accents on dark backgrounds, gradient text on metrics. These are the opposite of bold. Reject them first, then increase visual impact and personality through stronger hierarchy, committed scale, and decisive type.
|
||||
When asked for "bolder," AI defaults to the same tired tricks: cyan/purple gradients, glassmorphism, neon accents on dark backgrounds, gradient text on metrics. These are the opposite of bold. Reject them first, then increase visual impact by making the existing design language more decisive, specific, and committed.
|
||||
|
||||
---
|
||||
|
||||
## Register
|
||||
|
||||
Brand: "bolder" means distinctive. Extreme scale, unexpected color, typographic risk, committed POV.
|
||||
Brand: "bolder" means distinctive. Express a stronger point of view through hierarchy, pacing, proportion, copy, evidence, and one committed visual idea.
|
||||
|
||||
Product: "bolder" rarely means theatrics; those undermine trust. It means stronger hierarchy, clearer weight contrast, one sharper accent, more committed density. The amplification is in clarity, not drama.
|
||||
Product: "bolder" rarely means theatrics; those undermine trust. It means stronger hierarchy, clearer weight contrast, sharper information density, and more decisive prioritization. The amplification is in clarity, not drama.
|
||||
|
||||
---
|
||||
|
||||
@@ -15,98 +15,105 @@ Product: "bolder" rarely means theatrics; those undermine trust. It means strong
|
||||
Analyze what makes the design feel too safe or boring:
|
||||
|
||||
1. **Identify weakness sources**:
|
||||
- **Generic choices**: System fonts, basic colors, standard layouts
|
||||
- **Timid scale**: Everything is medium-sized with no drama
|
||||
- **Low contrast**: Everything has similar visual weight
|
||||
- **Static**: No motion, no energy, no life
|
||||
- **Predictable**: Standard patterns with no surprises
|
||||
- **Flat hierarchy**: Nothing stands out or commands attention
|
||||
- **Generic choices**: The page could belong to any product in the category.
|
||||
- **Timid scale**: Everything is medium-sized with no clear lead.
|
||||
- **Low contrast**: Important and supporting elements have similar visual weight.
|
||||
- **Static**: The surface has no meaningful moment of emphasis.
|
||||
- **Predictable**: The composition follows a default pattern without a point of view.
|
||||
- **Flat hierarchy**: Nothing stands out or commands attention.
|
||||
|
||||
2. **Understand the context**:
|
||||
- What's the brand personality? (How far can we push?)
|
||||
- What's the purpose? (Marketing can be bolder than financial dashboards)
|
||||
- Who's the audience? (What will resonate?)
|
||||
- What are the constraints? (Brand guidelines, accessibility, performance)
|
||||
- What is the brand personality?
|
||||
- What is the purpose of this surface?
|
||||
- Who is the audience?
|
||||
- What design system, tokens, components, and visual conventions already exist?
|
||||
|
||||
If any of these are unclear from the codebase, ask the user directly to clarify what you cannot infer.
|
||||
|
||||
**CRITICAL**: "Bolder" doesn't mean chaotic or garish. It means distinctive, memorable, and confident. Think intentional drama, not random chaos.
|
||||
**CRITICAL**: "Bolder" does not mean chaotic or garish. It means distinctive, memorable, and confident. Think intentional drama, not random noise.
|
||||
|
||||
**WARNING - AI SLOP TRAP**: Review ALL the DON'T guidelines from the parent impeccable skill (already loaded in this context) before proceeding. Bold means distinctive, not "more effects."
|
||||
|
||||
## Design-System Lock
|
||||
|
||||
If the project has `DESIGN.md`, tokens, theme variables, or established component styles, treat that system as the boundary. Make the existing language stronger before adding new language.
|
||||
|
||||
Do not invent new colors, gradients, radii, shadows, fonts, decorative backgrounds, or effects just because the request says "bolder." A bolder pass should usually change emphasis, proportion, rhythm, density, contrast, copy, artifact specificity, and layout relationships while staying inside the documented system.
|
||||
|
||||
If the existing system is genuinely too limited to express the bolder direction, stop and ask the user before expanding it. Name the exact additions, the role each would play, and why the current system cannot do the job. If the user approves expansion, update the design system or tokens alongside the implementation.
|
||||
|
||||
## Plan Amplification
|
||||
|
||||
Create a strategy to increase impact while maintaining coherence:
|
||||
|
||||
- **Focal point**: What should be the hero moment? (Pick ONE, make it amazing)
|
||||
- **Personality direction**: Maximalist chaos? Elegant drama? Playful energy? Dark moody? Choose a lane.
|
||||
- **Risk budget**: How experimental can we be? Push boundaries within constraints.
|
||||
- **Hierarchy amplification**: Make big things BIGGER, small things smaller (increase contrast)
|
||||
- **Focal point**: Pick one thing the viewer should remember, then make the rest support it.
|
||||
- **System levers**: Identify which existing tokens, components, layout patterns, and copy structures can carry more weight.
|
||||
- **Risk budget**: Decide how far the surface can push while still feeling like the same product or brand.
|
||||
- **Hierarchy amplification**: Increase contrast between primary, secondary, and tertiary content instead of making every element louder.
|
||||
|
||||
**IMPORTANT**: Bold design must still be usable. Impact without function is just decoration.
|
||||
|
||||
## Amplify the Design
|
||||
|
||||
Systematically increase impact across these dimensions:
|
||||
Systematically increase impact through intention, not a menu of effects:
|
||||
|
||||
### Typography Amplification
|
||||
- **Replace generic fonts**: Swap system fonts for distinctive choices (see the parent skill's typography guidelines and the [Reference Material section of typeset.md](typeset.md#reference-material) for inspiration)
|
||||
- **Extreme scale**: Create dramatic size jumps (3x-5x differences, not 1.5x)
|
||||
- **Weight contrast**: Pair 900 weights with 200 weights, not 600 with 400
|
||||
- **Unexpected choices**: Variable fonts, display fonts for headlines, condensed/extended widths, monospace as intentional accent (not as lazy "dev tool" default)
|
||||
- Strengthen the existing type hierarchy before changing typefaces.
|
||||
- Make important text meaningfully more dominant, and make supporting text quieter.
|
||||
- Use weight, measure, spacing, and line breaks to sharpen the point of view.
|
||||
- Add or replace fonts only after user-approved design-system expansion.
|
||||
|
||||
### Color Intensification
|
||||
- **Increase saturation**: Shift to more vibrant, energetic colors (but not neon)
|
||||
- **Bold palette**: Introduce unexpected color combinations. Avoid the purple-blue gradient AI slop
|
||||
- **Dominant color strategy**: Let one bold color own 60% of the design
|
||||
- **Sharp accents**: High-contrast accent colors that pop
|
||||
- **Tinted neutrals**: Replace pure grays with tinted grays that harmonize with your palette
|
||||
- **Rich gradients**: Intentional multi-stop gradients (not generic purple-to-blue)
|
||||
### Color Amplification
|
||||
- Use the existing palette more decisively before adding colors.
|
||||
- Shift the proportion, placement, and contrast of documented colors to clarify meaning.
|
||||
- Treat any new color, gradient, or tint ramp as a design-system expansion that requires user approval.
|
||||
- Keep color tied to hierarchy, state, or brand meaning; do not use it as surface decoration.
|
||||
|
||||
### Spatial Drama
|
||||
- **Extreme scale jumps**: Make important elements 3-5x larger than surroundings
|
||||
- **Break the grid**: Let hero elements escape containers and cross boundaries
|
||||
- **Asymmetric layouts**: Replace centered, balanced layouts with tension-filled asymmetry
|
||||
- **Generous space**: Use white space dramatically (100-200px gaps, not 20-40px)
|
||||
- **Overlap**: Layer elements intentionally for depth
|
||||
### Spatial Amplification
|
||||
- Change proportion, density, alignment, and sequencing so the composition has a stronger point of view.
|
||||
- Create clearer contrast between dense evidence and open breathing room.
|
||||
- Let layout express priority and narrative order before adding ornament.
|
||||
- Preserve responsive behavior and avoid text overflow at every breakpoint.
|
||||
|
||||
### Visual Effects
|
||||
- **Dramatic shadows**: Large, soft shadows for elevation (but not generic drop shadows on rounded rectangles)
|
||||
- **Background treatments**: Mesh patterns, noise textures, geometric patterns, intentional gradients (not purple-to-blue)
|
||||
- **Texture & depth**: Grain, halftone, duotone, layered elements. NOT glassmorphism (it's overused AI slop)
|
||||
- **Borders & frames**: Thick borders, decorative frames, custom shapes (not rounded rectangles with colored border on one side)
|
||||
- **Custom elements**: Illustrative elements, custom icons, decorative details that reinforce brand
|
||||
### Surface Amplification
|
||||
- Use existing surface, border, radius, and shadow rules more deliberately.
|
||||
- Remove timid half-measures: either give an element a clear role or simplify it.
|
||||
- Add texture, depth, illustration, or decorative treatments only when already established by the system or explicitly approved.
|
||||
- Make real product artifacts, imagery, data, or copy carry attention before reaching for effects.
|
||||
|
||||
### Motion & Animation
|
||||
- **Hero moment**: One signature entrance, once. Not on every visit and not on every section.
|
||||
- **Micro-interactions**: Satisfying hover effects, click feedback, state changes.
|
||||
- **Transitions**: Smooth, noticeable transitions using ease-out-quart/quint/expo (not bounce or elastic, which cheapen the effect).
|
||||
- **Bolder ≠ scroll-fade-rise on every section.** That's the saturated AI default, the opposite of bold.
|
||||
- Design one meaningful moment of emphasis when motion genuinely supports the point.
|
||||
- Make interaction feedback feel more decisive without becoming distracting.
|
||||
- Keep transitions smooth and intentional.
|
||||
- **Bolder != scroll-fade-rise on every section.** That's the saturated AI default, the opposite of bold.
|
||||
|
||||
### Composition Boldness
|
||||
- **Hero moments**: Create clear focal points with dramatic treatment
|
||||
- **Diagonal flows**: Escape horizontal/vertical rigidity with diagonal arrangements
|
||||
- **Full-bleed elements**: Use full viewport width/height for impact
|
||||
- **Unexpected proportions**: Golden ratio? Throw it out. Try 70/30, 80/20 splits
|
||||
- Make the dominant idea unmistakable.
|
||||
- Use layout tension, sequencing, contrast, and restraint to create a stronger read.
|
||||
- Let the page's structure communicate priority before adding decorative layers.
|
||||
- If every element is louder, the composition is not bolder; it is flatter.
|
||||
|
||||
**NEVER**:
|
||||
- Add effects randomly without purpose (chaos ≠ bold)
|
||||
- Sacrifice readability for aesthetics (body text must be readable)
|
||||
- Make everything bold (then nothing is bold; you need contrast)
|
||||
- Ignore accessibility (bold design must still meet WCAG standards)
|
||||
- Overwhelm with motion (animation fatigue is real)
|
||||
- Copy trendy aesthetics blindly (bold means distinctive, not derivative)
|
||||
- Add undocumented design-system primitives without user approval
|
||||
- Add effects randomly without purpose
|
||||
- Hide weak hierarchy behind decoration
|
||||
- Sacrifice readability for aesthetics
|
||||
- Make everything bold; contrast is the point
|
||||
- Ignore accessibility
|
||||
- Overwhelm with motion
|
||||
- Copy trendy aesthetics blindly
|
||||
|
||||
## Verify Quality
|
||||
|
||||
Ensure amplification maintains usability and coherence:
|
||||
|
||||
- **System-faithful**: Did the pass make the existing design language stronger before adding anything new?
|
||||
- **No undocumented drift**: Are new colors, gradients, shadows, radii, fonts, and effects either absent or explicitly approved and documented?
|
||||
- **NOT AI slop**: Does this look like every other AI-generated "bold" design? If yes, start over.
|
||||
- **Still functional**: Can users accomplish tasks without distraction?
|
||||
- **Coherent**: Does everything feel intentional and unified?
|
||||
- **Memorable**: Will users remember this experience?
|
||||
- **Performant**: Do all these effects run smoothly?
|
||||
- **Accessible**: Does it still meet accessibility standards?
|
||||
- **Memorable**: Will users remember this experience for the intended reason?
|
||||
- **Performant and accessible**: Does the result stay fast, readable, responsive, and WCAG-conscious?
|
||||
|
||||
**The test**: If you showed this to someone and said "AI made this bolder," would they believe you immediately? If yes, you've failed. Bold means distinctive, not "more AI effects."
|
||||
|
||||
|
||||
@@ -5,8 +5,9 @@ Resolve one stable target, run two independent assessments, synthesize a design
|
||||
### Hard Invariants
|
||||
|
||||
- Assessment A (design review) and Assessment B (detector/browser evidence) are both required.
|
||||
- Assessment A and B MUST run as two isolated sub-agents whenever a sub-agent/Task tool is exposed. Running them inline in this context is "possible" but is NOT permitted; it is a degraded run. Inline is allowed ONLY when no sub-agent tool exists (or the user declined, on harnesses that ask).
|
||||
- If you degrade for any reason, the report's first line MUST be a banner: `⚠️ DEGRADED: single-context (<reason>)`. A silent degraded critique is a failed critique.
|
||||
- Assessment A must finish before detector findings enter the parent synthesis context. Detector output is deterministic, but it still anchors judgment.
|
||||
- If sub-agents are unavailable, fall back sequentially: finish and record Assessment A first, then run Assessment B, then synthesize.
|
||||
- A skipped detector is a failed critique run unless `detect.mjs` is missing or crashes after a real attempt.
|
||||
- Viewable targets require browser inspection when available.
|
||||
- Any local server started only for critique visualization must run in the background, have a recorded stop method, and be stopped before final reporting unless the user asks to keep it.
|
||||
@@ -27,7 +28,13 @@ Resolve one stable target, run two independent assessments, synthesize a design
|
||||
|
||||
### Assessment Orchestration
|
||||
|
||||
Delegate Assessment A and Assessment B to separate sub-agents when possible. They must not see each other's output. Do not show findings to the user until synthesis.
|
||||
Delegate Assessment A and Assessment B to separate sub-agents. They must not see each other's output. Do not show findings to the user until synthesis.
|
||||
|
||||
Sub-agent gate (all harnesses):
|
||||
- Unless a harness-specific gate below overrides this, spawn A and B as two isolated, parallel sub-agents whenever a sub-agent/Task tool is exposed. This is the default and is mandatory; do not run them inline because it is faster.
|
||||
- "Unavailable" means exactly one thing: no sub-agent/Task tool is exposed in this session (or, on harnesses that ask, the user declined). It does not mean inconvenient.
|
||||
- If and only if sub-agents are unavailable, fall back sequentially: finish and record Assessment A, then run Assessment B, then synthesize, and emit the degraded banner.
|
||||
- Whichever path you take, declare it in the report header (see Report header provenance). Skipping sub-agents without the banner is the most common failure of this command.
|
||||
|
||||
If browser automation is available, each assessment creates its own new tab. Never reuse an existing tab, even if it is already at the right URL.
|
||||
|
||||
@@ -61,7 +68,7 @@ node .pi/skills/impeccable/scripts/detect.mjs --json [target]
|
||||
|
||||
Browser visualization is required for a viewable target when browser automation is available. Use a localhost dev/static URL for local files; avoid `file://` unless the available browser explicitly supports this workflow. Overlay flow:
|
||||
|
||||
1. Create a fresh tab and navigate.
|
||||
1. Create a fresh tab and navigate. Prefer the harness's native/browser-canvas screenshot path before hand-rolling a Playwright/Puppeteer script; only fall back to a custom script when no native browser tool is exposed.
|
||||
2. Preflight mutable injection by setting `document.title` and appending a `<script>` tag. Read-only evaluate APIs do not count.
|
||||
3. If mutation is unavailable, skip live server, browser presentation, and injection; report fallback signal.
|
||||
4. If mutation is available, start `node .pi/skills/impeccable/scripts/live-server.mjs --background`, present the browser if supported, label `[Human]`, scroll top, inject `http://localhost:PORT/detect.js`, wait 2-3 seconds, read `impeccable` console messages, then stop the live server.
|
||||
@@ -79,6 +86,12 @@ The chat response is the primary user-facing deliverable. Present the full struc
|
||||
|
||||
Structure your feedback as a design director would:
|
||||
|
||||
#### Report header provenance
|
||||
|
||||
The report's first line MUST declare how the assessments were run, so a degraded run is never silent:
|
||||
- Dual-agent: `Method: dual-agent (A: <agent-id> · B: <agent-id>)`
|
||||
- Degraded: `⚠️ DEGRADED: single-context (<reason, e.g. no sub-agent tool exposed>)`
|
||||
|
||||
#### Design Health Score
|
||||
> *Consult the [Heuristics Scoring Guide](#heuristics-scoring-guide) section below.*
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Generate a `DESIGN.md` file at the project root that captures the current visual design system, so AI agents generating new screens stay on-brand.
|
||||
|
||||
DESIGN.md follows the [official Google Stitch DESIGN.md format](https://stitch.withgoogle.com/docs/design-md/format/): YAML frontmatter carrying machine-readable design tokens, followed by a markdown body with exactly six sections in a fixed order. **Tokens are normative; prose provides context for how to apply them.** Sections may be omitted when not relevant, but **do not reorder them and do not rename them**. Section headers must match the spec character-for-character so the file stays parseable by other DESIGN.md-aware tools (Stitch itself, awesome-design-md, skill-rest, etc.).
|
||||
DESIGN.md follows the [official DESIGN.md format spec](https://raw.githubusercontent.com/google-labs-code/design.md/main/docs/spec.md): YAML frontmatter carrying machine-readable design tokens, followed by a markdown body with exactly six sections in a fixed order. **Tokens are normative; prose provides context for how to apply them.** Sections may be omitted when not relevant, but **do not reorder them and do not rename them**. Section headers must match the spec character-for-character so the file stays parseable by other DESIGN.md-aware tools (Stitch itself, awesome-design-md, skill-rest, etc.).
|
||||
|
||||
## The frontmatter: token schema
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
The setup command for a project. One codebase crawl feeds everything it writes:
|
||||
|
||||
- **PRODUCT.md** (strategic): root project file for register, target users, product purpose, brand personality, anti-references, strategic design principles. Answers "who/what/why".
|
||||
- **DESIGN.md** (visual): root project file for visual theme, color palette, typography, components, layout. Follows the [Google Stitch DESIGN.md format](https://stitch.withgoogle.com/docs/design-md/format/). Answers "how it looks".
|
||||
- **DESIGN.md** (visual): root project file for visual theme, color palette, typography, components, layout. Follows the [DESIGN.md format spec](https://raw.githubusercontent.com/google-labs-code/design.md/main/docs/spec.md). Answers "how it looks".
|
||||
- **`.impeccable/live/config.json`** (live mode): pre-configured so `/impeccable live` boots straight into variant mode with no first-time detour.
|
||||
|
||||
It closes by pointing the user at the best command to run next. Every other impeccable command reads PRODUCT.md and DESIGN.md before doing any work.
|
||||
|
||||
@@ -478,6 +478,17 @@ const ANTIPATTERNS = [
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'repeating-gradient decorative stripes',
|
||||
},
|
||||
{
|
||||
id: 'codex-grid-background',
|
||||
category: 'slop',
|
||||
severity: 'advisory',
|
||||
gated: 'gpt',
|
||||
name: 'Decorative grid-line background',
|
||||
description:
|
||||
'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) is a recurring generated-UI signature. Reserve grid overlays for actual canvas, map, blueprint, or measurement surfaces; elsewhere use product structure or a plain surface.',
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'two-axis grid-line gradient background',
|
||||
},
|
||||
{
|
||||
id: 'theater-slop-phrase',
|
||||
category: 'slop',
|
||||
@@ -1172,6 +1183,42 @@ function checkHtmlPatterns(html) {
|
||||
findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' });
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): two-axis grid-line background (Codex/GPT) ---
|
||||
// The Codex grid tell is two hairline `linear-gradient(... <color> 1px,
|
||||
// transparent 1px)` layers (one per axis) tiled by a repeating
|
||||
// `background-size` cell. Both signals must co-occur in the SAME style block
|
||||
// (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a
|
||||
// tiling background-size is a fixed crosshair, not a grid, and a single
|
||||
// hairline is a legitimate ruled line. Scoping to one block also stops
|
||||
// unrelated single-axis rules on separate elements from adding up across the
|
||||
// page. Count hairlines only inside `background`/`background-image` values so
|
||||
// a hairline in an unrelated property (mask-image, border-image) can't stand
|
||||
// in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry
|
||||
// nested parens, so match the hairline stop directly rather than parsing
|
||||
// whole gradient layers.
|
||||
{
|
||||
const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi;
|
||||
const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i;
|
||||
const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi;
|
||||
const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi;
|
||||
let blk;
|
||||
while ((blk = blockRe.exec(html)) !== null) {
|
||||
const block = blk[1] || blk[2] || blk[3] || '';
|
||||
if (!gridSizeRe.test(block)) continue;
|
||||
let hairlineCount = 0;
|
||||
let bm;
|
||||
bgDeclRe.lastIndex = 0;
|
||||
while ((bm = bgDeclRe.exec(block)) !== null) {
|
||||
const stops = bm[1].match(hairlineRe);
|
||||
if (stops) hairlineCount += stops.length;
|
||||
}
|
||||
if (hairlineCount >= 2) {
|
||||
findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' });
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): "X theater" framing copy (GPT) ---
|
||||
// Lives here (regex-on-HTML) rather than in the text-content analyzers so it
|
||||
// runs in the bundled browser path too, not just the CLI/static path.
|
||||
|
||||
@@ -376,6 +376,17 @@ const ANTIPATTERNS = [
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'repeating-gradient decorative stripes',
|
||||
},
|
||||
{
|
||||
id: 'codex-grid-background',
|
||||
category: 'slop',
|
||||
severity: 'advisory',
|
||||
gated: 'gpt',
|
||||
name: 'Decorative grid-line background',
|
||||
description:
|
||||
'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) is a recurring generated-UI signature. Reserve grid overlays for actual canvas, map, blueprint, or measurement surfaces; elsewhere use product structure or a plain surface.',
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'two-axis grid-line gradient background',
|
||||
},
|
||||
{
|
||||
id: 'theater-slop-phrase',
|
||||
category: 'slop',
|
||||
|
||||
@@ -573,6 +573,42 @@ function checkHtmlPatterns(html) {
|
||||
findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' });
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): two-axis grid-line background (Codex/GPT) ---
|
||||
// The Codex grid tell is two hairline `linear-gradient(... <color> 1px,
|
||||
// transparent 1px)` layers (one per axis) tiled by a repeating
|
||||
// `background-size` cell. Both signals must co-occur in the SAME style block
|
||||
// (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a
|
||||
// tiling background-size is a fixed crosshair, not a grid, and a single
|
||||
// hairline is a legitimate ruled line. Scoping to one block also stops
|
||||
// unrelated single-axis rules on separate elements from adding up across the
|
||||
// page. Count hairlines only inside `background`/`background-image` values so
|
||||
// a hairline in an unrelated property (mask-image, border-image) can't stand
|
||||
// in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry
|
||||
// nested parens, so match the hairline stop directly rather than parsing
|
||||
// whole gradient layers.
|
||||
{
|
||||
const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi;
|
||||
const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i;
|
||||
const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi;
|
||||
const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi;
|
||||
let blk;
|
||||
while ((blk = blockRe.exec(html)) !== null) {
|
||||
const block = blk[1] || blk[2] || blk[3] || '';
|
||||
if (!gridSizeRe.test(block)) continue;
|
||||
let hairlineCount = 0;
|
||||
let bm;
|
||||
bgDeclRe.lastIndex = 0;
|
||||
while ((bm = bgDeclRe.exec(block)) !== null) {
|
||||
const stops = bm[1].match(hairlineRe);
|
||||
if (stops) hairlineCount += stops.length;
|
||||
}
|
||||
if (hairlineCount >= 2) {
|
||||
findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' });
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): "X theater" framing copy (GPT) ---
|
||||
// Lives here (regex-on-HTML) rather than in the text-content analyzers so it
|
||||
// runs in the bundled browser path too, not just the CLI/static path.
|
||||
|
||||
@@ -75,7 +75,6 @@ const HOOK_MANIFEST_TARGETS = [
|
||||
skillRel: '.agents/skills/impeccable',
|
||||
destRel: '.codex/hooks.json',
|
||||
manifest: () => ({
|
||||
description: 'Impeccable design detector: runs after Edit/Write/apply_patch on UI files and surfaces findings as system reminders.',
|
||||
hooks: {
|
||||
PostToolUse: [
|
||||
{
|
||||
@@ -83,7 +82,7 @@ const HOOK_MANIFEST_TARGETS = [
|
||||
hooks: [
|
||||
{
|
||||
type: 'command',
|
||||
command: 'node "$(git rev-parse --show-toplevel)/.agents/skills/impeccable/scripts/hook.mjs"',
|
||||
command: 'node ".agents/skills/impeccable/scripts/hook.mjs"',
|
||||
timeout: TIMEOUT_SECONDS,
|
||||
statusMessage: STATUS_MESSAGE,
|
||||
},
|
||||
|
||||
@@ -7928,7 +7928,7 @@ void main() {
|
||||
const barTopFromBottom = barRect && barRect.height > 0
|
||||
? Math.max(16, window.innerHeight - barRect.top + 12)
|
||||
: 16;
|
||||
toastEl = el('div', {
|
||||
const currentToast = el('div', {
|
||||
position: 'fixed', bottom: barTopFromBottom + 'px', left: '50%',
|
||||
transform: 'translateX(-50%) translateY(8px)',
|
||||
background: C.ink, color: C.white,
|
||||
@@ -7938,19 +7938,24 @@ void main() {
|
||||
transition: 'opacity 0.25s ' + EASE + ', transform 0.25s ' + EASE,
|
||||
pointerEvents: 'none', maxWidth: '420px', textAlign: 'center',
|
||||
});
|
||||
toastEl.id = PREFIX + '-toast';
|
||||
toastEl.textContent = message;
|
||||
uiAppend(toastEl);
|
||||
toastEl = currentToast;
|
||||
currentToast.id = PREFIX + '-toast';
|
||||
currentToast.textContent = message;
|
||||
uiAppend(currentToast);
|
||||
requestAnimationFrame(() => {
|
||||
toastEl.style.opacity = '1';
|
||||
toastEl.style.transform = 'translateX(-50%) translateY(0)';
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.style.opacity = '1';
|
||||
currentToast.style.transform = 'translateX(-50%) translateY(0)';
|
||||
});
|
||||
setTimeout(() => {
|
||||
if (toastEl) {
|
||||
toastEl.style.opacity = '0';
|
||||
toastEl.style.transform = 'translateX(-50%) translateY(8px)';
|
||||
setTimeout(() => { if (toastEl) { toastEl.remove(); toastEl = null; } }, 250);
|
||||
}
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.style.opacity = '0';
|
||||
currentToast.style.transform = 'translateX(-50%) translateY(8px)';
|
||||
setTimeout(() => {
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.remove();
|
||||
toastEl = null;
|
||||
}, 250);
|
||||
}, duration);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
---
|
||||
name: impeccable
|
||||
description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks.
|
||||
version: 3.8.0
|
||||
version: 3.9.1
|
||||
user-invocable: true
|
||||
argument-hint: "[craft|shape · audit|critique · animate|bolder|colorize|delight|layout|overdrive|quieter|typeset · adapt|clarify|distill · harden|onboard|optimize|polish · init|document|extract|live] [target]"
|
||||
license: Apache 2.0
|
||||
allowed-tools:
|
||||
- Bash(npx impeccable *)
|
||||
- Bash(node .qoder/skills/impeccable/scripts/*)
|
||||
---
|
||||
|
||||
Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft.
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
When asked for "bolder," AI defaults to the same tired tricks: cyan/purple gradients, glassmorphism, neon accents on dark backgrounds, gradient text on metrics. These are the opposite of bold. Reject them first, then increase visual impact and personality through stronger hierarchy, committed scale, and decisive type.
|
||||
When asked for "bolder," AI defaults to the same tired tricks: cyan/purple gradients, glassmorphism, neon accents on dark backgrounds, gradient text on metrics. These are the opposite of bold. Reject them first, then increase visual impact by making the existing design language more decisive, specific, and committed.
|
||||
|
||||
---
|
||||
|
||||
## Register
|
||||
|
||||
Brand: "bolder" means distinctive. Extreme scale, unexpected color, typographic risk, committed POV.
|
||||
Brand: "bolder" means distinctive. Express a stronger point of view through hierarchy, pacing, proportion, copy, evidence, and one committed visual idea.
|
||||
|
||||
Product: "bolder" rarely means theatrics; those undermine trust. It means stronger hierarchy, clearer weight contrast, one sharper accent, more committed density. The amplification is in clarity, not drama.
|
||||
Product: "bolder" rarely means theatrics; those undermine trust. It means stronger hierarchy, clearer weight contrast, sharper information density, and more decisive prioritization. The amplification is in clarity, not drama.
|
||||
|
||||
---
|
||||
|
||||
@@ -15,98 +15,105 @@ Product: "bolder" rarely means theatrics; those undermine trust. It means strong
|
||||
Analyze what makes the design feel too safe or boring:
|
||||
|
||||
1. **Identify weakness sources**:
|
||||
- **Generic choices**: System fonts, basic colors, standard layouts
|
||||
- **Timid scale**: Everything is medium-sized with no drama
|
||||
- **Low contrast**: Everything has similar visual weight
|
||||
- **Static**: No motion, no energy, no life
|
||||
- **Predictable**: Standard patterns with no surprises
|
||||
- **Flat hierarchy**: Nothing stands out or commands attention
|
||||
- **Generic choices**: The page could belong to any product in the category.
|
||||
- **Timid scale**: Everything is medium-sized with no clear lead.
|
||||
- **Low contrast**: Important and supporting elements have similar visual weight.
|
||||
- **Static**: The surface has no meaningful moment of emphasis.
|
||||
- **Predictable**: The composition follows a default pattern without a point of view.
|
||||
- **Flat hierarchy**: Nothing stands out or commands attention.
|
||||
|
||||
2. **Understand the context**:
|
||||
- What's the brand personality? (How far can we push?)
|
||||
- What's the purpose? (Marketing can be bolder than financial dashboards)
|
||||
- Who's the audience? (What will resonate?)
|
||||
- What are the constraints? (Brand guidelines, accessibility, performance)
|
||||
- What is the brand personality?
|
||||
- What is the purpose of this surface?
|
||||
- Who is the audience?
|
||||
- What design system, tokens, components, and visual conventions already exist?
|
||||
|
||||
If any of these are unclear from the codebase, ask the user directly to clarify what you cannot infer.
|
||||
|
||||
**CRITICAL**: "Bolder" doesn't mean chaotic or garish. It means distinctive, memorable, and confident. Think intentional drama, not random chaos.
|
||||
**CRITICAL**: "Bolder" does not mean chaotic or garish. It means distinctive, memorable, and confident. Think intentional drama, not random noise.
|
||||
|
||||
**WARNING - AI SLOP TRAP**: Review ALL the DON'T guidelines from the parent impeccable skill (already loaded in this context) before proceeding. Bold means distinctive, not "more effects."
|
||||
|
||||
## Design-System Lock
|
||||
|
||||
If the project has `DESIGN.md`, tokens, theme variables, or established component styles, treat that system as the boundary. Make the existing language stronger before adding new language.
|
||||
|
||||
Do not invent new colors, gradients, radii, shadows, fonts, decorative backgrounds, or effects just because the request says "bolder." A bolder pass should usually change emphasis, proportion, rhythm, density, contrast, copy, artifact specificity, and layout relationships while staying inside the documented system.
|
||||
|
||||
If the existing system is genuinely too limited to express the bolder direction, stop and ask the user before expanding it. Name the exact additions, the role each would play, and why the current system cannot do the job. If the user approves expansion, update the design system or tokens alongside the implementation.
|
||||
|
||||
## Plan Amplification
|
||||
|
||||
Create a strategy to increase impact while maintaining coherence:
|
||||
|
||||
- **Focal point**: What should be the hero moment? (Pick ONE, make it amazing)
|
||||
- **Personality direction**: Maximalist chaos? Elegant drama? Playful energy? Dark moody? Choose a lane.
|
||||
- **Risk budget**: How experimental can we be? Push boundaries within constraints.
|
||||
- **Hierarchy amplification**: Make big things BIGGER, small things smaller (increase contrast)
|
||||
- **Focal point**: Pick one thing the viewer should remember, then make the rest support it.
|
||||
- **System levers**: Identify which existing tokens, components, layout patterns, and copy structures can carry more weight.
|
||||
- **Risk budget**: Decide how far the surface can push while still feeling like the same product or brand.
|
||||
- **Hierarchy amplification**: Increase contrast between primary, secondary, and tertiary content instead of making every element louder.
|
||||
|
||||
**IMPORTANT**: Bold design must still be usable. Impact without function is just decoration.
|
||||
|
||||
## Amplify the Design
|
||||
|
||||
Systematically increase impact across these dimensions:
|
||||
Systematically increase impact through intention, not a menu of effects:
|
||||
|
||||
### Typography Amplification
|
||||
- **Replace generic fonts**: Swap system fonts for distinctive choices (see the parent skill's typography guidelines and the [Reference Material section of typeset.md](typeset.md#reference-material) for inspiration)
|
||||
- **Extreme scale**: Create dramatic size jumps (3x-5x differences, not 1.5x)
|
||||
- **Weight contrast**: Pair 900 weights with 200 weights, not 600 with 400
|
||||
- **Unexpected choices**: Variable fonts, display fonts for headlines, condensed/extended widths, monospace as intentional accent (not as lazy "dev tool" default)
|
||||
- Strengthen the existing type hierarchy before changing typefaces.
|
||||
- Make important text meaningfully more dominant, and make supporting text quieter.
|
||||
- Use weight, measure, spacing, and line breaks to sharpen the point of view.
|
||||
- Add or replace fonts only after user-approved design-system expansion.
|
||||
|
||||
### Color Intensification
|
||||
- **Increase saturation**: Shift to more vibrant, energetic colors (but not neon)
|
||||
- **Bold palette**: Introduce unexpected color combinations. Avoid the purple-blue gradient AI slop
|
||||
- **Dominant color strategy**: Let one bold color own 60% of the design
|
||||
- **Sharp accents**: High-contrast accent colors that pop
|
||||
- **Tinted neutrals**: Replace pure grays with tinted grays that harmonize with your palette
|
||||
- **Rich gradients**: Intentional multi-stop gradients (not generic purple-to-blue)
|
||||
### Color Amplification
|
||||
- Use the existing palette more decisively before adding colors.
|
||||
- Shift the proportion, placement, and contrast of documented colors to clarify meaning.
|
||||
- Treat any new color, gradient, or tint ramp as a design-system expansion that requires user approval.
|
||||
- Keep color tied to hierarchy, state, or brand meaning; do not use it as surface decoration.
|
||||
|
||||
### Spatial Drama
|
||||
- **Extreme scale jumps**: Make important elements 3-5x larger than surroundings
|
||||
- **Break the grid**: Let hero elements escape containers and cross boundaries
|
||||
- **Asymmetric layouts**: Replace centered, balanced layouts with tension-filled asymmetry
|
||||
- **Generous space**: Use white space dramatically (100-200px gaps, not 20-40px)
|
||||
- **Overlap**: Layer elements intentionally for depth
|
||||
### Spatial Amplification
|
||||
- Change proportion, density, alignment, and sequencing so the composition has a stronger point of view.
|
||||
- Create clearer contrast between dense evidence and open breathing room.
|
||||
- Let layout express priority and narrative order before adding ornament.
|
||||
- Preserve responsive behavior and avoid text overflow at every breakpoint.
|
||||
|
||||
### Visual Effects
|
||||
- **Dramatic shadows**: Large, soft shadows for elevation (but not generic drop shadows on rounded rectangles)
|
||||
- **Background treatments**: Mesh patterns, noise textures, geometric patterns, intentional gradients (not purple-to-blue)
|
||||
- **Texture & depth**: Grain, halftone, duotone, layered elements. NOT glassmorphism (it's overused AI slop)
|
||||
- **Borders & frames**: Thick borders, decorative frames, custom shapes (not rounded rectangles with colored border on one side)
|
||||
- **Custom elements**: Illustrative elements, custom icons, decorative details that reinforce brand
|
||||
### Surface Amplification
|
||||
- Use existing surface, border, radius, and shadow rules more deliberately.
|
||||
- Remove timid half-measures: either give an element a clear role or simplify it.
|
||||
- Add texture, depth, illustration, or decorative treatments only when already established by the system or explicitly approved.
|
||||
- Make real product artifacts, imagery, data, or copy carry attention before reaching for effects.
|
||||
|
||||
### Motion & Animation
|
||||
- **Hero moment**: One signature entrance, once. Not on every visit and not on every section.
|
||||
- **Micro-interactions**: Satisfying hover effects, click feedback, state changes.
|
||||
- **Transitions**: Smooth, noticeable transitions using ease-out-quart/quint/expo (not bounce or elastic, which cheapen the effect).
|
||||
- **Bolder ≠ scroll-fade-rise on every section.** That's the saturated AI default, the opposite of bold.
|
||||
- Design one meaningful moment of emphasis when motion genuinely supports the point.
|
||||
- Make interaction feedback feel more decisive without becoming distracting.
|
||||
- Keep transitions smooth and intentional.
|
||||
- **Bolder != scroll-fade-rise on every section.** That's the saturated AI default, the opposite of bold.
|
||||
|
||||
### Composition Boldness
|
||||
- **Hero moments**: Create clear focal points with dramatic treatment
|
||||
- **Diagonal flows**: Escape horizontal/vertical rigidity with diagonal arrangements
|
||||
- **Full-bleed elements**: Use full viewport width/height for impact
|
||||
- **Unexpected proportions**: Golden ratio? Throw it out. Try 70/30, 80/20 splits
|
||||
- Make the dominant idea unmistakable.
|
||||
- Use layout tension, sequencing, contrast, and restraint to create a stronger read.
|
||||
- Let the page's structure communicate priority before adding decorative layers.
|
||||
- If every element is louder, the composition is not bolder; it is flatter.
|
||||
|
||||
**NEVER**:
|
||||
- Add effects randomly without purpose (chaos ≠ bold)
|
||||
- Sacrifice readability for aesthetics (body text must be readable)
|
||||
- Make everything bold (then nothing is bold; you need contrast)
|
||||
- Ignore accessibility (bold design must still meet WCAG standards)
|
||||
- Overwhelm with motion (animation fatigue is real)
|
||||
- Copy trendy aesthetics blindly (bold means distinctive, not derivative)
|
||||
- Add undocumented design-system primitives without user approval
|
||||
- Add effects randomly without purpose
|
||||
- Hide weak hierarchy behind decoration
|
||||
- Sacrifice readability for aesthetics
|
||||
- Make everything bold; contrast is the point
|
||||
- Ignore accessibility
|
||||
- Overwhelm with motion
|
||||
- Copy trendy aesthetics blindly
|
||||
|
||||
## Verify Quality
|
||||
|
||||
Ensure amplification maintains usability and coherence:
|
||||
|
||||
- **System-faithful**: Did the pass make the existing design language stronger before adding anything new?
|
||||
- **No undocumented drift**: Are new colors, gradients, shadows, radii, fonts, and effects either absent or explicitly approved and documented?
|
||||
- **NOT AI slop**: Does this look like every other AI-generated "bold" design? If yes, start over.
|
||||
- **Still functional**: Can users accomplish tasks without distraction?
|
||||
- **Coherent**: Does everything feel intentional and unified?
|
||||
- **Memorable**: Will users remember this experience?
|
||||
- **Performant**: Do all these effects run smoothly?
|
||||
- **Accessible**: Does it still meet accessibility standards?
|
||||
- **Memorable**: Will users remember this experience for the intended reason?
|
||||
- **Performant and accessible**: Does the result stay fast, readable, responsive, and WCAG-conscious?
|
||||
|
||||
**The test**: If you showed this to someone and said "AI made this bolder," would they believe you immediately? If yes, you've failed. Bold means distinctive, not "more AI effects."
|
||||
|
||||
|
||||
@@ -5,8 +5,9 @@ Resolve one stable target, run two independent assessments, synthesize a design
|
||||
### Hard Invariants
|
||||
|
||||
- Assessment A (design review) and Assessment B (detector/browser evidence) are both required.
|
||||
- Assessment A and B MUST run as two isolated sub-agents whenever a sub-agent/Task tool is exposed. Running them inline in this context is "possible" but is NOT permitted; it is a degraded run. Inline is allowed ONLY when no sub-agent tool exists (or the user declined, on harnesses that ask).
|
||||
- If you degrade for any reason, the report's first line MUST be a banner: `⚠️ DEGRADED: single-context (<reason>)`. A silent degraded critique is a failed critique.
|
||||
- Assessment A must finish before detector findings enter the parent synthesis context. Detector output is deterministic, but it still anchors judgment.
|
||||
- If sub-agents are unavailable, fall back sequentially: finish and record Assessment A first, then run Assessment B, then synthesize.
|
||||
- A skipped detector is a failed critique run unless `detect.mjs` is missing or crashes after a real attempt.
|
||||
- Viewable targets require browser inspection when available.
|
||||
- Any local server started only for critique visualization must run in the background, have a recorded stop method, and be stopped before final reporting unless the user asks to keep it.
|
||||
@@ -27,7 +28,13 @@ Resolve one stable target, run two independent assessments, synthesize a design
|
||||
|
||||
### Assessment Orchestration
|
||||
|
||||
Delegate Assessment A and Assessment B to separate sub-agents when possible. They must not see each other's output. Do not show findings to the user until synthesis.
|
||||
Delegate Assessment A and Assessment B to separate sub-agents. They must not see each other's output. Do not show findings to the user until synthesis.
|
||||
|
||||
Sub-agent gate (all harnesses):
|
||||
- Unless a harness-specific gate below overrides this, spawn A and B as two isolated, parallel sub-agents whenever a sub-agent/Task tool is exposed. This is the default and is mandatory; do not run them inline because it is faster.
|
||||
- "Unavailable" means exactly one thing: no sub-agent/Task tool is exposed in this session (or, on harnesses that ask, the user declined). It does not mean inconvenient.
|
||||
- If and only if sub-agents are unavailable, fall back sequentially: finish and record Assessment A, then run Assessment B, then synthesize, and emit the degraded banner.
|
||||
- Whichever path you take, declare it in the report header (see Report header provenance). Skipping sub-agents without the banner is the most common failure of this command.
|
||||
|
||||
If browser automation is available, each assessment creates its own new tab. Never reuse an existing tab, even if it is already at the right URL.
|
||||
|
||||
@@ -61,7 +68,7 @@ node .qoder/skills/impeccable/scripts/detect.mjs --json [target]
|
||||
|
||||
Browser visualization is required for a viewable target when browser automation is available. Use a localhost dev/static URL for local files; avoid `file://` unless the available browser explicitly supports this workflow. Overlay flow:
|
||||
|
||||
1. Create a fresh tab and navigate.
|
||||
1. Create a fresh tab and navigate. Prefer the harness's native/browser-canvas screenshot path before hand-rolling a Playwright/Puppeteer script; only fall back to a custom script when no native browser tool is exposed.
|
||||
2. Preflight mutable injection by setting `document.title` and appending a `<script>` tag. Read-only evaluate APIs do not count.
|
||||
3. If mutation is unavailable, skip live server, browser presentation, and injection; report fallback signal.
|
||||
4. If mutation is available, start `node .qoder/skills/impeccable/scripts/live-server.mjs --background`, present the browser if supported, label `[Human]`, scroll top, inject `http://localhost:PORT/detect.js`, wait 2-3 seconds, read `impeccable` console messages, then stop the live server.
|
||||
@@ -79,6 +86,12 @@ The chat response is the primary user-facing deliverable. Present the full struc
|
||||
|
||||
Structure your feedback as a design director would:
|
||||
|
||||
#### Report header provenance
|
||||
|
||||
The report's first line MUST declare how the assessments were run, so a degraded run is never silent:
|
||||
- Dual-agent: `Method: dual-agent (A: <agent-id> · B: <agent-id>)`
|
||||
- Degraded: `⚠️ DEGRADED: single-context (<reason, e.g. no sub-agent tool exposed>)`
|
||||
|
||||
#### Design Health Score
|
||||
> *Consult the [Heuristics Scoring Guide](#heuristics-scoring-guide) section below.*
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Generate a `DESIGN.md` file at the project root that captures the current visual design system, so AI agents generating new screens stay on-brand.
|
||||
|
||||
DESIGN.md follows the [official Google Stitch DESIGN.md format](https://stitch.withgoogle.com/docs/design-md/format/): YAML frontmatter carrying machine-readable design tokens, followed by a markdown body with exactly six sections in a fixed order. **Tokens are normative; prose provides context for how to apply them.** Sections may be omitted when not relevant, but **do not reorder them and do not rename them**. Section headers must match the spec character-for-character so the file stays parseable by other DESIGN.md-aware tools (Stitch itself, awesome-design-md, skill-rest, etc.).
|
||||
DESIGN.md follows the [official DESIGN.md format spec](https://raw.githubusercontent.com/google-labs-code/design.md/main/docs/spec.md): YAML frontmatter carrying machine-readable design tokens, followed by a markdown body with exactly six sections in a fixed order. **Tokens are normative; prose provides context for how to apply them.** Sections may be omitted when not relevant, but **do not reorder them and do not rename them**. Section headers must match the spec character-for-character so the file stays parseable by other DESIGN.md-aware tools (Stitch itself, awesome-design-md, skill-rest, etc.).
|
||||
|
||||
## The frontmatter: token schema
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
The setup command for a project. One codebase crawl feeds everything it writes:
|
||||
|
||||
- **PRODUCT.md** (strategic): root project file for register, target users, product purpose, brand personality, anti-references, strategic design principles. Answers "who/what/why".
|
||||
- **DESIGN.md** (visual): root project file for visual theme, color palette, typography, components, layout. Follows the [Google Stitch DESIGN.md format](https://stitch.withgoogle.com/docs/design-md/format/). Answers "how it looks".
|
||||
- **DESIGN.md** (visual): root project file for visual theme, color palette, typography, components, layout. Follows the [DESIGN.md format spec](https://raw.githubusercontent.com/google-labs-code/design.md/main/docs/spec.md). Answers "how it looks".
|
||||
- **`.impeccable/live/config.json`** (live mode): pre-configured so `/impeccable live` boots straight into variant mode with no first-time detour.
|
||||
|
||||
It closes by pointing the user at the best command to run next. Every other impeccable command reads PRODUCT.md and DESIGN.md before doing any work.
|
||||
|
||||
@@ -478,6 +478,17 @@ const ANTIPATTERNS = [
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'repeating-gradient decorative stripes',
|
||||
},
|
||||
{
|
||||
id: 'codex-grid-background',
|
||||
category: 'slop',
|
||||
severity: 'advisory',
|
||||
gated: 'gpt',
|
||||
name: 'Decorative grid-line background',
|
||||
description:
|
||||
'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) is a recurring generated-UI signature. Reserve grid overlays for actual canvas, map, blueprint, or measurement surfaces; elsewhere use product structure or a plain surface.',
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'two-axis grid-line gradient background',
|
||||
},
|
||||
{
|
||||
id: 'theater-slop-phrase',
|
||||
category: 'slop',
|
||||
@@ -1172,6 +1183,42 @@ function checkHtmlPatterns(html) {
|
||||
findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' });
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): two-axis grid-line background (Codex/GPT) ---
|
||||
// The Codex grid tell is two hairline `linear-gradient(... <color> 1px,
|
||||
// transparent 1px)` layers (one per axis) tiled by a repeating
|
||||
// `background-size` cell. Both signals must co-occur in the SAME style block
|
||||
// (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a
|
||||
// tiling background-size is a fixed crosshair, not a grid, and a single
|
||||
// hairline is a legitimate ruled line. Scoping to one block also stops
|
||||
// unrelated single-axis rules on separate elements from adding up across the
|
||||
// page. Count hairlines only inside `background`/`background-image` values so
|
||||
// a hairline in an unrelated property (mask-image, border-image) can't stand
|
||||
// in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry
|
||||
// nested parens, so match the hairline stop directly rather than parsing
|
||||
// whole gradient layers.
|
||||
{
|
||||
const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi;
|
||||
const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i;
|
||||
const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi;
|
||||
const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi;
|
||||
let blk;
|
||||
while ((blk = blockRe.exec(html)) !== null) {
|
||||
const block = blk[1] || blk[2] || blk[3] || '';
|
||||
if (!gridSizeRe.test(block)) continue;
|
||||
let hairlineCount = 0;
|
||||
let bm;
|
||||
bgDeclRe.lastIndex = 0;
|
||||
while ((bm = bgDeclRe.exec(block)) !== null) {
|
||||
const stops = bm[1].match(hairlineRe);
|
||||
if (stops) hairlineCount += stops.length;
|
||||
}
|
||||
if (hairlineCount >= 2) {
|
||||
findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' });
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): "X theater" framing copy (GPT) ---
|
||||
// Lives here (regex-on-HTML) rather than in the text-content analyzers so it
|
||||
// runs in the bundled browser path too, not just the CLI/static path.
|
||||
|
||||
@@ -376,6 +376,17 @@ const ANTIPATTERNS = [
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'repeating-gradient decorative stripes',
|
||||
},
|
||||
{
|
||||
id: 'codex-grid-background',
|
||||
category: 'slop',
|
||||
severity: 'advisory',
|
||||
gated: 'gpt',
|
||||
name: 'Decorative grid-line background',
|
||||
description:
|
||||
'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) is a recurring generated-UI signature. Reserve grid overlays for actual canvas, map, blueprint, or measurement surfaces; elsewhere use product structure or a plain surface.',
|
||||
skillSection: 'Visual Details',
|
||||
skillGuideline: 'two-axis grid-line gradient background',
|
||||
},
|
||||
{
|
||||
id: 'theater-slop-phrase',
|
||||
category: 'slop',
|
||||
|
||||
@@ -573,6 +573,42 @@ function checkHtmlPatterns(html) {
|
||||
findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' });
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): two-axis grid-line background (Codex/GPT) ---
|
||||
// The Codex grid tell is two hairline `linear-gradient(... <color> 1px,
|
||||
// transparent 1px)` layers (one per axis) tiled by a repeating
|
||||
// `background-size` cell. Both signals must co-occur in the SAME style block
|
||||
// (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a
|
||||
// tiling background-size is a fixed crosshair, not a grid, and a single
|
||||
// hairline is a legitimate ruled line. Scoping to one block also stops
|
||||
// unrelated single-axis rules on separate elements from adding up across the
|
||||
// page. Count hairlines only inside `background`/`background-image` values so
|
||||
// a hairline in an unrelated property (mask-image, border-image) can't stand
|
||||
// in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry
|
||||
// nested parens, so match the hairline stop directly rather than parsing
|
||||
// whole gradient layers.
|
||||
{
|
||||
const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi;
|
||||
const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i;
|
||||
const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi;
|
||||
const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi;
|
||||
let blk;
|
||||
while ((blk = blockRe.exec(html)) !== null) {
|
||||
const block = blk[1] || blk[2] || blk[3] || '';
|
||||
if (!gridSizeRe.test(block)) continue;
|
||||
let hairlineCount = 0;
|
||||
let bm;
|
||||
bgDeclRe.lastIndex = 0;
|
||||
while ((bm = bgDeclRe.exec(block)) !== null) {
|
||||
const stops = bm[1].match(hairlineRe);
|
||||
if (stops) hairlineCount += stops.length;
|
||||
}
|
||||
if (hairlineCount >= 2) {
|
||||
findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' });
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --- Provider tells (gated): "X theater" framing copy (GPT) ---
|
||||
// Lives here (regex-on-HTML) rather than in the text-content analyzers so it
|
||||
// runs in the bundled browser path too, not just the CLI/static path.
|
||||
|
||||
@@ -75,7 +75,6 @@ const HOOK_MANIFEST_TARGETS = [
|
||||
skillRel: '.agents/skills/impeccable',
|
||||
destRel: '.codex/hooks.json',
|
||||
manifest: () => ({
|
||||
description: 'Impeccable design detector: runs after Edit/Write/apply_patch on UI files and surfaces findings as system reminders.',
|
||||
hooks: {
|
||||
PostToolUse: [
|
||||
{
|
||||
@@ -83,7 +82,7 @@ const HOOK_MANIFEST_TARGETS = [
|
||||
hooks: [
|
||||
{
|
||||
type: 'command',
|
||||
command: 'node "$(git rev-parse --show-toplevel)/.agents/skills/impeccable/scripts/hook.mjs"',
|
||||
command: 'node ".agents/skills/impeccable/scripts/hook.mjs"',
|
||||
timeout: TIMEOUT_SECONDS,
|
||||
statusMessage: STATUS_MESSAGE,
|
||||
},
|
||||
|
||||
@@ -7928,7 +7928,7 @@ void main() {
|
||||
const barTopFromBottom = barRect && barRect.height > 0
|
||||
? Math.max(16, window.innerHeight - barRect.top + 12)
|
||||
: 16;
|
||||
toastEl = el('div', {
|
||||
const currentToast = el('div', {
|
||||
position: 'fixed', bottom: barTopFromBottom + 'px', left: '50%',
|
||||
transform: 'translateX(-50%) translateY(8px)',
|
||||
background: C.ink, color: C.white,
|
||||
@@ -7938,19 +7938,24 @@ void main() {
|
||||
transition: 'opacity 0.25s ' + EASE + ', transform 0.25s ' + EASE,
|
||||
pointerEvents: 'none', maxWidth: '420px', textAlign: 'center',
|
||||
});
|
||||
toastEl.id = PREFIX + '-toast';
|
||||
toastEl.textContent = message;
|
||||
uiAppend(toastEl);
|
||||
toastEl = currentToast;
|
||||
currentToast.id = PREFIX + '-toast';
|
||||
currentToast.textContent = message;
|
||||
uiAppend(currentToast);
|
||||
requestAnimationFrame(() => {
|
||||
toastEl.style.opacity = '1';
|
||||
toastEl.style.transform = 'translateX(-50%) translateY(0)';
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.style.opacity = '1';
|
||||
currentToast.style.transform = 'translateX(-50%) translateY(0)';
|
||||
});
|
||||
setTimeout(() => {
|
||||
if (toastEl) {
|
||||
toastEl.style.opacity = '0';
|
||||
toastEl.style.transform = 'translateX(-50%) translateY(8px)';
|
||||
setTimeout(() => { if (toastEl) { toastEl.remove(); toastEl = null; } }, 250);
|
||||
}
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.style.opacity = '0';
|
||||
currentToast.style.transform = 'translateX(-50%) translateY(8px)';
|
||||
setTimeout(() => {
|
||||
if (toastEl !== currentToast) return;
|
||||
currentToast.remove();
|
||||
toastEl = null;
|
||||
}, 250);
|
||||
}, duration);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
---
|
||||
name: impeccable
|
||||
description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks.
|
||||
version: 3.8.0
|
||||
version: 3.9.1
|
||||
user-invocable: true
|
||||
argument-hint: "[craft|shape · audit|critique · animate|bolder|colorize|delight|layout|overdrive|quieter|typeset · adapt|clarify|distill · harden|onboard|optimize|polish · init|document|extract|live] [target]"
|
||||
license: Apache 2.0
|
||||
allowed-tools:
|
||||
- Bash(npx impeccable *)
|
||||
- Bash(node .rovodev/skills/impeccable/scripts/*)
|
||||
---
|
||||
|
||||
Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft.
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
When asked for "bolder," AI defaults to the same tired tricks: cyan/purple gradients, glassmorphism, neon accents on dark backgrounds, gradient text on metrics. These are the opposite of bold. Reject them first, then increase visual impact and personality through stronger hierarchy, committed scale, and decisive type.
|
||||
When asked for "bolder," AI defaults to the same tired tricks: cyan/purple gradients, glassmorphism, neon accents on dark backgrounds, gradient text on metrics. These are the opposite of bold. Reject them first, then increase visual impact by making the existing design language more decisive, specific, and committed.
|
||||
|
||||
---
|
||||
|
||||
## Register
|
||||
|
||||
Brand: "bolder" means distinctive. Extreme scale, unexpected color, typographic risk, committed POV.
|
||||
Brand: "bolder" means distinctive. Express a stronger point of view through hierarchy, pacing, proportion, copy, evidence, and one committed visual idea.
|
||||
|
||||
Product: "bolder" rarely means theatrics; those undermine trust. It means stronger hierarchy, clearer weight contrast, one sharper accent, more committed density. The amplification is in clarity, not drama.
|
||||
Product: "bolder" rarely means theatrics; those undermine trust. It means stronger hierarchy, clearer weight contrast, sharper information density, and more decisive prioritization. The amplification is in clarity, not drama.
|
||||
|
||||
---
|
||||
|
||||
@@ -15,98 +15,105 @@ Product: "bolder" rarely means theatrics; those undermine trust. It means strong
|
||||
Analyze what makes the design feel too safe or boring:
|
||||
|
||||
1. **Identify weakness sources**:
|
||||
- **Generic choices**: System fonts, basic colors, standard layouts
|
||||
- **Timid scale**: Everything is medium-sized with no drama
|
||||
- **Low contrast**: Everything has similar visual weight
|
||||
- **Static**: No motion, no energy, no life
|
||||
- **Predictable**: Standard patterns with no surprises
|
||||
- **Flat hierarchy**: Nothing stands out or commands attention
|
||||
- **Generic choices**: The page could belong to any product in the category.
|
||||
- **Timid scale**: Everything is medium-sized with no clear lead.
|
||||
- **Low contrast**: Important and supporting elements have similar visual weight.
|
||||
- **Static**: The surface has no meaningful moment of emphasis.
|
||||
- **Predictable**: The composition follows a default pattern without a point of view.
|
||||
- **Flat hierarchy**: Nothing stands out or commands attention.
|
||||
|
||||
2. **Understand the context**:
|
||||
- What's the brand personality? (How far can we push?)
|
||||
- What's the purpose? (Marketing can be bolder than financial dashboards)
|
||||
- Who's the audience? (What will resonate?)
|
||||
- What are the constraints? (Brand guidelines, accessibility, performance)
|
||||
- What is the brand personality?
|
||||
- What is the purpose of this surface?
|
||||
- Who is the audience?
|
||||
- What design system, tokens, components, and visual conventions already exist?
|
||||
|
||||
If any of these are unclear from the codebase, ask the user directly to clarify what you cannot infer.
|
||||
|
||||
**CRITICAL**: "Bolder" doesn't mean chaotic or garish. It means distinctive, memorable, and confident. Think intentional drama, not random chaos.
|
||||
**CRITICAL**: "Bolder" does not mean chaotic or garish. It means distinctive, memorable, and confident. Think intentional drama, not random noise.
|
||||
|
||||
**WARNING - AI SLOP TRAP**: Review ALL the DON'T guidelines from the parent impeccable skill (already loaded in this context) before proceeding. Bold means distinctive, not "more effects."
|
||||
|
||||
## Design-System Lock
|
||||
|
||||
If the project has `DESIGN.md`, tokens, theme variables, or established component styles, treat that system as the boundary. Make the existing language stronger before adding new language.
|
||||
|
||||
Do not invent new colors, gradients, radii, shadows, fonts, decorative backgrounds, or effects just because the request says "bolder." A bolder pass should usually change emphasis, proportion, rhythm, density, contrast, copy, artifact specificity, and layout relationships while staying inside the documented system.
|
||||
|
||||
If the existing system is genuinely too limited to express the bolder direction, stop and ask the user before expanding it. Name the exact additions, the role each would play, and why the current system cannot do the job. If the user approves expansion, update the design system or tokens alongside the implementation.
|
||||
|
||||
## Plan Amplification
|
||||
|
||||
Create a strategy to increase impact while maintaining coherence:
|
||||
|
||||
- **Focal point**: What should be the hero moment? (Pick ONE, make it amazing)
|
||||
- **Personality direction**: Maximalist chaos? Elegant drama? Playful energy? Dark moody? Choose a lane.
|
||||
- **Risk budget**: How experimental can we be? Push boundaries within constraints.
|
||||
- **Hierarchy amplification**: Make big things BIGGER, small things smaller (increase contrast)
|
||||
- **Focal point**: Pick one thing the viewer should remember, then make the rest support it.
|
||||
- **System levers**: Identify which existing tokens, components, layout patterns, and copy structures can carry more weight.
|
||||
- **Risk budget**: Decide how far the surface can push while still feeling like the same product or brand.
|
||||
- **Hierarchy amplification**: Increase contrast between primary, secondary, and tertiary content instead of making every element louder.
|
||||
|
||||
**IMPORTANT**: Bold design must still be usable. Impact without function is just decoration.
|
||||
|
||||
## Amplify the Design
|
||||
|
||||
Systematically increase impact across these dimensions:
|
||||
Systematically increase impact through intention, not a menu of effects:
|
||||
|
||||
### Typography Amplification
|
||||
- **Replace generic fonts**: Swap system fonts for distinctive choices (see the parent skill's typography guidelines and the [Reference Material section of typeset.md](typeset.md#reference-material) for inspiration)
|
||||
- **Extreme scale**: Create dramatic size jumps (3x-5x differences, not 1.5x)
|
||||
- **Weight contrast**: Pair 900 weights with 200 weights, not 600 with 400
|
||||
- **Unexpected choices**: Variable fonts, display fonts for headlines, condensed/extended widths, monospace as intentional accent (not as lazy "dev tool" default)
|
||||
- Strengthen the existing type hierarchy before changing typefaces.
|
||||
- Make important text meaningfully more dominant, and make supporting text quieter.
|
||||
- Use weight, measure, spacing, and line breaks to sharpen the point of view.
|
||||
- Add or replace fonts only after user-approved design-system expansion.
|
||||
|
||||
### Color Intensification
|
||||
- **Increase saturation**: Shift to more vibrant, energetic colors (but not neon)
|
||||
- **Bold palette**: Introduce unexpected color combinations. Avoid the purple-blue gradient AI slop
|
||||
- **Dominant color strategy**: Let one bold color own 60% of the design
|
||||
- **Sharp accents**: High-contrast accent colors that pop
|
||||
- **Tinted neutrals**: Replace pure grays with tinted grays that harmonize with your palette
|
||||
- **Rich gradients**: Intentional multi-stop gradients (not generic purple-to-blue)
|
||||
### Color Amplification
|
||||
- Use the existing palette more decisively before adding colors.
|
||||
- Shift the proportion, placement, and contrast of documented colors to clarify meaning.
|
||||
- Treat any new color, gradient, or tint ramp as a design-system expansion that requires user approval.
|
||||
- Keep color tied to hierarchy, state, or brand meaning; do not use it as surface decoration.
|
||||
|
||||
### Spatial Drama
|
||||
- **Extreme scale jumps**: Make important elements 3-5x larger than surroundings
|
||||
- **Break the grid**: Let hero elements escape containers and cross boundaries
|
||||
- **Asymmetric layouts**: Replace centered, balanced layouts with tension-filled asymmetry
|
||||
- **Generous space**: Use white space dramatically (100-200px gaps, not 20-40px)
|
||||
- **Overlap**: Layer elements intentionally for depth
|
||||
### Spatial Amplification
|
||||
- Change proportion, density, alignment, and sequencing so the composition has a stronger point of view.
|
||||
- Create clearer contrast between dense evidence and open breathing room.
|
||||
- Let layout express priority and narrative order before adding ornament.
|
||||
- Preserve responsive behavior and avoid text overflow at every breakpoint.
|
||||
|
||||
### Visual Effects
|
||||
- **Dramatic shadows**: Large, soft shadows for elevation (but not generic drop shadows on rounded rectangles)
|
||||
- **Background treatments**: Mesh patterns, noise textures, geometric patterns, intentional gradients (not purple-to-blue)
|
||||
- **Texture & depth**: Grain, halftone, duotone, layered elements. NOT glassmorphism (it's overused AI slop)
|
||||
- **Borders & frames**: Thick borders, decorative frames, custom shapes (not rounded rectangles with colored border on one side)
|
||||
- **Custom elements**: Illustrative elements, custom icons, decorative details that reinforce brand
|
||||
### Surface Amplification
|
||||
- Use existing surface, border, radius, and shadow rules more deliberately.
|
||||
- Remove timid half-measures: either give an element a clear role or simplify it.
|
||||
- Add texture, depth, illustration, or decorative treatments only when already established by the system or explicitly approved.
|
||||
- Make real product artifacts, imagery, data, or copy carry attention before reaching for effects.
|
||||
|
||||
### Motion & Animation
|
||||
- **Hero moment**: One signature entrance, once. Not on every visit and not on every section.
|
||||
- **Micro-interactions**: Satisfying hover effects, click feedback, state changes.
|
||||
- **Transitions**: Smooth, noticeable transitions using ease-out-quart/quint/expo (not bounce or elastic, which cheapen the effect).
|
||||
- **Bolder ≠ scroll-fade-rise on every section.** That's the saturated AI default, the opposite of bold.
|
||||
- Design one meaningful moment of emphasis when motion genuinely supports the point.
|
||||
- Make interaction feedback feel more decisive without becoming distracting.
|
||||
- Keep transitions smooth and intentional.
|
||||
- **Bolder != scroll-fade-rise on every section.** That's the saturated AI default, the opposite of bold.
|
||||
|
||||
### Composition Boldness
|
||||
- **Hero moments**: Create clear focal points with dramatic treatment
|
||||
- **Diagonal flows**: Escape horizontal/vertical rigidity with diagonal arrangements
|
||||
- **Full-bleed elements**: Use full viewport width/height for impact
|
||||
- **Unexpected proportions**: Golden ratio? Throw it out. Try 70/30, 80/20 splits
|
||||
- Make the dominant idea unmistakable.
|
||||
- Use layout tension, sequencing, contrast, and restraint to create a stronger read.
|
||||
- Let the page's structure communicate priority before adding decorative layers.
|
||||
- If every element is louder, the composition is not bolder; it is flatter.
|
||||
|
||||
**NEVER**:
|
||||
- Add effects randomly without purpose (chaos ≠ bold)
|
||||
- Sacrifice readability for aesthetics (body text must be readable)
|
||||
- Make everything bold (then nothing is bold; you need contrast)
|
||||
- Ignore accessibility (bold design must still meet WCAG standards)
|
||||
- Overwhelm with motion (animation fatigue is real)
|
||||
- Copy trendy aesthetics blindly (bold means distinctive, not derivative)
|
||||
- Add undocumented design-system primitives without user approval
|
||||
- Add effects randomly without purpose
|
||||
- Hide weak hierarchy behind decoration
|
||||
- Sacrifice readability for aesthetics
|
||||
- Make everything bold; contrast is the point
|
||||
- Ignore accessibility
|
||||
- Overwhelm with motion
|
||||
- Copy trendy aesthetics blindly
|
||||
|
||||
## Verify Quality
|
||||
|
||||
Ensure amplification maintains usability and coherence:
|
||||
|
||||
- **System-faithful**: Did the pass make the existing design language stronger before adding anything new?
|
||||
- **No undocumented drift**: Are new colors, gradients, shadows, radii, fonts, and effects either absent or explicitly approved and documented?
|
||||
- **NOT AI slop**: Does this look like every other AI-generated "bold" design? If yes, start over.
|
||||
- **Still functional**: Can users accomplish tasks without distraction?
|
||||
- **Coherent**: Does everything feel intentional and unified?
|
||||
- **Memorable**: Will users remember this experience?
|
||||
- **Performant**: Do all these effects run smoothly?
|
||||
- **Accessible**: Does it still meet accessibility standards?
|
||||
- **Memorable**: Will users remember this experience for the intended reason?
|
||||
- **Performant and accessible**: Does the result stay fast, readable, responsive, and WCAG-conscious?
|
||||
|
||||
**The test**: If you showed this to someone and said "AI made this bolder," would they believe you immediately? If yes, you've failed. Bold means distinctive, not "more AI effects."
|
||||
|
||||
|
||||
@@ -5,8 +5,9 @@ Resolve one stable target, run two independent assessments, synthesize a design
|
||||
### Hard Invariants
|
||||
|
||||
- Assessment A (design review) and Assessment B (detector/browser evidence) are both required.
|
||||
- Assessment A and B MUST run as two isolated sub-agents whenever a sub-agent/Task tool is exposed. Running them inline in this context is "possible" but is NOT permitted; it is a degraded run. Inline is allowed ONLY when no sub-agent tool exists (or the user declined, on harnesses that ask).
|
||||
- If you degrade for any reason, the report's first line MUST be a banner: `⚠️ DEGRADED: single-context (<reason>)`. A silent degraded critique is a failed critique.
|
||||
- Assessment A must finish before detector findings enter the parent synthesis context. Detector output is deterministic, but it still anchors judgment.
|
||||
- If sub-agents are unavailable, fall back sequentially: finish and record Assessment A first, then run Assessment B, then synthesize.
|
||||
- A skipped detector is a failed critique run unless `detect.mjs` is missing or crashes after a real attempt.
|
||||
- Viewable targets require browser inspection when available.
|
||||
- Any local server started only for critique visualization must run in the background, have a recorded stop method, and be stopped before final reporting unless the user asks to keep it.
|
||||
@@ -27,7 +28,13 @@ Resolve one stable target, run two independent assessments, synthesize a design
|
||||
|
||||
### Assessment Orchestration
|
||||
|
||||
Delegate Assessment A and Assessment B to separate sub-agents when possible. They must not see each other's output. Do not show findings to the user until synthesis.
|
||||
Delegate Assessment A and Assessment B to separate sub-agents. They must not see each other's output. Do not show findings to the user until synthesis.
|
||||
|
||||
Sub-agent gate (all harnesses):
|
||||
- Unless a harness-specific gate below overrides this, spawn A and B as two isolated, parallel sub-agents whenever a sub-agent/Task tool is exposed. This is the default and is mandatory; do not run them inline because it is faster.
|
||||
- "Unavailable" means exactly one thing: no sub-agent/Task tool is exposed in this session (or, on harnesses that ask, the user declined). It does not mean inconvenient.
|
||||
- If and only if sub-agents are unavailable, fall back sequentially: finish and record Assessment A, then run Assessment B, then synthesize, and emit the degraded banner.
|
||||
- Whichever path you take, declare it in the report header (see Report header provenance). Skipping sub-agents without the banner is the most common failure of this command.
|
||||
|
||||
If browser automation is available, each assessment creates its own new tab. Never reuse an existing tab, even if it is already at the right URL.
|
||||
|
||||
@@ -61,7 +68,7 @@ node .rovodev/skills/impeccable/scripts/detect.mjs --json [target]
|
||||
|
||||
Browser visualization is required for a viewable target when browser automation is available. Use a localhost dev/static URL for local files; avoid `file://` unless the available browser explicitly supports this workflow. Overlay flow:
|
||||
|
||||
1. Create a fresh tab and navigate.
|
||||
1. Create a fresh tab and navigate. Prefer the harness's native/browser-canvas screenshot path before hand-rolling a Playwright/Puppeteer script; only fall back to a custom script when no native browser tool is exposed.
|
||||
2. Preflight mutable injection by setting `document.title` and appending a `<script>` tag. Read-only evaluate APIs do not count.
|
||||
3. If mutation is unavailable, skip live server, browser presentation, and injection; report fallback signal.
|
||||
4. If mutation is available, start `node .rovodev/skills/impeccable/scripts/live-server.mjs --background`, present the browser if supported, label `[Human]`, scroll top, inject `http://localhost:PORT/detect.js`, wait 2-3 seconds, read `impeccable` console messages, then stop the live server.
|
||||
@@ -79,6 +86,12 @@ The chat response is the primary user-facing deliverable. Present the full struc
|
||||
|
||||
Structure your feedback as a design director would:
|
||||
|
||||
#### Report header provenance
|
||||
|
||||
The report's first line MUST declare how the assessments were run, so a degraded run is never silent:
|
||||
- Dual-agent: `Method: dual-agent (A: <agent-id> · B: <agent-id>)`
|
||||
- Degraded: `⚠️ DEGRADED: single-context (<reason, e.g. no sub-agent tool exposed>)`
|
||||
|
||||
#### Design Health Score
|
||||
> *Consult the [Heuristics Scoring Guide](#heuristics-scoring-guide) section below.*
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user