Build
Production UI to the craft bar. This spine routes and carries the shared loop; the
craft itself lives in the reference files — load only what the mode needs.
The loop (every mode)
- Boundary — name the exact target, what must remain unchanged, and the surface's
job (persuade / operate / read / experience); read
DESIGN.md when present and
verify it against tokens, components, and rendered output. Read .product/approved/
for a record matching the target: an approved artifact ranks above your judgment and
below the user's words — implement to it, and state any deviation (constraint,
platform, accessibility) before making it, never as a silent improvement. Preserve
the incumbent identity: polish is refinement, never a concealed redesign.
- Evidence — read the real code and, where possible, the rendered result before
changing anything.
- Triage — fix in order: blocked tasks and inaccessible paths → missing states
and recovery → flow, hierarchy, responsiveness, drift → visual/copy/motion
inconsistencies → cleanup. Don't perfect one corner while the path stays below bar.
- Implement — complete fixes, in the project's stack and idiom.
- Verify — walk the whole path; check states, viewports, zoom, focus, semantics,
console, layout shift. At most two bounded visual rounds — no open-ended loop.
- Report — what changed, what was preserved, what remains, and the approved record
built against (with each stated deviation), when one exists.
Modes
| Mode |
When |
Load from references/ |
| craft (default) |
Components, polish, detail work, "feels off" |
craft/emil-craft.md for the canon; the domain folders as the work touches them: craft/ui/ (details: surfaces, icons, enter/exit), craft/layout/, craft/typography/, craft/colors/, craft/writing/ (each has index.md); craft/polish-lenses.md for trade-offs; craft/library-choices.md before adding a dependency |
| motion |
Animate, transition, gesture, "feels janky" |
motion/build.md + motion/recipes.md; motion/apple-design.md for gesture physics and fluid interfaces; motion/view-transitions/ for React's View Transition API; motion/perf-additions.md; motion/vocabulary.md to name an effect |
| a11y |
Make accessible, keyboard, screen reader, focus, forms |
a11y/index.md, then its files per subtopic |
| harden |
Production-ready, edge cases, real data, offline, metadata |
harden/index.md, harden/resilience-matrix.md, harden/adaptation-patterns.md, harden/performance-diagnostics.md, harden/metadata.md |
Generation guardrail: when writing new UI from scratch in any mode, also load
craft/generation-guardrails.md (terse MUST/NEVER rules).
Course preference: if references/course/ contains files, prefer them for their
topics — craft-design-rules.md and friends extend craft; the motion-* files extend
and deepen motion (CSS, Motion for React, gestures, scroll, debugging, performance,
reduced-motion snippets, and the motion-brief interview). They are a licensed local
install; never copy from them into tracked files.
Gates
- Redesign gate: changing the visual identity (fonts, palette, layout language) is
forbidden unless the user explicitly asked for a redesign. Only then load
craft/deslop-audit.md and work audit-first within the existing stack.
- Read-only requests are not this skill. "Review/audit/critique" → hand to
pe-review. Findings received from pe-review are implemented here at their stated
file:line.
House rules (bind every mode)
- Press scale is exactly
0.96.
- Spring bounce
0 unless the design direction's register is explicitly playful.
- Reduced motion means gentler-not-zero — keep opacity/color transitions.
- Exits use ease-out; accelerate-away only as a stated deliberate choice.
motion/view-transitions/css-recipes.md uses ease-in on several
::view-transition-old (exit) snippets and one enter — apply ease-out instead.
will-change only on observed first-frame stutter, never prophylactically.
- Custom easing from the named curves in the motion references — never invent
novel curves ad hoc.
- Stagger ~30–80ms between list items, ~100ms between semantic groups.
- Never disable submit buttons; validate on submit.
Name mapping
References that route to better-* skills by name resolve inside this skill:
better-ui → craft/ui/ · better-layout → craft/layout/ · better-typography →
craft/typography/ · better-colors → craft/colors/ · better-writing →
craft/writing/ · better-accessibility → a11y/ · better-interface → the pe-review
skill.
Handoffs
Verdicts and audits → pe-review. Proof that the built feature works, with recordings → pe-verify (the natural last step after harden). Direction, mockups, variations → pe-design. Standalone brand assets → pe-brand-assets. Documenting the
system you built → pe-design, understand mode.
1---2name: pe-build3description: Write and refine production UI code to a high craft bar. Use for building components, polish and detail work (spacing, typography, color, copy, icons, shadows, interaction states), implementing animation and gestures, implementing accessibility (keyboard, screen readers, focus, forms), and hardening for production (real data, failure states, devices, languages, offline, shipping metadata). Triggers on build, implement, polish, refine, tighten, "feels off", animate, transition, gesture, drawer, make accessible, keyboard navigation, production-ready, edge cases, empty states. The deliverable is code. Not for read-only critique (review) or pre-code design work (design).4license: Apache-2.05---67# Build89Production UI to the craft bar. This spine routes and carries the shared loop; the10craft itself lives in the reference files — load only what the mode needs.1112## The loop (every mode)13141. **Boundary** — name the exact target, what must remain unchanged, and the surface's15 job (persuade / operate / read / experience); read `DESIGN.md` when present and16 verify it against tokens, components, and rendered output. Read `.product/approved/`17 for a record matching the target: an approved artifact ranks above your judgment and18 below the user's words — implement to it, and state any deviation (constraint,19 platform, accessibility) before making it, never as a silent improvement. Preserve20 the incumbent identity: polish is refinement, never a concealed redesign.212. **Evidence** — read the real code and, where possible, the rendered result before22 changing anything.233. **Triage** — fix in order: blocked tasks and inaccessible paths → missing states24 and recovery → flow, hierarchy, responsiveness, drift → visual/copy/motion25 inconsistencies → cleanup. Don't perfect one corner while the path stays below bar.264. **Implement** — complete fixes, in the project's stack and idiom.275. **Verify** — walk the whole path; check states, viewports, zoom, focus, semantics,28 console, layout shift. At most two bounded visual rounds — no open-ended loop.296. **Report** — what changed, what was preserved, what remains, and the approved record30 built against (with each stated deviation), when one exists.3132## Modes3334| Mode | When | Load from `references/` |35| --- | --- | --- |36| **craft** (default) | Components, polish, detail work, "feels off" | `craft/emil-craft.md` for the canon; the domain folders as the work touches them: `craft/ui/` (details: surfaces, icons, enter/exit), `craft/layout/`, `craft/typography/`, `craft/colors/`, `craft/writing/` (each has `index.md`); `craft/polish-lenses.md` for trade-offs; `craft/library-choices.md` before adding a dependency |37| **motion** | Animate, transition, gesture, "feels janky" | `motion/build.md` + `motion/recipes.md`; `motion/apple-design.md` for gesture physics and fluid interfaces; `motion/view-transitions/` for React's View Transition API; `motion/perf-additions.md`; `motion/vocabulary.md` to name an effect |38| **a11y** | Make accessible, keyboard, screen reader, focus, forms | `a11y/index.md`, then its files per subtopic |39| **harden** | Production-ready, edge cases, real data, offline, metadata | `harden/index.md`, `harden/resilience-matrix.md`, `harden/adaptation-patterns.md`, `harden/performance-diagnostics.md`, `harden/metadata.md` |4041**Generation guardrail:** when writing new UI from scratch in any mode, also load42`craft/generation-guardrails.md` (terse MUST/NEVER rules).4344**Course preference:** if `references/course/` contains files, prefer them for their45topics — `craft-design-rules.md` and friends extend craft; the `motion-*` files extend46and deepen motion (CSS, Motion for React, gestures, scroll, debugging, performance,47reduced-motion snippets, and the motion-brief interview). They are a licensed local48install; never copy from them into tracked files.4950## Gates5152- **Redesign gate:** changing the visual identity (fonts, palette, layout language) is53 forbidden unless the user explicitly asked for a redesign. Only then load54 `craft/deslop-audit.md` and work audit-first within the existing stack.55- **Read-only requests are not this skill.** "Review/audit/critique" → hand to56 **pe-review**. Findings received from pe-review are implemented here at their stated57 file:line.5859## House rules (bind every mode)6061- Press scale is exactly `0.96`.62- Spring bounce `0` unless the design direction's register is explicitly playful.63- Reduced motion means gentler-not-zero — keep opacity/color transitions.64- Exits use ease-out; accelerate-away only as a stated deliberate choice.65 `motion/view-transitions/css-recipes.md` uses `ease-in` on several66 `::view-transition-old` (exit) snippets and one enter — apply ease-out instead.67- `will-change` only on observed first-frame stutter, never prophylactically.68- Custom easing from the named curves in the motion references — never invent69 novel curves ad hoc.70- Stagger ~30–80ms between list items, ~100ms between semantic groups.71- Never disable submit buttons; validate on submit.7273## Name mapping7475References that route to `better-*` skills by name resolve inside this skill:76better-ui → `craft/ui/` · better-layout → `craft/layout/` · better-typography →77`craft/typography/` · better-colors → `craft/colors/` · better-writing →78`craft/writing/` · better-accessibility → `a11y/` · better-interface → the pe-review79skill.8081## Handoffs8283Verdicts and audits → **pe-review**. Proof that the built feature works, with recordings → **pe-verify** (the natural last step after harden). Direction, mockups, variations → **pe-design**. Standalone brand assets → **pe-brand-assets**. Documenting the84system you built → **pe-design**, understand mode.