@hegemonart/get-design-done 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +63 -0
- package/.claude-plugin/plugin.json +54 -0
- package/CHANGELOG.md +221 -0
- package/LICENSE +21 -0
- package/README.md +724 -0
- package/SKILL.md +232 -0
- package/agents/README.md +226 -0
- package/agents/a11y-mapper.md +118 -0
- package/agents/component-taxonomy-mapper.md +88 -0
- package/agents/design-advisor.md +139 -0
- package/agents/design-assumptions-analyzer.md +171 -0
- package/agents/design-auditor.md +383 -0
- package/agents/design-context-builder.md +544 -0
- package/agents/design-context-checker-gate.md +90 -0
- package/agents/design-context-checker.md +260 -0
- package/agents/design-discussant.md +98 -0
- package/agents/design-doc-writer.md +229 -0
- package/agents/design-executor.md +452 -0
- package/agents/design-figma-writer.md +302 -0
- package/agents/design-fixer.md +180 -0
- package/agents/design-integration-checker-gate.md +93 -0
- package/agents/design-integration-checker.md +326 -0
- package/agents/design-pattern-mapper.md +206 -0
- package/agents/design-phase-researcher.md +229 -0
- package/agents/design-plan-checker.md +164 -0
- package/agents/design-planner.md +352 -0
- package/agents/design-reflector.md +175 -0
- package/agents/design-research-synthesizer.md +127 -0
- package/agents/design-verifier-gate.md +97 -0
- package/agents/design-verifier.md +605 -0
- package/agents/gdd-graphify-sync.md +100 -0
- package/agents/gdd-intel-updater.md +88 -0
- package/agents/gdd-learnings-extractor.md +85 -0
- package/agents/motion-mapper.md +103 -0
- package/agents/token-mapper.md +103 -0
- package/agents/visual-hierarchy-mapper.md +95 -0
- package/connections/chromatic.md +247 -0
- package/connections/claude-design.md +190 -0
- package/connections/connections.md +218 -0
- package/connections/figma-writer.md +139 -0
- package/connections/figma.md +146 -0
- package/connections/graphify.md +197 -0
- package/connections/pinterest.md +153 -0
- package/connections/preview.md +173 -0
- package/connections/refero.md +189 -0
- package/connections/storybook.md +280 -0
- package/hooks/budget-enforcer.js +318 -0
- package/hooks/context-exhaustion.js +127 -0
- package/hooks/gdd-read-injection-scanner.js +44 -0
- package/hooks/hooks.json +44 -0
- package/package.json +60 -0
- package/reference/BRANCH-PROTECTION.md +65 -0
- package/reference/DEPRECATIONS.md +41 -0
- package/reference/STATE-TEMPLATE.md +200 -0
- package/reference/accessibility.md +190 -0
- package/reference/anti-patterns.md +336 -0
- package/reference/audit-scoring.md +205 -0
- package/reference/checklists.md +137 -0
- package/reference/config-schema.md +319 -0
- package/reference/debugger-philosophy.md +32 -0
- package/reference/heuristics.md +201 -0
- package/reference/intel-schema.md +266 -0
- package/reference/model-prices.md +37 -0
- package/reference/model-tiers.md +118 -0
- package/reference/motion.md +285 -0
- package/reference/parallelism-rules.md +108 -0
- package/reference/priority-matrix.md +31 -0
- package/reference/project-skills-guide.md +42 -0
- package/reference/review-format.md +107 -0
- package/reference/schemas/config.schema.json +41 -0
- package/reference/schemas/hooks.schema.json +55 -0
- package/reference/schemas/intel.schema.json +191 -0
- package/reference/schemas/marketplace.schema.json +72 -0
- package/reference/schemas/plugin.schema.json +59 -0
- package/reference/shared-preamble.md +82 -0
- package/reference/typography.md +229 -0
- package/scripts/aggregate-agent-metrics.js +144 -0
- package/scripts/apply-branch-protection.sh +75 -0
- package/scripts/bootstrap-manifest.txt +3 -0
- package/scripts/bootstrap.sh +80 -0
- package/scripts/build-intel.cjs +458 -0
- package/scripts/detect-stale-refs.cjs +101 -0
- package/scripts/extract-changelog-section.cjs +57 -0
- package/scripts/release-smoke-test.cjs +169 -0
- package/scripts/rollback-release.sh +42 -0
- package/scripts/run-injection-scanner-ci.cjs +92 -0
- package/scripts/validate-frontmatter.cjs +68 -0
- package/scripts/validate-schemas.cjs +225 -0
- package/scripts/verify-version-sync.cjs +30 -0
- package/skills/add-backlog/SKILL.md +47 -0
- package/skills/analyze-dependencies/SKILL.md +184 -0
- package/skills/apply-reflections/SKILL.md +112 -0
- package/skills/audit/SKILL.md +54 -0
- package/skills/brief/SKILL.md +75 -0
- package/skills/cache-manager/SKILL.md +120 -0
- package/skills/compare/SKILL.md +322 -0
- package/skills/complete-cycle/SKILL.md +33 -0
- package/skills/darkmode/SKILL.md +331 -0
- package/skills/debug/SKILL.md +38 -0
- package/skills/design/SKILL.md +281 -0
- package/skills/discover/SKILL.md +172 -0
- package/skills/discuss/SKILL.md +67 -0
- package/skills/do/SKILL.md +45 -0
- package/skills/explore/SKILL.md +109 -0
- package/skills/extract-learnings/SKILL.md +98 -0
- package/skills/fast/SKILL.md +44 -0
- package/skills/figma-write/SKILL.md +40 -0
- package/skills/graphify/SKILL.md +48 -0
- package/skills/health/SKILL.md +48 -0
- package/skills/help/SKILL.md +76 -0
- package/skills/list-assumptions/SKILL.md +60 -0
- package/skills/map/SKILL.md +112 -0
- package/skills/new-cycle/SKILL.md +35 -0
- package/skills/new-project/SKILL.md +53 -0
- package/skills/next/SKILL.md +42 -0
- package/skills/note/SKILL.md +47 -0
- package/skills/optimize/SKILL.md +120 -0
- package/skills/pause/SKILL.md +41 -0
- package/skills/plan/SKILL.md +251 -0
- package/skills/plant-seed/SKILL.md +47 -0
- package/skills/pr-branch/SKILL.md +31 -0
- package/skills/progress/SKILL.md +60 -0
- package/skills/quick/SKILL.md +43 -0
- package/skills/reapply-patches/SKILL.md +31 -0
- package/skills/reflect/SKILL.md +73 -0
- package/skills/resume/SKILL.md +37 -0
- package/skills/review-backlog/SKILL.md +45 -0
- package/skills/router/SKILL.md +67 -0
- package/skills/scan/SKILL.md +721 -0
- package/skills/settings/SKILL.md +78 -0
- package/skills/ship/SKILL.md +31 -0
- package/skills/sketch/SKILL.md +78 -0
- package/skills/sketch-wrap-up/SKILL.md +88 -0
- package/skills/skill-manifest/SKILL.md +79 -0
- package/skills/spike/SKILL.md +67 -0
- package/skills/spike-wrap-up/SKILL.md +81 -0
- package/skills/stats/SKILL.md +50 -0
- package/skills/style/SKILL.md +193 -0
- package/skills/synthesize/SKILL.md +93 -0
- package/skills/todo/SKILL.md +54 -0
- package/skills/undo/SKILL.md +30 -0
- package/skills/update/SKILL.md +36 -0
- package/skills/verify/SKILL.md +452 -0
- package/skills/warm-cache/SKILL.md +113 -0
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
# Anti-Pattern Catalog
|
|
2
|
+
|
|
3
|
+
Use during Discover (baseline audit), Design (prevention), and Verify (compliance scoring).
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## The AI-Slop Test
|
|
8
|
+
|
|
9
|
+
Before shipping any artifact: **"If I told someone 'AI made this,' would they believe me immediately?"**
|
|
10
|
+
|
|
11
|
+
If yes — redo. The training-set monoculture has specific fingerprints. Learn them all.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Hard Bans (BAN-XX)
|
|
16
|
+
|
|
17
|
+
Zero tolerance. Each violation = −3 points from Anti-Pattern score. Rewrite rather than soften.
|
|
18
|
+
|
|
19
|
+
### BAN-01: Side-Stripe Borders
|
|
20
|
+
|
|
21
|
+
```css
|
|
22
|
+
/* BANNED — AI-generated card tell, regardless of color */
|
|
23
|
+
border-left: 4px solid var(--color-primary);
|
|
24
|
+
border-right: 3px solid #6366f1;
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Why**: The border-left accent card is the most recognizable AI default. It signals no design thinking happened.
|
|
28
|
+
|
|
29
|
+
**Fix**: Use different element structure — colored icon, colored background section, or inline accent element.
|
|
30
|
+
|
|
31
|
+
**Grep**: `border-left:\s*[2-9][0-9]*px|border-right:\s*[2-9][0-9]*px`
|
|
32
|
+
|
|
33
|
+
### BAN-02: Gradient Text
|
|
34
|
+
|
|
35
|
+
```css
|
|
36
|
+
/* BANNED */
|
|
37
|
+
background: linear-gradient(to right, #6366f1, #8b5cf6);
|
|
38
|
+
-webkit-background-clip: text;
|
|
39
|
+
-webkit-text-fill-color: transparent;
|
|
40
|
+
background-clip: text;
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Why**: Every AI-generated hero uses this. It's a visual cliché and fails against light backgrounds.
|
|
44
|
+
|
|
45
|
+
**Fix**: Solid color, emphasis via weight or size increase.
|
|
46
|
+
|
|
47
|
+
**Grep**: `background-clip:\s*text|text-fill-color:\s*transparent`
|
|
48
|
+
|
|
49
|
+
### BAN-03: Bounce/Elastic Easing
|
|
50
|
+
|
|
51
|
+
```css
|
|
52
|
+
/* BANNED */
|
|
53
|
+
transition: all 300ms cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
|
54
|
+
animation: bounce 1s ease;
|
|
55
|
+
animation-timing-function: spring(1, 80, 10, 0);
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Why**: Skeuomorphic residue from 2012. Feels toy-like and unprofessional.
|
|
59
|
+
|
|
60
|
+
**Fix**: `ease-out` for enter, `ease-in` for exit, `ease-in-out` for transitions.
|
|
61
|
+
|
|
62
|
+
**Grep**: `cubic-bezier\(.*-[0-9]|bounce|elastic|spring\(`
|
|
63
|
+
|
|
64
|
+
### BAN-04: Animating Keyboard Actions
|
|
65
|
+
|
|
66
|
+
No animation on: command palette open/close, keyboard shortcuts, tab switching, filter/sort toggles, navigation item expand/collapse.
|
|
67
|
+
|
|
68
|
+
**Why**: These repeat 100+ times per day. Every millisecond of animation accumulates into felt sluggishness.
|
|
69
|
+
|
|
70
|
+
**Fix**: Instant state change. Zero transition duration.
|
|
71
|
+
|
|
72
|
+
### BAN-05: Pure Black Dark Mode
|
|
73
|
+
|
|
74
|
+
```css
|
|
75
|
+
/* BANNED */
|
|
76
|
+
background: #000000;
|
|
77
|
+
background: rgb(0, 0, 0);
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Why**: Pure black in dark mode creates harsh contrast and looks amateur.
|
|
81
|
+
|
|
82
|
+
**Fix**: oklch(12% 0 0) through oklch(18% 0.005 [hue]) — slightly warm or cool near-black.
|
|
83
|
+
|
|
84
|
+
**Grep**: `background.*#000000|background.*rgb\(0,\s*0,\s*0\)`
|
|
85
|
+
|
|
86
|
+
### BAN-06: Disabling Zoom
|
|
87
|
+
|
|
88
|
+
```html
|
|
89
|
+
<!-- BANNED -->
|
|
90
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
|
91
|
+
<meta name="viewport" content="width=device-width, maximum-scale=1">
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**Why**: WCAG 1.4.4 violation. Breaks accessibility for low-vision users.
|
|
95
|
+
|
|
96
|
+
**Grep**: `user-scalable=no|maximum-scale=1`
|
|
97
|
+
|
|
98
|
+
### BAN-07: Naked `outline: none`
|
|
99
|
+
|
|
100
|
+
```css
|
|
101
|
+
/* BANNED — unless a custom focus indicator replaces it */
|
|
102
|
+
:focus { outline: none; }
|
|
103
|
+
button:focus { outline: 0; }
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**Why**: Removes keyboard navigation visibility. WCAG 2.4.7 failure.
|
|
107
|
+
|
|
108
|
+
**Fix**: `:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }` with `outline: none` only on `:focus:not(:focus-visible)`.
|
|
109
|
+
|
|
110
|
+
**Grep**: `:focus\s*\{[^}]*outline:\s*(none|0)`
|
|
111
|
+
|
|
112
|
+
### BAN-08: `transition: all`
|
|
113
|
+
|
|
114
|
+
```css
|
|
115
|
+
/* BANNED */
|
|
116
|
+
transition: all 300ms ease;
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**Why**: Animates every property including layout properties (width, height, top) causing expensive paint/layout operations.
|
|
120
|
+
|
|
121
|
+
**Fix**: Specify exact properties: `transition: transform 200ms ease-out, opacity 150ms ease-out;`
|
|
122
|
+
|
|
123
|
+
**Grep**: `transition:\s*all\s`
|
|
124
|
+
|
|
125
|
+
### BAN-09: `scale(0)` Animation Entry
|
|
126
|
+
|
|
127
|
+
```css
|
|
128
|
+
/* BANNED — nothing in the real world materializes from nothing */
|
|
129
|
+
@keyframes enter { from { transform: scale(0); } }
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**Fix**: `scale(0.95)` + `opacity: 0` → `scale(1)` + `opacity: 1`.
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## AI-Slop Tells (SLOP-XX)
|
|
137
|
+
|
|
138
|
+
Each confirmed tell = −1 point from Anti-Pattern score. These signal training-set monoculture without deliberate design choices.
|
|
139
|
+
|
|
140
|
+
### SLOP-01: AI Default Palette
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
#6366f1 (indigo-500) + #8b5cf6 (violet-500) + #06b6d4 (cyan-500)
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
The exact palette generated by GPT-4 and Claude for 80% of UI requests.
|
|
147
|
+
|
|
148
|
+
**Grep**: `#6366f1|#8b5cf6|#06b6d4`
|
|
149
|
+
|
|
150
|
+
### SLOP-02: Purple → Blue Gradient Hero
|
|
151
|
+
|
|
152
|
+
```css
|
|
153
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
154
|
+
background: linear-gradient(to right, #6366f1, #8b5cf6);
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### SLOP-03: Cyan Accent on Dark Background
|
|
158
|
+
|
|
159
|
+
`color: #06b6d4` or `color: #22d3ee` as the primary accent in dark mode.
|
|
160
|
+
|
|
161
|
+
### SLOP-04: `backdrop-filter: blur` Without Purpose
|
|
162
|
+
|
|
163
|
+
```css
|
|
164
|
+
/* SLOP if used purely decoratively */
|
|
165
|
+
backdrop-filter: blur(20px);
|
|
166
|
+
-webkit-backdrop-filter: blur(10px);
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Glassmorphism as the default card treatment signals no layout thinking.
|
|
170
|
+
|
|
171
|
+
**Valid uses**: Modal overlays dimming content behind them, floating command palette, persistent header over content.
|
|
172
|
+
|
|
173
|
+
**Grep**: `backdrop-filter:\s*blur`
|
|
174
|
+
|
|
175
|
+
### SLOP-05: Default Font Without Decision
|
|
176
|
+
|
|
177
|
+
Using Inter, DM Sans, Space Grotesk, or Plus Jakarta Sans without a documented brand reason.
|
|
178
|
+
|
|
179
|
+
**Test**: Can you give 3 concrete reasons this font matches the product's brand? If not — choose again.
|
|
180
|
+
|
|
181
|
+
### SLOP-06: Card-in-Card
|
|
182
|
+
|
|
183
|
+
A component with `border-radius` + `background` + `box-shadow` nested inside another such component.
|
|
184
|
+
|
|
185
|
+
### SLOP-07: "Icon in Rounded Square Above Every Heading"
|
|
186
|
+
|
|
187
|
+
The feature section pattern where every item has: `rounded-xl bg-primary/10 p-3 mb-4` containing an icon, followed by a heading and 2 sentences.
|
|
188
|
+
|
|
189
|
+
### SLOP-08: Rainbow Status Badges
|
|
190
|
+
|
|
191
|
+
Assigning a different color to every status: blue (pending), yellow (in review), purple (waiting), orange (blocked), teal (processing). Status color must be semantic: green (success/active), yellow (warning/pending), red (error/blocked), gray (inactive/draft). Only those four roles.
|
|
192
|
+
|
|
193
|
+
### SLOP-09: Decorative Sparklines
|
|
194
|
+
|
|
195
|
+
Charts placed in dashboards with no real data, purely decorative "trend lines" that don't encode information.
|
|
196
|
+
|
|
197
|
+
### SLOP-10: Generic Drop Shadow
|
|
198
|
+
|
|
199
|
+
```css
|
|
200
|
+
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
The Tailwind `shadow-md` default. Used without considering elevation system.
|
|
204
|
+
|
|
205
|
+
### SLOP-11: "Simple, Powerful, Flexible" Copy
|
|
206
|
+
|
|
207
|
+
Hero headline triplets with no subject or verb. Feature list as the hero. "We're passionate about..." opener.
|
|
208
|
+
|
|
209
|
+
### SLOP-12: 3D Isometric Illustration
|
|
210
|
+
|
|
211
|
+
Pastel-colored isometric illustrations with floating icons. Figma community template vibe. Use photography, real screenshots, or purposefully-styled illustration with brand character.
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## Visual Anti-Patterns
|
|
216
|
+
|
|
217
|
+
### Color Errors
|
|
218
|
+
|
|
219
|
+
- Gray on colored backgrounds (fails contrast, not "subtle")
|
|
220
|
+
- Pure gray neutrals — add 0.005–0.015 chroma toward brand hue
|
|
221
|
+
- Red + green as the only meaning carrier (colorblind failure)
|
|
222
|
+
- Text over image without scrim or overlay
|
|
223
|
+
- Alpha-heavy transparency everywhere (incomplete palette signal)
|
|
224
|
+
- > 1 semantic role for the same color (red = danger ONLY)
|
|
225
|
+
|
|
226
|
+
### Typography Errors
|
|
227
|
+
|
|
228
|
+
- Body text < 16px on web (< 12px anywhere)
|
|
229
|
+
- > 6 font-size/weight combinations on a single page
|
|
230
|
+
- `all-caps` body text (labels/badges only)
|
|
231
|
+
- Fluid `clamp()` on app/dashboard UI (marketing headings only)
|
|
232
|
+
- Line height 1.0–1.2 on body text (needs 1.5–1.75)
|
|
233
|
+
- `letter-spacing` changes with no typographic reason
|
|
234
|
+
- `font-weight: 300` on text < 16px (illegible)
|
|
235
|
+
|
|
236
|
+
### Layout Errors
|
|
237
|
+
|
|
238
|
+
- Full-width buttons for every CTA (primary only)
|
|
239
|
+
- Placeholder-only labels (no visible `<label>` above input)
|
|
240
|
+
- Multi-column forms on mobile
|
|
241
|
+
- Hamburger as PRIMARY nav on desktop (> 1024px)
|
|
242
|
+
- Bottom nav with > 5 items
|
|
243
|
+
- Container width fixed at 1200px (breaks at 1300+)
|
|
244
|
+
- Spacing values not from 4/8/12/16/24/32/48/64 series (e.g. `padding: 13px`)
|
|
245
|
+
|
|
246
|
+
### Shadow/Elevation Errors
|
|
247
|
+
|
|
248
|
+
- 3+ shadow depths when 2 tiers is enough
|
|
249
|
+
- Shadow AND border AND background color on the same element
|
|
250
|
+
- Inner shadow + outer shadow simultaneously
|
|
251
|
+
- Drop shadows on flat/minimal design systems
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## Motion Anti-Patterns
|
|
256
|
+
|
|
257
|
+
- `ease-in` on entrances (use `ease-out`)
|
|
258
|
+
- Same duration for enter and exit (exit should be 60–70% of enter)
|
|
259
|
+
- Animating `width`/`height` (triggers layout — use `transform` only)
|
|
260
|
+
- No `prefers-reduced-motion` media query
|
|
261
|
+
- Popover origin `transform-origin: center` (should come from trigger element)
|
|
262
|
+
- Button with no `:active` press feedback
|
|
263
|
+
- Toast re-playing entrance on every state update
|
|
264
|
+
- Decorative pulses > 1s that loop forever
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## UX/Interaction Anti-Patterns
|
|
269
|
+
|
|
270
|
+
### Forms
|
|
271
|
+
- Validation firing on every keystroke (exception: password strength)
|
|
272
|
+
- Errors shown only at top of form for field-level problems
|
|
273
|
+
- Native `<select>` for > 10 options without typeahead search
|
|
274
|
+
- No progressive disclosure on long forms (show all fields upfront)
|
|
275
|
+
|
|
276
|
+
### Feedback
|
|
277
|
+
- Instant (0ms) state transitions — feels broken
|
|
278
|
+
- "Loading..." spinners with no context ("Loading contacts..." is better)
|
|
279
|
+
- Success toast that blocks the next interaction
|
|
280
|
+
- Destructive action with no undo and no confirmation
|
|
281
|
+
- Confirmation dialog for reversible action (annoyance — use undo instead)
|
|
282
|
+
|
|
283
|
+
### Navigation
|
|
284
|
+
- Browser back button breaks app state
|
|
285
|
+
- Custom back button overriding native swipe gesture (mobile)
|
|
286
|
+
- FAB (floating action button) on iOS native (Material Design pattern, not HIG)
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
## Copy Anti-Patterns
|
|
291
|
+
|
|
292
|
+
- Placeholder text as the only label (disappears on focus; accessibility failure)
|
|
293
|
+
- "Click here" / "Read more" / "Learn more" links (use verb-first + specific: "Download the guide")
|
|
294
|
+
- "OK" / "Submit" / "Yes" buttons (use action verbs: "Save changes", "Create account", "Delete message")
|
|
295
|
+
- Error messages that blame the user: "You entered an invalid email" → "Email address not recognized"
|
|
296
|
+
- "Oops!" / "Uh oh!" in error states
|
|
297
|
+
- Empty state that only says "No items found" (missed onboarding opportunity)
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## Auto-Detection Grep Commands
|
|
302
|
+
|
|
303
|
+
Run these against the codebase for quick anti-pattern audit:
|
|
304
|
+
|
|
305
|
+
```bash
|
|
306
|
+
# BAN violations (−3 each)
|
|
307
|
+
grep -rn "border-left:\s*[2-9]" src/ --include="*.css" --include="*.scss"
|
|
308
|
+
grep -rn "background-clip:\s*text" src/
|
|
309
|
+
grep -rn "text-fill-color:\s*transparent" src/
|
|
310
|
+
grep -rn "cubic-bezier(.*-[0-9]" src/
|
|
311
|
+
grep -rn "user-scalable=no\|maximum-scale=1" public/
|
|
312
|
+
grep -rn ":focus\s*{" src/ | grep -v "focus-visible"
|
|
313
|
+
grep -rn "transition:\s*all\s" src/
|
|
314
|
+
|
|
315
|
+
# SLOP signals (−1 each)
|
|
316
|
+
grep -rn "#6366f1\|#8b5cf6\|#06b6d4" src/
|
|
317
|
+
grep -rn "backdrop-filter:\s*blur" src/
|
|
318
|
+
grep -rn "bounce\|elastic" src/ --include="*.css"
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
## Pre-Ship Self-Check
|
|
324
|
+
|
|
325
|
+
- [ ] Default font (Inter, DM Sans, Space Grotesk) used without a brand reason?
|
|
326
|
+
- [ ] Accent uses purple → blue gradient, cyan-on-dark, or AI default palette?
|
|
327
|
+
- [ ] Any card-in-card nesting?
|
|
328
|
+
- [ ] Every shadow a rounded-rectangle drop shadow?
|
|
329
|
+
- [ ] Hero headline: "Simple, powerful, [noun]"?
|
|
330
|
+
- [ ] Decorative sparklines with no real data?
|
|
331
|
+
- [ ] Empty state just says "No items found"?
|
|
332
|
+
- [ ] Border-left accent on cards/alerts?
|
|
333
|
+
- [ ] Gradient text on any heading?
|
|
334
|
+
- [ ] Bounce or elastic easing anywhere?
|
|
335
|
+
|
|
336
|
+
If YES to any → rewrite that element before proceeding.
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
# Design Audit Scoring Framework
|
|
2
|
+
|
|
3
|
+
Use during Discover (establishing baseline) and Verify (measuring improvement).
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Severity Classification
|
|
8
|
+
|
|
9
|
+
| Level | Code | Impact | Action |
|
|
10
|
+
|---|---|---|---|
|
|
11
|
+
| Blocker | **P0** | Breaks functionality or violates a hard requirement | Fix before shipping — no exceptions |
|
|
12
|
+
| Major | **P1** | Significantly degrades UX or fails accessibility standard | Fix in this design pass |
|
|
13
|
+
| Minor | **P2** | Noticeable issue but doesn't break flows | Fix if time allows |
|
|
14
|
+
| Cosmetic | **P3** | Polish item only, subjective quality issue | Deferred to polish pass |
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Audit Categories and Scoring Rubric
|
|
19
|
+
|
|
20
|
+
Score each category 0–10. Overall score = weighted average.
|
|
21
|
+
|
|
22
|
+
### 1. Accessibility (Weight: 25%)
|
|
23
|
+
|
|
24
|
+
| Score | Criteria |
|
|
25
|
+
|---|---|
|
|
26
|
+
| 10 | All WCAG 2.1 AA criteria pass. Keyboard nav works end-to-end. Focus rings visible. No color-only meaning. |
|
|
27
|
+
| 8–9 | Minor issues — 1–2 non-critical violations, no contrast failures on primary text |
|
|
28
|
+
| 5–7 | Several violations — contrast issues on secondary text, some missing labels |
|
|
29
|
+
| 3–4 | Multiple failures — some interactive elements inaccessible, missing alt text |
|
|
30
|
+
| 0–2 | Critical failures — primary text fails contrast, keyboard nav broken, missing form labels |
|
|
31
|
+
|
|
32
|
+
Auto-checkable:
|
|
33
|
+
- Body text contrast ≥ 4.5:1
|
|
34
|
+
- Large text contrast ≥ 3:1
|
|
35
|
+
- Touch targets ≥ 44×44px
|
|
36
|
+
- Focus rings present (`:focus-visible` defined)
|
|
37
|
+
- Form labels associated
|
|
38
|
+
- Images have alt text
|
|
39
|
+
- No `<div onClick>` for interactive elements
|
|
40
|
+
|
|
41
|
+
### 2. Visual Hierarchy (Weight: 20%)
|
|
42
|
+
|
|
43
|
+
| Score | Criteria |
|
|
44
|
+
|---|---|
|
|
45
|
+
| 10 | Clear primary action per view. Reading order is instantly obvious. Headlines scannable without reading body. |
|
|
46
|
+
| 8–9 | Mostly clear hierarchy, 1–2 competing priorities |
|
|
47
|
+
| 5–7 | Multiple elements compete for primary attention, visual noise |
|
|
48
|
+
| 3–4 | Hard to identify primary action, everything is same weight |
|
|
49
|
+
| 0–2 | No discernible hierarchy, flat design with equal visual weight throughout |
|
|
50
|
+
|
|
51
|
+
Check for:
|
|
52
|
+
- One primary CTA per section/screen
|
|
53
|
+
- Heading vs body text visually distinguishable by weight/family (not just size)
|
|
54
|
+
- Spacing used to group related elements (8–16px within groups, 32–64px between groups)
|
|
55
|
+
|
|
56
|
+
### Auto-checkable grep patterns (Phase 3 addition)
|
|
57
|
+
|
|
58
|
+
Use these patterns during audit to flag hierarchy violations automatically:
|
|
59
|
+
|
|
60
|
+
**Multiple same-weight headings (hierarchy violation):**
|
|
61
|
+
```bash
|
|
62
|
+
grep -rEn "font-weight:\s*400.*(h1|h2|h3)" src/ --include="*.css" --include="*.scss" 2>/dev/null | head -10
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**CTA count (flag >1 primary per section):**
|
|
66
|
+
```bash
|
|
67
|
+
grep -rEn 'variant="primary"|btn-primary|bg-primary' src/ --include="*.tsx" --include="*.jsx" 2>/dev/null | wc -l
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Spacing groups (within-group 8–16px vs between-group 32–64px):**
|
|
71
|
+
```bash
|
|
72
|
+
grep -rEn "(padding|margin|gap):\s*(8|12|16)px" src/ --include="*.css" 2>/dev/null | head -5
|
|
73
|
+
grep -rEn "(margin-top|margin-bottom|gap):\s*(32|40|48|64)px" src/ --include="*.css" 2>/dev/null | head -5
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
These patterns supplement the qualitative rubric above — they cannot replace
|
|
77
|
+
visual inspection but reduce false positives during automated audit passes.
|
|
78
|
+
|
|
79
|
+
### 3. Typography (Weight: 15%)
|
|
80
|
+
|
|
81
|
+
| Score | Criteria |
|
|
82
|
+
|---|---|
|
|
83
|
+
| 10 | Systematic type scale, harmonious pairing, correct line-height/length, consistent weights |
|
|
84
|
+
| 8–9 | Scale mostly consistent, minor deviations |
|
|
85
|
+
| 5–7 | Ad-hoc sizes, inconsistent weights, or poor pairing |
|
|
86
|
+
| 3–4 | No system evident, mixing too many families, poor readability |
|
|
87
|
+
| 0–2 | Body text below 16px, light weights on small text, unreadable |
|
|
88
|
+
|
|
89
|
+
Check for:
|
|
90
|
+
- Font sizes from a defined scale (not arbitrary px values)
|
|
91
|
+
- Line height 1.5–1.75 on body
|
|
92
|
+
- Max 2 font families (code font is a 3rd exception)
|
|
93
|
+
- No default-Inter-without-decision
|
|
94
|
+
- Weight hierarchy: bold headings, regular body, medium labels
|
|
95
|
+
|
|
96
|
+
### 4. Color System (Weight: 15%)
|
|
97
|
+
|
|
98
|
+
| Score | Criteria |
|
|
99
|
+
|---|---|
|
|
100
|
+
| 10 | Cohesive palette with clear roles (primary, secondary, semantic tokens), dark mode quality, no accidental palette |
|
|
101
|
+
| 8–9 | Mostly consistent, minor token inconsistencies |
|
|
102
|
+
| 5–7 | Ad-hoc color usage, some semantic inconsistency |
|
|
103
|
+
| 3–4 | Multiple shades of same hue used without logic, no clear semantic roles |
|
|
104
|
+
| 0–2 | AI default palette, pure black dark mode, decorative gradient overuse |
|
|
105
|
+
|
|
106
|
+
Check for:
|
|
107
|
+
- Color semantic consistency (red = danger, ONLY danger)
|
|
108
|
+
- No AI-slop palette (#6366f1 + #8b5cf6 + #06b6d4)
|
|
109
|
+
- Dark mode: desaturated variant colors, not pure black
|
|
110
|
+
- Single primary accent used consistently
|
|
111
|
+
|
|
112
|
+
### 5. Layout & Spacing (Weight: 10%)
|
|
113
|
+
|
|
114
|
+
| Score | Criteria |
|
|
115
|
+
|---|---|
|
|
116
|
+
| 10 | Consistent 8pt grid, intentional white space, clear content zones, responsive breakpoints |
|
|
117
|
+
| 8–9 | Mostly grid-aligned, minor inconsistencies |
|
|
118
|
+
| 5–7 | Mixed spacing values, some alignment issues |
|
|
119
|
+
| 3–4 | No evident system, arbitrary spacing |
|
|
120
|
+
| 0–2 | Cramped or chaotic layout, broken mobile layout |
|
|
121
|
+
|
|
122
|
+
Check for:
|
|
123
|
+
- Spacing values from 4/8/12/16/24/32/48/64 series
|
|
124
|
+
- Content max-width enforced (prose: 65ch, layout: 1200–1440px)
|
|
125
|
+
- Mobile breakpoint respected (no horizontal scroll)
|
|
126
|
+
|
|
127
|
+
### 6. Anti-Pattern Compliance (Weight: 10%)
|
|
128
|
+
|
|
129
|
+
Score = 10 − (number of hard-ban violations × 3) − (number of AI-slop tells × 1), minimum 0.
|
|
130
|
+
|
|
131
|
+
Auto-detect (grep):
|
|
132
|
+
- Side-stripe borders > 1px → BAN violation
|
|
133
|
+
- Gradient text → BAN violation
|
|
134
|
+
- `backdrop-filter: blur` without purpose context → slop signal
|
|
135
|
+
- AI palette colors → slop signal
|
|
136
|
+
- Bounce easing → BAN violation
|
|
137
|
+
|
|
138
|
+
### 7. Interaction & Motion (Weight: 5%)
|
|
139
|
+
|
|
140
|
+
| Score | Criteria |
|
|
141
|
+
|---|---|
|
|
142
|
+
| 10 | `prefers-reduced-motion` implemented, motion purposeful, correct easing, no bounce, exit < enter |
|
|
143
|
+
| 8–9 | Minor motion issues, no accessibility violations |
|
|
144
|
+
| 5–7 | Some unnecessary motion or poor easing |
|
|
145
|
+
| 3–4 | Bounce easing, missing reduced-motion, blocking animations |
|
|
146
|
+
| 0–2 | Animates keyboard actions, no reduced-motion, excessive animation |
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Weighted Score Calculation
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
Score = (Accessibility × 0.25)
|
|
154
|
+
+ (Visual Hierarchy × 0.20)
|
|
155
|
+
+ (Typography × 0.15)
|
|
156
|
+
+ (Color × 0.15)
|
|
157
|
+
+ (Layout × 0.10)
|
|
158
|
+
+ (Anti-Patterns × 0.10)
|
|
159
|
+
+ (Motion × 0.05)
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
| Grade | Score | Meaning |
|
|
163
|
+
|---|---|---|
|
|
164
|
+
| A | 90–100 | Excellent — production ready |
|
|
165
|
+
| B | 75–89 | Good — minor polish needed |
|
|
166
|
+
| C | 60–74 | Acceptable — notable issues to address |
|
|
167
|
+
| D | 45–59 | Poor — significant redesign needed |
|
|
168
|
+
| F | 0–44 | Failing — fundamental problems |
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## Audit Output Format
|
|
173
|
+
|
|
174
|
+
```markdown
|
|
175
|
+
## Design Audit — [Project Name]
|
|
176
|
+
Date: [ISO 8601]
|
|
177
|
+
Baseline score: [N/100]
|
|
178
|
+
|
|
179
|
+
### Category Scores
|
|
180
|
+
| Category | Score | Weight | Weighted |
|
|
181
|
+
|---|---|---|---|
|
|
182
|
+
| Accessibility | /10 | 25% | |
|
|
183
|
+
| Visual Hierarchy | /10 | 20% | |
|
|
184
|
+
| Typography | /10 | 15% | |
|
|
185
|
+
| Color | /10 | 15% | |
|
|
186
|
+
| Layout | /10 | 10% | |
|
|
187
|
+
| Anti-Patterns | /10 | 10% | |
|
|
188
|
+
| Motion | /10 | 5% | |
|
|
189
|
+
| **Total** | | | **/100** |
|
|
190
|
+
|
|
191
|
+
### Findings
|
|
192
|
+
| ID | Severity | Category | Description | Fix |
|
|
193
|
+
|---|---|---|---|---|
|
|
194
|
+
| A-01 | P0 | Accessibility | Body text contrast 3.2:1 (needs 4.5:1) | Change #9CA3AF → #6B7280 |
|
|
195
|
+
| A-02 | P1 | Anti-Pattern | Gradient text on hero heading | Use solid #111827 |
|
|
196
|
+
| A-03 | P2 | Typography | Body line-height 1.3 (needs 1.5+) | Change to 1.6 |
|
|
197
|
+
|
|
198
|
+
### NNG Heuristic Scores
|
|
199
|
+
| Heuristic | Score /4 | Notes |
|
|
200
|
+
|---|---|---|
|
|
201
|
+
| H-01 Visibility of status | /4 | |
|
|
202
|
+
| H-02 Real world match | /4 | |
|
|
203
|
+
| ... | | |
|
|
204
|
+
| **Total** | /40 | **= NNG Score:** /100 |
|
|
205
|
+
```
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Pre-Delivery Checklists
|
|
2
|
+
|
|
3
|
+
Run these before saying "done." Each checklist below is **gated** — if any item fails, you cannot ship.
|
|
4
|
+
|
|
5
|
+
## Master pre-ship checklist
|
|
6
|
+
|
|
7
|
+
Use this before any design artifact goes to the user or into a PR.
|
|
8
|
+
|
|
9
|
+
### Discovery check
|
|
10
|
+
- [ ] Pulled ≥3 real references via refero (or awesome-design-md library if refero unavailable)
|
|
11
|
+
- [ ] Wrote down 3 concrete brand-voice words (not "modern"/"elegant")
|
|
12
|
+
- [ ] Identified 1–2 North Star brand references
|
|
13
|
+
- [ ] Cited references in output so user can redirect
|
|
14
|
+
|
|
15
|
+
### Context check
|
|
16
|
+
- [ ] `.impeccable.md` exists at project root
|
|
17
|
+
- [ ] `DESIGN.md` exists at project root
|
|
18
|
+
- [ ] Design direction explicitly stated (brutalist / editorial / …)
|
|
19
|
+
- [ ] User approved direction before Phase 3
|
|
20
|
+
|
|
21
|
+
### AI-slop check (see anti-patterns.md)
|
|
22
|
+
- [ ] Did NOT default to Inter / DM Sans / Space Grotesk / Plus Jakarta Sans
|
|
23
|
+
- [ ] No purple→blue or teal→cyan gradient
|
|
24
|
+
- [ ] No glassmorphism + rounded rect + drop shadow combo
|
|
25
|
+
- [ ] No card-in-card
|
|
26
|
+
- [ ] No `border-left`/`border-right` > 1px on cards/alerts
|
|
27
|
+
- [ ] No gradient text
|
|
28
|
+
- [ ] No sparkline as decoration
|
|
29
|
+
- [ ] No emoji as UI icon
|
|
30
|
+
- [ ] Empty states give context + positive framing + one CTA (not just "No items")
|
|
31
|
+
|
|
32
|
+
### Accessibility check
|
|
33
|
+
- [ ] Body text ≥ 16px; contrast ≥ 4.5:1
|
|
34
|
+
- [ ] UI components contrast ≥ 3:1
|
|
35
|
+
- [ ] `:focus-visible` style defined (2–3px ring)
|
|
36
|
+
- [ ] Touch targets ≥ 44×44pt iOS / 48×48dp Android
|
|
37
|
+
- [ ] No color-only meaning (pair with icon/text)
|
|
38
|
+
- [ ] `prefers-reduced-motion` respected on all animations
|
|
39
|
+
- [ ] Keyboard can reach and operate every interactive element
|
|
40
|
+
- [ ] Form labels above fields (not placeholder-only)
|
|
41
|
+
- [ ] Semantic heading hierarchy (h1→h6, no skipping)
|
|
42
|
+
|
|
43
|
+
### Motion check (if any animations)
|
|
44
|
+
- [ ] All animations use transform / opacity (not width/height/top/left)
|
|
45
|
+
- [ ] Custom easing curves (not built-in `ease`)
|
|
46
|
+
- [ ] Exit duration ~75% of enter duration
|
|
47
|
+
- [ ] No animation on keyboard-initiated actions
|
|
48
|
+
- [ ] No `scale(0)` entries (min `scale(0.95)` + opacity)
|
|
49
|
+
- [ ] Popovers use `transform-origin: var(...content-transform-origin)`, not `center`
|
|
50
|
+
|
|
51
|
+
### Token check
|
|
52
|
+
- [ ] No raw hex in component files (all colors via `var(--...)`)
|
|
53
|
+
- [ ] No `padding: 13px` (off 4pt grid)
|
|
54
|
+
- [ ] All interactive components have: default / hover / focus-visible / active / disabled / loading / error / success
|
|
55
|
+
- [ ] Dark mode defined (not inverted light; tinted oklch 14-18% base)
|
|
56
|
+
- [ ] Typography uses the committed scale (no one-off sizes)
|
|
57
|
+
|
|
58
|
+
### Copy check (if any text)
|
|
59
|
+
- [ ] Button labels are verb-first and outcome-specific (not "OK" / "Submit" / "Click here")
|
|
60
|
+
- [ ] Error messages: what happened + how to fix (not just what's wrong)
|
|
61
|
+
- [ ] Empty state acknowledges state + explains value + one CTA
|
|
62
|
+
- [ ] No "Oops!" / forced cheer in errors
|
|
63
|
+
- [ ] No 3-adjective pile-up ("beautiful, seamless, intuitive")
|
|
64
|
+
- [ ] Placeholders show format, not restated label
|
|
65
|
+
|
|
66
|
+
### Technical check (code artifacts)
|
|
67
|
+
- [ ] Browser: running in preview; no console errors
|
|
68
|
+
- [ ] Dev server responds with HTTP 200 on expected routes
|
|
69
|
+
- [ ] Mobile viewport tested (or `impeccable-adapt` run)
|
|
70
|
+
- [ ] Tap delay removed (`touch-action: manipulation`)
|
|
71
|
+
- [ ] Images use WebP/AVIF + `srcset` + lazy-loading where appropriate
|
|
72
|
+
|
|
73
|
+
### Handoff check (if cross-team)
|
|
74
|
+
- [ ] Ran `Skill(design:design-handoff)` to produce spec sheet
|
|
75
|
+
- [ ] Spec lists every state, every token, every breakpoint
|
|
76
|
+
- [ ] Figma and code token names match (or explicit rename map documented)
|
|
77
|
+
- [ ] Known-unimplemented edge cases flagged with severity
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Quick checklist — Small changes
|
|
82
|
+
|
|
83
|
+
When the change is a single-screen tweak, use this shortened list:
|
|
84
|
+
|
|
85
|
+
- [ ] Pulled 1–2 references before touching code
|
|
86
|
+
- [ ] Change respects `.impeccable.md` direction (didn't sneak in a different tone)
|
|
87
|
+
- [ ] Interactive element has all 8 states
|
|
88
|
+
- [ ] No item on the absolute-ban list (anti-patterns.md)
|
|
89
|
+
- [ ] Contrast AA
|
|
90
|
+
- [ ] Focus ring present
|
|
91
|
+
- [ ] Touch target ≥ 44pt
|
|
92
|
+
- [ ] Tested in the preview browser
|
|
93
|
+
- [ ] Review presented as Before/After table
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Checklist for design system contributions
|
|
98
|
+
|
|
99
|
+
When adding tokens/components to the design system:
|
|
100
|
+
|
|
101
|
+
- [ ] New tokens follow `[category].[variant].[property].[state]` naming
|
|
102
|
+
- [ ] No primitive token used directly in a component — route through semantic
|
|
103
|
+
- [ ] Component has full anatomy doc (slots + variants + states + behavior + platform notes + do/don't)
|
|
104
|
+
- [ ] Figma spec frame exists OR explicit note that it doesn't
|
|
105
|
+
- [ ] Component validated against: same-structure-variant rule, not-a-new-component rule
|
|
106
|
+
- [ ] 30-min audit performed — no off-grid spacings, no duplicate color tokens
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Checklist for presentations
|
|
111
|
+
|
|
112
|
+
Before presenting to stakeholders:
|
|
113
|
+
|
|
114
|
+
- [ ] 6-step narrative spine applied (Orient → Shape → Decision → Why → Defuse → Ask)
|
|
115
|
+
- [ ] Opened with a decision, not exploration
|
|
116
|
+
- [ ] Anticipated top 2–3 objections with pre-addressed slides
|
|
117
|
+
- [ ] Design language translated to business language (efficiency, conversion, a11y reach)
|
|
118
|
+
- [ ] Closed with ONE specific ask (not "thoughts?")
|
|
119
|
+
- [ ] Parking lot section ready if detail derail starts
|
|
120
|
+
- [ ] Decision log slide referenced if revisiting prior choices
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Mega-smoke-test for full pages/features
|
|
125
|
+
|
|
126
|
+
For flagship work:
|
|
127
|
+
|
|
128
|
+
1. **Squint test.** Blur the screen; most important element still identifiable? Second most? Groupings?
|
|
129
|
+
2. **Zoom to 200%.** No horizontal scroll; nothing clipped; hierarchy holds.
|
|
130
|
+
3. **Tab test.** Tab through every interactive element. Focus visible? Order logical? Nothing skipped?
|
|
131
|
+
4. **Kill CSS test.** Disable all styles. Page still has logical reading order? Headings hierarchical?
|
|
132
|
+
5. **Kill JS test.** Form still submittable via HTML action? Content still visible?
|
|
133
|
+
6. **Throttle test.** Simulate 3G. Skeletons/placeholders in place? LCP < 2.5s?
|
|
134
|
+
7. **Dark mode test.** Toggle. Any broken contrast? Any colors that failed to theme?
|
|
135
|
+
8. **Reduced motion test.** Enable it at OS level. Functional animations preserved, spatial ones killed?
|
|
136
|
+
9. **Mobile test.** Real device or Chrome DevTools mobile emulation. Touch targets? Safe areas? Viewport zoom allowed?
|
|
137
|
+
10. **The AI-slop self-check** (see anti-patterns.md). Honest answer: would someone believe this was AI-generated? If yes, which elements? Fix those.
|