Use when an existing UI artifact needs to be iterated to a verified 5/5 design score. Enumerate every view, run independent dead-item and design-rubric audit...
---
name: design-eval-loop
description: |
Use when an existing UI artifact needs to be iterated to a verified 5/5 design score. Enumerate every view, run independent dead-item and design-rubric audits, apply fixes, then re-score with fresh reviewers until every view and the whole app pass. Designed for Enterprise Crew/OpenClaw operators finishing prototypes without false 5/5 claims.
triggers:
- "design eval"
- "score it till 5/5"
- "loop till 5/5"
- "design eval loop"
- "rate every page"
- "no dead links"
- "no dead items"
- "audit every view"
- "polish to 5/5"
version: 1.0.0-ec.1
author: Book / Enterprise Crew
license: MIT
source: open-design/skills/design-eval-loop
metadata:
hermes:
tags: [design, qa, ui, evaluation, openclaw, enterprise-crew]
related_skills: [browser-testing-with-devtools, dogfood, manual-human-qa, publish-skill]
od:
mode: utility
---
# Design Eval Loop
Drive an existing UI artifact to a **verified 5/5** on a current design rubric.
The engine is a per-view loop: **enumerate → audit + score (parallel sub-agents)
→ fix → re-score**, repeated until every view passes, then once more for the
whole app. It is a finishing pass — the artifact must already exist.
This skill exists to stop two failure modes: shipping **dead controls** (links
and buttons that go nowhere) and claiming a **false 5/5** without evidence.
## EC public-safety note
This skill is safe to publish as a generic workflow. Do not include private product names, customer data, internal screenshots, private URLs, or local filesystem paths in public scorecards. For public release, run the publish-skill sanitizer before sending the bundle to GitHub, SuperAda, or ClawHub.
## When to use
- "Score this and keep improving until it's 5/5 on the design eval."
- "Make sure every page is linked — no dead items."
- "Run sub-agents over every view and rate them till they pass."
Not for: building the artifact from scratch (build it first), or a one-line
visual tweak (just make the edit).
## Inputs to lock before looping
1. **Target file(s)** — which artifact(s). If multiple builds exist, confirm
whether the loop runs on one or all of them; they are separate files and
each needs its own pass.
2. **View inventory** — the full list of distinct views/screens/panels/overlays.
Derive it from the file, don't guess. State the count aloud (e.g. "20 views").
3. **Rubric** — default to `references/rubric.md`. Honor any dimension the user
names explicitly (e.g. "2026 best practices", "WCAG AA").
4. **Pass bar** — default **5.0/5 per view, then 5.0/5 whole-app**. The user may
relax it (e.g. "≥4.5 is fine").
## The loop
Plan it with TodoWrite first — one todo per phase, plus the iteration cap.
### Phase 1 — Enumerate
List every view and every interactive element. A view is any distinct
surface: home, drawer, sheet, overlay, settings list, and **each** detail
panel. Detail panels are views too — don't fold them into one line.
### Phase 2 — Audit + score in parallel
For each round, spawn **two sub-agents at once** (one message, two `Agent`
tool calls) so they don't collide on the file:
- **Agent A — Dead-item audit.** Crawl every clickable element; report any that
navigate nowhere, have no handler, or give no feedback. Output: a list of
dead items with selector + expected destination.
- **Agent B — Design eval.** Score every view against `references/rubric.md`,
0–5 per dimension, with a one-line reason per sub-score and the specific
blocker keeping each view under the bar.
Use the prompt templates in `references/sub-agent-prompts.md` verbatim; they
force structured, file-grounded output instead of vibes.
### Phase 3 — Fix
Apply the highest-impact findings first: real bugs (undefined tokens, occluded
panels, wrong z-index), then dead items, then the lowest-scoring rubric
dimensions. Fix in the canonical file. After edits, run a static integrity
check (balanced tags/braces/parens, every panel defined, every row mapped).
### Phase 4 — Re-score
Re-run Agent B (a fresh agent — don't trust the fixer's self-report) on the
changed views. Record the delta in a scorecard. Repeat Phases 2–4 per view
until it hits the bar.
### Phase 5 — Whole-app pass
Once every view passes individually, score the **whole app** as one experience
(cross-view consistency, shared theme, navigation coherence, no orphan
surfaces). Iterate until the whole-app score hits the bar.
## Convergence and escape hatches
- **Iteration cap:** max **4 rounds per view** and **3 whole-app rounds**. If a
view won't reach the bar within the cap, stop and report the exact remaining
blocker — do not loop on cosmetics.
- **Honesty gate (non-negotiable):** never claim 5/5 without a fresh scoring
agent confirming it. If the real ceiling is structural (e.g. native-control
rewrite, focus-trap) and out of scope, say so and report the true score
rather than rounding up. A reported 4.6 with a named gap beats a fabricated 5.
- **User break:** the user can stop the loop at any round; report current state.
## Output each round
Emit a compact scorecard table (view → before → after) plus an
`<od-card type="verify-scorecard">` covering the dead-item and rubric checks.
End with: which views pass, which don't, the named blocker for any that don't,
and the next round's target.
## Hard rules
- **Parallel, not serial:** Agent A and Agent B launch in the same message.
- **Re-score with a fresh agent:** the agent that fixed the code does not grade
its own work.
- **Every link opens somewhere:** zero dead items is a P0, not a nice-to-have.
- **Detail panels count as views.** A 5/5 on the shell with unscored panels is
not a 5/5.
- **One canonical file is the source of truth** — edits land there, not in chat.
## References
- `references/rubric.md` — the scoring dimensions, weights, and 5/5 bar.
- `references/sub-agent-prompts.md` — paste-ready prompts for Agent A and Agent B.
don't have the plugin yet? install it then click "run inline in claude" again.
expanded intent into a clear one-paragraph skill statement, extracted all implicit inputs (artifact path, view inventory, rubric, pass bar, iteration caps, reference materials) into a dedicated inputs section with setup guidance, numbered the procedure steps 1-8 with explicit inputs and outputs per step, added a decision-points section covering artifact selection, rubric validation, inaccessible views, iteration caps, user stops, zero defects detection, and artifact deployment, formalized output contract with round headers and scorecard format, clarified outcome signal with success and failure cases, and preserved original author attribution and all hard rules from the source.
use this skill to iteratively drive an existing ui artifact from its current state to a verified 5/5 design score. the artifact must already exist (code, figma file, prototype, or live build). enumerate every distinct view and interactive element, run parallel dead-item and design-rubric audits, apply fixes to the canonical source, then re-score with fresh agents until every view and the whole app pass the bar. use it to ship with zero dead controls and with honest scoring backed by evidence, not vibes.
before starting the loop, lock down these inputs:
target artifact(s)
view inventory
design rubric
references/rubric.md. the rubric must define all scoring dimensions (e.g. visual hierarchy, spacing, contrast, state feedback, accessibility), the 0-5 scale per dimension, and the calculation of per-view and whole-app scores.pass bar
iteration caps
reference materials
references/sub-agent-prompts.md: paste-ready prompts for the dead-item auditor (agent a) and design evaluator (agent b). use verbatim; do not paraphrase.references/rubric.md: the scoring dimensions and weights.external connections
write a plan in todowrite. create one todo per phase (enumerate, audit+score, fix, rescore, whole-app). add a final todo for "review and sign off". above the todos, note the iteration cap (4 per view, 3 whole-app). nail the view count in the plan.
phase 1: enumerate. list every view by name and description. a view is any distinct surface: home screen, drawer, modal, sheet, overlay, settings panel, and every detail panel or sub-screen. do not collapse a detail panel into its parent. count and state aloud (e.g. "enumerated 22 views"). output: a numbered list with view name and one-line description per view.
phase 2: audit and score in parallel. for each iteration round, launch two sub-agents in a single message (two agent tool calls, zero wait between). do not let them run sequentially.
references/sub-agent-prompts.md for the dead-item auditor. input: the artifact file or url, the view inventory from step 2, and the definition of "dead item" (a clickable element with no handler, no navigation target, no visible state feedback, or navigation to undefined/missing location). output: a structured list of dead items, each with selector/element id, expected vs. actual behavior, and impact (blocker or low priority).references/sub-agent-prompts.md for the design evaluator. input: the artifact file or url, the view inventory, and references/rubric.md. output: a scored table with one row per view, columns for each rubric dimension, a 0-5 score per dimension, a one-line reason for each sub-score, the per-view average, and the specific blocker keeping that view below the pass bar.phase 3: fix. collect the outputs from agents a and b. prioritize fixes in this order: (i) real bugs (undefined design tokens, occluded panels, z-index collisions, missing handlers), (ii) dead items, (iii) rubric gaps (lowest-scoring dimensions first). apply fixes to the canonical file only. after each fix, run a static integrity check (balanced brackets/braces/tags, all panels declared, all rows mapped, no orphan elements). document each fix with a one-line summary in a fix log.
phase 4: re-score changed views. launch a fresh agent (agent c, not the same agent that fixed) with the same design-eval prompt from references/sub-agent-prompts.md. input: the artifact file with fixes applied, the list of views that were modified in phase 3, and references/rubric.md. output: a before-after scorecard showing delta per dimension per changed view. do not trust the fixer's self-report; the re-scorer is independent.
phase 5: check convergence per view. for each view, compare the re-score (phase 4) to the pass bar (from inputs). if the view hits the bar, mark it pass and move on. if it does not hit the bar and the view has not yet hit the 4-iteration cap, loop back to phase 2 for that view only (re-audit, re-fix, re-score). if the view hits the cap, stop and report the true score and the named remaining blocker (do not round up). record which views pass and which do not after this round.
phase 6: whole-app pass. once every individual view reaches the pass bar, score the app as one unified experience. input: the entire artifact, the context of all individual view scores, and references/rubric.md but applied to cross-view consistency (shared design theme, navigation coherence, orphan-free surface list, internal link integrity, state sync across views). launch a fresh agent to score the whole app. output: a single score with per-dimension breakdown and blockers. if the whole-app score hits the pass bar, declare the loop complete. if not and the whole-app iteration cap (3 rounds) is not exhausted, loop back: identify the highest-impact blocker, fix it across all affected views, re-score the whole app. repeat until the whole-app score hits the bar or the cap is reached.
emit final scorecard and sign-off. output a compact table: view name, individual-view initial score, final score, pass/fail, named blocker if fail. below the table, emit a single whole-app score and pass/fail. include the dead-item audit result: count of dead items found and fixed per round, final count (target: zero). include a notes field with any structural gaps that could not be fixed within scope (e.g. "native control rewrite required", "focus-trap implementation out of scope"). if all views and the app pass the bar, sign the scorecard "verified 5/5, [date], [agent name]". if not, sign it with the true ceiling and the blocker.
if multiple artifacts are in scope: confirm which one(s) get the loop. if the user says "all of them," run the full loop per artifact sequentially, keeping separate scorecards. do not merge scores.
if the rubric is not provided or found: ask the user for the rubric url or file path. if none exists, create a minimal rubric on the spot (visual hierarchy, spacing, contrast, state feedback, accessibility) and confirm it with the user before phase 2.
if a view is inaccessible or cannot be rendered (404, permission denied, broken build): report it immediately. do not skip it. offer to loop on a different artifact or to wait for the artifact to be fixed.
if a view hits the 4-iteration cap without reaching the pass bar: stop iterating on that view. report the true final score, the named blocker, and whether it is a cosmetic gap (fixable in a later pass) or a structural gap (out of scope). do not round up the score.
if the whole-app score hits the 3-iteration cap without reaching the bar: stop the loop. report the true whole-app score, the named blocker, and offer a retro to discuss scope or timeline. do not claim 5/5.
if the user requests to stop the loop mid-round: halt immediately. output the current state (which views pass, which don't, latest scores, any in-flight fixes), and offer to resume.
if dead-item audit finds zero dead items and design eval shows all views at 5/5: declare the loop converged. emit the scorecard and move to sign-off.
if the artifact is a live product and fixes require a deploy: confirm the user has write access to the canonical source and a path to deploy before fixes land. do not fix-in-chat without the user confirming the changes will be applied to the actual artifact.
each round must emit:
all output must be file-grounded: every claim must cite the view, the rubric dimension, and the specific element or section in the artifact that is being scored or fixed.
the skill is complete and successful when:
success = verified 5/5 on every view and the whole app, zero dead items, honest scoring with evidence, and user sign-off.
failure / incomplete: