# Harness Design > 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. ## When to Use - Establishing aesthetic direction for a new or existing project (style, tone, differentiator) - When `on_new_feature` triggers fire and the feature has design scope requiring aesthetic guidance - Reviewing existing components against declared design intent and anti-patterns - Enforcing design constraints via the knowledge graph with configurable strictness - Generating or updating `design-system/DESIGN.md` with aesthetic direction, anti-patterns, and platform notes - NOT for design token generation or palette selection (use harness-design-system) - NOT for accessibility auditing or WCAG compliance (use harness-accessibility) - NOT for platform-specific token implementation into CSS/Tailwind/etc. (use harness-design-web/mobile, Phase 5) ## Process ### Phase 1: INTENT -- Capture Aesthetic Intent 1. **Read 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 settings 2. **Check 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`) 3. **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: - Recommended visual style and tone - Industry conventions and user expectations - Regulatory or cultural considerations - Common anti-patterns for the sector 4. **Capture user intent.** Ask the user to define: - **Style:** minimal, expressive, corporate, playful, editorial, or custom - **Tone:** warm, cool, neutral, bold, muted, or custom - **Key differentiator:** what makes this product's visual identity unique - **Anti-patterns:** specific design choices to explicitly avoid (e.g., "no gradients on data elements," "no decorative borders on cards") 5. **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 available - `typography/pairings.yaml` -- typography pairings to understand which font combinations are recommended - Industry-specific anti-pattern guidance from the loaded industry profile 6. **Confirm 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. ### Phase 2: DIRECTION -- Generate DESIGN.md 1. **Generate or update `design-system/DESIGN.md`.** The document must contain the following sections: **Aesthetic Direction:** - Style declaration (the chosen style and what it means for this project) - Tone description (how the tone manifests in color usage, typography weight, spacing density) - Key differentiator (the unique visual identity aspect and how it is expressed) **Anti-Patterns:** - Project-specific anti-patterns (from user input in Phase 1) - Industry-informed anti-patterns (from the loaded industry profile) - Each anti-pattern includes: name, description, example of what NOT to do, and why it conflicts with the declared intent **Platform Notes:** - Web-specific guidance (CSS strategy, responsive behavior, animation preferences) - Mobile-specific guidance (touch targets, native component usage, platform conventions) - Cross-platform consistency rules (which elements must be identical vs. platform-adapted) **Strictness Override:** - Current `designStrictness` level and what it means - Instructions for changing strictness in `harness.config.json` - Behavior differences per level: - `permissive` -- 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 `warn` 2. **Populate the knowledge graph.** If a graph exists at `.harness/graph/`: - Create an `AestheticIntent` node with properties: style, tone, differentiator, strictness level. Use `DesignIngestor` from `packages/graph/src/ingest/DesignIngestor.ts` for graph ingestion. - Create a `DECLARES_INTENT` edge from the project node to the `AestheticIntent` node. - This enables downstream skills (harness-accessibility, harness-impact-analysis) to query the declared design intent. 3. **Run harness validate.** After generating DESIGN.md, verify the project still passes all constraints. The new file must not break existing validations. ### Phase 3: REVIEW -- Review Components Against Design Intent 1. **Scan for anti-pattern violations.** Use Grep to search the codebase for patterns that match declared anti-patterns: - Hardcoded color values not present in `design-system/tokens.json` (suggests off-brand color usage) - Font families flagged as anti-patterns in the design intent (e.g., decorative fonts in a minimal project) - Layout patterns on the forbidden list (e.g., excessive drop shadows in a flat design, gradients on data elements) - CSS properties or values that contradict the declared style (e.g., rounded corners in a sharp-edge design) 2. **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 style - `anti-patterns/color.yaml` — hardcoded colors, insufficient contrast, color-only indicators that undermine the declared tone - `anti-patterns/layout.yaml` — spacing inconsistencies, missing touch targets, fixed-width containers - `anti-patterns/motion.yaml` — missing prefers-reduced-motion, long animations, scroll-jacking - `industries/{industry}.yaml` — industry-specific rules from the loaded industry profile 3. **Cross-reference with graph constraints.** If a graph exists at `.harness/graph/`: - Query for existing `VIOLATES_DESIGN` edges using `DesignConstraintAdapter` from `packages/graph/src/constraints/DesignConstraintAdapter.ts` - Compare current findings against previously recorded violations - Identify new violations and resolved violations 4. **Assign severity based on `designStrictness`:** - `permissive` -- all findings are `info` severity - `standard` -- anti-pattern violations and accessibility-related findings are `warn`, critical design constraint violations are `error` - `strict` -- accessibility violations are `error` (blocks), anti-pattern violations are `warn` 5. **Report findings.** Present each finding with: - File path and line number - Violation description and which anti-pattern or design constraint it violates - Severity level (based on current strictness) - Suggested remediation ### Phase 4: ENFORCE -- Surface and Record Violations 1. **Create constraint nodes in the graph.** For each violated design rule, if a graph exists at `.harness/graph/`: - Create a `DesignConstraint` node for the rule being violated (if one does not already exist) - Create a `VIOLATES_DESIGN` edge from the violating component to the `DesignConstraint` node - Use `DesignConstraintAdapter` from `packages/graph/src/constraints/DesignConstraintAdapter.ts` to manage constraint creation and violation recording 2. **Format 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" ``` 3. **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 = `error` 4. **Run harness validate.** After recording violations in the graph, run validation to ensure the enforcement pass is consistent with the project state. ## Harness Integration - **`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. ## Success Criteria - `design-system/DESIGN.md` exists with all required sections: Aesthetic Direction, Anti-Patterns, Platform Notes, Strictness Override - Anti-patterns are detected in the codebase and reported with file paths, line numbers, and severity - `designStrictness` configuration is read from `harness.config.json` and respected in all severity assignments - `AestheticIntent` node created in the knowledge graph with style, tone, differentiator, and strictness properties - `DECLARES_INTENT` edge connects the project to the aesthetic intent node - `DesignConstraint` nodes created for each violated design rule - `VIOLATES_DESIGN` edges connect violating components to their constraint nodes - Violations output in numbered format (DESIGN-001, DESIGN-002, etc.) with severity matching strictness level - `harness validate` passes after DESIGN.md generation and enforcement - User confirmed aesthetic intent before DESIGN.md generation (hard gate) ## Examples ### Example: SaaS Analytics Dashboard Aesthetic Direction **Context:** 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):** ```markdown ## 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 ``` ## Rationalizations to Reject | 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. | ## Gates These are hard stops. Violating any gate means the process has broken down. - **No DESIGN.md generated without the user confirming aesthetic intent.** The INTENT phase must end with explicit user confirmation of style, tone, differentiator, and anti-patterns. Do not generate based on assumptions. - **No enforcement without reading tokens from harness-design-system.** The REVIEW and ENFORCE phases require `design-system/tokens.json` to exist. If tokens have not been generated, instruct the user to run harness-design-system first. - **Strictness must be read from configuration, not assumed.** Read `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. - **No anti-pattern detection without a declared intent.** The REVIEW phase requires an existing DESIGN.md with declared anti-patterns. If no intent has been captured, run the INTENT and DIRECTION phases first. - **No graph mutations without validating node types.** When creating `AestheticIntent`, `DesignConstraint`, or `VIOLATES_DESIGN` edges, verify the node and edge types are registered in the graph schema before writing. ## Escalation - **When the user cannot articulate a style or tone:** Suggest industry-based defaults from the loaded industry profile. Present 2-3 options with examples: "Based on the saas industry profile, common styles are: (1) Minimal -- clean, data-focused, (2) Corporate -- structured, trustworthy, (3) Expressive -- colorful, engaging. Which resonates most?" - **When declared anti-patterns conflict with existing code:** Present a migration path rather than flagging every instance as a violation. Report: "Found 47 instances of gradients on data elements. Recommend a phased migration: (1) Update new components immediately, (2) Schedule legacy component updates over 3 sprints. Set strictness to 'permissive' during migration to avoid blocking CI." - **When tokens do not exist yet:** Do not attempt to infer a token set. Instruct the user: "Design tokens have not been generated. Run harness-design-system first to create `design-system/tokens.json`, then re-run harness-design for aesthetic direction." - **When strictness level conflicts with team velocity:** Explain the tradeoffs: "Strict mode blocks PRs on any design violation. If this is slowing the team, consider 'standard' mode which blocks only on critical violations (off-brand colors, accessibility) and warns on anti-patterns." - **When the knowledge graph is unavailable:** Skip graph operations in DIRECTION and ENFORCE phases. Log: "Graph not available at `.harness/graph/` -- skipping AestheticIntent node creation and violation recording. Run `harness scan` later to populate." Continue with file-based operations.