@monoes/monomindcli 1.14.7 → 1.15.0
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/agents/reengineer-squad/boss.md +113 -0
- package/.claude/agents/reengineer-squad/critic-architect.md +132 -0
- package/.claude/agents/reengineer-squad/git-manager.md +145 -0
- package/.claude/agents/reengineer-squad/idea-generator.md +95 -0
- package/.claude/agents/reengineer-squad/implementer.md +112 -0
- package/.claude/agents/reengineer-squad/integration-planner.md +112 -0
- package/.claude/agents/reengineer-squad/source-analyst.md +103 -0
- package/.claude/agents/reengineer-squad/target-analyst.md +118 -0
- package/.claude/agents/reengineer-squad/tester.md +105 -0
- package/.claude/commands/mastermind/master.md +35 -14
- package/.claude/helpers/handlers/capture-handler.cjs +155 -18
- package/.claude/helpers/monolean-activate.cjs +20 -0
- package/.claude/helpers/monolean-config.cjs +76 -0
- package/.claude/helpers/monolean-instructions.cjs +109 -0
- package/.claude/helpers/monolean-propagate.cjs +9 -0
- package/.claude/helpers/monolean-tracker.cjs +18 -0
- package/.claude/helpers/skill-registry.json +2 -2
- package/.claude/skills/agent-browser-testing/SKILL.md +301 -18
- package/.claude/skills/mastermind/runorg.md +69 -23
- package/.claude/skills/monodesign/SKILL.md +32 -1
- package/.claude/skills/monodesign/adapt.md +53 -0
- package/.claude/skills/monodesign/agents/monodesign-asset-producer.md +100 -0
- package/.claude/skills/monodesign/animate.md +65 -0
- package/.claude/skills/monodesign/audit.md +89 -0
- package/.claude/skills/monodesign/bolder.md +50 -0
- package/.claude/skills/monodesign/clarify.md +64 -0
- package/.claude/skills/monodesign/colorize.md +68 -0
- package/.claude/skills/monodesign/craft.md +51 -0
- package/.claude/skills/monodesign/critique.md +66 -0
- package/.claude/skills/monodesign/delight.md +47 -0
- package/.claude/skills/monodesign/distill.md +56 -0
- package/.claude/skills/monodesign/document.md +80 -0
- package/.claude/skills/monodesign/extract.md +74 -0
- package/.claude/skills/monodesign/harden.md +65 -0
- package/.claude/skills/monodesign/live.md +59 -0
- package/.claude/skills/monodesign/onboard.md +50 -0
- package/.claude/skills/monodesign/optimize.md +64 -0
- package/.claude/skills/monodesign/overdrive.md +56 -0
- package/.claude/skills/monodesign/polish.md +68 -0
- package/.claude/skills/monodesign/quieter.md +57 -0
- package/.claude/skills/monodesign/reference/antipatterns-catalog.md +248 -76
- package/.claude/skills/monodesign/reference/codex.md +107 -0
- package/.claude/skills/monodesign/reference/craft.md +3 -0
- package/.claude/skills/monodesign/reference/hooks.md +99 -0
- package/.claude/skills/monodesign/reference/image-prompts.md +12 -0
- package/.claude/skills/monodesign/shape.md +71 -0
- package/.claude/skills/monodesign/teach.md +69 -0
- package/.claude/skills/monodesign/typeset.md +59 -0
- package/.claude/skills/monolean/SKILL.md +118 -0
- package/.claude/skills/monolean-audit/SKILL.md +41 -0
- package/.claude/skills/monolean-debt/SKILL.md +46 -0
- package/.claude/skills/monolean-help/SKILL.md +60 -0
- package/.claude/skills/monolean-review/SKILL.md +57 -0
- package/bin/cli.js +3 -1
- package/dist/dashboard/server.js +137 -0
- package/dist/src/__tests__/browse-adapters.test.d.ts +2 -0
- package/dist/src/__tests__/browse-adapters.test.d.ts.map +1 -0
- package/dist/src/__tests__/browse-adapters.test.js +51 -0
- package/dist/src/__tests__/browse-adapters.test.js.map +1 -0
- package/dist/src/__tests__/browse-analyzer.test.d.ts +2 -0
- package/dist/src/__tests__/browse-analyzer.test.d.ts.map +1 -0
- package/dist/src/__tests__/browse-analyzer.test.js +68 -0
- package/dist/src/__tests__/browse-analyzer.test.js.map +1 -0
- package/dist/src/__tests__/browse-builtin-handlers.test.d.ts +2 -0
- package/dist/src/__tests__/browse-builtin-handlers.test.d.ts.map +1 -0
- package/dist/src/__tests__/browse-builtin-handlers.test.js +139 -0
- package/dist/src/__tests__/browse-builtin-handlers.test.js.map +1 -0
- package/dist/src/__tests__/browse-cdp.test.d.ts +2 -0
- package/dist/src/__tests__/browse-cdp.test.d.ts.map +1 -0
- package/dist/src/__tests__/browse-cdp.test.js +169 -0
- package/dist/src/__tests__/browse-cdp.test.js.map +1 -0
- package/dist/src/__tests__/browse-dashboard.test.d.ts +2 -0
- package/dist/src/__tests__/browse-dashboard.test.d.ts.map +1 -0
- package/dist/src/__tests__/browse-dashboard.test.js +179 -0
- package/dist/src/__tests__/browse-dashboard.test.js.map +1 -0
- package/dist/src/__tests__/browse-engine.test.d.ts +2 -0
- package/dist/src/__tests__/browse-engine.test.d.ts.map +1 -0
- package/dist/src/__tests__/browse-engine.test.js +122 -0
- package/dist/src/__tests__/browse-engine.test.js.map +1 -0
- package/dist/src/__tests__/browse-expression.test.d.ts +2 -0
- package/dist/src/__tests__/browse-expression.test.d.ts.map +1 -0
- package/dist/src/__tests__/browse-expression.test.js +54 -0
- package/dist/src/__tests__/browse-expression.test.js.map +1 -0
- package/dist/src/__tests__/browse-store.test.d.ts +2 -0
- package/dist/src/__tests__/browse-store.test.d.ts.map +1 -0
- package/dist/src/__tests__/browse-store.test.js +99 -0
- package/dist/src/__tests__/browse-store.test.js.map +1 -0
- package/dist/src/__tests__/browse-workflow-types.test.d.ts +2 -0
- package/dist/src/__tests__/browse-workflow-types.test.d.ts.map +1 -0
- package/dist/src/__tests__/browse-workflow-types.test.js +33 -0
- package/dist/src/__tests__/browse-workflow-types.test.js.map +1 -0
- package/dist/src/browser/action-builder/analyzer.d.ts +11 -0
- package/dist/src/browser/action-builder/analyzer.d.ts.map +1 -0
- package/dist/src/browser/action-builder/analyzer.js +71 -0
- package/dist/src/browser/action-builder/analyzer.js.map +1 -0
- package/dist/src/browser/action-builder/types.d.ts +47 -0
- package/dist/src/browser/action-builder/types.d.ts.map +1 -0
- package/dist/src/browser/action-builder/types.js +2 -0
- package/dist/src/browser/action-builder/types.js.map +1 -0
- package/dist/src/browser/adapters/gemini.d.ts +3 -0
- package/dist/src/browser/adapters/gemini.d.ts.map +1 -0
- package/dist/src/browser/adapters/gemini.js +16 -0
- package/dist/src/browser/adapters/gemini.js.map +1 -0
- package/dist/src/browser/adapters/google.d.ts +3 -0
- package/dist/src/browser/adapters/google.d.ts.map +1 -0
- package/dist/src/browser/adapters/google.js +17 -0
- package/dist/src/browser/adapters/google.js.map +1 -0
- package/dist/src/browser/adapters/index.d.ts +19 -0
- package/dist/src/browser/adapters/index.d.ts.map +1 -0
- package/dist/src/browser/adapters/index.js +23 -0
- package/dist/src/browser/adapters/index.js.map +1 -0
- package/dist/src/browser/adapters/instagram.d.ts +3 -0
- package/dist/src/browser/adapters/instagram.d.ts.map +1 -0
- package/dist/src/browser/adapters/instagram.js +17 -0
- package/dist/src/browser/adapters/instagram.js.map +1 -0
- package/dist/src/browser/adapters/linkedin.d.ts +3 -0
- package/dist/src/browser/adapters/linkedin.d.ts.map +1 -0
- package/dist/src/browser/adapters/linkedin.js +19 -0
- package/dist/src/browser/adapters/linkedin.js.map +1 -0
- package/dist/src/browser/adapters/microsoft.d.ts +3 -0
- package/dist/src/browser/adapters/microsoft.d.ts.map +1 -0
- package/dist/src/browser/adapters/microsoft.js +16 -0
- package/dist/src/browser/adapters/microsoft.js.map +1 -0
- package/dist/src/browser/adapters/x.d.ts +3 -0
- package/dist/src/browser/adapters/x.d.ts.map +1 -0
- package/dist/src/browser/adapters/x.js +19 -0
- package/dist/src/browser/adapters/x.js.map +1 -0
- package/dist/src/browser/dashboard/api-types.d.ts +50 -0
- package/dist/src/browser/dashboard/api-types.d.ts.map +1 -0
- package/dist/src/browser/dashboard/api-types.js +14 -0
- package/dist/src/browser/dashboard/api-types.js.map +1 -0
- package/dist/src/browser/dashboard/server.d.ts +9 -0
- package/dist/src/browser/dashboard/server.d.ts.map +1 -0
- package/dist/src/browser/dashboard/server.js +62 -0
- package/dist/src/browser/dashboard/server.js.map +1 -0
- package/dist/src/browser/dashboard/ui.html +1811 -0
- package/dist/src/browser/workflow/builtin-handlers.d.ts +3 -0
- package/dist/src/browser/workflow/builtin-handlers.d.ts.map +1 -0
- package/dist/src/browser/workflow/builtin-handlers.js +343 -0
- package/dist/src/browser/workflow/builtin-handlers.js.map +1 -0
- package/dist/src/browser/workflow/engine.d.ts +15 -0
- package/dist/src/browser/workflow/engine.d.ts.map +1 -0
- package/dist/src/browser/workflow/engine.js +127 -0
- package/dist/src/browser/workflow/engine.js.map +1 -0
- package/dist/src/browser/workflow/expression.d.ts +4 -0
- package/dist/src/browser/workflow/expression.d.ts.map +1 -0
- package/dist/src/browser/workflow/expression.js +64 -0
- package/dist/src/browser/workflow/expression.js.map +1 -0
- package/dist/src/browser/workflow/store.d.ts +24 -0
- package/dist/src/browser/workflow/store.d.ts.map +1 -0
- package/dist/src/browser/workflow/store.js +145 -0
- package/dist/src/browser/workflow/store.js.map +1 -0
- package/dist/src/browser/workflow/types.d.ts +48 -0
- package/dist/src/browser/workflow/types.d.ts.map +1 -0
- package/dist/src/browser/workflow/types.js +2 -0
- package/dist/src/browser/workflow/types.js.map +1 -0
- package/dist/src/commands/browse-action.d.ts +4 -0
- package/dist/src/commands/browse-action.d.ts.map +1 -0
- package/dist/src/commands/browse-action.js +151 -0
- package/dist/src/commands/browse-action.js.map +1 -0
- package/dist/src/commands/browse-platform.d.ts +4 -0
- package/dist/src/commands/browse-platform.d.ts.map +1 -0
- package/dist/src/commands/browse-platform.js +117 -0
- package/dist/src/commands/browse-platform.js.map +1 -0
- package/dist/src/commands/browse-workflow.d.ts +4 -0
- package/dist/src/commands/browse-workflow.d.ts.map +1 -0
- package/dist/src/commands/browse-workflow.js +153 -0
- package/dist/src/commands/browse-workflow.js.map +1 -0
- package/dist/src/commands/browse.d.ts +10 -6
- package/dist/src/commands/browse.d.ts.map +1 -1
- package/dist/src/commands/browse.js +11 -2154
- package/dist/src/commands/browse.js.map +1 -1
- package/dist/src/commands/design-detect.d.ts +21 -0
- package/dist/src/commands/design-detect.d.ts.map +1 -0
- package/dist/src/commands/design-detect.js +127 -0
- package/dist/src/commands/design-detect.js.map +1 -0
- package/dist/src/commands/design-palette.d.ts +22 -0
- package/dist/src/commands/design-palette.d.ts.map +1 -0
- package/dist/src/commands/design-palette.js +539 -0
- package/dist/src/commands/design-palette.js.map +1 -0
- package/dist/src/commands/hooks-core-commands.d.ts +10 -0
- package/dist/src/commands/hooks-core-commands.d.ts.map +1 -0
- package/dist/src/commands/hooks-core-commands.js +377 -0
- package/dist/src/commands/hooks-core-commands.js.map +1 -0
- package/dist/src/commands/hooks-coverage-commands.d.ts +12 -0
- package/dist/src/commands/hooks-coverage-commands.d.ts.map +1 -0
- package/dist/src/commands/hooks-coverage-commands.js +1217 -0
- package/dist/src/commands/hooks-coverage-commands.js.map +1 -0
- package/dist/src/commands/hooks-coverage-utils.d.ts +42 -0
- package/dist/src/commands/hooks-coverage-utils.d.ts.map +1 -0
- package/dist/src/commands/hooks-coverage-utils.js +220 -0
- package/dist/src/commands/hooks-coverage-utils.js.map +1 -0
- package/dist/src/commands/hooks-extended-commands.d.ts +14 -0
- package/dist/src/commands/hooks-extended-commands.d.ts.map +1 -0
- package/dist/src/commands/hooks-extended-commands.js +579 -0
- package/dist/src/commands/hooks-extended-commands.js.map +1 -0
- package/dist/src/commands/hooks-formatting.d.ts +13 -0
- package/dist/src/commands/hooks-formatting.d.ts.map +1 -0
- package/dist/src/commands/hooks-formatting.js +42 -0
- package/dist/src/commands/hooks-formatting.js.map +1 -0
- package/dist/src/commands/hooks-routing-commands.d.ts +15 -0
- package/dist/src/commands/hooks-routing-commands.d.ts.map +1 -0
- package/dist/src/commands/hooks-routing-commands.js +723 -0
- package/dist/src/commands/hooks-routing-commands.js.map +1 -0
- package/dist/src/commands/hooks-workers.d.ts +9 -0
- package/dist/src/commands/hooks-workers.d.ts.map +1 -0
- package/dist/src/commands/hooks-workers.js +782 -0
- package/dist/src/commands/hooks-workers.js.map +1 -0
- package/dist/src/commands/hooks.d.ts +8 -0
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +179 -4103
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/index.d.ts +1 -0
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +6 -0
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/org.d.ts.map +1 -1
- package/dist/src/commands/org.js +14 -15
- package/dist/src/commands/org.js.map +1 -1
- package/dist/src/commands/tokens.d.ts.map +1 -1
- package/dist/src/commands/tokens.js +77 -1
- package/dist/src/commands/tokens.js.map +1 -1
- package/dist/src/init/executor.d.ts.map +1 -1
- package/dist/src/init/executor.js +18 -8
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/settings-generator.d.ts.map +1 -1
- package/dist/src/init/settings-generator.js +39 -5
- package/dist/src/init/settings-generator.js.map +1 -1
- package/dist/src/init/statusline-generator.d.ts.map +1 -1
- package/dist/src/init/statusline-generator.js +25 -5
- package/dist/src/init/statusline-generator.js.map +1 -1
- package/dist/src/mcp-tools/browser-tools.d.ts +3 -5
- package/dist/src/mcp-tools/browser-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/browser-tools.js +619 -326
- package/dist/src/mcp-tools/browser-tools.js.map +1 -1
- package/dist/src/mcp-tools/hooks-embedding.d.ts +161 -0
- package/dist/src/mcp-tools/hooks-embedding.d.ts.map +1 -0
- package/dist/src/mcp-tools/hooks-embedding.js +506 -0
- package/dist/src/mcp-tools/hooks-embedding.js.map +1 -0
- package/dist/src/mcp-tools/hooks-intelligence.d.ts +26 -0
- package/dist/src/mcp-tools/hooks-intelligence.d.ts.map +1 -0
- package/dist/src/mcp-tools/hooks-intelligence.js +1328 -0
- package/dist/src/mcp-tools/hooks-intelligence.js.map +1 -0
- package/dist/src/mcp-tools/hooks-routing.d.ts +27 -0
- package/dist/src/mcp-tools/hooks-routing.d.ts.map +1 -0
- package/dist/src/mcp-tools/hooks-routing.js +1591 -0
- package/dist/src/mcp-tools/hooks-routing.js.map +1 -0
- package/dist/src/mcp-tools/hooks-tools.d.ts +3 -38
- package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.js +5 -3393
- package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
- package/dist/src/mcp-tools/monograph-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/monograph-tools.js +24 -14
- package/dist/src/mcp-tools/monograph-tools.js.map +1 -1
- package/dist/src/mcp-tools/workflow-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/workflow-tools.js +54 -1
- package/dist/src/mcp-tools/workflow-tools.js.map +1 -1
- package/dist/src/memory/embedding-operations.d.ts +58 -0
- package/dist/src/memory/embedding-operations.d.ts.map +1 -0
- package/dist/src/memory/embedding-operations.js +299 -0
- package/dist/src/memory/embedding-operations.js.map +1 -0
- package/dist/src/memory/ewc-consolidation.d.ts.map +1 -1
- package/dist/src/memory/ewc-consolidation.js +37 -3
- package/dist/src/memory/ewc-consolidation.js.map +1 -1
- package/dist/src/memory/hnsw-operations.d.ts +130 -0
- package/dist/src/memory/hnsw-operations.d.ts.map +1 -0
- package/dist/src/memory/hnsw-operations.js +400 -0
- package/dist/src/memory/hnsw-operations.js.map +1 -0
- package/dist/src/memory/intelligence.d.ts.map +1 -1
- package/dist/src/memory/intelligence.js +42 -23
- package/dist/src/memory/intelligence.js.map +1 -1
- package/dist/src/memory/memory-bridge.d.ts.map +1 -1
- package/dist/src/memory/memory-bridge.js +52 -8
- package/dist/src/memory/memory-bridge.js.map +1 -1
- package/dist/src/memory/memory-crud.d.ts +67 -0
- package/dist/src/memory/memory-crud.d.ts.map +1 -0
- package/dist/src/memory/memory-crud.js +415 -0
- package/dist/src/memory/memory-crud.js.map +1 -0
- package/dist/src/memory/memory-initializer.d.ts +9 -322
- package/dist/src/memory/memory-initializer.d.ts.map +1 -1
- package/dist/src/memory/memory-initializer.js +17 -1794
- package/dist/src/memory/memory-initializer.js.map +1 -1
- package/dist/src/memory/memory-migrations.d.ts +30 -0
- package/dist/src/memory/memory-migrations.d.ts.map +1 -0
- package/dist/src/memory/memory-migrations.js +134 -0
- package/dist/src/memory/memory-migrations.js.map +1 -0
- package/dist/src/memory/memory-read.d.ts +78 -0
- package/dist/src/memory/memory-read.d.ts.map +1 -0
- package/dist/src/memory/memory-read.js +331 -0
- package/dist/src/memory/memory-read.js.map +1 -0
- package/dist/src/memory/memory-schema.d.ts +13 -0
- package/dist/src/memory/memory-schema.d.ts.map +1 -0
- package/dist/src/memory/memory-schema.js +167 -0
- package/dist/src/memory/memory-schema.js.map +1 -0
- package/dist/src/memory/sona-optimizer.d.ts.map +1 -1
- package/dist/src/memory/sona-optimizer.js +37 -4
- package/dist/src/memory/sona-optimizer.js.map +1 -1
- package/dist/src/monovector/route-outcomes.d.ts.map +1 -1
- package/dist/src/monovector/route-outcomes.js +16 -6
- package/dist/src/monovector/route-outcomes.js.map +1 -1
- package/dist/src/pricing/model-pricing.d.ts +41 -0
- package/dist/src/pricing/model-pricing.d.ts.map +1 -0
- package/dist/src/pricing/model-pricing.js +61 -0
- package/dist/src/pricing/model-pricing.js.map +1 -0
- package/dist/src/ui/.monomind/capture/active-run.json +1 -0
- package/dist/src/ui/.monomind/orgs/system-trial-qa/runs/real-events-1782290897.convs.jsonl +3 -0
- package/dist/src/ui/.monomind/orgs/system-trial-qa/runs/real-events-1782290897.jsonl +11 -0
- package/dist/src/ui/.monomind/orgs/system-trial-qa/runs/rigid-qa-restart-1782288201.jsonl +540 -0
- package/dist/src/ui/.monomind/orgs/system-trial-qa-threads.jsonl +3 -0
- package/dist/src/ui/.monomind/orgs/test-event-fix/runs/rigid-qa-restart-1782288201.jsonl +2 -0
- package/dist/src/ui/MODULARIZATION_PLAN.md +79 -0
- package/dist/src/ui/collector.mjs +23 -13
- package/dist/src/ui/dashboard.html +1652 -13
- package/dist/src/ui/data/known-projects.json +1 -0
- package/dist/src/ui/data/mastermind-events.jsonl +553 -0
- package/dist/src/ui/data/sessions/_index.json +1 -0
- package/dist/src/ui/data/sessions/final-sess-001.jsonl +542 -0
- package/dist/src/ui/data/unknown-events.jsonl +1 -0
- package/dist/src/ui/orgs.html +154 -10
- package/dist/src/ui/server.mjs +1131 -168
- package/dist/src/ui/sse-manager.mjs +119 -0
- package/dist/src/update/checker.js +1 -1
- package/dist/src/update/checker.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/workflow/builtin-handlers.js +321 -0
- package/dist/workflow/engine.js +253 -0
- package/dist/workflow/expression.js +98 -0
- package/dist/workflow/types.js +2 -0
- package/package.json +8 -5
|
@@ -1,187 +1,359 @@
|
|
|
1
|
+
<!-- Synced from impeccable v3.1.0 registry. Source of truth: cli/engine/registry/antipatterns.mjs -->
|
|
1
2
|
# Antipatterns Catalog
|
|
2
3
|
|
|
3
|
-
All
|
|
4
|
+
All 46 known design antipatterns with detection rules and remediation. These are what `npx impeccable detect` checks. Run this on any HTML/CSS target before presenting work.
|
|
4
5
|
|
|
5
6
|
## Categories
|
|
6
7
|
|
|
7
8
|
These are the two categories the `impeccable detect` engine uses:
|
|
8
9
|
|
|
9
|
-
- **slop** — AI tells that signal lack of intentional design (
|
|
10
|
-
- **quality** — Design principle violations including contrast, motion, readability, and semantic structure (
|
|
10
|
+
- **slop** — AI tells that signal lack of intentional design (27 patterns)
|
|
11
|
+
- **quality** — Design principle violations including contrast, motion, readability, and semantic structure (19 patterns)
|
|
11
12
|
|
|
12
13
|
---
|
|
13
14
|
|
|
14
15
|
## Slop Antipatterns (AI Tells)
|
|
15
16
|
|
|
16
|
-
### `
|
|
17
|
-
**Detect:** `border-left: Npx solid [color]` or `border-right: Npx solid [color]` > 1px on cards, list items, callouts, or alerts.
|
|
18
|
-
**Why it's wrong:** This is the most recognizable AI-generated dashboard pattern. It substitutes a structural decision with a painted stripe.
|
|
19
|
-
**Fix:** Use full borders, background tints, leading numbers or icons, or remove the accent entirely.
|
|
17
|
+
### `aphoristic-cadence` — Aphoristic-cadence copy
|
|
20
18
|
|
|
21
|
-
|
|
22
|
-
**Detect:** `border-left/right` ≥ 2px combined with `border-radius` > 0 on the same element.
|
|
23
|
-
**Why it's wrong:** A stripe on a pill reads as broken — the side border doesn't match the rounded corners. The composition is incoherent.
|
|
24
|
-
**Fix:** Use a full border or background tint instead; if accent is needed, use a dot, icon, or colored chip.
|
|
19
|
+
**Detect**: Three or more sections ending in a short rebuttal sentence ("X. No Y." / "X. Just Y.") or a manufactured-contrast aphorism ("Not a feature. A platform.").
|
|
25
20
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
**
|
|
29
|
-
**Fix:** Use a single solid color. Emphasis via weight (bold), scale (larger), or color contrast (accent vs. neutral).
|
|
21
|
+
**Why it's wrong**: Once is fine; the pattern is the tell. This AI cadence reads as manufactured voice, not genuine brand personality.
|
|
22
|
+
|
|
23
|
+
**Fix**: Replace manufactured contrast with specific, concrete language about what the product literally does. Vary sentence structure across sections.
|
|
30
24
|
|
|
31
25
|
### `ai-color-palette` — AI color palette
|
|
32
26
|
**Detect:** Purple or violet text on headings, purple gradient backgrounds, or violet accent colors not in the project's declared palette.
|
|
33
27
|
**Why it's wrong:** Purple/violet as a default accent is the most saturated AI training-data reflex. It signals zero intentionality.
|
|
34
28
|
**Fix:** Define a color strategy (restrained → drenched) and pick a hue from that strategy — not from "what looks techy."
|
|
35
29
|
|
|
36
|
-
### `
|
|
37
|
-
**Detect:**
|
|
38
|
-
**Why it's wrong:**
|
|
39
|
-
**Fix:**
|
|
30
|
+
### `border-accent-on-rounded` — Border accent on rounded element
|
|
31
|
+
**Detect:** `border-left/right` ≥ 2px combined with `border-radius` > 0 on the same element.
|
|
32
|
+
**Why it's wrong:** A stripe on a pill reads as broken — the side border doesn't match the rounded corners. The composition is incoherent.
|
|
33
|
+
**Fix:** Use a full border or background tint instead; if accent is needed, use a dot, icon, or colored chip.
|
|
40
34
|
|
|
41
|
-
### `
|
|
42
|
-
**Detect:**
|
|
43
|
-
**Why it's wrong:**
|
|
44
|
-
**Fix:**
|
|
35
|
+
### `bounce-easing` — Bounce or elastic easing
|
|
36
|
+
**Detect:** `cubic-bezier` with overshoot (second Y control point > 1 or < 0, e.g., `cubic-bezier(0.34, 1.56, 0.64, 1)`), or `animate-bounce` Tailwind class, or `spring` easing.
|
|
37
|
+
**Why it's wrong:** Bounce easing is a 2013 trend that reads as playful-in-a-bad-way on professional interfaces. It also tends to cause layout shift.
|
|
38
|
+
**Fix:** Use expo-out (`cubic-bezier(0.16, 1, 0.3, 1)`) for snappy exits, quint-out for softer landings. No overshoot.
|
|
39
|
+
|
|
40
|
+
### `cream-palette` — Cream / beige palette
|
|
41
|
+
|
|
42
|
+
**Detect**: Warm cream or beige page background (`#fdf6e3`, `#faf8f5`, or equivalent warm off-white) with no other distinguishing palette element.
|
|
43
|
+
|
|
44
|
+
**Why it's wrong**: A warm cream or beige background has become the default "tasteful" AI surface, reached for by reflex. It signals lack of a deliberate palette strategy.
|
|
45
|
+
|
|
46
|
+
**Fix**: Choose a background that comes from a deliberate palette. If warm neutrals are right for the project, commit to them intentionally with a full color strategy — not as a safe default.
|
|
45
47
|
|
|
46
48
|
### `dark-glow` — Dark mode with glowing accents
|
|
47
49
|
**Detect:** Colored glow (`box-shadow` or `filter: blur + color`) on colored elements against a dark (`oklch < 20%` or `#1x` hex) background.
|
|
48
50
|
**Why it's wrong:** Neon glows on dark backgrounds are the most saturated sci-fi/crypto UI cliché. They scream AI-generated dark mode.
|
|
49
51
|
**Fix:** Use subtle shadow lifts, border treatments, or opacity shifts on dark backgrounds. Glow should be exceptionally rare and intentional.
|
|
50
52
|
|
|
51
|
-
### `
|
|
52
|
-
|
|
53
|
-
**
|
|
54
|
-
|
|
53
|
+
### `em-dash-overuse` — Em-dash overuse
|
|
54
|
+
|
|
55
|
+
**Detect**: More than two em-dashes (— or --) in body copy across the page.
|
|
56
|
+
|
|
57
|
+
**Why it's wrong**: Frequent em-dashes are an AI cadence tell. Over-reliance on the em-dash signals generated prose rather than edited writing.
|
|
58
|
+
|
|
59
|
+
**Fix**: Use commas, colons, periods, or parentheses instead. Reserve em-dashes for strong breaks where no other punctuation works.
|
|
60
|
+
|
|
61
|
+
### `everything-centered` — Everything centered
|
|
62
|
+
**Detect:** More than 3 consecutive sections all use `text-align: center` or centered flex/grid layout.
|
|
63
|
+
**Why it's wrong:** Center alignment works for short content (headings, CTAs) but becomes monotonous for long sections. It also reduces readability for multi-line copy.
|
|
64
|
+
**Fix:** Mix alignment. Left-align body copy. Center only headings and CTAs. Alternate center and left-aligned sections.
|
|
65
|
+
|
|
66
|
+
### `extreme-negative-tracking` — Crushed letter spacing
|
|
67
|
+
|
|
68
|
+
**Detect**: `letter-spacing` pulled below `-0.05em` on display or body type.
|
|
69
|
+
|
|
70
|
+
**Why it's wrong**: Letter spacing crushed past the point where characters keep their own shapes costs legibility. Characters merge and the type becomes harder to read at a glance.
|
|
71
|
+
|
|
72
|
+
**Fix**: Tighten display type optically — no further than `-0.03em` for most typefaces. Never compress body text letter spacing.
|
|
55
73
|
|
|
56
74
|
### `flat-type-hierarchy` — Flat type hierarchy
|
|
57
75
|
**Detect:** All heading levels within a page section are within 2px of the same size, or fewer than 2 distinct font-size steps across the visible viewport.
|
|
58
76
|
**Why it's wrong:** Flat type makes all content equal weight. Users can't scan. Every element shouts at the same volume.
|
|
59
77
|
**Fix:** Apply a minimum 1.25× scale ratio between heading steps. Body should be visually distinct from all heading levels.
|
|
60
78
|
|
|
79
|
+
### `gpt-thin-border-wide-shadow` — Hairline border with wide shadow
|
|
80
|
+
|
|
81
|
+
**Detect**: A hairline border (`border-width: 1px` or less) paired with a wide, diffuse `box-shadow` (blur radius ≥ 20px) on the same element.
|
|
82
|
+
|
|
83
|
+
**Why it's wrong**: This combination is a recurring generated-UI signature — the thin border and wide shadow fight each other, creating a muddy visual that commits to neither a defined edge nor a soft elevation.
|
|
84
|
+
|
|
85
|
+
**Fix**: Commit to one treatment — a defined border edge or a soft elevation shadow — rather than both at once.
|
|
86
|
+
|
|
87
|
+
### `gradient-text` — Gradient text
|
|
88
|
+
**Detect:** `background-clip: text` + gradient `background-image`, or Tailwind `bg-clip-text bg-gradient-*`.
|
|
89
|
+
**Why it's wrong:** Gradient text is purely decorative and never carries meaning. It signals AI-generated output immediately.
|
|
90
|
+
**Fix:** Use a single solid color. Emphasis via weight (bold), scale (larger), or color contrast (accent vs. neutral).
|
|
91
|
+
|
|
92
|
+
### `hero-eyebrow-chip` — Hero eyebrow / pill chip
|
|
93
|
+
**Detect:** A small pill/badge element above the hero heading containing "NEW", "Beta", an emoji, or a one-word category label.
|
|
94
|
+
**Why it's wrong:** This is the SaaS hero template in its most recognizable form. It signals AI-generated marketing pages.
|
|
95
|
+
**Fix:** If the launch or category genuinely matters, integrate it into the heading copy or use a full callout section. Don't float a badge above the heading.
|
|
96
|
+
|
|
97
|
+
### `icon-tile-stack` — Icon tile stacked above heading
|
|
98
|
+
**Detect:** An icon or emoji centered above a heading + paragraph, repeated in a grid pattern.
|
|
99
|
+
**Why it's wrong:** Icon-tile grids are the quickest path to identical-card-grid antipattern. They flatten all information to the same visual weight.
|
|
100
|
+
**Fix:** Vary card density, use leading numbers, use inline icons, or eliminate the icon entirely if it doesn't add meaning.
|
|
101
|
+
|
|
102
|
+
### `image-hover-transform` — Image hover transform
|
|
103
|
+
|
|
104
|
+
**Detect**: `transform: scale(...)` or `transform: rotate(...)` applied to `img` elements on `:hover` or via a hover-triggered class.
|
|
105
|
+
|
|
106
|
+
**Why it's wrong**: Scaling or rotating an image on hover is a recurring generated-UI signature. It draws attention to the interaction mechanic rather than the content.
|
|
107
|
+
|
|
108
|
+
**Fix**: Let imagery sit still, or use a subtler purposeful interaction — a gentle opacity shift or a contained overlay — that serves the content.
|
|
109
|
+
|
|
110
|
+
### `italic-serif-display` — Italic serif display headline
|
|
111
|
+
**Detect:** A serif font in italic style used as the primary heading on a product UI (not brand/marketing surface).
|
|
112
|
+
**Why it's wrong:** Editorial serif-italic (Fraunces, Recoleta, Playfair, Newsreader-italic) is powerful on brand/landing surfaces but reads as mismatched on product UIs (dashboards, apps, settings). It has also become the universal AI-startup landing page hero.
|
|
113
|
+
**Fix:** On product register surfaces, use a weight-contrast pair with a sans-serif. If using italic serif on a brand surface, judge by context — editorial/magazine register may legitimately want this.
|
|
114
|
+
|
|
115
|
+
### `marketing-buzzword` — Marketing buzzword
|
|
116
|
+
|
|
117
|
+
**Detect**: Generic SaaS phrases in body copy or headings: "streamline", "empower", "supercharge", "world-class", "enterprise-grade", "next-generation", "cutting-edge", "leverage", "revolutionize", "game-changing".
|
|
118
|
+
|
|
119
|
+
**Why it's wrong**: These are instant AI tells. They communicate nothing specific and signal copy generated by reflex rather than written for the product.
|
|
120
|
+
|
|
121
|
+
**Fix**: Pick a specific verb and noun that says what the product literally does. Replace "streamline your workflow" with the concrete action — "send invoices in two clicks."
|
|
122
|
+
|
|
61
123
|
### `monotonous-spacing` — Monotonous spacing
|
|
62
124
|
**Detect:** All `margin`, `padding`, or `gap` values across sibling elements are identical — no variation in rhythm.
|
|
63
125
|
**Why it's wrong:** Same spacing everywhere is visual monotony. It removes cadence, making layouts feel like forms rather than compositions.
|
|
64
126
|
**Fix:** Vary vertical spacing deliberately. Sections deserve more breathing room than components. Components deserve more than inline elements.
|
|
65
127
|
|
|
66
|
-
### `
|
|
67
|
-
**Detect:**
|
|
68
|
-
**Why it's wrong:**
|
|
69
|
-
**Fix:**
|
|
128
|
+
### `nested-cards` — Nested cards
|
|
129
|
+
**Detect:** A `.card` element (or equivalent with shadow + border-radius + border) that contains another `.card` element.
|
|
130
|
+
**Why it's wrong:** Nested cards create a visual hierarchy that competes with itself and usually signals a structural decision that should be a section, list, or table instead.
|
|
131
|
+
**Fix:** Flatten the nesting. Use a list for similar items; use a section divider for grouped content; use a table for structured data.
|
|
70
132
|
|
|
71
|
-
### `
|
|
72
|
-
|
|
73
|
-
**
|
|
74
|
-
|
|
133
|
+
### `numbered-section-markers` — Numbered section markers (01 / 02 / 03)
|
|
134
|
+
|
|
135
|
+
**Detect**: Display markers like "01", "02", "03" used as section labels or visual counters above section headings.
|
|
136
|
+
|
|
137
|
+
**Why it's wrong**: Numbered display markers as section labels are the AI editorial scaffold one tier deeper than tracked eyebrow chips. They signal template-filling rather than deliberate structural choice.
|
|
138
|
+
|
|
139
|
+
**Fix**: If numbering genuinely serves the content (a step-by-step process), integrate it into the heading. Otherwise choose a different section cadence — imagery, whitespace variation, or typographic contrast.
|
|
75
140
|
|
|
76
141
|
### `overused-font` — Overused font
|
|
77
142
|
**Detect:** Font family is Inter, Roboto, Open Sans, Lato, Montserrat, Arial, Helvetica, Fraunces, Geist, Geist Sans, Geist Mono, Mona Sans, Plus Jakarta Sans, Space Grotesk, Recoleta, or Instrument Sans, with no customization of weight, optical size, or pairing.
|
|
78
143
|
**Why it's wrong:** These are the most saturated AI-default and monoculture fonts. Using them without a strong visual concept makes designs interchangeable.
|
|
79
144
|
**Fix:** Choose fonts with personality for the project. Inter is acceptable in product UIs when combined with a distinctive display font.
|
|
80
145
|
|
|
146
|
+
### `oversized-h1` — Oversized hero headline
|
|
147
|
+
|
|
148
|
+
**Detect**: A full-sentence headline (more than 6 words) set at display size (≥ 72px / ≥ 4.5rem) that dominates the above-fold viewport.
|
|
149
|
+
|
|
150
|
+
**Why it's wrong**: A long headline blown up to display size leaves no room for supporting content above the fold and creates a wall of text at an uncomfortable size. A punchy one- or two-word headline at that size is fine — the problem is long copy at display scale.
|
|
151
|
+
|
|
152
|
+
**Fix**: Set long headlines smaller, or tighten the copy to a punchy phrase that earns the display size.
|
|
153
|
+
|
|
154
|
+
### `repeated-section-kickers` — Repeated section kicker labels
|
|
155
|
+
|
|
156
|
+
**Detect**: Three or more page sections each open with a small uppercase tracked label (eyebrow / kicker) immediately above the section heading.
|
|
157
|
+
|
|
158
|
+
**Why it's wrong**: Repeating tiny uppercase tracked labels above section headings turns a brand page into AI editorial scaffolding. The structural repetition signals template-filling.
|
|
159
|
+
|
|
160
|
+
**Fix**: Replace with stronger structure, artifacts, imagery, or a deliberate brand system. Reserve eyebrow labels for sections where the category label genuinely aids navigation.
|
|
161
|
+
|
|
162
|
+
### `repeating-stripes-gradient` — Repeating-gradient stripes
|
|
163
|
+
|
|
164
|
+
**Detect**: `repeating-linear-gradient` or `repeating-conic-gradient` used as surface decoration (backgrounds, cards, dividers).
|
|
165
|
+
|
|
166
|
+
**Why it's wrong**: Repeating-gradient stripes used as surface decoration are a recurring generated-UI signature. They read as filler texture rather than intentional design.
|
|
167
|
+
|
|
168
|
+
**Fix**: Reach for a deliberate texture with cultural or brand meaning, or leave the surface plain.
|
|
169
|
+
|
|
170
|
+
### `side-tab` — Side-tab accent border
|
|
171
|
+
**Detect:** `border-left: Npx solid [color]` or `border-right: Npx solid [color]` > 1px on cards, list items, callouts, or alerts.
|
|
172
|
+
**Why it's wrong:** This is the most recognizable AI-generated dashboard pattern. It substitutes a structural decision with a painted stripe.
|
|
173
|
+
**Fix:** Use full borders, background tints, leading numbers or icons, or remove the accent entirely.
|
|
174
|
+
|
|
81
175
|
### `single-font` — Single font for everything
|
|
82
176
|
**Detect:** Only one `font-family` used across all type scales — heading, body, and UI elements.
|
|
83
177
|
**Why it's wrong:** A single font at identical weights looks like a rough draft. Type contrast is one of the strongest design levers.
|
|
84
178
|
**Fix:** Pair a display font (headings) with a text font (body). At minimum, vary weight aggressively (300 vs 700) between heading and body.
|
|
85
179
|
|
|
86
|
-
### `
|
|
87
|
-
|
|
88
|
-
**
|
|
89
|
-
|
|
180
|
+
### `theater-slop-phrase` — Theater framing copy
|
|
181
|
+
|
|
182
|
+
**Detect**: The word "theater" used dismissively in copy — "security theater", "performance theater", "compliance theater" — as a rhetorical framing device.
|
|
183
|
+
|
|
184
|
+
**Why it's wrong**: Dismissing something as "theater" is a recurring generated-copy tic. It reads as borrowed critical voice rather than genuine analysis.
|
|
185
|
+
|
|
186
|
+
**Fix**: Say plainly what the thing does or does not do. Replace "security theater" with a specific claim about what the mechanism fails to prevent.
|
|
90
187
|
|
|
91
188
|
---
|
|
92
189
|
|
|
93
190
|
## Quality Antipatterns
|
|
94
191
|
|
|
192
|
+
### `all-caps-body` — All-caps body text
|
|
193
|
+
**Detect:** `text-transform: uppercase` on multi-word sentence-length (> 4 words) elements.
|
|
194
|
+
**Why it's wrong:** All-caps in running text reduces reading speed by ~12% (Tinker, 1955). Reserved for micro-labels (≤ 3 words) and navigation items.
|
|
195
|
+
**Fix:** Uppercase is valid for: button labels, navigation links, section eyebrows (≤ 3 words), form labels. Not for sentences.
|
|
196
|
+
|
|
197
|
+
### `body-text-viewport-edge` — Body text touching viewport edge
|
|
198
|
+
|
|
199
|
+
**Detect**: Body paragraphs render with no horizontal margin or padding from the viewport edge — computed left or right offset is less than 16px.
|
|
200
|
+
|
|
201
|
+
**Why it's wrong**: Text flush against the viewport edge has no breathing room and signals an unstyled or broken layout. It makes the content feel uncontained and is especially painful on narrow mobile viewports.
|
|
202
|
+
|
|
203
|
+
**Fix**: Wrap content in a container with at least 16px (ideally 24–32px) of horizontal padding, or apply `max-width` with `mx-auto` to center-constrain the content.
|
|
204
|
+
|
|
205
|
+
### `broken-image` — Broken or placeholder image
|
|
206
|
+
|
|
207
|
+
**Detect**: `<img>` tags with empty `src`, missing `src`, `src=""`, `src="#"`, or placeholder values like `placeholder.png`, `image.jpg`, `example.com/image`.
|
|
208
|
+
|
|
209
|
+
**Why it's wrong**: Broken image boxes ship as visible errors. They signal unfinished work and erode trust in the design.
|
|
210
|
+
|
|
211
|
+
**Fix**: Use real images, generated assets, or remove the `<img>` tag entirely. If a placeholder is needed during development, use a real placeholder service (`picsum.photos`, etc.) and flag it for replacement.
|
|
212
|
+
|
|
213
|
+
### `clipped-overflow-container` — Positioned child clipped by overflow container
|
|
214
|
+
|
|
215
|
+
**Detect**: An `overflow: hidden` or `overflow: clip` container that wraps an absolutely-positioned child element (tooltip, dropdown, popover, menu).
|
|
216
|
+
|
|
217
|
+
**Why it's wrong**: A clipping container cuts off tooltips, menus, and popovers that need to escape the bounds of their parent. The positioned layer renders invisibly clipped.
|
|
218
|
+
|
|
219
|
+
**Fix**: Let the overflow be visible on the clipping ancestor, or move the positioned layer out of the clip — render it in a portal at the document body level.
|
|
220
|
+
|
|
95
221
|
### `cramped-padding` — Cramped padding
|
|
96
222
|
**Detect:** `padding` inside interactive or card elements is ≤ 8px on any axis.
|
|
97
223
|
**Why it's wrong:** Cramped elements are hard to read, harder to click, and communicate low quality. 8px is the absolute minimum; 16px is the default.
|
|
98
224
|
**Fix:** Minimum 12px padding inside cards. Minimum 10px vertical + 16px horizontal on buttons. Minimum 44×44px touch targets.
|
|
99
225
|
|
|
100
|
-
### `
|
|
101
|
-
|
|
102
|
-
**
|
|
103
|
-
|
|
226
|
+
### `design-system-color` — Color outside DESIGN.md
|
|
227
|
+
|
|
228
|
+
**Detect**: A literal color value used in CSS that is not declared in the project's `DESIGN.md` palette or its tonal ramps.
|
|
229
|
+
|
|
230
|
+
**Why it's wrong**: Colors outside the declared palette are design-system drift. Each undeclared color erodes the consistency of the system and makes future updates harder.
|
|
231
|
+
|
|
232
|
+
**Fix**: Use a documented palette token or update `DESIGN.md` if this color is an intentional brand addition. Distinguish intentional additions from accidental drift.
|
|
233
|
+
|
|
234
|
+
### `design-system-font` — Font outside DESIGN.md
|
|
235
|
+
|
|
236
|
+
**Detect**: A `font-family` used in CSS that is not declared in the project's `DESIGN.md` typography section.
|
|
237
|
+
|
|
238
|
+
**Why it's wrong**: Undeclared fonts are type-system drift. They break typographic consistency and signal unreviewed additions outside the design system.
|
|
239
|
+
|
|
240
|
+
**Fix**: Use the documented type system or update `DESIGN.md` if this is an intentional brand addition. Never silently add a typeface without updating the system.
|
|
241
|
+
|
|
242
|
+
### `design-system-radius` — Radius outside DESIGN.md
|
|
243
|
+
|
|
244
|
+
**Detect**: A `border-radius` value used in CSS that is not in the project's `DESIGN.md` rounded-corner scale.
|
|
245
|
+
|
|
246
|
+
**Why it's wrong**: Undeclared radius values erode the consistency of the shape system. Mixed corner radii make a UI feel unpolished and assembled from parts.
|
|
247
|
+
|
|
248
|
+
**Fix**: Use a documented radius token or update the design system if the new shape is intentional.
|
|
104
249
|
|
|
105
250
|
### `gray-on-color` — Gray text on colored background
|
|
106
251
|
**Detect:** A gray text color (`oklch < 70% chroma < 0.05`) rendered on a colored (chroma > 0.1) background.
|
|
107
252
|
**Why it's wrong:** Gray text on colored backgrounds almost always fails WCAG contrast requirements and looks muddy.
|
|
108
253
|
**Fix:** Use white or the appropriate neutral from the color ramp. Never use a generic gray on a tinted background.
|
|
109
254
|
|
|
255
|
+
### `justified-text` — Justified text
|
|
256
|
+
**Detect:** `text-align: justify` on paragraph elements.
|
|
257
|
+
**Why it's wrong:** CSS text justification creates uneven word spacing (rivers of white) because browsers don't hyphenate automatically. It reads as broken on web.
|
|
258
|
+
**Fix:** Use `text-align: left` for body copy, `text-align: center` for short headings only.
|
|
259
|
+
|
|
110
260
|
### `layout-transition` — Layout property animation
|
|
111
261
|
**Detect:** `transition: width`, `transition: height`, `transition: padding`, or `transition: margin` on any element.
|
|
112
262
|
**Why it's wrong:** Layout property animation triggers reflow on every frame, causing jank on low-powered devices.
|
|
113
263
|
**Fix:** Animate only `transform` and `opacity`. For expanding elements, use `max-height` + `opacity` with caution, or clip-path for reveal animations.
|
|
114
264
|
|
|
265
|
+
### `line-length` — Line length too long
|
|
266
|
+
**Detect:** `max-width` not set on `p` or body-copy containers, or line length exceeding ~80ch based on font-size and container width.
|
|
267
|
+
**Why it's wrong:** Long lines reduce reading speed and comprehension. 65–75ch is optimal for Latin script.
|
|
268
|
+
**Fix:** Apply `max-width: 65ch` to paragraph elements, or `max-width: 680px` as a safe value for 16–18px body text.
|
|
269
|
+
|
|
115
270
|
### `low-contrast` — Low contrast text
|
|
116
271
|
**Detect:** Text color does not achieve 4.5:1 contrast ratio against its background for normal text, or 3:1 for large text (18px+ regular or 14px+ bold), as measured by the WCAG relative luminance formula.
|
|
117
272
|
**Why it's wrong:** Low contrast text fails WCAG AA requirements and creates genuine barriers for users with low vision, in bright ambient light, or on low-quality displays.
|
|
118
273
|
**Fix:** Increase the contrast between text and background. Use white or a high-lightness neutral on dark backgrounds; use Deep Graphite (`oklch(10% 0 0)`) or Soft Charcoal (`oklch(25% 0 0)`) on light ones. Tool: check with `npx impeccable detect` or the WebAIM contrast checker.
|
|
119
274
|
|
|
120
|
-
### `
|
|
121
|
-
**Detect:** `
|
|
122
|
-
**Why it's wrong:**
|
|
123
|
-
**Fix:**
|
|
275
|
+
### `pure-black-white` — Pure black or white background
|
|
276
|
+
**Detect:** `background: #000`, `background: #000000`, or `background: black` on any surface.
|
|
277
|
+
**Why it's wrong:** Pure black reads as low quality on most displays. Tinted dark (e.g., `oklch(8% 0.005 350)`) reads as intentional.
|
|
278
|
+
**Fix:** Tint every neutral toward the brand hue. Chroma 0.003–0.01 is enough to remove pure-black/pure-white.
|
|
279
|
+
|
|
280
|
+
### `skipped-heading` — Skipped heading level
|
|
281
|
+
**Detect:** An `h3` or deeper element that is not preceded by an `h2` in the same section, or an `h2` not preceded by an `h1`.
|
|
282
|
+
**Why it's wrong:** Skipped headings break screen reader navigation and document outline semantics.
|
|
283
|
+
**Fix:** Maintain sequential heading hierarchy. If you need the visual size of `h3` without the `h2` parent, use a `h2` with class-based styling.
|
|
284
|
+
|
|
285
|
+
### `text-overflow` — Content overflowing its container
|
|
286
|
+
|
|
287
|
+
**Detect**: Content renders wider than its container — `scrollWidth > clientWidth` on any non-scroll element, or a horizontal scrollbar appears on the page.
|
|
288
|
+
|
|
289
|
+
**Why it's wrong**: Content spilling out of its container forces a horizontal scrollbar and signals a broken layout. It is especially disruptive on mobile viewports.
|
|
290
|
+
|
|
291
|
+
**Fix**: Let text wrap with `overflow-wrap: break-word`, constrain widths explicitly, or give the region a deliberate scroll affordance with `overflow-x: auto`.
|
|
124
292
|
|
|
125
293
|
### `tight-leading` — Tight line height
|
|
126
294
|
**Detect:** `line-height` < 1.4 on paragraph or body-copy elements.
|
|
127
295
|
**Why it's wrong:** Tight leading makes multi-line copy hard to track. The eye loses the line.
|
|
128
296
|
**Fix:** Body copy is `line-height: 1.6`. Long-form article content can go to `1.7`. Headings can use `1.1`–`1.25`.
|
|
129
297
|
|
|
130
|
-
### `justified-text` — Justified text
|
|
131
|
-
**Detect:** `text-align: justify` on paragraph elements.
|
|
132
|
-
**Why it's wrong:** CSS text justification creates uneven word spacing (rivers of white) because browsers don't hyphenate automatically. It reads as broken on web.
|
|
133
|
-
**Fix:** Use `text-align: left` for body copy, `text-align: center` for short headings only.
|
|
134
|
-
|
|
135
298
|
### `tiny-text` — Tiny body text
|
|
136
299
|
**Detect:** `font-size` < 14px on paragraph or body-copy elements.
|
|
137
300
|
**Why it's wrong:** Text below 14px fails readability standards for most users, especially at 96–120% zoom.
|
|
138
301
|
**Fix:** Body copy minimum is 16px (`1rem`). Supporting text (captions, labels) minimum is 13px (0.8125rem).
|
|
139
302
|
|
|
140
|
-
### `all-caps-body` — All-caps body text
|
|
141
|
-
**Detect:** `text-transform: uppercase` on multi-word sentence-length (> 4 words) elements.
|
|
142
|
-
**Why it's wrong:** All-caps in running text reduces reading speed by ~12% (Tinker, 1955). Reserved for micro-labels (≤ 3 words) and navigation items.
|
|
143
|
-
**Fix:** Uppercase is valid for: button labels, navigation links, section eyebrows (≤ 3 words), form labels. Not for sentences.
|
|
144
|
-
|
|
145
303
|
### `wide-tracking` — Wide letter spacing on body text
|
|
146
304
|
**Detect:** `letter-spacing` > 0.05em on paragraph elements.
|
|
147
305
|
**Why it's wrong:** Wide tracking on running text creates the "design-y" look at the cost of readability. Tracking belongs on display type and caps, not body.
|
|
148
306
|
**Fix:** Body copy `letter-spacing: 0` (default) or at most `0.01em`. Track only micro-labels, buttons, and uppercase elements.
|
|
149
307
|
|
|
150
|
-
### `skipped-heading` — Skipped heading level
|
|
151
|
-
**Detect:** An `h3` or deeper element that is not preceded by an `h2` in the same section, or an `h2` not preceded by an `h1`.
|
|
152
|
-
**Why it's wrong:** Skipped headings break screen reader navigation and document outline semantics.
|
|
153
|
-
**Fix:** Maintain sequential heading hierarchy. If you need the visual size of `h3` without the `h2` parent, use a `h2` with class-based styling.
|
|
154
|
-
|
|
155
308
|
---
|
|
156
309
|
|
|
157
310
|
## Quick Reference Table
|
|
158
311
|
|
|
159
312
|
| ID | Category | Quick fix |
|
|
160
313
|
|---|---|---|
|
|
161
|
-
| `
|
|
162
|
-
| `border-accent-on-rounded` | slop | Full border or background tint |
|
|
163
|
-
| `gradient-text` | slop | Solid color + weight |
|
|
314
|
+
| `aphoristic-cadence` | slop | Specific language, not manufactured contrast |
|
|
164
315
|
| `ai-color-palette` | slop | Declare a color strategy |
|
|
165
|
-
| `
|
|
166
|
-
| `
|
|
316
|
+
| `border-accent-on-rounded` | slop | Full border or background tint |
|
|
317
|
+
| `bounce-easing` | slop | expo-out curve |
|
|
318
|
+
| `cream-palette` | slop | Deliberate palette, not default warm off-white |
|
|
167
319
|
| `dark-glow` | slop | Shadow lift + border |
|
|
168
|
-
| `
|
|
320
|
+
| `em-dash-overuse` | slop | Commas, colons, periods instead |
|
|
321
|
+
| `everything-centered` | slop | Mix alignment |
|
|
322
|
+
| `extreme-negative-tracking` | slop | No tighter than -0.03em |
|
|
169
323
|
| `flat-type-hierarchy` | slop | 1.25× scale minimum |
|
|
324
|
+
| `gpt-thin-border-wide-shadow` | slop | Border or shadow — not both |
|
|
325
|
+
| `gradient-text` | slop | Solid color + weight |
|
|
326
|
+
| `hero-eyebrow-chip` | slop | Integrate into copy |
|
|
327
|
+
| `icon-tile-stack` | slop | Vary density or remove icons |
|
|
328
|
+
| `image-hover-transform` | slop | Subtle opacity or no interaction |
|
|
329
|
+
| `italic-serif-display` | slop | Sans on product register |
|
|
330
|
+
| `marketing-buzzword` | slop | Specific verb + noun |
|
|
170
331
|
| `monotonous-spacing` | slop | Vary rhythm deliberately |
|
|
171
|
-
| `
|
|
172
|
-
| `
|
|
332
|
+
| `nested-cards` | slop | Flatten to list or section |
|
|
333
|
+
| `numbered-section-markers` | slop | Different section cadence |
|
|
173
334
|
| `overused-font` | slop | Choose fonts with personality |
|
|
335
|
+
| `oversized-h1` | slop | Shorter copy or smaller size |
|
|
336
|
+
| `repeated-section-kickers` | slop | Stronger structure or imagery |
|
|
337
|
+
| `repeating-stripes-gradient` | slop | Deliberate texture or plain surface |
|
|
338
|
+
| `side-tab` | slop | Full border or background tint |
|
|
174
339
|
| `single-font` | slop | Pair display + text font |
|
|
175
|
-
| `
|
|
340
|
+
| `theater-slop-phrase` | slop | Say what it does or doesn't do |
|
|
341
|
+
| `all-caps-body` | quality | Capitalize only ≤3 word labels |
|
|
342
|
+
| `body-text-viewport-edge` | quality | 16–32px horizontal padding |
|
|
343
|
+
| `broken-image` | quality | Real image or remove tag |
|
|
344
|
+
| `clipped-overflow-container` | quality | Portal or visible overflow |
|
|
176
345
|
| `cramped-padding` | quality | 16px minimum |
|
|
177
|
-
| `
|
|
346
|
+
| `design-system-color` | quality | Use palette token or update DESIGN.md |
|
|
347
|
+
| `design-system-font` | quality | Use type system or update DESIGN.md |
|
|
348
|
+
| `design-system-radius` | quality | Use radius token or update DESIGN.md |
|
|
178
349
|
| `gray-on-color` | quality | White or appropriate ramp tone |
|
|
350
|
+
| `justified-text` | quality | text-align: left |
|
|
179
351
|
| `layout-transition` | quality | transform + opacity only |
|
|
180
|
-
| `low-contrast` | quality | 4.5:1 normal, 3:1 large text |
|
|
181
352
|
| `line-length` | quality | max-width: 65ch |
|
|
353
|
+
| `low-contrast` | quality | 4.5:1 normal, 3:1 large text |
|
|
354
|
+
| `pure-black-white` | quality | Tinted neutral (chroma 0.005) |
|
|
355
|
+
| `skipped-heading` | quality | Sequential h1→h2→h3 |
|
|
356
|
+
| `text-overflow` | quality | overflow-wrap + constrained widths |
|
|
182
357
|
| `tight-leading` | quality | line-height: 1.6 |
|
|
183
|
-
| `justified-text` | quality | text-align: left |
|
|
184
358
|
| `tiny-text` | quality | 16px minimum body |
|
|
185
|
-
| `all-caps-body` | quality | Capitalize only ≤3 word labels |
|
|
186
359
|
| `wide-tracking` | quality | letter-spacing: 0 on body |
|
|
187
|
-
| `skipped-heading` | quality | Sequential h1→h2→h3 |
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Codex: Visual Direction & Asset Production
|
|
2
|
+
|
|
3
|
+
This file is loaded by `/monodesign craft` when the harness has native image generation (currently Codex via `image_gen`). Other harnesses skip it. It covers the two craft steps that depend on real image generation: landing the visual direction, and producing the raster assets the implementation will compose.
|
|
4
|
+
|
|
5
|
+
Read this *before* generating any images. The order matters, and the per-step user pauses are what keep generated imagery from drifting away from the brief.
|
|
6
|
+
|
|
7
|
+
### Six steps, four mandatory stops
|
|
8
|
+
|
|
9
|
+
Steps A through F produce the visual direction and raster assets. Four of the six steps end with a mandatory user pause — do not advance past any of them on your own read of the situation.
|
|
10
|
+
|
|
11
|
+
1. **STOP after Step A questions.** Wait for answers.
|
|
12
|
+
2. **STOP after Step B palette generation.** Wait for "confirm palette."
|
|
13
|
+
3. **STOP after Step C mocks.** Wait for direction approval or delegation.
|
|
14
|
+
4. **Only after Step D approves a direction** do you continue into Step E and F.
|
|
15
|
+
5. Step E (mock fidelity inventory) and Step F (asset slicing) complete the asset set.
|
|
16
|
+
6. After Step F, return to craft.md Step 4 and write code.
|
|
17
|
+
|
|
18
|
+
Prior shape approval does **not** satisfy any of these. Shape's "confirm or override" advances you into Step A; it is not a substitute for it.
|
|
19
|
+
|
|
20
|
+
## Step A: Explore Directions with the User
|
|
21
|
+
|
|
22
|
+
Before generating anything, run a brief direction conversation grounded in the shape brief.
|
|
23
|
+
|
|
24
|
+
**Step A is required even when shape just produced a confirmed brief.** The shape questions and Step A questions cover different ground: shape pins purpose, content, scope; Step A pins palette, atmosphere, and named visual references for the comps you're about to generate. The only time you can skip Step A is when the user has already answered these exact palette/atmosphere/reference questions in the same session.
|
|
25
|
+
|
|
26
|
+
Ask **2-3 targeted questions** about visual lane, color strategy, atmosphere, and named anchor references. Don't enumerate generic menus; tie each question to the shape brief's answers. Example shape-grounded questions:
|
|
27
|
+
|
|
28
|
+
- "Brief says 'specimen-page restraint.' Are we closer to a quiet typographic page or a wider editorial spread with hero imagery?"
|
|
29
|
+
- "Palette strategy from shape was 'Committed.' Which one color carries the surface (a brand-driven pick rather than a default warm-or-cool framing)? (And no, the answer isn't a cream/sand body bg; that's the saturated AI default.)"
|
|
30
|
+
|
|
31
|
+
**STOP and wait for answers.** These pin the palette before any pixel gets generated. Do not proceed to Step B until the user has responded.
|
|
32
|
+
|
|
33
|
+
## Step B: Generate the Brand Palette First
|
|
34
|
+
|
|
35
|
+
Generate **one** palette artifact before any mocks. This is a small, focused image: typography pairing on the chosen background, primary + accent color swatches, one signature ornament or motif. Single image, single pass.
|
|
36
|
+
|
|
37
|
+
Why palette first: mocks generated against a vague color sense produce noise that drowns out the structural decisions. A confirmed palette is the first concrete contract for everything downstream.
|
|
38
|
+
|
|
39
|
+
Show the palette to the user. Ask one question: "This is the palette I'm locking in for the mocks. Confirm, or call out what to shift?"
|
|
40
|
+
|
|
41
|
+
**STOP and wait for confirmation.** Do not generate mocks against an unconfirmed palette. "Probably good enough" is the wrong call here; the palette is the contract for everything downstream.
|
|
42
|
+
|
|
43
|
+
## Step C: Generate 1-3 Visual Mocks Against the Palette
|
|
44
|
+
|
|
45
|
+
Once the palette is confirmed, generate **1 to 3** high-fidelity north-star comps. Each mock must use the confirmed palette and typography. Mocks differ in *structural* direction (hierarchy, topology, density, composition), not in color or motif.
|
|
46
|
+
|
|
47
|
+
- Brand work: push visual identity, composition, mood, and signature motifs.
|
|
48
|
+
- Product work: push hierarchy, topology, density, tone, grounded in realistic product structure.
|
|
49
|
+
- Landing pages and long-form brand surfaces: show enough of the second fold to establish the system beyond the hero.
|
|
50
|
+
|
|
51
|
+
Use the `image_gen` tool directly (or via the imagegen skill when available). Don't ask the user to install anything.
|
|
52
|
+
|
|
53
|
+
## Step D: Approval Loop
|
|
54
|
+
|
|
55
|
+
Show the comps. Ask what carries forward. Iterate until **one direction is approved** or the user explicitly delegates.
|
|
56
|
+
|
|
57
|
+
**STOP and wait for the approval or the delegation.** Do not begin Step E or return to craft.md Step 4 until a single direction is named. If the user delegates, pick the strongest direction and explain it from the brief, not personal taste.
|
|
58
|
+
|
|
59
|
+
Before moving to assets, summarize what to carry into code and what *not* to literalize from the mock. This is the handoff between visual exploration and semantic implementation.
|
|
60
|
+
|
|
61
|
+
## Step E: Mock Fidelity Inventory
|
|
62
|
+
|
|
63
|
+
Inventory the approved mock's major visible ingredients. For each, decide implementation: semantic HTML/CSS/SVG, generated raster, sourced raster, icon library, canvas/WebGL, or accepted omission.
|
|
64
|
+
|
|
65
|
+
Common ingredients to inventory:
|
|
66
|
+
|
|
67
|
+
- Hero silhouette and dominant composition
|
|
68
|
+
- Signature motifs (planets, devices, portraits, charts, route lines, insets, badges, etc.)
|
|
69
|
+
- Nav and primary CTA treatment
|
|
70
|
+
- Section sequence, especially the second fold
|
|
71
|
+
- Image-native content the concept depends on
|
|
72
|
+
- Typography, density, color/material treatment, motion cues
|
|
73
|
+
|
|
74
|
+
Treat the mock as a north star, not a screenshot to trace. Don't rasterize core UI text. But if the live result lacks the mock's major ingredients, the implementation is wrong.
|
|
75
|
+
|
|
76
|
+
If a photographic, architectural, product, or place-led mock becomes generic CSS scenery, decorative diagrams, bullets, or copy, stop and fix it. That's a broken implementation, not a harmless interpretation.
|
|
77
|
+
|
|
78
|
+
Don't substitute a different hero composition or visual driver post-approval without user sign-off.
|
|
79
|
+
|
|
80
|
+
## Step F: Asset Slicing via the Asset Producer
|
|
81
|
+
|
|
82
|
+
Raster ingredients identified in Step E need clean production assets. Use the bundled `monodesign_asset_producer` subagent rather than producing inline.
|
|
83
|
+
|
|
84
|
+
Spawn it as a scoped subagent. If you do not have explicit permission to use agents, stop and ask:
|
|
85
|
+
|
|
86
|
+
```text
|
|
87
|
+
Asset production will work better as a scoped subagent job. Should I spawn the monodesign asset producer subagent for this step?
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Pass to the agent:
|
|
91
|
+
|
|
92
|
+
- Approved mock path or screenshot reference
|
|
93
|
+
- Crop paths or a contact sheet with crop ids
|
|
94
|
+
- Output directory
|
|
95
|
+
- Required dimensions, format, transparency needs
|
|
96
|
+
- Avoid list
|
|
97
|
+
- Notes on what should remain semantic HTML/CSS/SVG instead of raster
|
|
98
|
+
|
|
99
|
+
Attach image generation capability to the spawned agent when the harness supports it. Do **not** load image-generation reference material into the parent thread.
|
|
100
|
+
|
|
101
|
+
Inline asset production is allowed only if the user declines subagents, the harness cannot spawn the authorized agent, or the user explicitly asks for single-thread mode.
|
|
102
|
+
|
|
103
|
+
Prefer HTML/CSS/SVG/canvas when they can credibly reproduce an ingredient; reach for real, generated, or stock imagery when the mock or subject matter calls for actual visual content.
|
|
104
|
+
|
|
105
|
+
## After This File
|
|
106
|
+
|
|
107
|
+
Once Steps A through F are complete, return to `craft.md` Step 5 (Build to Production Quality). The implementation builds against the confirmed palette, approved mock, and the assets the producer wrote.
|
|
@@ -52,6 +52,7 @@ Then add references based on the brief's needs:
|
|
|
52
52
|
- Color-heavy or themed? Consult [color-and-contrast.md](color-and-contrast.md)
|
|
53
53
|
- Responsive requirements? Consult [responsive-design.md](responsive-design.md)
|
|
54
54
|
- Heavy on copy, labels, or errors? Consult [ux-writing.md](ux-writing.md)
|
|
55
|
+
- Brand identity work, visual identity guidelines, or establishing a brand-consistent design system? Consult [brand-workflow.md](brand-workflow.md) for the end-to-end brand definition and token-sync process, and [brand.md](brand.md) for register-specific design rules.
|
|
55
56
|
|
|
56
57
|
## Step 3: Land the Visual Direction (Capability-Gated)
|
|
57
58
|
|
|
@@ -63,6 +64,8 @@ Before implementation, generate high-fidelity visual comps when all of these are
|
|
|
63
64
|
|
|
64
65
|
When those conditions are met, this step is mandatory for **both brand and product work** in Codex and any harness with built-in image generation. Use native image generation; in Codex, use the built-in `image_gen` tool via the imagegen skill. If image generation is unavailable, do not ask the user to install APIs or tooling. State in one line that the image step is skipped because the harness lacks native image generation, then proceed.
|
|
65
66
|
|
|
67
|
+
When image generation is available, load [codex.md](codex.md) before generating anything. It defines the four stop points (A–D) and the full direction workflow: palette lock, mock generation, approval loop, and asset handoff. Do not skip the stop points.
|
|
68
|
+
|
|
66
69
|
Do not skip this step because the eventual UI should be semantic, editable, code-native, responsive, or accessible. Those are implementation requirements, not reasons to avoid visual exploration.
|
|
67
70
|
|
|
68
71
|
### Purpose
|