ui-craft v0.35.0
Closes the gap between "technically correct" builds and surfaces that feel intentional. Product apps (dashboards, auth, settings) and marketing surfaces (landings, portfolios) are both first-class — not either/or.
New reference: craft-intent.md — Craft Read (one-line creative thesis before code), DESIGN_VARIANCE knob (separate from density), mandatory signature bet on every /craft, product + marketing build patterns, rotation policy when no brand exists.
New commands: /bolder and /quieter — adjust variance and motion amplitude without a full rebuild.
Recipe wiring: recipe-dashboard.md, recipe-landing.md, and recipe-auth.md now load craft-intent defaults (variance 4 / 7 / 4), declare Craft Read in the acceptance bar, and gate signature bets on the first pass.
Themes: themes.md gains an accent rotation table (indigo, teal, rose, amber, forest) for builds without brand direction.
Eval: evals/quality/fixtures/designer/product-shell.tsx — production-shell patterns in the designer corpus. evals/quality/fixtures/slop/auth-brand-flood.tsx — the recognizable AI auth screen. evals/craft-quality/PROMPTS.md — manual blind-build prompts for local auditor regression (Track A product + Track B marketing).
CI: scripts/check-mirror-copies.mjs — drift guard for skills/ + commands/ ↔ harness mirrors (runs in validate.yml alongside agent copy guard).
End-to-end alignment (same release): /polish and /typeset now verify/strengthen the signature built at /craft first pass instead of owning it; /sddesign Gate 4 declares the Craft Read as part of the build contract; /finalize gains Step 3b — a craft-intent check (signature present, variance matches surface, Craft Read honored) issuing Major findings on full surfaces. MCP acceptance_bar adds dash-11 / land-11 / auth-09 craft items.
Detector (ui-craft-detect v0.11.0, 38 rules): seven new majors. Auth tells — copy/or-divider-caps (caps "OR" between auth options; skips <option>/<abbr>) and auth/brand-flood-panel (full-height saturated accent panel in a file with a password input). Marketing production tells — layout/eyebrow-flood (4+ uppercase wide-tracked micro-labels in one file; table headers exempt), copy/scroll-cue ("Scroll to explore" and arrow variants), copy/section-number-eyebrow (zero-padded section counters like "01 · About"; dates exempt), and copy/duplicate-cta-intent (two labels wearing one intent — "Get in touch" + "Let's talk"). All mirrored in the SKILL.md Anti-Slop list.
Marketing craft rules (production-tell hardening): recipe-landing.md gains hero discipline (≤4 text elements, ≤20-word subtext, logo wall below the hero, top-padding cap, no scroll cues or version badges), a layout-family budget (family appears once per page, ≥4 families per 8 sections, ≤2 consecutive image+text splits), an eyebrow budget (≤ ceil(sections/3), mechanical count), and an imagery mandate (real assets → generation tool → labeled placeholder slots; never div-built fake screenshots; logo walls are real SVG marks). copy.md gains one-label-per-intent CTAs, the CTA one-line rule, fake-precise-number discipline, and a pre-ship Copy Self-Audit (broken/forced-clever strings, separator flooding). /finalize gains Step 3c (copy self-audit + mechanical eyebrow/layout/CTA counts on marketing surfaces). MCP acceptance_bar adds land-12 through land-15.
Expressiveness (marketing surfaces): color.md gains the Commitment Axis — restrained / committed / full-palette / drenched color strategies gated by DESIGN_VARIANCE, so landings can commit to color instead of always hedging at 90% neutral. craft-intent.md adds a second-order lane check (reject aesthetic lanes guessable from the category alone), an imagery rule, an ecosystem-brief rule (use the official design system when the platform mandates one), and premium-palette-family rotation. typography.md adds a voice-driven display-font selection procedure with rotation (safe sans list is a product-shell default, not a marketing display pick) and italic descender clearance. themes.md adds six premium palette families rotating away from the default warm-beige + brass. stack.md adds canonical GSAP sticky-stack and horizontal-pan skeletons (start: "top top" pin fix).
Eval additions: evals/quality/fixtures/slop/landing-template-tells.tsx — the templated AI landing (eyebrow flood, numbered eyebrows, scroll cue, duplicate CTA intent) scoring 68; baseline band added; blind-build prompts extended with hero-discipline, eyebrow-count, and imagery checks.
Agent edit-time hooks (ui-craft-detect hooks): the detector now installs itself into the agent loop, not just pre-commit/CI. hooks install writes merge-safe, idempotent manifests for Claude Code (.claude/settings.json PostToolUse, matcher Edit|Write|MultiEdit) and Cursor (.cursor/hooks.json afterFileEdit, schema v1); hooks uninstall/hooks status manage them. The hook-run runner reads the harness event JSON from stdin, scans only the edited file, and exits 2 with a compact findings summary on critical/major findings — Claude Code feeds that straight back to the model mid-task. Silent on clean edits and warn-level findings; fails open on internal errors so a broken hook never stalls an agent.
Live URL scanning: ui-craft-detect https://… scans a deployed page. Uses puppeteer (optional dependency, dynamic import — core stays zero-dep) to scan the JS-rendered DOM when installed, falling back to static fetch of the server-rendered HTML otherwise; --engine auto|puppeteer|fetch forces a choice. Findings report the URL as the file. --json and --fail-on work as usual; file-oriented flags (--fix, --scope, --sarif) are rejected up front.
Calibration + ecosystem interop: craft-intent.md now names the three default AI looks (warm-cream + serif + terracotta; near-black + acid accent; broadsheet hairline zero-radius) as lanes that are only valid when the brief asks for them, and adds the similar-prompt self-test ("would I produce this same plan for a different brand in this category?"). /craft Step 4 gains a visual self-check — screenshot the built surface when a browser tool is reachable and re-run the self-test against the render. copy.md adds action-name continuity ("Publish" button → "Published" toast, same verb through the whole flow). SKILL.md Anti-Slop adds carousels without narrative purpose, app UI built from stacked cards, and em-dash floods — the last backed by a new detector major copy/em-dash-flood (3+ em dashes in visible text nodes of markup files; comments and plain .ts/.js never count). /start and /brief now detect and honor a root DESIGN.md/design-tokens.json (the emerging cross-agent design-contract convention) as brief + token input instead of duplicating it.
New command: /redesign — redesign without regression. Audits the existing surface first (detector on source or live URL), classifies what to preserve (brand equity, IA/SEO, content voice, conversion paths), picks the smallest sufficient scope (refresh → reskin → rebuild), then declares a Craft Read and modernizes lever by lever. Ships with the standard mirror set; /start and the SKILL.md routing table route "modernize this site" briefs to it.