--- name: doctrine-gauntlet description: Use when the user asks for web design or front-end visual work done with the doctrine or "the gauntlet": building or restyling pages, heroes, landing pages, and design-system cards with builder/critic pairs that judge rendered output against a reference, red-teaming, and looping until the work eclipses it. --- # Doctrine Gauntlet Web design under the doctrine, run as a gauntlet: sections are built by agents and judged by harsh critics that **render them and look at them**, blind, beside the reference. Visual work only — application logic behind the page is `doctrine-code`. **REQUIRED BACKGROUND:** Read the `doctrine` skill first. Mapping onto its posture: - A **phase** is a **page** (or one design-system card). Multi-page work = one phase per page. - A **wave** is the builder/critic pairs inside that phase, one pair per **section** (hero, nav, feature blocks, pricing, footer). - **Native checks** (doctrine step 3) = the technical floor below, **plus every check the project itself documents as a gate** — typecheck, build, tests, linters, schema and content checks, probes — whatever its `CLAUDE.md`, README, review doc **or task runner** lists, **whether or not the project compiles**. Read `package.json` scripts or their equivalent directly: one site's copy-law gate — the bound design system's own law, wrapped for this repo — appeared in the deliverable's README not at all and in its CI not at all, so "prefer what CI invokes" argues against finding it — while the sibling system's own `CLAUDE.md` documented it plainly. Read both sides: a gate the deliverable hides is often the bound system's, documented where the bound system documents things. A restyle can break types while rendering perfectly; a screenshot will never show it, so a green floor over a red build is not a clean pass. Three things to know, all met live. A project with **no build step still has gates** — a static design system's copy linter and ruling-probes are its entire mechanical review, and naming native checks after compiler nouns reads every one of them out of the run. And **a declared script can be interactive**: `"test": "vitest"` is watch mode and never returns, so confirm a command exits before you run it as a gate. **And a declared script can need an environment it does not carry**: run each gate in the form its documentation gives it — env prefix, flag and all — because a cross-repo gate is commonly documented as `VAR= npm run