wizz-method 2.8.1 → 2.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "wizz-method",
4
- "version": "2.8.1",
4
+ "version": "2.10.0",
5
5
  "description": "Wizz Method: método de agência orientado por IA em PT-BR",
6
6
  "keywords": [
7
7
  "agile",
@@ -86,10 +86,21 @@ areas:
86
86
  - id: wizz-decision-maker
87
87
  entry: true
88
88
  door: direcao
89
- when: "PORTA de direção: todo trabalho de decidir ANTES de construir. Brief visual inicial (6 decisões de estética + 3 lógicas) no kickoff. Puxa: wizz-taste-skill (direção anti-slop de brief novo) e wizz-motion-3d-director (decidir caminho motion/3D/vídeo)."
89
+ when: "PORTA de direção: todo trabalho de decidir ANTES de construir. Brief visual inicial (6 decisões de estética + 3 lógicas) no kickoff. Puxa: wizz-design-needs (o que precisa ser pesquisado), wizz-taste-skill (direção anti-slop de brief novo) e wizz-motion-3d-director (decidir caminho motion/3D/vídeo)."
90
90
  rel:
91
- before: [wizz-ui-ux-pro-max]
91
+ before: [wizz-design-needs, wizz-ui-ux-pro-max]
92
92
  pairs_with: [wizz-motion-3d-director, wizz-taste-skill]
93
+ # Arquitetura (NÃO no `when:`, que é critério de seleção e fica guloso com
94
+ # explicação dentro): esta entrada só PRODUZ o mapa. Quem executa o mapa
95
+ # são os dois mineradores, que a puxam pela aresta `before` abaixo — é
96
+ # assim que o protocolo rel garante que ninguém minere sem mapa.
97
+ - id: wizz-design-needs
98
+ door: direcao
99
+ when: "Decidir O QUE precisa ser pesquisado num projeto de site/UI: transformar o brief na lista de referências, efeitos, componentes e comportamentos a minerar."
100
+ not_when: "Executar a pesquisa (é wizz-premium-landing-ui-researcher ou wizz-ui-component-curator), escolher componente ou escrever UI."
101
+ rel:
102
+ after: [wizz-decision-maker]
103
+ before: [wizz-premium-landing-ui-researcher, wizz-ui-component-curator]
93
104
  - id: wizz-taste-skill
94
105
  door: direcao
95
106
  when: "Anti-slop em briefs NOVOS: lê o brief, define a direção e audita contra defaults de AI. Também cobre projeto EXISTENTE: audita o código atual, lista problemas, prioriza fixes (protocolo de redesign)."
@@ -111,15 +122,21 @@ areas:
111
122
  after: [wizz-decision-maker]
112
123
  before: [wizz-impeccable]
113
124
  pairs_with: [wizz-huashu-design, wizz-premium-landing-ui-researcher, wizz-ui-component-curator]
125
+ # Executa o mapa do wizz-design-needs, uma necessidade por passada (a
126
+ # aresta `after` abaixo é o que o protocolo rel lê; nota de arquitetura
127
+ # dentro do `when:` deixa a entrada gulosa e mexe no roteamento).
114
128
  - id: wizz-premium-landing-ui-researcher
115
129
  door: construcao
116
130
  when: "Projeto NOVO (greenfield): cria landing premium do zero, hero, 3D high-end. Estratégia source-first."
117
131
  rel:
132
+ after: [wizz-design-needs]
118
133
  pairs_with: [wizz-ui-ux-pro-max]
134
+ # Idem: a relação com o mapa vive na aresta `after`, não no `when:`.
119
135
  - id: wizz-ui-component-curator
120
136
  door: construcao
121
137
  when: "Projeto EXISTENTE: qual componente/efeito adicionar que combina com o estilo atual."
122
138
  rel:
139
+ after: [wizz-design-needs]
123
140
  pairs_with: [wizz-ui-ux-pro-max]
124
141
  - id: wizz-impeccable
125
142
  door: construcao
@@ -533,11 +550,21 @@ areas:
533
550
 
534
551
  social:
535
552
  agent: wizz-social
536
- summary: "Social e roteiros virais: Reels/Shorts, hooks, calendário de conteúdo. Persona Rafa, aplica o Blueprint de Roteiro Viral e roteia para as CLIs de vídeo quando o roteiro vira vídeo."
553
+ # O `summary:` é critério de SELEÇÃO de área, igual ao `when:` de uma
554
+ # entrada — não é narrativa de arquitetura. Até 2026-09-21 ele dizia "roteia
555
+ # para as CLIs de vídeo quando o roteiro vira vídeo", prometendo um handoff
556
+ # que a área não pode fazer: as CLIs de vídeo (get-brolls, hyperframes,
557
+ # buttercut, claude-video) moram em `designer`, e o único cli daqui é o
558
+ # postiz. Medido: essa frase puxava pedido de ASSET ("imagens de apoio pro
559
+ # meu Reel", "carrossel pro Instagram") para social, que não tem a
560
+ # ferramenta. A fronteira ficou no summary; a nota ficou aqui.
561
+ summary: "Social e roteiros virais: o TEXTO e o ROTEIRO de Reels/Shorts, hooks, legenda, thread, calendário de conteúdo. Persona Rafa, aplica o Blueprint de Roteiro Viral. Captar, desenhar ou montar o asset em si (b-roll, vídeo, carrossel, imagem) não é desta área."
537
562
  skills:
538
563
  - id: wizz-social-content
539
564
  when: "Criar/agendar conteúdo de social (LinkedIn, X, TikTok, IG...), o que inclui ESCREVER o texto: post, story, carrossel, legenda, thread. Gatilhos: 'escreve copy pra story', 'post pro LinkedIn', 'legenda do carrossel', 'thread pro X'."
540
- not_when: "Editar/revisar texto de social já escrito: aí é wizz-copy-editing."
565
+ not_when:
566
+ - "Editar/revisar texto de social já escrito: aí é wizz-copy-editing."
567
+ - "Pedir SÓ o asset de um Reel/vídeo — b-roll, 'imagens de apoio', 'cenas de apoio', imagem de corte, footage — sem que o texto ou o roteiro façam parte do pedido: a captação é get-brolls, na área designer. Esta entrada entra quando o TEXTO ou o ROTEIRO é parte do que se pede; se o pedido junta roteiro E captação, são 2 áreas."
541
568
  rel:
542
569
  before: [get-brolls, postiz]
543
570
  pairs_with: [wizz-canvas-design, wizz-content-strategy, wizz-copy-editing, wizz-launch-strategy]
@@ -28,13 +28,13 @@ You are Wizz's Designer. It creates high-level interfaces and landing pages, sho
28
28
  > **Single source (registry) — ALWAYS read before the examples below:** the real list for your area (`designer`) lives in `skills-registry.yaml`. Resolve the **light slice for your area** first, `{project-root}/_wizz/_config/registry/designer.yaml` (already comes as the full `areas.designer` block — skills/mcps/clis/references); if it's missing (old install), fall back to the monolith in order `{project-root}/_wizz/_config/skills-registry.yaml` → `{project-root}/_wizz/skills-registry.yaml` → `{project-root}/skills-registry.yaml` and find the `areas.designer` block there. If you need something cross-cutting (utility/mcp_utility/cli_utility/squads), also read `{project-root}/_wizz/_config/registry/_shared.yaml`. Route by the `when:` field — `skills:` (invoke via `Skill`), `clis:` (run the `check:`; if missing, show the `install:`, opt-in; respect `platform:` — e.g. `buttercut` is `darwin-arm64` only) and `mcps:` (propose `claude mcp add <id>` with the `server` block). **Follow `rel:` before answering.** An entry's `rel` (`pairs_with`, `before`, `after`, `instead_of`) is how the method knows that a request about A also needs C. Every edge is reciprocal by construction — the schema validator rejects one-way edges — so the relation shows up whichever side the user enters from. Do it in this order, before answering: (1) pick the entries whose `when:` matches the request; (2) LIST every id named in the `rel` of those entries — including the ids you do not recognise, which are exactly the point; (3) for each id outside YOUR slice, resolve id → area through the `ids:` map (id → area) in `{project-root}/_wizz/_config/registry/index.yaml` and read that area's slice to get its `when:` (a target marked `_shared` lives in `_shared.yaml`); (4) either bring it in or discard it with a stated reason. A related capability you never named is one the method lost: silence is the failure, not the discard. When the target is in ANOTHER area and shapes the SAME deliverable (the thing you are about to hand over is incomplete without it), say so and offer `wizz-maestro`, who coordinates areas — you never invoke the other area's agent yourself, and you never hand the request back to whoever delegated it to you (anti-loop). Tell the user what the related capability is instead of delivering only the half they asked for, and when the relation is `before`, say what has to come first. **Entry points (skills):** offer only the 3 skills with `entry: true` (direction → wizz-decision-maker, building → wizz-ui-ux-pro-max, motion/assets → wizz-animate); the rest carry a `door:` field and only come in pulled by their layer's door or by an explicit user request — never offer the full list. The examples below are just a readable shortcut; the registry is the source of truth and picks up whatever gets added later (e.g. video tools: hyperframes, get-brolls, claude-video, buttercut, voicebox, ctc-align). **Video:** before choosing a tool, apply `_shared/video-pipeline.md` — HyperFrames draws the screens (silent visual, one scene per composition), Remotion assembles the film (audio, SFX, captions, frame timing via ctc-align); never position audio/captions in HyperFrames. **B-roll:** when the script names something real (a fact, a person, a product, a news item, a screen), the insert is sourced with `get-brolls`, not drawn — it searches the literal source, builds a Storyboard, and stops at a human approval gate you never sign for the user. Stock only enters if the user asks for stock.
29
29
 
30
30
  For every task, **go through the right door via the `Skill` tool** and bring the result in plain language:
31
- - Decide BEFORE building (brief, visual direction, motion/3D path) → `wizz-decision-maker` (pulls in wizz-taste-skill, wizz-motion-3d-director)
31
+ - Decide BEFORE building (brief, visual direction, motion/3D path) → `wizz-decision-maker` (pulls in wizz-design-needs, wizz-taste-skill, wizz-motion-3d-director)
32
32
  - Create/improve UI (landing, design system, component, polish) → `wizz-ui-ux-pro-max` (pulls in wizz-premium-landing-ui-researcher, wizz-ui-component-curator, wizz-impeccable, wizz-taste-skill, wizz-huashu-design, wizz-react-components)
33
33
  - Run animation and generate media → `wizz-animate` (pulls in wizz-design-motion-principles, wizz-remotion-best-practices, wizz-canvas-design, wizz-algorithmic-art)
34
34
 
35
35
  Always **show the visual/plan before the code**. Code building is `wizz-agent-dev`'s job; for a one-off tweak, point to `wizz-quick-dev`.
36
36
 
37
- **Research gate:** for a non-trivial component/effect, the build door must cover the record of searches, demos and exact code/registry, review date/license, dependencies, visual evaluation, and reason for the choice. The output of `wizz-ui-ux-pro-max` is a local guideline lookup, not web component mining. Before the handoff to dev, confirm the evidence or state the limitations and the justification for a custom implementation. Optional sources being unavailable doesn't block research in other public sources.
37
+ **Research gate:** for a non-trivial component/effect, research runs against the project's research map (`design-state.yaml`, produced by `wizz-design-needs`): one need per pass, with the need's own source budget, floor and `proibidos` block. Without a map, non-trivial work goes through `wizz-design-needs` first — otherwise the user ends up naming every effect by hand, one request at a time. The build door must cover the record of searches, demos and exact code/registry, review date/license, dependencies, visual evaluation, and reason for the choice. The output of `wizz-ui-ux-pro-max` is a local guideline lookup, not web component mining. Before the handoff to dev, confirm the evidence or state the limitations and the justification for a custom implementation. Optional sources being unavailable doesn't block research in other public sources.
38
38
 
39
39
  ## Closing
40
40
  Close in the Wizz format: `✅ O que fiz` (simple sentences) / `➡️ Próximo passo` (usually wizz-agent-dev or wizz-quick-dev to build) / `🎯 Comando`.
@@ -0,0 +1,61 @@
1
+ ---
2
+ name: wizz-design-needs
3
+ description: Turns a website brief into the project's research map — the explicit list of what has to be mined before any UI is built, with a budget and a stop condition for each item. Reads the brief, decomposes the project into surfaces, sections, components and behaviours, derives the research needs, subtracts the ones the brief forbids, checks what the project already has, and writes everything to design-state.yaml. Use when a site, landing page, portfolio or app UI is about to be researched, designed or rebuilt and nobody has written the list of what to look for; use before wizz-premium-landing-ui-researcher or wizz-ui-component-curator, which mine one need at a time against this map. Does not mine, does not choose components and does not write UI code.
4
+ ---
5
+
6
+ # Design Needs — the project's research map
7
+
8
+ The miner is good at searching and cannot know what to search for. That is this skill's only job: read the brief and produce the list, so the human stops being the system's to-do list.
9
+
10
+ Output: a `needs` block in `design-state.yaml`. Nothing else. This skill never opens a source, never recommends a component and never writes UI.
11
+
12
+ ## Hard rules (always, before reading any reference)
13
+
14
+ 1. **Every need carries a `why` that traces back to the brief.** If you cannot point at the phrase, the requirement or the page type that produced it, the need does not exist. A need without a `why` is noise, and noise is what makes a system research forever.
15
+ 2. **Signals subtract as well as add.** A brief that says "minimalista" does not merely fail to ask for particles: it *forbids* opening that search. Removal always beats addition, and the conflict is recorded, not silently resolved.
16
+ 3. **The level caps the behaviour layer.** The site level (1-5, from `wizz-premium-landing-ui-researcher/references/site-levels.md`) sets the motion budget, and that budget is the stop condition for behaviour research. Ambition above the level is not a need, it is scope creep.
17
+ 4. **Gap analysis runs before any query is written.** A need already satisfied by the project, the local cache or an earlier selection is closed with a reason, not researched again.
18
+ 5. **Never mine here.** Producing the map and executing it are different jobs on purpose: one bad map costs the whole project, one bad search costs one search.
19
+ 6. **Declare hypotheses, do not ask for them.** Missing objective, audience or stage become stated hypotheses in the state file. Only the questions in `references/derivacao.md` ("What stays with the human") are worth stopping for, and there are at most three.
20
+
21
+ ## Flow
22
+
23
+ 1. **Read the brief.** Whatever exists: the `wizz-decision-maker` output, a PRD, a paragraph in chat, an existing site. Extract objective, audience, page type, signals, constraints and stack. Missing fields become hypotheses.
24
+ 2. **Set the level** (1-5) and read its motion budget. A signal that pulls up and a signal that pulls down is a conflict: record it, and the restrictive one wins.
25
+ 3. **Decompose.** Surfaces → sections → components → behaviours. Procedure in [decomposicao](references/decomposicao.md).
26
+ 4. **Derive the needs** with the four rules and the signal table in [derivacao](references/derivacao.md). This is where needs are both created and forbidden.
27
+ 5. **Run the gap analysis** ([gap-analysis](references/gap-analysis.md)): project inventory → local cache → needs already satisfied on another surface. What survives gets a query, a source budget and a floor. What does not survive is closed with `status: dropped` and a reason.
28
+ 6. **Write `design-state.yaml`** in the shape of [design-state](references/design-state.md), and hand off.
29
+
30
+ ## Output format
31
+
32
+ Report in `{communication_language}`, short, in this order:
33
+
34
+ - the level and the motion budget, with the one-line reason
35
+ - the count: needs open, dropped, deferred
36
+ - the needs, grouped by layer (system, section, behaviour), one line each
37
+ - **what the brief forbade**, with the signal that forbade it. This block is not optional: it is the proof that the map is dirigido and not a shopping list
38
+ - the open questions for the human, at most three, only the ones from `references/derivacao.md`
39
+ - the handoff line: which miner runs next and against which needs
40
+
41
+ ## Handoff
42
+
43
+ The map is executed by the miner, one need per pass:
44
+
45
+ - greenfield surface or whole-page direction → `wizz-premium-landing-ui-researcher`
46
+ - one isolated need inside an existing project → `wizz-ui-component-curator`
47
+
48
+ Both read `design-state.yaml`, take the need's `budget` and `floor` as given, and write their findings back as `discoveries`. Never hand a miner a request in prose when a need id exists: the id carries the budget and the stop condition, the prose does not.
49
+
50
+ Level 4 or 5 also hands off to `wizz-motion-3d-director` before any behaviour need is mined.
51
+
52
+ ## References map (read on demand)
53
+
54
+ | For... | Read |
55
+ |---|---|
56
+ | Surfaces, sections, components, behaviours: how to break the project down | [decomposicao](references/decomposicao.md) |
57
+ | The four derivation rules, the signal table that adds and subtracts, and the three questions that stay with the human | [derivacao](references/derivacao.md) |
58
+ | The three lookups that close a need before it costs a search | [gap-analysis](references/gap-analysis.md) |
59
+ | The `design-state.yaml` schema, who writes each block and the read contract | [design-state](references/design-state.md) |
60
+
61
+ Final rule: a map that lists everything is the same as no map. The value of this skill is in what it refuses to research.
@@ -0,0 +1,54 @@
1
+ # Decomposition
2
+
3
+ Four layers, top down. Each layer answers a different question, and only two of them generate research.
4
+
5
+ | Layer | Question | Generates research? |
6
+ |---|---|---|
7
+ | Surface | which pages/routes exist | no, it sets the scope |
8
+ | Section | what each surface is made of | yes, when the project has no compatible component |
9
+ | Component | which pieces a section needs | yes, same condition |
10
+ | Behaviour | what moves, reacts and transitions | yes, capped by the level |
11
+
12
+ ## 1. Surfaces
13
+
14
+ A surface is a route with its own job. Derive from the page type, not from imagination.
15
+
16
+ | Page type | Usual surfaces |
17
+ |---|---|
18
+ | Landing / offer | one surface. Extra pages (thanks, terms) are not surfaces |
19
+ | Authority / portfolio | home, project list, individual project, about, contact |
20
+ | SaaS marketing | home, product, pricing, one proof page, docs entry |
21
+ | App / dashboard | shell, main list, detail, empty/first run, settings |
22
+
23
+ When the project has more than three surfaces or the hierarchy is genuinely in question, that is `wizz-site-architecture`'s job (area `seo`). Name it to the user and take its sitemap as the surface layer if they run it; do not re-derive what that skill owns. It is deliberately NOT a registry `rel` edge: a cross-area edge would inject a seo entry into every designer discovery prompt, and the surface layer needs it in maybe one project out of ten.
24
+
25
+ ## 2. Sections
26
+
27
+ The required structure per page type already exists in `wizz-premium-landing-ui-researcher/references/landing-page-strategy.md` and, for the other two modes, in `dashboard-and-portfolio-modes.md`. Read the one that matches and take its section list. This skill does not invent a competing structure.
28
+
29
+ Rule: a section becomes a research need **only if the gap analysis finds no compatible component in the project**. A contact section in a project that already has a form is not a need, it is an assembly.
30
+
31
+ ## 3. Components
32
+
33
+ Break each section into its pieces only where the piece carries the brief. A card grid in a portfolio carries the brief; a footer does not.
34
+
35
+ Test to apply: *if this piece were generic, would anyone notice?* If the answer is no, it is not a need. Generic is the correct answer for most footers, most legal pages and most form fields.
36
+
37
+ ## 4. Behaviours
38
+
39
+ Everything that is not a static state. Six families, and they are the whole list:
40
+
41
+ | Family | Covers |
42
+ |---|---|
43
+ | Entry | how something appears the first time (reveal, stagger, mask) |
44
+ | Scroll | what the page does as it scrolls (parallax, sticky, progress, pinning) |
45
+ | Pointer | hover, tilt, magnetism, cursor |
46
+ | Transition | route to route, list to detail, state to state |
47
+ | Feedback | loading, empty, error, success, disabled |
48
+ | Adaptive | what changes on mobile, on keyboard, under `prefers-reduced-motion` |
49
+
50
+ The Adaptive family is never a separate need: it is a required field on every other behaviour need. A behaviour whose mobile and reduced-motion answer is unknown is not researched, it is incomplete.
51
+
52
+ ## Output of this step
53
+
54
+ An ordered list with `surface → section → component/behaviour`, no queries yet, no sources yet. Queries are written only after the gap analysis, because half of this list usually dies there.
@@ -0,0 +1,62 @@
1
+ # Derivation rules
2
+
3
+ Four rules turn the decomposition into needs. Rules 1 to 3 create; rule 4 both creates and forbids.
4
+
5
+ ## Rule 1 — System layer: five needs, always
6
+
7
+ Typography, grid, colour, spacing and image treatment. They do not depend on the brief, they are not negotiable and they decide more of "does this look expensive" than any effect does.
8
+
9
+ Budget is small for each (one or two sources), because the answer usually comes from the local base in `wizz-ui-ux-pro-max` plus one real reference. Image treatment is the exception: give it three sources when the project is image-led (portfolio, architecture, photography, product).
10
+
11
+ ## Rule 2 — Section layer: comes from the page type, not from the brief
12
+
13
+ Take the section list from the page-type structure (see `decomposicao.md`, step 2). Each section becomes a candidate need. The gap analysis decides which ones survive.
14
+
15
+ A section need is written as a question about *composition*, never about a component name: "how does a selected-projects grid breathe" is a need, "find a card component" is a shopping item.
16
+
17
+ ## Rule 3 — Behaviour layer: the level sets the ceiling
18
+
19
+ The site level (1-5) carries a motion budget in `wizz-premium-landing-ui-researcher/references/site-levels.md`. Convert the budget into a number of behaviour needs, not into a number of animations: one researched pattern repeats across the page.
20
+
21
+ | Level | Motion budget (existing) | Behaviour needs |
22
+ |---|---|---|
23
+ | 1 Basic | 5-8 light animations | 1 |
24
+ | 2 Intermediate | 10-15 animations | 2 |
25
+ | 3 Advanced | 15-25 coordinated | 4 |
26
+ | 4 High-End 3D | 20-35 + hero scene | 6, and `wizz-motion-3d-director` runs first |
27
+ | 5 Signature | 1 wow + 2-3 secondary | 8, same handoff |
28
+
29
+ When more behaviours compete than the ceiling allows, rank by how much each one carries the brief and mark the losers `deferred`, with the reason. A deferred need is cheap to reopen later and expensive to have researched now.
30
+
31
+ ## Rule 4 — Brief signals add and subtract
32
+
33
+ This is the rule that stops the system from researching everything.
34
+
35
+ | Signal in the brief | Adds | Forbids |
36
+ |---|---|---|
37
+ | editorial | typographic rhythm, image treatment, deliberate grid break | symmetric 3-column grid, decorative icon set |
38
+ | minimalista | hover states, intentional emptiness | particles, glow, saturated gradient, 3D/WebGL |
39
+ | sofisticado / premium | route transition, focus states, micro-hover | badges, emoji, default shadow scale |
40
+ | portfólio / arquitetura / estúdio | project grid, cursor, scroll reveal | logo carousel, generic testimonial card |
41
+ | SaaS / produto | empty state, loading, data density | cinematic hero |
42
+ | e-commerce | image zoom, variant state, cart feedback | long-form scroll narrative |
43
+ | institucional / corporativo | clear hierarchy, dependable patterns | experimental layout, heavy motion |
44
+ | performance crítica / mobile-first | LCP, font strategy, bundle weight | WebGL, background video, heavy shader |
45
+ | lúdico / consumer | expressive states, colour accents | austere editorial restraint |
46
+
47
+ Reading rules:
48
+
49
+ 1. **Forbidden beats added.** When one signal adds what another forbids, the search does not open. Record it under `conflitos` with both signals named.
50
+ 2. **A forbidden item is never researched, not even "to compare".** Comparison is the most common way a forbidden capability gets back in.
51
+ 3. **A signal that is not in the table is still a signal.** Write the add/forbid pair yourself, name it in `derived_from`, and keep it in the state file so the next session inherits it.
52
+ 4. **A reference the user supplied outranks a signal.** If they sent a site that uses exactly what a signal forbids, the reference wins and the conflict is recorded: they chose it on purpose.
53
+
54
+ ## What stays with the human
55
+
56
+ At most three questions, and only these kinds. Each one changes the work and none can be inferred:
57
+
58
+ 1. **Which outcome the surface is for**, when two plausible outcomes need different heroes and different CTAs (capture a lead vs impress a peer, sell vs educate).
59
+ 2. **Whether the required raw material exists** (professional photography, real product screenshots, real numbers). Its absence changes the nature of needs, not their priority.
60
+ 3. **Whether the identity is already locked** (typeface, palette, logotype). If locked, system needs close without research.
61
+
62
+ Everything else is a hypothesis, declared in the state file and carried forward. Asking a fourth question is a failure of this skill, not diligence.
@@ -0,0 +1,108 @@
1
+ # design-state.yaml
2
+
3
+ One file per project, the shared memory of the design chain. It exists so a decision taken during research survives until implementation and QA, instead of evaporating in a prose handoff.
4
+
5
+ ## Location and read contract
6
+
7
+ Path: `{output_folder}/design-state.yaml`, next to `project-context.md` (default `_wizz-output/`, configurable via `output_folder` in `_wizz/bmm/config.yaml`).
8
+
9
+ Read contract, deliberately identical to the one the router and the maestro already use for `project-context.md`:
10
+
11
+ - **Fail-open.** No file, no complaint: proceed and say the map does not exist yet.
12
+ - **Cheap read first.** `grep -m1 '^nivel:'` and `grep -c 'status: open'` answer most questions without loading the file.
13
+ - **Full read only to write.** Whoever is going to change a block loads the file; whoever only needs context greps it.
14
+
15
+ ## Who writes what
16
+
17
+ | Block | Written by | Read by |
18
+ |---|---|---|
19
+ | `brief`, `identidade`, `stack` | `wizz-decision-maker`, `wizz-design-needs` | everyone |
20
+ | `nivel`, `orcamento_motion`, `conflitos` | `wizz-design-needs` | miner, implementer |
21
+ | `superficies`, `inventario`, `needs` | `wizz-design-needs` | miner |
22
+ | `discoveries` | the miner | implementer, QA |
23
+ | `implementacao` | `wizz-agent-dev` / `wizz-quick-dev` | QA |
24
+ | `problemas` | QA, the audit protocol, the user | `wizz-design-needs` when reopening a need |
25
+
26
+ No block has two owners. A skill that needs a field it does not own asks the owner or records a `problema`; it never overwrites.
27
+
28
+ ## Schema
29
+
30
+ ```yaml
31
+ version: 1
32
+ atualizado_em: 2026-09-21
33
+
34
+ brief:
35
+ objetivo: "captar contato de cliente de alto padrão" # hipotese: true quando inferido
36
+ publico: "..."
37
+ tipo_pagina: autoridade
38
+ sinais: [editorial, minimalista, sofisticado]
39
+ hipoteses: ["objetivo inferido do tipo de página, não informado pelo usuário"]
40
+
41
+ nivel: 3
42
+ orcamento_motion: "15-25 animações coordenadas"
43
+ conflitos:
44
+ - { entre: [premium, minimalista], resolvido_para: minimalista, motivo: "restritivo vence" }
45
+
46
+ identidade: { tipografia: null, paleta: null, travada: false }
47
+ stack: { framework: next, styling: tailwind, motion: null, orcamento_bundle_kb: 180 }
48
+
49
+ superficies:
50
+ - { id: home, rota: "/", tipo: landing, secoes: [hero, manifesto, projetos, processo, prova, contato] }
51
+
52
+ inventario:
53
+ componentes: []
54
+ tokens: null
55
+ motion_utils: []
56
+ lido_em: 2026-09-21
57
+
58
+ needs:
59
+ - id: b1-hero-entrada
60
+ surface: home
61
+ section: hero
62
+ layer: comportamento # sistema | secao | componente | comportamento
63
+ question: "como o hero entra e como reage ao primeiro scroll"
64
+ why: "brief pede sensação editorial; o hero é o teste dos 3 segundos"
65
+ derived_from: [sinal:editorial, tipo:autoridade, nivel:3]
66
+ query: "editorial hero scroll reveal mask typography react"
67
+ budget: { fontes: 3 }
68
+ floor: 7
69
+ signature: true # no máximo 1 por superfície
70
+ adaptive: { mobile: null, reduced_motion: null } # obrigatório antes de fechar
71
+ status: open # open | mining | evaluated | selected | unmet | dropped | deferred
72
+ reason: null # obrigatório em dropped, deferred, unmet
73
+ satisfied_by: []
74
+
75
+ proibidos:
76
+ - { o_que: "partícula, glow, gradiente saturado, 3D", por: sinal:minimalista }
77
+ - { o_que: "carrossel de logos, card de depoimento genérico", por: tipo:autoridade }
78
+
79
+ discoveries: [] # escrito pelo minerador
80
+ implementacao: {} # escrito pelo dev
81
+ problemas: [] # escrito pelo QA
82
+ ```
83
+
84
+ ## The `proibidos` block
85
+
86
+ It is not documentation. It is an active constraint: before opening any query, the miner checks it, and a query that would land on a forbidden capability is not run. Without this block the rest of the map is a shopping list with extra steps.
87
+
88
+ It also survives sessions. A month later, "add something impressive to the hero" is still answered against the same brief.
89
+
90
+ ## Status lifecycle
91
+
92
+ ```text
93
+ open ──▶ mining ──▶ evaluated ──▶ selected ──▶ (implementado)
94
+ │ │
95
+ │ └──▶ unmet (budget esgotado, nada acima do piso)
96
+ ├──▶ dropped (gap analysis, ou duplicata)
97
+ └──▶ deferred (perdeu para o teto do nível)
98
+ ```
99
+
100
+ `unmet`, `dropped` and `deferred` require a `reason`. That is what makes reopening cheap: the next round knows what was already tried and why it failed, and does not re-search the same ground.
101
+
102
+ ## Reopening
103
+
104
+ QA, the audit protocol or the user record a `problema`. `wizz-design-needs` converts it into a need:
105
+
106
+ - objective defect (contrast, focus, overflow, reduced-motion, LCP) → not a need. It is a fix, handled by the implementer.
107
+ - missing piece → reopen the need with `status: open` and a `budget` reduced by what was already spent, and with the previously rejected discoveries carried forward so they are not proposed again.
108
+ - wrong direction → this is not a need either. It goes back to the brief, and it is the human's call.
@@ -0,0 +1,46 @@
1
+ # Gap analysis
2
+
3
+ Three lookups, in this order, before a single query is written. The first one that satisfies a need closes it.
4
+
5
+ ## 1. Project inventory
6
+
7
+ Inspect what the project already has: dependencies, tokens, theme, shared primitives, existing animation utilities, components already built. This is phase 1 of the source-first protocol; the difference here is that **the result is written down**, in `design-state.inventario`, so it is paid for once per project instead of once per search.
8
+
9
+ Look at: `package.json`, the token/theme file, the shared component folder, any motion utility, and the two or three pages that already exist.
10
+
11
+ A need is closed by the inventory when the existing piece is compatible *as is or with token-level adaptation*. "We have a card, it just needs a full redesign" does not close the need.
12
+
13
+ **A capability is often satisfied at a different layer than the one that uses it.** Check the global layer before declaring a component gap, or the inventory invents needs that do not exist. Measured on a real project (MeJu, 2026-09-21): nine of twelve landing-page effect components had no `useReducedMotion` call, and every one of them was already covered, either by a global `@media (prefers-reduced-motion: reduce)` block in the stylesheet or by Tailwind's `motion-safe:` variant. Reading only the component files would have produced nine false needs.
14
+
15
+ So, for any cross-cutting concern (reduced motion, dark mode, focus rings, i18n, spacing scale, container widths), look in this order: global stylesheet → framework variant/utility → provider or layout → the component itself. Only the absence at **every** layer is a gap.
16
+
17
+ When the layers disagree or the coverage cannot be proven by reading (a CSS rule that may or may not reach a JS-driven animation, for instance), that is **not** a research need. Record it under `problemas`, split into what you observed and what you inferred, and route it to the polish/QA skills. Research finds what the project lacks; it does not diagnose what the project already has.
18
+
19
+ ## 2. Local cache and user material
20
+
21
+ - `~/.claude/design-sources/` (React Bits, Cult UI, Ali Imam, StyleUI, Watermelon)
22
+ - `modelos lp/` or whatever local reference folder the project uses
23
+ - anything the user pasted, linked or screenshotted in this conversation
24
+
25
+ Cache freshness rule: check the revision and date before treating a cached item as current. A stale cache is still a valid source for a pattern; it is not a valid source for an API. When the cache answers a need, record the revision in the discovery, not just the path.
26
+
27
+ User-supplied material outranks every catalogue. A reference the user chose is worth more than a better reference they did not.
28
+
29
+ ## 3. Needs already satisfied on another surface
30
+
31
+ Within one project, a pattern is researched once. A hover resolved on the home page is not re-researched for the project list. The second occurrence is closed with `status: dropped`, `reason: "resolvido por <need-id>"`, and it inherits that need's discovery.
32
+
33
+ This is the deduplication that makes multi-surface projects affordable, and it only works because the state file persists between sessions.
34
+
35
+ ## Output
36
+
37
+ For each need in the decomposition, one of:
38
+
39
+ | Outcome | Status | What is recorded |
40
+ |---|---|---|
41
+ | satisfied by the project | `dropped` | which file or component satisfies it |
42
+ | satisfied by cache or user material | `selected` | the source, revision and why it fits |
43
+ | satisfied by another need | `dropped` | the need id it inherits from |
44
+ | not satisfied | `open` | the query, the source budget and the floor |
45
+
46
+ Report the count of each. A project where the gap analysis closes nothing is a project where the inventory was not actually read.
@@ -7,6 +7,15 @@ description: Research animations, components, visual references, and conversion
7
7
 
8
8
  Autonomous strategist for premium landing pages, SaaS UI, and advanced visual experiences (React, Next.js, Tailwind, shadcn/ui, Framer Motion, Three.js, R3F). This file is the index: only the always-active rules live here. The detail for each step lives in `references/` and should be read only when that step is executed.
9
9
 
10
+ ## Gate 0: the research map (always, before Gate 1)
11
+
12
+ Check for `{output_folder}/design-state.yaml` (default `_wizz-output/`). Cheap check first: `grep -c 'status: open'`.
13
+
14
+ - **It exists, with open needs:** you are not deciding what to research. Work **one need per pass**, in the order given, and take `query`, `budget.fontes` and `floor` as given. Read the `proibidos` block before writing any query: a query that lands on a forbidden capability is not run, not even for comparison. Write each finding back under `discoveries` with the `need` id, and move the need to `selected` or `unmet` with a reason. Stop when the needs are exhausted, not when the ideas are.
15
+ - **It exists, no open needs:** the map is done. Do not open new research on your own: report it and hand back to `wizz-design-needs` if something is genuinely missing.
16
+ - **It does not exist, and the work is non-trivial:** invoke `skill:wizz-design-needs` first. Mining without a map is how a project ends up depending on the user to name every effect, one request at a time.
17
+ - **It does not exist, and the work is one isolated component the user named:** proceed, and say the map was not created.
18
+
10
19
  ## Gate 1: Source-First (always, before any UI code)
11
20
 
12
21
  This skill exists because writing shaders, animations, hovers, and components from scratch is NOT the way. The way is to curate mature components, animations, and shaders from professional sources (the user's `modelos lp/`, React Bits, Cult UI, Ali Imam, Watermelon, StyleUI, Skiper UI, Componentry, and public registries) and adapt them to the brand.
@@ -24,7 +24,9 @@ Choose sources based on the effect needed, using [component-sources](component-s
24
24
  | Carousel | Embla, shadcn/ui |
25
25
  | Visual direction and reference motion | Sites provided by the user, Landing Love, Godly, Design Spells, Refero Styles |
26
26
 
27
- For each non-trivial component:
27
+ The set of "non-trivial components" is not improvised here: it is the list of open needs in `design-state.yaml` (produced by `wizz-design-needs`). With no state file, derive it from the approved section structure and say you did, so the gap is visible.
28
+
29
+ For each open need:
28
30
 
29
31
  1. Formulate a concrete search with function, style, and stack; check at least two suitable sources when available.
30
32
  2. Open the exact item: demo, documentation, and the code file or registry JSON. A search result alone doesn't prove compatibility.
@@ -40,6 +40,12 @@ Assess the **Area**: how many areas does the request touch? The canonical area l
40
40
 
41
41
  **Dispatch rule:** IF 2+ areas → `wizz-maestro`, always. OTHERWISE count the 3 remaining factors (multi-step, needs planning, produces a memorable artifact); 2+ factors → `wizz-maestro`. The area clause decides on its own, without combining with anything else.
42
42
 
43
+ **One gate runs before dispatch, and it is deliberately narrow: the ambiguous referent.** Ask the user instead of dispatching ONLY when all three hold: (a) the request names a target that does not resolve to ONE thing — the context shows several objects that fit the name, or there is no antecedent at all; (b) a single short factual question settles which one; (c) guessing wrong lands the work on the wrong object at a cost worth a question. When it fires, ask via `AskUserQuestion` and dispatch only after the answer. "Update the price on the page" with three live sales pages is the case; "improve this" with nothing to point at is the case; "remove the banner" where a promo banner and a cookie banner both exist is the case.
44
+
45
+ **Clause (c) is eliminatory, and it is the clause that settles most cases — check it last and let it close the gate.** The bar is that a wrong guess costs more than redoing the delivery: a change lands on the wrong live object, or work already done has to be thrown away. A short piece of text that is cheap to rewrite never clears that bar, however unresolved its referent looks: "write a headline to sell this plan" has no antecedent at all for "this plan", clause (a) holds, and it still goes to `agent:copy` — a headline aimed at the wrong plan is rewritten in a minute. **Clause (a) alone never fires the gate.** (Calibrated on `a04`, measured 2026-09-21: the gate fired there and should not have.)
46
+
47
+ This gate does NOT fire for an open-scope request. "My site is bad, sort it out", "my sales page converts badly": the target resolves fine, it is the SCOPE that is undefined, and discovering scope is the Manager's work — that is the counterpart clause below, and it stays the maestro's. It does NOT fire for an area that is defensible either way: pick the area, do not ask. And it never outranks the sensitive-subsystem clause below — an ambiguous request that touches authentication, payments, permissions or production data goes to `wizz-maestro`, who asks as part of planning what must not break. One rule per case: the Director asks only about WHICH object, never about what the work should be. **When in doubt, the gate does NOT fire.** (Owner's decision, 2026-09-21.)
48
+
43
49
  **Decision order — capabilities → required relations → areas → shortcuts.** Match the catalogue entries, inspect their `rel`, and include only capabilities needed for the requested deliverable and not already supplied in the context. Resolve their owning areas before applying ANY one-area shortcut. One artifact can require multiple areas; the word "copy" does not prove that only copy is needed. For full sales-page copy, if either the offer or the conversion structure is missing from the supplied context, include the missing capability: `wizz-offer-forge` for the offer and/or `wizz-page-cro` for conversion structure (growth), alongside `wizz-copywriting` (copy); route to maestro. Do not assume those inputs are ready merely because the user did not mention them. If both are already approved and the request is limited to text, keep copy-only work in copy. An isolated headline or CTA does not require redesigning the whole page. Optional neighbours and separate deliverables do not add areas; `pairs_with` alone never escalates.
44
50
 
45
51
  **What you count are the areas of the catalogue ENTRIES the request matches — never the topics named in the sentence.** A request can name four subjects and still match one entry, and then it is one area. "Full audit of the site: performance, SEO, security, accessibility" names four topics and matches `wizz-launch-readiness` (qa), whose `when:` already spans build, security, SEO, analytics, content, legal and infra: those four legs are that single audit's own scope, not four deliverables, so the answer is `agent:qa`. Counting nouns instead of entries is the most common way to over-escalate. (Owner's decision, 2026-09-19.)
@@ -42,6 +42,7 @@ Use this table to map skills/CLIs/MCPs directly **outside a Wizz project** (no `
42
42
  |---|---|---|
43
43
  | Visual brief at kickoff, "what should this look like", deciding direction BEFORE building | `wizz-decision-maker` (designer's direction door: 6 aesthetic decisions + 3 logical ones) + `wizz-taste-skill` | 1 |
44
44
  | Design, UI, visual, component, style, palette, typography, design system | `wizz-ui-ux-pro-max` + `wizz-ui-component-curator` | 1 |
45
+ | "What do I need to research for this site", turning a brief into the list of references/effects/components to mine, before any research | `wizz-design-needs` (research map in design-state.yaml; the miners then run one need per pass) | 1 |
45
46
  | Turn a design into React/Vite components (Stitch MCP output) | `wizz-react-components` | 2 |
46
47
  | Review/audit NATIVE UI (iOS/macOS: SwiftUI, Flutter, React Native, Tauri, Electron) against the Apple HIG and Liquid Glass | CLI `apple-design` (designer registry) — covers what `wizz-taste-skill` declares out of scope; for web UI it's `wizz-ui-ux-pro-max` instead | 2 |
47
48
  | Landing page, hero, motion, 3D animation, conversion, visual CRO | `wizz-premium-landing-ui-researcher` | 1 |
@@ -15,6 +15,12 @@ Act as a UI curator with taste and restraint — not a gallery explorer. Optimiz
15
15
 
16
16
  # Step-by-step flow
17
17
 
18
+ ## 0. Check the research map
19
+
20
+ If `{output_folder}/design-state.yaml` exists, the need being worked is already written there: take its `query`, `budget.fontes` and `floor` instead of improvising them, honour the `proibidos` block, and write the result back under `discoveries` with the `need` id. If the request does not match any open need, say so before researching: an unplanned need is either a gap in the map (go back to `wizz-design-needs`) or scope creep.
21
+
22
+ With no state file, continue normally.
23
+
18
24
  ## 1. Read and infer the style DNA
19
25
 
20
26
  Inspect the relevant UI files before searching anything. Look at: main shell, hero/homepage, shared primitives, buttons, cards, nav, animation utilities, theme/token files.