brief — one conversation, every decision
Stage: Phase 1 — Understand - Reads: the user's prompt (invoke ultraweb:taste first) - Writes: design/BRIEF.md
Standard
A first-grade brief is decisive, specific, and complete:
- Decisive: zero open questions. No options deferred, nothing "for later".
direction, sitemap, copywriting, and every backend skill can run from this file without asking anything.
- Specific: it fails the swap test — swap in a competitor's name and the brief must break. "Audience: businesses" survives the swap and is therefore worthless.
- Complete: site type, audience, conversion, tone, pages, per-page content inventory, backend decision — all present, all committed.
- Lean: 40–80 lines. Every downstream phase re-reads this file; pad it and it stops being read.
Process
- Read the prompt twice. Extract every noun, constraint, and stated feature — nothing the user wrote may be dropped, softened, or contradicted.
- Classify the site type — one of: SaaS/product, portfolio/agency, e-commerce, editorial/content, local business, event, web app, docs. Record the energy budget
taste assigns it (SaaS: clarity + one wow; portfolio: spend boldly; e-commerce: imagery leads; editorial: type is 80% of the design; local business: warmth beats cleverness).
- Guided mode: run the scoping interview (next section) — the site type from step 2 picks which forks are worth asking. Fold every answer into the brief as a committed decision. Autonomous mode: skip; decide everything per "Decide, never interview" below.
- Name the audience as a person, not a demographic: "a 38-year-old head of ops comparing rostering tools on her phone between meetings" — never "businesses of all sizes". Add what she distrusts;
copywriting and social-proof build against it.
- Fix ONE primary conversion (book, buy, sign up, contact, subscribe) and at most one secondary. A page that serves neither does not exist.
- Choose tone: 3 specific adjectives + 1 tension pair ("warm but exact", "playful but competent"). Reject any adjective that fits every site — "modern", "clean", "professional" are bans, not tone words. Write one sample sentence in the voice.
- List pages — the fewest that serve the conversion; 1–5 covers most briefs. Do not invent About/Blog/Careers pages nobody asked for; do not collapse pages the prompt explicitly named.
- Build the content inventory per page: the facts, claims, numbers, names, and proof points
copywriting will need — opening hours, price points, team names, feature specifics, testimonial sources, stat claims. Where the prompt is silent, decide — but sort every invention into one of two classes and log it in §Assumed facts under that class. Creative assumptions (tone, visual direction, page structure, demo product names, copy angles) drive autonomous work freely. Material claims — opening hours, prices, addresses, delivery times, guarantees and refund terms, inventory, professional credentials, measured statistics — may be drafted as placeholders but are never production truth: log each ending — material, unconfirmed; it may render on a demo/staging build, and it BLOCKS a production ship until the user confirms or corrects it (ship greps the marker). An invented "open at 8" or "30-day refunds" harms a real visitor exactly like an invented testimonial. The invention license stops entirely at third-party proof: testimonials, reviews, press mentions, customer logos, and usage stats presented as measured are never invented — an empty proof inventory is recorded as empty, and social-proof builds honest credibility from it (or, on a build this brief explicitly marks demo/staging, labeled UNVERIFIED-PROOF samples). An invented endorsement logged in §Assumed facts is still a fabricated endorsement on the rendered page.
- Run the backend decision framework below. Record chosen Tier-6 skills AND rejected ones, each with a one-line reason.
- Write design/BRIEF.md in the format below. Grep it for
? — a question mark in the FILE is a defect in either mode; the interview happens in conversation, and its answers land as decisions.
The scoping interview — guided mode
The interview exists because two kinds of wrong assumptions are expensive: scope (a page or feature the user didn't want, or wanted and didn't get) and substance (selling the wrong thing to the wrong person). Those forks get asked; everything else still gets decided. Rules:
- Generated, never templated. Questions come from what THIS prompt left open, filtered through the site type. A prompt that already says "shop + subscriptions, German only" has answered those forks — asking again is noise.
- Multiple-choice, concrete options. Ask via the structured question tool (AskUserQuestion) — each question 2–4 real options a professional would shortlist, the recommended one first; the user can always free-type. Never open-ended "tell me about your business" essays.
- Ceiling: one round of up to four questions. A second round only if an answer opens a genuinely new fork (chose subscriptions → one follow-up on billing rhythm is legitimate). Two rounds is the hard stop.
- Only forks that change the build. If every option leads to the same site, the question is theater — cut it.
- Never aesthetics. Colors, fonts, style, "vibe" — banned. Phase 2's mockup round shows three real candidates; the user points instead of describing. An interview question about visuals steals that phase's job and does it worse.
Site-type fork banks (starting points, not scripts): e-commerce — catalog size, one-time vs subscription, own checkout vs external, shipping scope; SaaS/product — self-serve vs sales-led, public pricing, docs/changelog; local business — booking/reservations vs walk-in, languages, opening-hours source; portfolio/agency — index vs deep case studies, public vs gated/password-protected work, hireability CTA; editorial — cadence, authorship, newsletter capture; event — single date vs series, own registration vs ticket platform; web app — accounts from day one, what's saved per user; docs — versioning, search depth.
Answers become committed decisions in the brief, attributed plainly ("subscriptions: yes — user, interview R1"). Everything unasked follows the autonomous doctrine below.
Decide, never interview — autonomous mode (and everything unasked)
In autonomous mode the user's prompt WAS the interview: default question count zero, and the pipeline's single permitted question (root SKILL.md) is reserved for exactly one case — no professional could infer what the site is even for. And in BOTH modes, everything the interview didn't cover — name, pricing, tone, imagery, page structure, tech needs — you decide the way a studio would, then record it in §Assumed facts so the user can correct it after seeing the build. A wrong specific assumption costs one iterate pass; an exhaustive interview costs the premise of the harness. Specific-and-wrong beats vague-and-safe every time.
Backend decision framework
Map stated or implied features to Tier-6 skills. Take the cheapest set that fulfills the brief — every tier added is build time and failure surface. Ceiling for a brochure/marketing site: server-actions + email, nothing more.
| Brief says or implies |
Pull in |
Explicitly NOT |
| Contact / quote / booking-request form |
server-actions + email |
database — the recipient's inbox is the datastore |
| Newsletter signup |
server-actions + email |
database, unless the site itself manages subscribers |
| Blog, docs, changelog, case studies |
content-cms (MDX) |
a headless CMS, unless non-technical editors are stated |
| Accounts, login, anything saved per user |
auth + database |
— |
| Dashboards, comments, availability-aware booking, user-generated data |
database (+ auth in almost every case) |
— |
| Selling — one-time or subscription |
payments + database |
both, if "buy" is a link to an external checkout |
| User file uploads (avatars, attachments, submissions) |
storage |
— |
| Third parties calling in: webhooks, public API, a mobile client |
api-design |
route handlers for the site's own forms — server-actions owns those |
| "Ask anything" chatbot, AI assistant, AI/semantic search, generative UI |
Default reject — an AI-feature skill enters needs only with an accepted variant + reason logged |
any AI chat/search widget the brief doesn't demand — reflexive "every modern site has one" sprawl |
Write the outcome as two lists: Backend: needs (skill → the feature demanding it) and Backend: rejected (skill → one-line reason). The rejected list is what stops Phase 7 scope creep.
AI features are the one class that defaults to rejected: an assistant, chatbot, or AI/semantic search earns a place in needs only with an explicit variant and one-line reason, and a downstream AI-feature skill must find that acceptance logged here before it may build — it may never self-justify inclusion. Tidepool's B2B SaaS docs accept a grounded docs-RAG with inline citations; Ledger & Lane (law firm) rejects — unvetted legal answers are a liability and undercut the firm's authority; Casa Verde (restaurant) rejects — menu and hours change faster than any index, so stale answers erode trust.
BRIEF.md format
# Brief — <working site name>
Deployment mode: production
## Site type & energy budget
## Audience (one named persona: situation, device, what they distrust)
## Goals (primary conversion; secondary if any; what success means)
## Tone (3 adjectives + 1 tension pair; one sample sentence in the voice)
## Pages (each: name, route, job, which conversion it serves)
## Content inventory (per page: facts, claims, numbers, proof the copy needs)
## Compliance facts (see below — only for briefs naming a market/jurisdiction)
## Backend: needs (Tier-6 skill → the feature demanding it)
## Backend: rejected (Tier-6 skill → one-line reason it's out)
## Assumed facts (every invention, one line each, classed creative or material —
## material entries end with the material-unconfirmed marker from
## Process step 8 and block production until confirmed)
The skeleton shows the literal default (production); write staging or demo in its place only on the user's explicit request — never copy an options list into the file, the grammar takes exactly one value.
Deployment mode is a machine-read field, exactly the literal Deployment mode: production (or staging/demo) on its own line — the antislop hook, gate-content, and ship grep it to decide whether labeled UNVERIFIED-PROOF samples are lawful. Rules: exactly ONE such line; allowed values exactly those three; a missing, duplicated, or misspelled line fails BRIEF validation and every consumer fails closed to production semantics. Default is production; only an explicit user request makes a build staging/demo, and switching a demo build to production re-triggers proof and material-claims validation.
§Compliance facts exists so legal scoping happens where the facts are cheap (the user knows them) instead of being guessed at gate time. When the brief names a market or jurisdiction, record: seller's seat (country), targeted consumer markets, B2C or B2B, whether the site concludes consumer contracts online (shop/booking/ticketing — yes/no), employee count and turnover/balance relative to the €2M microenterprise thresholds, the evidence source for each (user statement vs assumed), and a counsel-needed: flag for anything asserted rather than known. sitemap consumes this to decide legal routes; gate-accessibility re-derives scope from the finished build and flags drift. These are user facts — ask for them in guided mode when a DACH/EU market is named; in autonomous mode record them as §Assumed facts entries with the counsel flag set.
Anti-patterns
Grep a finished BRIEF.md for these:
TBD, TODO, ?, to be decided, ask the user, depending on — questions live in the interview, never in the file; the finished brief defers to nobody, including future-you
- An interview question about colors, fonts, or style — that fork belongs to the mockup round, which shows instead of asking
- Re-asking something the prompt already answered, or a question whose every option builds the same site
modern, clean, professional, sleek as tone words — they describe nothing
various, etc., and more in a content inventory — the inventory exists so copywriting never improvises
- A
database for a contact form; auth "for later"; a CMS for a 3-post launch blog; an AI chat/search widget with no accepted-variant reason logged — backend maximalism
- Pages without a stated job ("About — about the company")
- An audience section that survives the swap test
- A stated user constraint silently dropped ("must be in German", "no stock photos")
Worked example — Framewalk, Steam-launch site for "Hollow Cartographer"
Moved to references/example.md — read only when this build's case is genuinely ambiguous; the sections above are the decision material.
Composes with
Moved to references/composes.md — the handoff map; load it when orchestrating this skill against its neighbors.
1---2name: brief3description: Expand a user prompt into design/BRIEF.md — the complete creative brief; site type and energy budget, a named audience persona, conversion goals, tone words with a tension pair, page list, per-page content inventory, and backend needs mapped to Tier-6 skills with an explicit rejected list. In guided mode (the default) it runs a short scoping interview whose questions are generated from what THIS prompt left open — site-type-specific forks about scope, features, and content, never aesthetics; in autonomous mode it decides everything a professional studio would decide itself. Either way it logs inventions as assumed facts and the finished file contains zero open questions. Invoke as Phase 1 of the ultraweb pipeline right after taste, whenever a build starts from a raw prompt ("build me a site for X", "create a landing page for Y", "make a website for my business"), or when any downstream skill finds design/BRIEF.md missing, stale, or incomplete.4---56# brief — one conversation, every decision78**Stage:** Phase 1 — Understand - **Reads:** the user's prompt (invoke `ultraweb:taste` first) - **Writes:** design/BRIEF.md910## Standard1112A first-grade brief is decisive, specific, and complete:1314- **Decisive:** zero open questions. No options deferred, nothing "for later". `direction`, `sitemap`, `copywriting`, and every backend skill can run from this file without asking anything.15- **Specific:** it fails the swap test — swap in a competitor's name and the brief must break. "Audience: businesses" survives the swap and is therefore worthless.16- **Complete:** site type, audience, conversion, tone, pages, per-page content inventory, backend decision — all present, all committed.17- **Lean:** 40–80 lines. Every downstream phase re-reads this file; pad it and it stops being read.1819## Process20211. Read the prompt twice. Extract every noun, constraint, and stated feature — nothing the user wrote may be dropped, softened, or contradicted.222. Classify the site type — one of: SaaS/product, portfolio/agency, e-commerce, editorial/content, local business, event, web app, docs. Record the energy budget `taste` assigns it (SaaS: clarity + one wow; portfolio: spend boldly; e-commerce: imagery leads; editorial: type is 80% of the design; local business: warmth beats cleverness).233. **Guided mode:** run the scoping interview (next section) — the site type from step 2 picks which forks are worth asking. Fold every answer into the brief as a committed decision. **Autonomous mode:** skip; decide everything per "Decide, never interview" below.244. Name the audience as a person, not a demographic: "a 38-year-old head of ops comparing rostering tools on her phone between meetings" — never "businesses of all sizes". Add what she distrusts; `copywriting` and `social-proof` build against it.255. Fix ONE primary conversion (book, buy, sign up, contact, subscribe) and at most one secondary. A page that serves neither does not exist.266. Choose tone: 3 specific adjectives + 1 tension pair ("warm but exact", "playful but competent"). Reject any adjective that fits every site — "modern", "clean", "professional" are bans, not tone words. Write one sample sentence in the voice.277. List pages — the fewest that serve the conversion; 1–5 covers most briefs. Do not invent About/Blog/Careers pages nobody asked for; do not collapse pages the prompt explicitly named.288. Build the content inventory per page: the facts, claims, numbers, names, and proof points `copywriting` will need — opening hours, price points, team names, feature specifics, testimonial sources, stat claims. Where the prompt is silent, decide — but sort every invention into one of two classes and log it in §Assumed facts under that class. **Creative assumptions** (tone, visual direction, page structure, demo product names, copy angles) drive autonomous work freely. **Material claims** — opening hours, prices, addresses, delivery times, guarantees and refund terms, inventory, professional credentials, measured statistics — may be drafted as placeholders but are never production truth: log each ending `— material, unconfirmed`; it may render on a demo/staging build, and it BLOCKS a production ship until the user confirms or corrects it (`ship` greps the marker). An invented "open at 8" or "30-day refunds" harms a real visitor exactly like an invented testimonial. **The invention license stops entirely at third-party proof:** testimonials, reviews, press mentions, customer logos, and usage stats presented as measured are never invented — an empty proof inventory is recorded as empty, and `social-proof` builds honest credibility from it (or, on a build this brief explicitly marks demo/staging, labeled `UNVERIFIED-PROOF` samples). An invented endorsement logged in §Assumed facts is still a fabricated endorsement on the rendered page.299. Run the backend decision framework below. Record chosen Tier-6 skills AND rejected ones, each with a one-line reason.3010. Write design/BRIEF.md in the format below. Grep it for `?` — a question mark in the FILE is a defect in either mode; the interview happens in conversation, and its answers land as decisions.3132## The scoping interview — guided mode3334The interview exists because two kinds of wrong assumptions are expensive: scope (a page or feature the user didn't want, or wanted and didn't get) and substance (selling the wrong thing to the wrong person). Those forks get asked; everything else still gets decided. Rules:3536- **Generated, never templated.** Questions come from what THIS prompt left open, filtered through the site type. A prompt that already says "shop + subscriptions, German only" has answered those forks — asking again is noise.37- **Multiple-choice, concrete options.** Ask via the structured question tool (AskUserQuestion) — each question 2–4 real options a professional would shortlist, the recommended one first; the user can always free-type. Never open-ended "tell me about your business" essays.38- **Ceiling: one round of up to four questions.** A second round only if an answer opens a genuinely new fork (chose subscriptions → one follow-up on billing rhythm is legitimate). Two rounds is the hard stop.39- **Only forks that change the build.** If every option leads to the same site, the question is theater — cut it.40- **Never aesthetics.** Colors, fonts, style, "vibe" — banned. Phase 2's mockup round shows three real candidates; the user points instead of describing. An interview question about visuals steals that phase's job and does it worse.4142Site-type fork banks (starting points, not scripts): **e-commerce** — catalog size, one-time vs subscription, own checkout vs external, shipping scope; **SaaS/product** — self-serve vs sales-led, public pricing, docs/changelog; **local business** — booking/reservations vs walk-in, languages, opening-hours source; **portfolio/agency** — index vs deep case studies, public vs gated/password-protected work, hireability CTA; **editorial** — cadence, authorship, newsletter capture; **event** — single date vs series, own registration vs ticket platform; **web app** — accounts from day one, what's saved per user; **docs** — versioning, search depth.4344Answers become committed decisions in the brief, attributed plainly ("subscriptions: yes — user, interview R1"). Everything unasked follows the autonomous doctrine below.4546## Decide, never interview — autonomous mode (and everything unasked)4748In autonomous mode the user's prompt WAS the interview: default question count zero, and the pipeline's single permitted question (root SKILL.md) is reserved for exactly one case — no professional could infer what the site is even for. And in BOTH modes, everything the interview didn't cover — name, pricing, tone, imagery, page structure, tech needs — you decide the way a studio would, then record it in §Assumed facts so the user can correct it after seeing the build. A wrong specific assumption costs one `iterate` pass; an exhaustive interview costs the premise of the harness. Specific-and-wrong beats vague-and-safe every time.4950## Backend decision framework5152Map stated or implied features to Tier-6 skills. Take the cheapest set that fulfills the brief — every tier added is build time and failure surface. Ceiling for a brochure/marketing site: `server-actions` + `email`, nothing more.5354| Brief says or implies | Pull in | Explicitly NOT |55|---|---|---|56| Contact / quote / booking-request form | `server-actions` + `email` | `database` — the recipient's inbox is the datastore |57| Newsletter signup | `server-actions` + `email` | `database`, unless the site itself manages subscribers |58| Blog, docs, changelog, case studies | `content-cms` (MDX) | a headless CMS, unless non-technical editors are stated |59| Accounts, login, anything saved per user | `auth` + `database` | — |60| Dashboards, comments, availability-aware booking, user-generated data | `database` (+ `auth` in almost every case) | — |61| Selling — one-time or subscription | `payments` + `database` | both, if "buy" is a link to an external checkout |62| User file uploads (avatars, attachments, submissions) | `storage` | — |63| Third parties calling in: webhooks, public API, a mobile client | `api-design` | route handlers for the site's own forms — `server-actions` owns those |64| "Ask anything" chatbot, AI assistant, AI/semantic search, generative UI | **Default reject** — an AI-feature skill enters `needs` only with an accepted variant + reason logged | any AI chat/search widget the brief doesn't demand — reflexive "every modern site has one" sprawl |6566Write the outcome as two lists: **Backend: needs** (skill → the feature demanding it) and **Backend: rejected** (skill → one-line reason). The rejected list is what stops Phase 7 scope creep.6768AI features are the one class that defaults to **rejected**: an assistant, chatbot, or AI/semantic search earns a place in **needs** only with an explicit variant and one-line reason, and a downstream AI-feature skill must find that acceptance logged here before it may build — it may never self-justify inclusion. Tidepool's B2B SaaS docs accept a grounded docs-RAG with inline citations; Ledger & Lane (law firm) rejects — unvetted legal answers are a liability and undercut the firm's authority; Casa Verde (restaurant) rejects — menu and hours change faster than any index, so stale answers erode trust.6970## BRIEF.md format7172```md73# Brief — <working site name>74Deployment mode: production75## Site type & energy budget76## Audience (one named persona: situation, device, what they distrust)77## Goals (primary conversion; secondary if any; what success means)78## Tone (3 adjectives + 1 tension pair; one sample sentence in the voice)79## Pages (each: name, route, job, which conversion it serves)80## Content inventory (per page: facts, claims, numbers, proof the copy needs)81## Compliance facts (see below — only for briefs naming a market/jurisdiction)82## Backend: needs (Tier-6 skill → the feature demanding it)83## Backend: rejected (Tier-6 skill → one-line reason it's out)84## Assumed facts (every invention, one line each, classed creative or material —85## material entries end with the material-unconfirmed marker from86## Process step 8 and block production until confirmed)87```8889The skeleton shows the literal default (`production`); write `staging` or `demo` in its place only on the user's explicit request — never copy an options list into the file, the grammar takes exactly one value.9091**Deployment mode** is a machine-read field, exactly the literal `Deployment mode: production` (or `staging`/`demo`) on its own line — the antislop hook, gate-content, and ship grep it to decide whether labeled `UNVERIFIED-PROOF` samples are lawful. Rules: exactly ONE such line; allowed values exactly those three; a missing, duplicated, or misspelled line fails BRIEF validation and every consumer fails closed to production semantics. Default is `production`; only an explicit user request makes a build staging/demo, and switching a demo build to production re-triggers proof and material-claims validation.9293**§Compliance facts** exists so legal scoping happens where the facts are cheap (the user knows them) instead of being guessed at gate time. When the brief names a market or jurisdiction, record: seller's seat (country), targeted consumer markets, B2C or B2B, whether the site concludes consumer contracts online (shop/booking/ticketing — yes/no), employee count and turnover/balance relative to the €2M microenterprise thresholds, the evidence source for each (user statement vs assumed), and a `counsel-needed:` flag for anything asserted rather than known. `sitemap` consumes this to decide legal routes; `gate-accessibility` re-derives scope from the finished build and flags drift. These are user facts — ask for them in guided mode when a DACH/EU market is named; in autonomous mode record them as §Assumed facts entries with the counsel flag set.9495## Anti-patterns9697Grep a finished BRIEF.md for these:9899- `TBD`, `TODO`, `?`, `to be decided`, `ask the user`, `depending on` — questions live in the interview, never in the file; the finished brief defers to nobody, including future-you100- An interview question about colors, fonts, or style — that fork belongs to the mockup round, which shows instead of asking101- Re-asking something the prompt already answered, or a question whose every option builds the same site102- `modern`, `clean`, `professional`, `sleek` as tone words — they describe nothing103- `various`, `etc.`, `and more` in a content inventory — the inventory exists so `copywriting` never improvises104- A `database` for a contact form; `auth` "for later"; a CMS for a 3-post launch blog; an AI chat/search widget with no accepted-variant reason logged — backend maximalism105- Pages without a stated job ("About — about the company")106- An audience section that survives the swap test107- A stated user constraint silently dropped ("must be in German", "no stock photos")108109## Worked example — Framewalk, Steam-launch site for "Hollow Cartographer"110111Moved to `references/example.md` — read only when this build's case is genuinely ambiguous; the sections above are the decision material.112113## Composes with114115Moved to `references/composes.md` — the handoff map; load it when orchestrating this skill against its neighbors.