Harness Design Craft
LLM-judgment-based design ceiling-raiser. Three branchable phases — CRITIQUE finds what's mediocre, POLISH applies high-craft moves, BENCHMARK scores against curated exemplars. The ceiling counterpart to harness-design (declared-intent enforcement, rule-based) and the design-pipeline floor audits.
When to Use
- Reviewing UI for craft elevation opportunities the rule-based skills can't surface ("hierarchy is muddy here," "loading spinner where a content-matched skeleton would fit")
- After harness-design has captured intent and basic checks pass — go from "consistent" to "stunning"
- Before launching customer-facing surfaces — visual judgment beyond consistency
- During design-engineering work — POLISH phase suggests concrete craft moves with before/after sketches
- For competitive benchmarking — BENCHMARK scores how close you are to Linear / Stripe / Raycast tier
- When
on_new_feature fires AND the feature touches design surface
- NOT for declared-anti-pattern enforcement (use harness-design)
- NOT for component anatomy completeness (use audit-component-anatomy)
- NOT for token validation (use harness-design-system)
- NOT for accessibility (use harness-accessibility)
- NOT for code generation from scratch (use v0 / bolt.new / Lovable — different tool class)
Capability Roles
- Defines (Service Definition): the shared craft critique contract (
packages/cli/src/shared/craft/) — LlmProvider + finding/axes schema + run store — shared across all *-craft skills. This skill implements, and does not own, that contract.
- Provides (Provider): this skill — a design ceiling critique/polish/benchmark implemented over the shared contract (
packages/cli/src/design-craft/).
- Consumes (Consumer):
craft-fleet (the craft-pipeline elevation sweep) and the harness natural-language router, which invoke every *-craft provider uniformly through the shared critique/finding shape. It is also dispatched by harness-design-pipeline in the FILL phase; note it is not a formal Verifier<F> provider — its output shape differs, so it is dispatched rather than registered in the verifier seam
Process
Argument Resolution
mode: "fast" (code-only LLM, cheap, default) or "deep" (rendered + vision-LLM, ceiling-raising, requires playwright + vision-capable model)
phases: subset of critique, polish, benchmark. Default: all three, sequenced.
autoCapture: B' upgrade behavior. "prompt" (default — offer to chain to harness-design if preconditions missing), "auto" (chain without prompting), "skip" (run with generic-craft rubrics, no offer).
files: optional scoping. Default: all components/pages discovered.
B' Precondition Check (every invocation)
Before any phase runs, check four preconditions and offer to fulfill missing ones:
| Precondition |
Source |
If missing |
designMdExists |
design-system/DESIGN.md present |
Offer to chain to harness-design (INTENT + DIRECTION) |
aestheticIntentDeclared |
DESIGN.md Aesthetic Direction section populated |
Offer to chain to harness-design (INTENT) |
tokensExist |
design-system/tokens.json present |
Note in summary; do not auto-chain (harness-design-system territory) |
componentRegistryPopulated |
DESIGN.md Component Registry section |
Note in summary; falls back to export-name resolution |
autoCapture controls behavior:
prompt: emit upgradeOffer interaction; pause for user choice
auto: chain to harness-design transition automatically (for autopilot)
skip: run with generic-craft rubrics (degrades quality but unblocks first-run)
Phase: CRITIQUE — Find what is craft-mediocre
Identify targets. Discover components (or pages, when scoped to pages) to critique. Apply files scoping if provided.
Load critique rubrics. Read from catalog (catalog/rubrics/). 10 rubrics in v1 covering: hierarchy clarity, typography craft, motion quality, color confidence, density rhythm, restraint, polish details, copy voice, interaction craft, brand coherence. Filter by catalog.rubrics config if set.
For each target × each rubric, run an LLM critique pass:
- Fast mode: pass source code + rubric prompt + AestheticIntent (if present) to text LLM
- Deep mode: render via playwright at three viewports (1440/768/375), pass screenshots + source + rubric prompt + AestheticIntent to vision-capable LLM
- Parse response into 3-axis finding:
tier (foundational/polish/aspirational), impact (small/medium/large), confidence (high/medium/low — essential for honest LLM output)
Apply harness-design overlap deferral. Per design.craft.enabled = true, when a CRITIQUE finding matches a declared anti-pattern in DESIGN.md, defer to harness-design (suppress this finding) and increment meta.deferralsToHarnessDesign.
Compute derived priority field for each finding (tier × impact × confidence-weighted score) for single-axis sorting when needed.
Phase: POLISH — Apply craft pattern library
Load polish patterns. Read from catalog (catalog/patterns/). 15 patterns in v1 across 5 categories: motion (3), skeleton (3), typography (3), interaction (3), layout (3). Filter by catalog.patterns config if set.
For each target × each applicable pattern, evaluate fit:
- Match pattern's
applicableTo criteria (jsx-attribute, css-property, component-type, etc.)
- LLM judgment: would applying this pattern improve craft here?
- If yes: produce 3-axis finding with
before and after content (codemod-TODO sketch, not actual edit)
No source modification. POLISH only emits suggestions with before/after sketches. The user applies via codemod tools or by hand.
Phase: BENCHMARK — Score against curated exemplars
Load exemplar corpus. Read from catalog (catalog/exemplars/). 50 exemplars in v1 across 5 component types (EmptyState, LoadingState, ErrorState, Modal, Button — 10 each). Filter by catalog.exemplars config if set.
For each target component, identify matching exemplars by component-type tag (e.g., target is an EmptyState → load all 10 EmptyState exemplars).
For each target × matching exemplars, run an LLM benchmark pass:
- Fast mode: structural comparison (code/markup/declared anatomy vs exemplar's reference markup) — limited but useful as a first signal
- Deep mode: visual comparison via vision-LLM (target screenshot vs exemplar screenshot/URL)
- Parse response into 5-dim radar:
philosophicalCoherence, hierarchy, craftExecution, function, innovation — each with score (0-100), confidence, notes
- Compute weighted
overall score
- Emit narrative
gaps (where the target falls short of the best exemplars and why)
Cite exemplars used. Each BenchmarkScore lists exemplars (ids) consulted. Increment per-exemplar citationCount for measurement.
Derive the award-tier verdict (machine-computed, not LLM-emitted). Each BenchmarkScore carries an awardBar verdict — cleared, not-cleared, or indeterminate — derived in code from the radar plus the cited exemplars' reference scores, never emitted by the LLM. The bar is per-dimension: each dimension must reach max(dimensionFloor, round(fraction × median(cited-exemplar references))). Any dimension whose confidence falls below the confidence floor forces indeterminate — a score the model is unsure about never certifies award tier. Tunable via design.craft.benchmark.awardBar (dimensionFloor default 80, fraction default 0.95, confidenceFloor default medium).
Scope: the aesthetic radar certifies desktop craft. Mobile/responsive behavior is enforced separately by the responsive gate (next step), which can veto cleared.
Apply the responsive gate (mechanical, ADR 0085). awardBar.responsive is a machine gate over mobile layout metrics: a horizontal-overflow or unreachable-nav (no visible nav AND no menu toggle) defect makes it defective and vetoes cleared → not-cleared, regardless of the aesthetic score. Supply per-target layout metrics via responsiveMetrics (e.g. from a Playwright MCP run) or a responsiveProbeCommand — a render step that prints a ResponsiveMetrics[] JSON manifest (the CLI ships no browser; a screenshot is insufficient — the gate needs scrollWidth / nav visibility). With no metrics the gate is not-evaluated and the aesthetic verdict stands; set design.craft.benchmark.awardBar.responsive.require to force indeterminate instead of a mobile-blind cleared.
Phase: REPORT — Format and persist outputs
Write to graph: CRITIQUE/POLISH findings → VIOLATES_CRAFT edges via extended DesignConstraintAdapter. BENCHMARK scores → CRAFT_SCORE nodes attached to component nodes. All carry runId for check-design verifier fixpoint detection. Idempotent.
Format markdown report. Grouped by component, with CRAFT-* codes linked to finding-codes.md and rubric/pattern/exemplar names linked to their catalog entries. Low-confidence findings visually distinguished (italic or (low confidence:) prefix).
Emit summary. Total findings, breakdown by phase, mode (fast/deep), LLM cost (llmCalls.{count, costUsd}), catalog applied, deferrals to harness-design, precondition state.
Signal feedback. Append to running aggregate: when the same finding-shape recurs N≥5 times across audits (config: design.craft.signal.proposalThreshold), emit a candidate pattern proposal to .harness/design-craft/proposals/.
Harness Integration
harness validate — Fast-mode CRITIQUE hook (subset of rubrics; opt-in). Findings respect design.strictness.
mcp__harness__design_craft — Programmatic API. Consumed by harness check-design verifier and design-pipeline orchestrator. Phase selector exposed.
harness-design — Soft dependency. B' progressive upgrade chains to it when AestheticIntent missing. Defers declared-anti-pattern findings to it.
harness-design-system — Soft dependency. Token-related polish patterns enriched when tokens exist.
DesignConstraintAdapter — Extended for CRAFT-* codes (CRAFT-C* critique, CRAFT-P* polish, CRAFT-B* benchmark identifiers) + CRAFT_SCORE node type.
packages/intelligence/ — Wrapped by llm/provider.ts for vision-capable LLM calls. May need extension if no vision support today.
Success Criteria
See docs/changes/design-pipeline/design-craft-elevator/proposal.md for the full 38 success criteria. Highlights:
- Three phases independently invocable via
phases arg
- 3-axis output for CRITIQUE/POLISH; 5-dim radar for BENCHMARK
- Confidence is honest (low-confidence findings emitted, not silently dropped)
- B' detect-and-offer works (preconditions detected, offer payload emitted, chain to harness-design honored)
- Seed catalog complete (10 rubrics + 15 patterns + 50 exemplars)
- Growth infrastructure operational (contribution validation, signal loop, usage measurement)
- Fast-mode ≤ 30s / 50 files; deep-mode ≤ 3min / 10 components
- LLM cost tracked per audit
Rationalizations to Reject
These are common rationalizations that sound reasonable but lead to incorrect results. When you catch yourself thinking any of these, stop and follow the documented process instead.
| Rationalization |
Why It Is Wrong |
"The screenshot looks stunning, so I will certify this component award-tier / cleared." |
The awardBar verdict is machine-computed in code from the radar plus the cited exemplars' reference scores — never LLM-asserted. And the mechanical responsive gate can veto a strong aesthetic score to not-cleared. You emit dimension scores; the referee derives the verdict. |
| "The model is only medium-confident on craftExecution, but the visual is clearly strong, so I will upgrade it." |
Any dimension whose confidence falls below the confidence floor forces indeterminate by design — a score the model is unsure about must never certify award tier. Silently upgrading confidence defeats the honesty the 3-axis output exists to preserve. |
| "POLISH found a better spring curve, so I will apply the codemod to the component." |
POLISH emits before/after sketches only (fix kind: codemod-todo); it never modifies source. Applying the change yourself violates the no-autofix gate — the user applies via their own tools. |
| "No DESIGN.md aesthetic intent is declared, so I will skip this component." |
The B' check degrades to generic-craft rubrics (or offers to chain to harness-design) — it never skips. Running with generic rubrics and noting the degraded quality is the documented fallback; abstaining abandons the ceiling role. |
| "This CRITIQUE finding matches a declared anti-pattern in DESIGN.md, but it is worth restating for emphasis." |
When design.craft.enabled and DESIGN.md declares the matching anti-pattern, defer to harness-design and suppress the finding (increment deferralsToHarnessDesign). Restating double-counts what the rule-based floor already owns. |
Examples
Example: CRITIQUE finds hierarchy muddiness
Input: A Dashboard.tsx page rendering three CTA buttons, all using the same variant="primary".
Output (3-axis finding):
CRAFT-C001 [foundational | medium | high] Hierarchy muddy: three buttons compete for primary
File: src/pages/Dashboard.tsx:88
Rubric: hierarchy-clarity (rubric-hierarchy-clarity)
Tier: foundational (this is "fix to be not-broken," not polish)
Impact: medium (users can still complete tasks, but decision fatigue is real)
Confidence: high (rule is unambiguous; LLM saw the three buttons + their identical styling)
Priority: derived → 0.78
Message: Three primary-variant buttons in the same view: "Save", "Export", "Share".
No visual signal indicates which is the recommended action. Reduce to one
primary; demote the others to secondary or ghost variant.
Cite: rubric "hierarchy-clarity" / source: huashu-design#hierarchy
Example: POLISH suggests spring physics
Input: A Modal.tsx using transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1).
Output (3-axis finding with before/after):
CRAFT-P001 [polish | medium | high] Spring physics would feel more confident here
File: src/components/Modal.tsx:42
Pattern: spring-physics-microinteraction
Tier: polish (Modal already works; this elevates the feel)
Impact: medium (users notice modal motion every time)
Before: transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);
After: transition: transform { duration: spring.medium };
// stiffness:200 damping:25 for modal entries per emil-design-eng#spring-physics
Fix kind: codemod-todo (POLISH does not modify source; suggestion only)
Example: BENCHMARK against Linear
Input: A custom EmptyState component for the project's task list.
Output (5-dim radar):
CRAFT-B001 EmptyState component scored against Linear empty list exemplar
philosophicalCoherence: 80 [high] "Restraint aligns with declared minimal aesthetic."
hierarchy: 65 [medium] "Heading and body OK; action button competes
with secondary 'Learn more' link."
craftExecution: 55 [medium] "Generic illustration; Linear uses subtle line art
matching their monochromatic palette. Missing the
'breathing room' Linear gets via 64px vertical padding."
function: 85 [high] "Action is clear and verb-led."
innovation: 50 [low] "Standard 4-part anatomy; not differentiated."
Overall: 67 [medium confidence]
Gaps:
- "Reduce the empty-state to one CTA — the secondary link adds noise"
- "Replace stock illustration with a custom line art aligned to brand"
- "Increase top padding from 32px to 56px+ to match the breathing-room pattern"
Exemplars cited: exemplar-linear-empty-list
Gates
- No assertion of "stunning" without LLM judgment. This skill is LLM-judgment-based; if no LLM provider is configured, halt with explanatory error — do not degrade to rule-based output.
- Deep mode requires playwright + vision-capable LLM. If either is missing, surface to user with the documented fallback path (code-only mode); do not silently degrade.
- No autofix. POLISH emits suggestions only; source files are never modified.
- Confidence is honest. Low-confidence outputs MUST be emitted (with the low-confidence flag) — never silently upgraded.
- B' deferral honored. When
design.craft.enabled = true and DESIGN.md declares an anti-pattern matching a CRITIQUE finding, defer to harness-design; never double-count.
Escalation
- When deep mode renders fail (component not reachable via URL). Emit a "render-unreachable" finding for the affected component, fall back to fast mode for that component, continue the audit. Do not abort.
- When the vision-LLM rejects the screenshot (size, content, format). Log the rejection; downgrade that component's run to fast mode; do not abort.
- When LLM cost exceeds the configured per-audit budget. Halt the audit, emit findings collected so far, report the cost overrun. Do not retry. Config:
design.craft.llm.maxCostUsd (default unset = no cap).
- When the catalog is empty or unloadable. Halt with explanatory error pointing to
agents/skills/shared/design-knowledge/craft-{rubrics,patterns,exemplars}/. Do not synthesize findings without the catalog.
- When B' detect-and-offer produces an offer the user declines. Run in generic-craft mode (no AestheticIntent context); note the degraded quality in summary. User can re-invoke with
autoCapture: skip to suppress future offers.
- When the same finding-shape recurs across many audits (signal feedback loop). Auto-export a candidate pattern proposal to
.harness/design-craft/proposals/ after N≥design.craft.signal.proposalThreshold recurrences; require human review before promotion to the catalog.
- When a graph operation fails. Skip graph integration for that run; emit findings to the report only. Log a warning that
VIOLATES_CRAFT edges + CRAFT_SCORE nodes were not persisted.
Status
v1 — in implementation. See:
- Spec:
docs/changes/design-pipeline/design-craft-elevator/proposal.md
- Plan:
docs/changes/design-pipeline/design-craft-elevator/plans/2026-05-23-design-craft-elevator-plan.md
- Finding codes:
docs/changes/design-pipeline/design-craft-elevator/finding-codes.md
- Contribution guide:
docs/changes/design-pipeline/design-craft-elevator/contribution.md
- Growth trajectory:
docs/changes/design-pipeline/design-craft-elevator/growth-trajectory.md
- Roadmap entry: part of the
design-pipeline initiative in docs/roadmap.md
- Prior-art references:
docs/changes/design-pipeline/REFERENCES.md tier-1 entries (impeccable, emil-design-eng, huashu-design)
1---2name: harness-design-craft3description: Harness Design Craft4---5# Harness Design Craft67> LLM-judgment-based design ceiling-raiser. Three branchable phases — CRITIQUE finds what's mediocre, POLISH applies high-craft moves, BENCHMARK scores against curated exemplars. The ceiling counterpart to harness-design (declared-intent enforcement, rule-based) and the design-pipeline floor audits.89## When to Use1011- Reviewing UI for craft elevation opportunities the rule-based skills can't surface ("hierarchy is muddy here," "loading spinner where a content-matched skeleton would fit")12- After harness-design has captured intent and basic checks pass — go from "consistent" to "stunning"13- Before launching customer-facing surfaces — visual judgment beyond consistency14- During design-engineering work — POLISH phase suggests concrete craft moves with before/after sketches15- For competitive benchmarking — BENCHMARK scores how close you are to Linear / Stripe / Raycast tier16- When `on_new_feature` fires AND the feature touches design surface17- NOT for declared-anti-pattern enforcement (use harness-design)18- NOT for component anatomy completeness (use audit-component-anatomy)19- NOT for token validation (use harness-design-system)20- NOT for accessibility (use harness-accessibility)21- NOT for code generation from scratch (use v0 / bolt.new / Lovable — different tool class)2223## Capability Roles2425<!-- Capability seam: this skill participates in a real extension point whose three roles are named and concrete. A seam with only one role filled is accidental single-implementation lock-in. See harness-skill-authoring Phase 1C. -->2627- **Defines (Service Definition):** the shared craft critique contract (`packages/cli/src/shared/craft/`) — `LlmProvider` + finding/axes schema + run store — shared across all `*-craft` skills. This skill implements, and does not own, that contract.28- **Provides (Provider):** **this skill** — a design ceiling critique/polish/benchmark implemented over the shared contract (`packages/cli/src/design-craft/`).29- **Consumes (Consumer):** `craft-fleet` (the craft-pipeline elevation sweep) and the `harness` natural-language router, which invoke every `*-craft` provider uniformly through the shared critique/finding shape. It is also dispatched by `harness-design-pipeline` in the FILL phase; note it is **not** a formal `Verifier<F>` provider — its output shape differs, so it is dispatched rather than registered in the verifier seam3031## Process3233### Argument Resolution3435- `mode`: `"fast"` (code-only LLM, cheap, default) or `"deep"` (rendered + vision-LLM, ceiling-raising, requires playwright + vision-capable model)36- `phases`: subset of `critique`, `polish`, `benchmark`. Default: all three, sequenced.37- `autoCapture`: B' upgrade behavior. `"prompt"` (default — offer to chain to harness-design if preconditions missing), `"auto"` (chain without prompting), `"skip"` (run with generic-craft rubrics, no offer).38- `files`: optional scoping. Default: all components/pages discovered.3940### B' Precondition Check (every invocation)4142Before any phase runs, check four preconditions and offer to fulfill missing ones:4344| Precondition | Source | If missing |45| ---------------------------- | ----------------------------------------------- | -------------------------------------------------------------------- |46| `designMdExists` | `design-system/DESIGN.md` present | Offer to chain to harness-design (INTENT + DIRECTION) |47| `aestheticIntentDeclared` | DESIGN.md Aesthetic Direction section populated | Offer to chain to harness-design (INTENT) |48| `tokensExist` | `design-system/tokens.json` present | Note in summary; do not auto-chain (harness-design-system territory) |49| `componentRegistryPopulated` | DESIGN.md Component Registry section | Note in summary; falls back to export-name resolution |5051`autoCapture` controls behavior:5253- `prompt`: emit `upgradeOffer` interaction; pause for user choice54- `auto`: chain to harness-design transition automatically (for autopilot)55- `skip`: run with generic-craft rubrics (degrades quality but unblocks first-run)5657### Phase: CRITIQUE — Find what is craft-mediocre58591. **Identify targets.** Discover components (or pages, when scoped to pages) to critique. Apply `files` scoping if provided.60612. **Load critique rubrics.** Read from catalog (`catalog/rubrics/`). 10 rubrics in v1 covering: hierarchy clarity, typography craft, motion quality, color confidence, density rhythm, restraint, polish details, copy voice, interaction craft, brand coherence. Filter by `catalog.rubrics` config if set.62633. **For each target × each rubric, run an LLM critique pass:**64 - **Fast mode:** pass source code + rubric prompt + AestheticIntent (if present) to text LLM65 - **Deep mode:** render via playwright at three viewports (1440/768/375), pass screenshots + source + rubric prompt + AestheticIntent to vision-capable LLM66 - Parse response into 3-axis finding: `tier` (foundational/polish/aspirational), `impact` (small/medium/large), `confidence` (high/medium/low — essential for honest LLM output)67684. **Apply harness-design overlap deferral.** Per `design.craft.enabled = true`, when a CRITIQUE finding matches a declared anti-pattern in DESIGN.md, defer to harness-design (suppress this finding) and increment `meta.deferralsToHarnessDesign`.69705. **Compute derived `priority` field** for each finding (tier × impact × confidence-weighted score) for single-axis sorting when needed.7172### Phase: POLISH — Apply craft pattern library73741. **Load polish patterns.** Read from catalog (`catalog/patterns/`). 15 patterns in v1 across 5 categories: motion (3), skeleton (3), typography (3), interaction (3), layout (3). Filter by `catalog.patterns` config if set.75762. **For each target × each applicable pattern, evaluate fit:**77 - Match pattern's `applicableTo` criteria (jsx-attribute, css-property, component-type, etc.)78 - LLM judgment: would applying this pattern improve craft here?79 - If yes: produce 3-axis finding with `before` and `after` content (codemod-TODO sketch, not actual edit)80813. **No source modification.** POLISH only emits suggestions with before/after sketches. The user applies via codemod tools or by hand.8283### Phase: BENCHMARK — Score against curated exemplars84851. **Load exemplar corpus.** Read from catalog (`catalog/exemplars/`). 50 exemplars in v1 across 5 component types (EmptyState, LoadingState, ErrorState, Modal, Button — 10 each). Filter by `catalog.exemplars` config if set.86872. **For each target component, identify matching exemplars** by component-type tag (e.g., target is an EmptyState → load all 10 EmptyState exemplars).88893. **For each target × matching exemplars, run an LLM benchmark pass:**90 - **Fast mode:** structural comparison (code/markup/declared anatomy vs exemplar's reference markup) — limited but useful as a first signal91 - **Deep mode:** visual comparison via vision-LLM (target screenshot vs exemplar screenshot/URL)92 - Parse response into 5-dim radar: `philosophicalCoherence`, `hierarchy`, `craftExecution`, `function`, `innovation` — each with score (0-100), confidence, notes93 - Compute weighted `overall` score94 - Emit narrative `gaps` (where the target falls short of the best exemplars and why)95964. **Cite exemplars used.** Each `BenchmarkScore` lists `exemplars` (ids) consulted. Increment per-exemplar `citationCount` for measurement.97985. **Derive the award-tier verdict (machine-computed, not LLM-emitted).** Each `BenchmarkScore` carries an `awardBar` verdict — `cleared`, `not-cleared`, or `indeterminate` — derived in code from the radar plus the cited exemplars' reference scores, never emitted by the LLM. The bar is per-dimension: each dimension must reach `max(dimensionFloor, round(fraction × median(cited-exemplar references)))`. Any dimension whose confidence falls below the confidence floor forces `indeterminate` — a score the model is unsure about never certifies award tier. Tunable via `design.craft.benchmark.awardBar` (`dimensionFloor` default 80, `fraction` default 0.95, `confidenceFloor` default medium).99100 > **Scope:** the aesthetic radar certifies **desktop craft**. Mobile/responsive behavior is enforced separately by the responsive gate (next step), which can veto `cleared`.1011026. **Apply the responsive gate (mechanical, ADR 0085).** `awardBar.responsive` is a machine gate over mobile layout metrics: a `horizontal-overflow` or `unreachable-nav` (no visible nav AND no menu toggle) defect makes it `defective` and **vetoes `cleared` → `not-cleared`**, regardless of the aesthetic score. Supply per-target layout metrics via `responsiveMetrics` (e.g. from a Playwright MCP run) or a `responsiveProbeCommand` — a render step that prints a `ResponsiveMetrics[]` JSON manifest (the CLI ships no browser; a screenshot is insufficient — the gate needs `scrollWidth` / nav visibility). With no metrics the gate is `not-evaluated` and the aesthetic verdict stands; set `design.craft.benchmark.awardBar.responsive.require` to force `indeterminate` instead of a mobile-blind `cleared`.103104### Phase: REPORT — Format and persist outputs1051061. **Write to graph:** CRITIQUE/POLISH findings → `VIOLATES_CRAFT` edges via extended `DesignConstraintAdapter`. BENCHMARK scores → `CRAFT_SCORE` nodes attached to component nodes. All carry `runId` for check-design verifier fixpoint detection. Idempotent.1071082. **Format markdown report.** Grouped by component, with `CRAFT-*` codes linked to `finding-codes.md` and rubric/pattern/exemplar names linked to their catalog entries. Low-confidence findings visually distinguished (italic or `(low confidence:)` prefix).1091103. **Emit summary.** Total findings, breakdown by phase, mode (`fast`/`deep`), LLM cost (`llmCalls.{count, costUsd}`), catalog applied, deferrals to harness-design, precondition state.1111124. **Signal feedback.** Append to running aggregate: when the same finding-shape recurs N≥5 times across audits (config: `design.craft.signal.proposalThreshold`), emit a candidate pattern proposal to `.harness/design-craft/proposals/`.113114## Harness Integration115116- **`harness validate`** — Fast-mode CRITIQUE hook (subset of rubrics; opt-in). Findings respect `design.strictness`.117- **`mcp__harness__design_craft`** — Programmatic API. Consumed by harness check-design verifier and design-pipeline orchestrator. Phase selector exposed.118- **`harness-design`** — Soft dependency. B' progressive upgrade chains to it when AestheticIntent missing. Defers declared-anti-pattern findings to it.119- **`harness-design-system`** — Soft dependency. Token-related polish patterns enriched when tokens exist.120- **`DesignConstraintAdapter`** — Extended for `CRAFT-*` codes (CRAFT-C* critique, CRAFT-P* polish, CRAFT-B\* benchmark identifiers) + `CRAFT_SCORE` node type.121- **`packages/intelligence/`** — Wrapped by `llm/provider.ts` for vision-capable LLM calls. May need extension if no vision support today.122123## Success Criteria124125See `docs/changes/design-pipeline/design-craft-elevator/proposal.md` for the full 38 success criteria. Highlights:126127- Three phases independently invocable via `phases` arg128- 3-axis output for CRITIQUE/POLISH; 5-dim radar for BENCHMARK129- Confidence is honest (low-confidence findings emitted, not silently dropped)130- B' detect-and-offer works (preconditions detected, offer payload emitted, chain to harness-design honored)131- Seed catalog complete (10 rubrics + 15 patterns + 50 exemplars)132- Growth infrastructure operational (contribution validation, signal loop, usage measurement)133- Fast-mode ≤ 30s / 50 files; deep-mode ≤ 3min / 10 components134- LLM cost tracked per audit135136## Rationalizations to Reject137138These are common rationalizations that sound reasonable but lead to incorrect results. When you catch yourself thinking any of these, stop and follow the documented process instead.139140| Rationalization | Why It Is Wrong |141| --------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |142| "The screenshot looks stunning, so I will certify this component award-tier / `cleared`." | The `awardBar` verdict is machine-computed in code from the radar plus the cited exemplars' reference scores — never LLM-asserted. And the mechanical responsive gate can veto a strong aesthetic score to `not-cleared`. You emit dimension scores; the referee derives the verdict. |143| "The model is only medium-confident on craftExecution, but the visual is clearly strong, so I will upgrade it." | Any dimension whose confidence falls below the confidence floor forces `indeterminate` by design — a score the model is unsure about must never certify award tier. Silently upgrading confidence defeats the honesty the 3-axis output exists to preserve. |144| "POLISH found a better spring curve, so I will apply the codemod to the component." | POLISH emits before/after sketches only (`fix kind: codemod-todo`); it never modifies source. Applying the change yourself violates the no-autofix gate — the user applies via their own tools. |145| "No DESIGN.md aesthetic intent is declared, so I will skip this component." | The B' check degrades to generic-craft rubrics (or offers to chain to harness-design) — it never skips. Running with generic rubrics and noting the degraded quality is the documented fallback; abstaining abandons the ceiling role. |146| "This CRITIQUE finding matches a declared anti-pattern in DESIGN.md, but it is worth restating for emphasis." | When `design.craft.enabled` and DESIGN.md declares the matching anti-pattern, defer to harness-design and suppress the finding (increment `deferralsToHarnessDesign`). Restating double-counts what the rule-based floor already owns. |147148## Examples149150### Example: CRITIQUE finds hierarchy muddiness151152**Input:** A Dashboard.tsx page rendering three CTA buttons, all using the same `variant="primary"`.153154**Output (3-axis finding):**155156```157CRAFT-C001 [foundational | medium | high] Hierarchy muddy: three buttons compete for primary158 File: src/pages/Dashboard.tsx:88159 Rubric: hierarchy-clarity (rubric-hierarchy-clarity)160 Tier: foundational (this is "fix to be not-broken," not polish)161 Impact: medium (users can still complete tasks, but decision fatigue is real)162 Confidence: high (rule is unambiguous; LLM saw the three buttons + their identical styling)163 Priority: derived → 0.78164 Message: Three primary-variant buttons in the same view: "Save", "Export", "Share".165 No visual signal indicates which is the recommended action. Reduce to one166 primary; demote the others to secondary or ghost variant.167 Cite: rubric "hierarchy-clarity" / source: huashu-design#hierarchy168```169170### Example: POLISH suggests spring physics171172**Input:** A Modal.tsx using `transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1)`.173174**Output (3-axis finding with before/after):**175176```177CRAFT-P001 [polish | medium | high] Spring physics would feel more confident here178 File: src/components/Modal.tsx:42179 Pattern: spring-physics-microinteraction180 Tier: polish (Modal already works; this elevates the feel)181 Impact: medium (users notice modal motion every time)182 Before: transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);183 After: transition: transform { duration: spring.medium };184 // stiffness:200 damping:25 for modal entries per emil-design-eng#spring-physics185 Fix kind: codemod-todo (POLISH does not modify source; suggestion only)186```187188### Example: BENCHMARK against Linear189190**Input:** A custom EmptyState component for the project's task list.191192**Output (5-dim radar):**193194```195CRAFT-B001 EmptyState component scored against Linear empty list exemplar196197 philosophicalCoherence: 80 [high] "Restraint aligns with declared minimal aesthetic."198 hierarchy: 65 [medium] "Heading and body OK; action button competes199 with secondary 'Learn more' link."200 craftExecution: 55 [medium] "Generic illustration; Linear uses subtle line art201 matching their monochromatic palette. Missing the202 'breathing room' Linear gets via 64px vertical padding."203 function: 85 [high] "Action is clear and verb-led."204 innovation: 50 [low] "Standard 4-part anatomy; not differentiated."205206 Overall: 67 [medium confidence]207 Gaps:208 - "Reduce the empty-state to one CTA — the secondary link adds noise"209 - "Replace stock illustration with a custom line art aligned to brand"210 - "Increase top padding from 32px to 56px+ to match the breathing-room pattern"211 Exemplars cited: exemplar-linear-empty-list212```213214## Gates215216- **No assertion of "stunning" without LLM judgment.** This skill is LLM-judgment-based; if no LLM provider is configured, halt with explanatory error — do not degrade to rule-based output.217- **Deep mode requires playwright + vision-capable LLM.** If either is missing, surface to user with the documented fallback path (code-only mode); do not silently degrade.218- **No autofix.** POLISH emits suggestions only; source files are never modified.219- **Confidence is honest.** Low-confidence outputs MUST be emitted (with the low-confidence flag) — never silently upgraded.220- **B' deferral honored.** When `design.craft.enabled = true` and DESIGN.md declares an anti-pattern matching a CRITIQUE finding, defer to harness-design; never double-count.221222## Escalation223224- **When deep mode renders fail (component not reachable via URL).** Emit a "render-unreachable" finding for the affected component, fall back to fast mode for that component, continue the audit. Do not abort.225- **When the vision-LLM rejects the screenshot (size, content, format).** Log the rejection; downgrade that component's run to fast mode; do not abort.226- **When LLM cost exceeds the configured per-audit budget.** Halt the audit, emit findings collected so far, report the cost overrun. Do not retry. Config: `design.craft.llm.maxCostUsd` (default unset = no cap).227- **When the catalog is empty or unloadable.** Halt with explanatory error pointing to `agents/skills/shared/design-knowledge/craft-{rubrics,patterns,exemplars}/`. Do not synthesize findings without the catalog.228- **When B' detect-and-offer produces an offer the user declines.** Run in generic-craft mode (no AestheticIntent context); note the degraded quality in summary. User can re-invoke with `autoCapture: skip` to suppress future offers.229- **When the same finding-shape recurs across many audits (signal feedback loop).** Auto-export a candidate pattern proposal to `.harness/design-craft/proposals/` after N≥`design.craft.signal.proposalThreshold` recurrences; require human review before promotion to the catalog.230- **When a graph operation fails.** Skip graph integration for that run; emit findings to the report only. Log a warning that `VIOLATES_CRAFT` edges + `CRAFT_SCORE` nodes were not persisted.231232## Status233234**v1 — in implementation.** See:235236- Spec: `docs/changes/design-pipeline/design-craft-elevator/proposal.md`237- Plan: `docs/changes/design-pipeline/design-craft-elevator/plans/2026-05-23-design-craft-elevator-plan.md`238- Finding codes: `docs/changes/design-pipeline/design-craft-elevator/finding-codes.md`239- Contribution guide: `docs/changes/design-pipeline/design-craft-elevator/contribution.md`240- Growth trajectory: `docs/changes/design-pipeline/design-craft-elevator/growth-trajectory.md`241- Roadmap entry: part of the `design-pipeline` initiative in `docs/roadmap.md`242- Prior-art references: `docs/changes/design-pipeline/REFERENCES.md` tier-1 entries (impeccable, emil-design-eng, huashu-design)