From harness-claude
Captures aesthetic intent, generates DESIGN.md with anti-patterns and platform notes, reviews components against guidelines, and enforces design constraints at configurable strictness levels.
npx claudepluginhub intense-visions/harness-engineering --plugin harness-claudeThis skill uses the workspace's default tool permissions.
> Aesthetic direction workflow. Capture design intent, generate DESIGN.md with anti-patterns and platform notes, review components against aesthetic guidelines, and enforce design constraints at configurable strictness levels.
Discovers existing design patterns, curates palettes and typography intent, generates W3C DTCG tokens, and validates WCAG color compliance for design systems. Triggers on project init or new features.
Guides UI design to avoid AI-generic patterns using project design systems, exact tokens, and component-by-component approach. For prototypes, reviews, and design systems.
Generates design system from product domain: style, palette, typography, platform patterns, anti-patterns. Outputs .rune/design-system.md as contract for UI skills.
Share bugs, ideas, or general feedback.
Aesthetic direction workflow. Capture design intent, generate DESIGN.md with anti-patterns and platform notes, review components against aesthetic guidelines, and enforce design constraints at configurable strictness levels.
on_new_feature triggers fire and the feature has design scope requiring aesthetic guidancedesign-system/DESIGN.md with aesthetic direction, anti-patterns, and platform notesRead existing design artifacts. Search for:
design-system/DESIGN.md -- existing aesthetic direction documentation (from harness-design-system output)design-system/tokens.json -- existing W3C DTCG tokens (palette, typography, spacing defined by harness-design-system)harness.config.json -- project configuration for design settingsCheck harness configuration. Read harness.config.json for:
design.strictness -- enforcement level (strict, standard, permissive). If not set, default to standard.design.platforms -- which platforms are enabled (web, mobile)design.aestheticIntent -- path to design intent doc (default: design-system/DESIGN.md)Load industry profile. If an industry is specified (via CLI --industry arg or config), read the industry profile from agents/skills/shared/design-knowledge/industries/{industry}.yaml. Available industries include: saas, fintech, healthcare, ecommerce, creative, emerging-tech, lifestyle, services. The profile provides sector-specific guidance on:
Capture user intent. Ask the user to define:
Load shared design knowledge. Read anti-pattern awareness from agents/skills/shared/design-knowledge/:
palettes/curated.yaml -- curated palettes to understand which aesthetic families are availabletypography/pairings.yaml -- typography pairings to understand which font combinations are recommendedConfirm intent before proceeding. Present a summary of the captured aesthetic intent to the user. This is a hard gate -- no DESIGN.md generation without the user confirming their aesthetic intent.
Generate or update design-system/DESIGN.md. The document must contain the following sections:
Aesthetic Direction:
Anti-Patterns:
Platform Notes:
Strictness Override:
designStrictness level and what it meansharness.config.jsonpermissive -- all design violations reported as info (nothing blocks)standard -- anti-pattern and accessibility violations are warn, critical violations are error (default)strict -- accessibility violations are error (blocks CI/PR merge), anti-pattern violations are warnPopulate the knowledge graph. If a graph exists at .harness/graph/:
AestheticIntent node with properties: style, tone, differentiator, strictness level. Use DesignIngestor from packages/graph/src/ingest/DesignIngestor.ts for graph ingestion.DECLARES_INTENT edge from the project node to the AestheticIntent node.Run harness validate. After generating DESIGN.md, verify the project still passes all constraints. The new file must not break existing validations.
Scan for anti-pattern violations. Use Grep to search the codebase for patterns that match declared anti-patterns:
design-system/tokens.json (suggests off-brand color usage)Load detection rules from shared design knowledge. Read from agents/skills/shared/design-knowledge/:
anti-patterns/typography.yaml — font combinations, size, weight, and line-height issues that clash with the declared styleanti-patterns/color.yaml — hardcoded colors, insufficient contrast, color-only indicators that undermine the declared toneanti-patterns/layout.yaml — spacing inconsistencies, missing touch targets, fixed-width containersanti-patterns/motion.yaml — missing prefers-reduced-motion, long animations, scroll-jackingindustries/{industry}.yaml — industry-specific rules from the loaded industry profileCross-reference with graph constraints. If a graph exists at .harness/graph/:
VIOLATES_DESIGN edges using DesignConstraintAdapter from packages/graph/src/constraints/DesignConstraintAdapter.tsAssign severity based on designStrictness:
permissive -- all findings are info severitystandard -- anti-pattern violations and accessibility-related findings are warn, critical design constraint violations are errorstrict -- accessibility violations are error (blocks), anti-pattern violations are warnReport findings. Present each finding with:
Create constraint nodes in the graph. For each violated design rule, if a graph exists at .harness/graph/:
DesignConstraint node for the rule being violated (if one does not already exist)VIOLATES_DESIGN edge from the violating component to the DesignConstraint nodeDesignConstraintAdapter from packages/graph/src/constraints/DesignConstraintAdapter.ts to manage constraint creation and violation recordingFormat violation output. Each violation follows a numbered format:
DESIGN-001 [warn] Anti-pattern: gradient used on data visualization element
File: src/components/Chart.tsx
Line: 42
Constraint: No gradients on data elements
Intent: Style "minimal" prohibits decorative effects on informational components
Fix: Replace linear-gradient with solid color from token "neutral.100"
DESIGN-002 [error] Off-brand color: hardcoded #ff6b35 not in token set
File: src/components/Alert.tsx
Line: 18
Constraint: All colors must reference design tokens
Intent: Tone "cool" conflicts with warm orange accent
Fix: Use token "semantic.warning" (#f59e0b) or add color to tokens.json via harness-design-system
DESIGN-003 [info] Typography: decorative font "Playfair Display" used in component
File: src/components/Hero.tsx
Line: 8
Constraint: Heading font must match declared typography pairing
Intent: Style "minimal" uses Inter for all headings
Fix: Replace with token "typography.heading.fontFamily"
Control severity by designStrictness:
permissive -- all violations output as info (DESIGN-001 [info], DESIGN-002 [info], etc.)standard -- anti-patterns and a11y = warn, off-brand tokens = error (default)strict -- a11y violations = error (blocks CI), anti-patterns = warn, off-brand tokens = errorRun harness validate. After recording violations in the graph, run validation to ensure the enforcement pass is consistent with the project state.
harness validate -- Run after generating DESIGN.md and after enforcement passes. Design violations surface as constraint violations at the configured strictness level.harness scan -- Run after changes to refresh the knowledge graph. Updated graph enables accurate violation detection and impact analysis.DesignIngestor (packages/graph/src/ingest/DesignIngestor.ts) -- Parses tokens.json and DESIGN.md to create graph nodes representing the design system. Creates AestheticIntent nodes and DECLARES_INTENT edges during the DIRECTION phase.DesignConstraintAdapter (packages/graph/src/constraints/DesignConstraintAdapter.ts) -- Manages DesignConstraint nodes and VIOLATES_DESIGN edges in the graph. Reads design.strictness to control violation severity. Used during REVIEW and ENFORCE phases.Graph naming convention: This skill uses PascalCase for node types (AestheticIntent, DesignToken, DesignConstraint) and UPPER_SNAKE for edge types (DECLARES_INTENT, VIOLATES_DESIGN, USES_TOKEN, PLATFORM_BINDING) as conceptual labels. The graph schema registers these as snake_case identifiers (aesthetic_intent, design_token, design_constraint, declares_intent, violates_design, uses_token, platform_binding). The adapter classes (DesignIngestor, DesignConstraintAdapter) handle the mapping — always use the adapters rather than constructing graph queries with raw type names.
harness-design-system -- Dependency. This skill reads tokens and design intent generated by harness-design-system. Token-level issues (palette changes, new colors) are resolved by running harness-design-system, not this skill.harness-impact-analysis -- When design tokens change, impact analysis traces which components consume affected tokens. Use this to determine which components need re-review after token updates.design-system/DESIGN.md exists with all required sections: Aesthetic Direction, Anti-Patterns, Platform Notes, Strictness OverridedesignStrictness configuration is read from harness.config.json and respected in all severity assignmentsAestheticIntent node created in the knowledge graph with style, tone, differentiator, and strictness propertiesDECLARES_INTENT edge connects the project to the aesthetic intent nodeDesignConstraint nodes created for each violated design ruleVIOLATES_DESIGN edges connect violating components to their constraint nodesharness validate passes after DESIGN.md generation and enforcementContext: A SaaS analytics dashboard project. Industry: saas. Design tokens already generated by harness-design-system. No existing DESIGN.md aesthetic direction.
INTENT capture:
Industry profile: Loaded (saas) -- recommends professional, data-focused aesthetic
Style: Minimal
Tone: Cool, professional
Differentiator: Dense information display with generous whitespace between sections
Anti-patterns: No gradients on data elements, no decorative borders on cards,
no more than 2 font weights per component
Strictness: standard (from harness.config.json)
DIRECTION output (DESIGN.md excerpt):
## Aesthetic Direction
**Style:** Minimal -- clean lines, flat surfaces, no decorative elements that do not serve
an informational purpose. Every visual element must earn its place by conveying data or
guiding the user's eye.
**Tone:** Cool, professional -- slate and blue palette dominates. Warm colors reserved
exclusively for semantic states (warning, error). No warm accents in neutral UI.
**Differentiator:** Dense information display with generous whitespace between sections.
Components are compact internally but breathe externally. Card padding is tight (12px),
but gaps between cards are generous (24px+).
## Anti-Patterns
| Pattern | Description | Why It Conflicts |
| -------------------------- | -------------------------------------------- | ------------------------------------------ |
| Gradients on data elements | linear-gradient on charts, tables, cards | Minimal style: flat surfaces only |
| Decorative card borders | border with color on .card elements | Minimal style: borders are structural only |
| Excess font weights | More than 2 font-weight values per component | Minimal style: typographic restraint |
## Strictness Override
Current level: **standard**
To change, update `harness.config.json`:
"design": { "strictness": "strict" | "standard" | "permissive" }
REVIEW findings:
Found 3 anti-pattern violations in 2 files:
DESIGN-001 [warn] Gradient on data element
File: src/components/RevenueChart.tsx:42
Constraint: No gradients on data elements
Fix: Replace linear-gradient(#3b82f6, #1d4ed8) with solid token "primary.500"
DESIGN-002 [warn] Decorative border on card
File: src/components/MetricCard.tsx:15
Constraint: No decorative borders on cards
Fix: Remove border-color: #3b82f6, use border-color: transparent or remove border
DESIGN-003 [info] Three font weights in one component
File: src/components/MetricCard.tsx:8
Constraint: Max 2 font weights per component
Fix: Consolidate font-weight values to 400 (body) and 600 (heading) only
| Rationalization | Reality |
|---|---|
| "The tokens are already defined, so the aesthetic intent is obvious — I can infer it and skip Phase 1." | Tokens define values, not intent. The style, tone, and differentiator exist in the designer's head, not in a color ramp. DESIGN.md cannot be generated without explicit confirmation. |
| "There are only 3 violations and they're minor — I'll skip recording them in the graph to save time." | Unrecorded violations are invisible to every downstream skill. harness-impact-analysis and harness-accessibility rely on VIOLATES_DESIGN edges existing. Skip graph writes and the enforcement record is permanently incomplete. |
| "The strictness level isn't set in config, so I'll just use strict to be safe." | Defaulting to strict without reading config imposes blocking CI failures the team never agreed to. Always read design.strictness and default to standard when absent — not to the most aggressive level. |
| "This anti-pattern is declared, but there are 40+ instances — it would take forever to report them all, so I'll summarize." | The REVIEW phase must report every finding with file path, line number, and severity. Summarizing hides the scope from the team and makes automated tooling miss violations. |
| "DESIGN.md already exists from a previous run, so I can skip Phase 2 and go straight to REVIEW." | An existing DESIGN.md may be outdated or missing sections. The DIRECTION phase must verify all required sections are present and current before the REVIEW phase can rely on them. |
These are hard stops. Violating any gate means the process has broken down.
design-system/tokens.json to exist. If tokens have not been generated, instruct the user to run harness-design-system first.design.strictness from harness.config.json. If the key does not exist, default to standard and report the default to the user. Never hardcode a strictness level.AestheticIntent, DesignConstraint, or VIOLATES_DESIGN edges, verify the node and edge types are registered in the graph schema before writing.design-system/tokens.json, then re-run harness-design for aesthetic direction.".harness/graph/ -- skipping AestheticIntent node creation and violation recording. Run harness scan later to populate." Continue with file-based operations.