wizz-method 2.7.0 → 2.7.1

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.7.0",
4
+ "version": "2.7.1",
5
5
  "description": "Wizz Method: método de agência orientado por IA em PT-BR",
6
6
  "keywords": [
7
7
  "agile",
@@ -101,6 +101,7 @@
101
101
  "test:registry-lib-parity": "node test/test-registry-lib-parity.js",
102
102
  "test:registry-schema": "node test/test-registry-schema.js",
103
103
  "test:rehype-plugins": "node test/test-rehype-plugins.mjs",
104
+ "test:rel-protocol": "node test/test-rel-protocol-consistency.js",
104
105
  "test:resolve-command": "node test/test-resolve-command.js",
105
106
  "test:resolved-config": "node test/test-resolved-config.js",
106
107
  "test:resolver": "node test/test-resolve-customization.js",
@@ -88,57 +88,89 @@ areas:
88
88
  door: direcao
89
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)."
90
90
  rel:
91
- pairs_with: [wizz-taste-skill, wizz-motion-3d-director]
91
+ before: [wizz-ui-ux-pro-max]
92
+ pairs_with: [wizz-motion-3d-director, wizz-taste-skill]
92
93
  - id: wizz-taste-skill
93
94
  door: direcao
94
95
  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)."
96
+ rel:
97
+ pairs_with: [apple-design, wizz-decision-maker]
95
98
  - id: wizz-motion-3d-director
96
99
  door: direcao
97
100
  when: "Direção de motion/animação, 3D, WebGL, scroll cinematográfico, image-to-video. Decide o caminho ANTES de implementar."
101
+ rel:
102
+ before: [wizz-remotion-best-practices]
103
+ pairs_with: [wizz-decision-maker]
98
104
 
99
105
  # ── Porta 2: CONSTRUÇÃO E POLISH DE UI ──
100
106
  - id: wizz-ui-ux-pro-max
101
107
  entry: true
102
108
  door: construcao
103
109
  when: "PORTA de construção: criar/melhorar UI (design system, paleta, tipografia, componente, página). Puxa: wizz-premium-landing-ui-researcher (landing premium greenfield), wizz-ui-component-curator (1 componente em projeto existente), wizz-impeccable (gate de polish/acessibilidade), wizz-taste-skill (anti-slop em código existente, protocolo de redesign), wizz-huashu-design (protótipo HTML hi-fi/variantes/review) e wizz-react-components (Stitch→React)."
110
+ rel:
111
+ after: [wizz-decision-maker]
112
+ before: [wizz-impeccable]
113
+ pairs_with: [wizz-huashu-design, wizz-premium-landing-ui-researcher, wizz-ui-component-curator]
104
114
  - id: wizz-premium-landing-ui-researcher
105
115
  door: construcao
106
116
  when: "Projeto NOVO (greenfield): cria landing premium do zero, hero, 3D high-end. Estratégia source-first."
117
+ rel:
118
+ pairs_with: [wizz-ui-ux-pro-max]
107
119
  - id: wizz-ui-component-curator
108
120
  door: construcao
109
121
  when: "Projeto EXISTENTE: qual componente/efeito adicionar que combina com o estilo atual."
122
+ rel:
123
+ pairs_with: [wizz-ui-ux-pro-max]
110
124
  - id: wizz-impeccable
111
125
  door: construcao
112
126
  when: "Gate de polish/qualidade de frontend: hardening de UI, acessibilidade, anti-padrões. Refina o que já existe."
127
+ rel:
128
+ after: [wizz-ui-ux-pro-max]
113
129
  - id: wizz-huashu-design
114
130
  door: construcao
115
131
  when: "Direção visual + protótipo HTML hi-fi, exploração de variantes, review 5-dim, export MP4/GIF."
132
+ rel:
133
+ before: [wizz-react-components]
134
+ pairs_with: [wizz-ui-ux-pro-max]
116
135
  - id: wizz-react-components
117
136
  door: construcao
118
137
  when: "Converter design (Stitch MCP) em componentes React/Vite."
138
+ rel:
139
+ after: [wizz-huashu-design]
119
140
 
120
141
  # ── Porta 3: MOTION E ASSETS (executar animação e gerar mídia) ──
121
142
  - id: wizz-animate
122
143
  entry: true
123
144
  door: motion
124
145
  when: "PORTA de motion/assets: executar animação e gerar mídia. Craft de micro-interação (regras do Emil Kowalski: saída > entrada, só transform/opacity, reduced-motion). Puxa: wizz-design-motion-principles (auditar animação existente), wizz-remotion-best-practices (vídeo em React), wizz-canvas-design (PNG/PDF por código) e wizz-algorithmic-art (visual generativo)."
146
+ rel:
147
+ pairs_with: [wizz-design-motion-principles]
125
148
  - id: wizz-design-motion-principles
126
149
  door: motion
127
150
  when: "Auditor de movimento: revisa animação existente e aponta scale(0) no início, easing cru, reduced-motion faltando; pesa contenção/polimento/diversão pelo contexto."
151
+ rel:
152
+ pairs_with: [wizz-animate]
128
153
  - id: wizz-remotion-best-practices
129
154
  door: motion
130
155
  when: "MONTAR o filme: vídeo em React (Remotion) com áudio, SFX, legenda e timing com precisão de frame. No pipeline de vídeo é o Remotion que faz a montagem final; o hyperframes só desenha as telas mudas (regra: HyperFrames desenha, Remotion monta — ver _shared/video-pipeline.md do módulo wizz)."
131
156
  rel:
132
- after: [hyperframes]
157
+ after: [buttercut, ctc-align, get-brolls, hyperframes, wizz-motion-3d-director]
133
158
  - id: wizz-canvas-design
134
159
  door: motion
135
160
  when: "Gerar PNG/PDF editável por código (carrossel, quote card, infográfico) com fonte/cor/logo sempre certos. Traz canvas-fonts."
161
+ rel:
162
+ pairs_with: [wizz-algorithmic-art, wizz-social-content]
136
163
  - id: wizz-algorithmic-art
137
164
  door: motion
138
165
  when: "Visual generativo por código (flow fields, ruído, partículas) para fundo/textura de hero, único a cada render, sem cara de banco de imagem."
166
+ rel:
167
+ pairs_with: [wizz-canvas-design]
139
168
  - id: ctc-align
140
169
  door: motion
141
170
  when: "Timing por forced alignment: timestamps palavra a palavra de narração TTS para sincronizar legenda, corte de cena e animação com a fala. Fonte única de timing no pipeline de vídeo; substitui Whisper e estimativa manual."
171
+ rel:
172
+ after: [voicebox]
173
+ before: [wizz-remotion-best-practices]
142
174
  clis:
143
175
  - id: hyperframes
144
176
  when: "DESENHAR telas de vídeo em HTML/CSS (HTML→MP4, agent-native, 20+ skills): cena isolada e MUDA — maqueta de WhatsApp/ChatGPT, gráfico animado, título, loop. NÃO usar para montagem com áudio/SFX/legenda sincronizada (posicionador de áudio falhou em produção, ~2,76s de drift; CSS vaza entre telas): a montagem final é do Remotion (regra: HyperFrames desenha, Remotion monta — ver _shared/video-pipeline.md do módulo wizz). Precisa ffmpeg + Node 22 + Chrome headless."
@@ -157,6 +189,8 @@ areas:
157
189
  install: 'd="$(mktemp -d)" && git clone https://github.com/heygen-com/hyperframes.git "$d" && git -C "$d" checkout 59a69a145bfbd0f10dee72246b68ee5d9bd71063 && npx skills add "$d" -g -y --copy && printf "%s\\n" 59a69a145bfbd0f10dee72246b68ee5d9bd71063 > "$HOME/.claude/skills/hyperframes/.wizz-pin" && rm -rf "$d" && rm -rf "$HOME/.claude/skills/remotion-to-hyperframes"'
158
190
  - id: claude-video
159
191
  when: "Analisar/entender vídeo EXISTENTE: baixa, extrai frames e transcreve para resumir, achar momentos ou diagnosticar footage. NÃO cria vídeo. Precisa ffmpeg + yt-dlp (+ Groq/OpenAI p/ transcrição sem legenda)."
192
+ rel:
193
+ pairs_with: [get-brolls]
160
194
  platform: [darwin, linux]
161
195
  # O check confere o SHA fixado, não só a existência da pasta: o bundle é
162
196
  # copiado (não clonado), então o pin é gravado num marcador no install.
@@ -169,7 +203,7 @@ areas:
169
203
  # última tag publicada lá é a v2.3.7; o 2.3.8 só existe como HEAD.
170
204
  metadata:
171
205
  version: "2.3.8"
172
- when: "CAPTAR B-roll/insert: acha a fonte LITERAL do que a narração cita (o fato, a pessoa, o produto, a notícia, a tela) em YouTube (yt-dlp, sem API key), Instagram/TikTok (navegador/Playwright, sessão do usuário), Pexels/Pixabay/Wikimedia Commons/NASA ou arquivo local; gera prévia (poster, contact sheet numerado, GIF), monta um Storyboard HTML para REVISÃO HUMANA e entrega o corte com origem/autor/condições de uso registrados. Etapa de CAPTAÇÃO do pipeline de vídeo: enche a timeline de material real antes do corte fino e da montagem. Stock só quando o usuário pedir stock explicitamente — nunca como preenchimento de um beat sem fonte literal."
206
+ when: "CAPTAR B-roll/insert — em português: 'imagens de apoio', 'cenas de apoio', 'imagem de corte' para Reel, TikTok ou vídeo: acha a fonte LITERAL do que a narração cita (o fato, a pessoa, o produto, a notícia, a tela) em YouTube (yt-dlp, sem API key), Instagram/TikTok (navegador/Playwright, sessão do usuário), Pexels/Pixabay/Wikimedia Commons/NASA ou arquivo local; gera prévia (poster, contact sheet numerado, GIF), monta um Storyboard HTML para REVISÃO HUMANA e entrega o corte com origem/autor/condições de uso registrados. Etapa de CAPTAÇÃO do pipeline de vídeo: enche a timeline de material real antes do corte fino e da montagem. Stock só quando o usuário pedir stock explicitamente — nunca como preenchimento de um beat sem fonte literal."
173
207
  not_when:
174
208
  - "Analisar/resumir um vídeo que já se tem em mãos: é claude-video."
175
209
  - "Cortar/montar footage já captado: é buttercut (corte fino) ou wizz-remotion-best-practices (montagem final)."
@@ -177,6 +211,7 @@ areas:
177
211
  - "Desenhar uma tela/cena em HTML: é hyperframes."
178
212
  - "Minerar/estudar criativo ou oferta de concorrente (Biblioteca de Anúncios, 'baixa esse anúncio pra eu ver'): é wizz-lowticket-minerador na área ads. O get-brolls capta insert para a SUA edição, com procedência registrada — não é ferramenta de inteligência competitiva, e o fato de saber baixar um Reel não o torna uma."
179
213
  rel:
214
+ after: [wizz-social-content]
180
215
  before: [buttercut, wizz-remotion-best-practices]
181
216
  pairs_with: [claude-video]
182
217
  # macOS apenas: o upstream declara macOS/Windows (Linux não é testado lá)
@@ -203,6 +238,9 @@ areas:
203
238
  verify: 'command -v ffmpeg >/dev/null 2>&1 && ffmpeg -hide_banner -filters 2>/dev/null | grep -q " drawtext " && test -x "$HOME/.claude/skills/get-brolls/.venv/bin/python"'
204
239
  - id: buttercut
205
240
  when: "EDITAR vídeo por IA: cortes, selects, cenas, roughcut via XML/FFmpeg. Sugerir quando o pedido for editar/cortar vídeo. Clone-and-run no PROJETO (não é skill add), pesado: Ruby + Python + FFmpeg + WhisperX. AVISOS: ~GB de modelos (WhisperX), build demorado, só Apple Silicon."
241
+ rel:
242
+ after: [get-brolls]
243
+ before: [wizz-remotion-best-practices]
206
244
  platform: darwin-arm64
207
245
  # Clone-and-run: o próprio repo responde o SHA, então o check compara com o
208
246
  # pin. O install repara um clone existente em vez de falhar no git clone.
@@ -212,6 +250,8 @@ areas:
212
250
  verify: "command -v ffmpeg >/dev/null 2>&1 && command -v ruby >/dev/null 2>&1 && command -v python3 >/dev/null 2>&1"
213
251
  - id: voicebox
214
252
  when: "Voz/TTS/clonagem de voz local para narração/VO de vídeo (7 engines TTS + Whisper STT). App desktop que expõe endpoint MCP local em runtime. Clone-and-run no projeto."
253
+ rel:
254
+ before: [ctc-align]
215
255
  platform: [darwin, linux]
216
256
  # Clone-and-run: o próprio repo responde o SHA, então o check compara com o
217
257
  # pin. O install repara um clone existente em vez de falhar no git clone.
@@ -220,12 +260,17 @@ areas:
220
260
  install: "{ [ -d voicebox/.git ] || git clone https://github.com/jamiepine/voicebox.git voicebox; } && git -C voicebox fetch --tags origin && git -C voicebox checkout 2bcb98d1a8b6fe05e15fbc1559e3085669e4035d"
221
261
  - id: ctc-align
222
262
  when: "Timestamps palavra a palavra CONFIÁVEIS de narração TTS (texto conhecido): sincronizar legenda, corte de cena, animação e elemento gráfico com a fala. Fonte única de timing em vídeo — substitui timestamps do Whisper e estimativa manual. Skill da lib: ctc-align (instalação + helper align.py + regras de âncora monotônica e duração mínima). Roda em CPU, sem CUDA."
263
+ rel:
264
+ after: [voicebox]
265
+ before: [wizz-remotion-best-practices]
223
266
  platform: [darwin, linux]
224
267
  check: "test -x ./tools/ctc-align/.venv/bin/ctc-forced-aligner"
225
268
  install: 'mkdir -p tools/ctc-align && uv venv --python 3.12 tools/ctc-align/.venv && uv pip install --python tools/ctc-align/.venv/bin/python "git+https://github.com/MahmoudAshraf97/ctc-forced-aligner.git"'
226
269
  verify: "command -v ffmpeg >/dev/null 2>&1 && command -v uv >/dev/null 2>&1"
227
270
  - id: fal-video
228
271
  when: "GERAR vídeo/imagem por IA (Veo/Kling/Wan e outros modelos via API da fal.ai), estilo UGC/ad-ready. Substitui o arcads: mesmo caso de uso (vídeo gerado por IA), custo 50-95% menor por vídeo, sem clone-and-run pesado. Precisa FAL_KEY em .env. Sem CLI binária oficial: usa o client Node oficial @fal-ai/client como dependência do projeto."
272
+ rel:
273
+ pairs_with: [wizz-ad-creative]
229
274
  platform: [darwin, linux]
230
275
  check: "test -f node_modules/@fal-ai/client/package.json"
231
276
  # Pin de supply chain (2026-08-25): versão fixa (client oficial fal.ai); atualizar conscientemente.
@@ -234,7 +279,7 @@ areas:
234
279
  when: "Revisar/auditar UI NATIVA (iOS/macOS: SwiftUI, Flutter, React Native, Tauri, Electron) contra o Apple HIG e o Liquid Glass — compliance com o HIG, acessibilidade, dark mode, navegação. Cobre o gap que o wizz-taste-skill declara fora de escopo ('native mobile: use Apple HIG directly')."
235
280
  not_when: "UI web: aí é wizz-ui-ux-pro-max / wizz-impeccable."
236
281
  rel:
237
- pairs_with: [wizz-taste-skill]
282
+ pairs_with: [wizz-desktop-security, wizz-taste-skill]
238
283
  platform: [darwin, linux]
239
284
  # Upstream sem licença declarada e reproduz texto do Apple HIG (122
240
285
  # páginas): o Wizz só instala a partir do upstream, no opt-in do
@@ -250,28 +295,48 @@ areas:
250
295
  agent: wizz-copy
251
296
  summary: "Copywriting: texto de venda, headlines, páginas, e-mails, sequências."
252
297
  skills:
253
- # Módulo lowticket (src/modules/lowticket) — ver nota em ads.skills.
254
- # Entram primeiro de propósito: copy de low ticket lê o shard antes de escrever.
255
- - id: wizz-lowticket-guia
256
- module: lowticket
257
- when: "Leigo que quer vender produto barato e não sabe o que pedir: situa na jornada de 7 etapas e despacha. Ler ANTES de escrever copy de low ticket."
258
- - id: wizz-lowticket-metodologia
259
- module: lowticket
260
- when: "Copy de low ticket BR/PT (página, VSL, roteiro de criativo, headline): ler o shard antes de escrever. 12c página, 18 copy, 04b §4.7-A VSL (9 vendas), 04c roteiro de criativo. O shard vence a skill genérica."
261
- not_when:
262
- - "SaaS, B2B, site de cliente, high ticket ou mentoria: os números não transferem."
298
+ # Módulo lowticket: as skills dele moram SÓ na área growth desde
299
+ # 2026-09-18 (decisão do dono: um dono por skill). A copy chega nelas
300
+ # pelo `rel` de wizz-copywriting — que é o caminho que o método usa pra
301
+ # tudo mais. Antes a mesma skill existia em copy, growth e ads, e o
302
+ # eval mostrava o custo: "qual prazo de garantia?" respondia copy,
303
+ # growth ou ads em amostras diferentes, porque as três estavam certas.
263
304
  - id: wizz-copywriting
264
305
  when: "Escrever copy de venda/página/headline do zero ou reescrever."
306
+ rel:
307
+ after: [pesquisa-de-publico-do-piva, wizz-offer-forge]
308
+ before: [wizz-copy-editing]
309
+ pairs_with:
310
+ [
311
+ wizz-ad-creative,
312
+ wizz-cold-email,
313
+ wizz-email-sequence,
314
+ wizz-humanizer,
315
+ wizz-lowticket-metodologia,
316
+ wizz-marketing-psychology,
317
+ wizz-page-cro,
318
+ ]
265
319
  - id: wizz-copy-editing
266
320
  when: "Editar/melhorar copy existente (framework Seven Sweeps). Review editorial geral."
321
+ rel:
322
+ after: [wizz-copywriting]
323
+ pairs_with: [wizz-social-content]
267
324
  - id: wizz-humanizer
268
325
  when: "Texto soa AI: remover padrões de escrita de máquina, dar naturalidade."
326
+ rel:
327
+ pairs_with: [wizz-copywriting]
269
328
  - id: wizz-email-sequence
270
329
  when: "Sequências de e-mail (onboarding, nurture, lançamento)."
330
+ rel:
331
+ pairs_with: [wizz-copywriting, wizz-launch-strategy, wizz-referral-program]
271
332
  - id: wizz-cold-email
272
333
  when: "Cold email / outbound B2B / prospecção."
334
+ rel:
335
+ pairs_with: [wizz-copywriting]
273
336
  - id: wizz-sales-enablement
274
337
  when: "Material de vendas: deck, one-pager, objeções, demo script, playbook."
338
+ rel:
339
+ pairs_with: [wizz-competitor-alternatives]
275
340
 
276
341
  seo:
277
342
  agent: wizz-seo
@@ -279,17 +344,33 @@ areas:
279
344
  skills:
280
345
  - id: wizz-seo-audit
281
346
  when: "Ponto de partida: auditar/diagnosticar SEO, queda de tráfego, ranking, core web vitals."
347
+ rel:
348
+ before: [distribb, wizz-ai-seo, wizz-programmatic-seo, wizz-schema-markup, wizz-site-architecture]
282
349
  - id: wizz-ai-seo
283
350
  when: "Otimizar pra ser citado por LLMs/AI search (AEO/GEO/LLMO, AI Overviews)."
351
+ rel:
352
+ after: [wizz-seo-audit]
353
+ pairs_with: [wizz-schema-markup]
284
354
  - id: wizz-schema-markup
285
355
  when: "Implementar dados estruturados / structured data."
356
+ rel:
357
+ after: [wizz-seo-audit]
358
+ pairs_with: [site-launch-kit, wizz-ai-seo]
286
359
  - id: wizz-programmatic-seo
287
360
  when: "Gerar páginas em escala pra atacar muitas keywords."
361
+ rel:
362
+ after: [wizz-seo-audit]
363
+ pairs_with: [wizz-free-tool-strategy, wizz-site-architecture]
288
364
  - id: wizz-site-architecture
289
365
  when: "Arquitetura de site / topic clusters / estrutura de URLs."
366
+ rel:
367
+ after: [wizz-seo-audit]
368
+ pairs_with: [wizz-programmatic-seo]
290
369
  clis:
291
370
  - id: distribb
292
371
  when: "EXECUTAR distribuição de SEO: publicar artigos + construir backlinks pela rede da Distribb, conectar Google Search Console, autopublicar notícias. Complementa (não duplica) as skills de SEO que só geram/auditam. Requer Distribb API + GSC (+ DataForSEO/Ahrefs no plano free)."
372
+ rel:
373
+ after: [wizz-seo-audit]
293
374
  platform: [darwin, linux]
294
375
  # O check confere o SHA fixado, não só a existência da pasta: o bundle é
295
376
  # copiado (não clonado), então o pin é gravado num marcador no install.
@@ -303,74 +384,141 @@ areas:
303
384
  skills:
304
385
  - id: wizz-marketing-ideas
305
386
  when: "Travou / quer inspiração ampla de marketing. Ponto de partida quando não sabe o canal."
387
+ rel:
388
+ pairs_with: [wizz-marketing-psychology, wizz-product-marketing-context]
306
389
  - id: wizz-marketing-psychology
307
390
  when: "Aplicar gatilhos/vieses/modelos mentais à persuasão."
391
+ rel:
392
+ pairs_with: [wizz-copywriting, wizz-marketing-ideas]
308
393
  - id: wizz-product-marketing-context
309
394
  when: "Posicionamento de produto e contexto de marketing do produto."
395
+ rel:
396
+ pairs_with: [wizz-marketing-ideas]
310
397
  - id: wizz-launch-strategy
311
398
  when: "Lançar produto/feature: Product Hunt, GTM, waitlist, beta."
399
+ rel:
400
+ pairs_with: [wizz-email-sequence, wizz-social-content]
312
401
  - id: wizz-pricing-strategy
313
402
  when: "Preço, planos, freemium, packaging, willingness to pay."
403
+ rel:
404
+ pairs_with: [wizz-offer-forge, wizz-paywall-upgrade-cro]
314
405
  - id: wizz-paywall-upgrade-cro
315
406
  when: "Tela de upgrade in-app / paywall."
407
+ rel:
408
+ pairs_with: [wizz-pricing-strategy]
316
409
  - id: wizz-churn-prevention
317
410
  when: "Churn, retenção, cancelamento, NPS."
411
+ rel:
412
+ pairs_with: [wizz-revops]
318
413
  - id: wizz-revops
319
414
  when: "Operações de receita: pipeline, métricas, processo de revenue."
415
+ rel:
416
+ pairs_with: [wizz-churn-prevention]
320
417
  - id: wizz-page-cro
321
418
  when: "Otimizar conversão de página (home, landing, pricing, feature)."
419
+ rel:
420
+ after: [wizz-tracking-audit]
421
+ pairs_with: [wizz-copywriting, wizz-form-cro, wizz-popup-cro]
322
422
  - id: wizz-form-cro
323
423
  when: "Otimizar formulários (fora de signup)."
424
+ rel:
425
+ pairs_with: [wizz-page-cro]
324
426
  - id: wizz-popup-cro
325
427
  when: "Otimizar popups/modais."
428
+ rel:
429
+ pairs_with: [wizz-page-cro]
326
430
  - id: wizz-onboarding-cro
327
431
  when: "Ativação pós-signup / onboarding de usuário."
432
+ rel:
433
+ pairs_with: [wizz-signup-flow-cro]
328
434
  - id: wizz-signup-flow-cro
329
435
  when: "Fluxo de signup/registro."
436
+ rel:
437
+ pairs_with: [wizz-onboarding-cro]
330
438
  - id: wizz-competitor-alternatives
331
439
  when: "Página de comparação vs concorrente / alternatives / battle card."
440
+ rel:
441
+ pairs_with: [scrapling, wizz-sales-enablement]
332
442
  - id: wizz-referral-program
333
443
  when: "Programa de indicação/afiliados."
444
+ rel:
445
+ pairs_with: [wizz-analytics-tracking, wizz-email-sequence]
334
446
  - id: wizz-free-tool-strategy
335
447
  when: "Ferramenta grátis pra captação de leads."
448
+ rel:
449
+ pairs_with: [wizz-programmatic-seo]
336
450
  - id: wizz-ab-test-setup
337
451
  when: "Montar A/B test / experimento de conversão."
452
+ rel:
453
+ pairs_with: [wizz-analytics-tracking]
338
454
  - id: wizz-analytics-tracking
339
455
  when: "Setar/auditar tracking e medição (GA4, GTM, eventos, UTM, atribuição)."
456
+ rel:
457
+ pairs_with: [wizz-ab-test-setup, wizz-referral-program, wizz-tracking-audit]
340
458
  - id: site-launch-kit
341
459
  when: "Site pronto ou quase pronto pra ir ao ar: revisão de pré-lançamento em 15 rodadas corretivas (CTA acima da dobra, barra fixa mobile, tempo de resposta, prova social real, FAQ+FAQPage, imagens reais, endereço, titles, Open Graph, breadcrumbs, alt text, schema local, robots/sitemap, LGPD, medição), com regra anti-invenção e PENDÊNCIAS. Gatilhos: 'vamos subir o site', 'checklist de lançamento', 'revisa antes do deploy', pré-go-live, ou um item isolado (og:image, FAQ com schema, robots.txt). Roda DEPOIS do site construído, ANTES do deploy."
460
+ rel:
461
+ pairs_with: [wizz-launch-readiness, wizz-schema-markup]
342
462
  - id: pesquisa-de-publico-do-piva
343
463
  when: "Pesquisa profunda de público, VoC, níveis de consciência, matriz de ângulos e léxico nativo de oferta compilados em HTML (metodologia @soupiva)."
464
+ rel:
465
+ before: [wizz-copywriting, wizz-offer-forge]
344
466
  - id: wizz-offer-forge
345
467
  when: "Forjar oferta irresistível de resposta direta/infoproduto (mecanismo único, empilhamento de valor, garantia reversa, ponte de tráfego)."
346
- # Módulo lowticket (src/modules/lowticket) — ver nota em ads.skills.
468
+ rel:
469
+ after: [pesquisa-de-publico-do-piva, wizz-lowticket-minerador]
470
+ before: [wizz-copywriting]
471
+ pairs_with: [wizz-pricing-strategy]
472
+ # Módulo lowticket (src/modules/lowticket) — ver nota em ads.skills. Desde
473
+ # 2026-09-18 o módulo inteiro mora aqui (um dono por skill): copy e ads
474
+ # chegam nele pelo `rel`. Isto é comentário de propósito — escrever "vale
475
+ # para as três áreas" dentro do `when:` da porta de entrada a deixou
476
+ # gulosa na medição seguinte (passou a engolir pedido de tarefa nomeada,
477
+ # que é exatamente a trava que a 2.7.0 tinha acabado de pôr nela).
347
478
  - id: wizz-lowticket-guia
348
479
  module: lowticket
349
- when: "Porta de entrada low ticket para leigo: 'quero vender um produto barato', 'por onde começo', 'ninguém compra'. Situa na jornada de 7 etapas e despacha."
480
+ when: "Porta de entrada low ticket para quem não sabe o que pedir: 'quero vender um produto barato', 'por onde começo', 'ninguém compra', 'não estou vendendo', 'anúncio não funciona'. Situa na jornada de 7 etapas e despacha. NÃO usar quando o pedido já nomeia uma tarefa concreta com seus insumos (escrever uma copy, diagnosticar uma página, ler um print de campanha): aí vá direto na skill daquela etapa."
481
+ rel:
482
+ before:
483
+ [wizz-lowticket-funil, wizz-lowticket-metodologia, wizz-lowticket-minerador, wizz-lowticket-pagina, wizz-lowticket-trafego]
350
484
  - id: wizz-lowticket-metodologia
351
485
  module: lowticket
352
- when: "Roteador da base low ticket BR/PT: gatilho → um shard. Régua de preço, garantia, copy e rastreamento que tem precedência sobre a skill genérica."
486
+ when: "Roteador da base low ticket BR/PT: gatilho → um shard (diagnóstico de funil, bid cap, criativo, oferta, página, Instagram, player de VSL, upsell, copy, rastreamento, mineração). Régua de preço, garantia, copy e rastreamento que tem precedência sobre a skill genérica — inclusive a copy de low ticket (página, VSL, roteiro de criativo, headline): ler o shard ANTES de escrever. Carrega guardrails junto."
353
487
  not_when:
354
488
  - "SaaS, B2B, site de cliente, high ticket ou mentoria: os números não transferem."
489
+ rel:
490
+ after: [wizz-lowticket-guia]
491
+ pairs_with: [wizz-copywriting, wizz-lowticket-pagina, wizz-lowticket-trafego]
355
492
  - id: wizz-lowticket-funil
356
493
  module: lowticket
357
494
  when: "Escada pós-checkout de low ticket: upsell 1, upsell 2, downsell, oferta final, régua de preço por degrau e copy das páginas."
358
495
  not_when:
359
496
  - "Antes de existir um front-end que converte: estender funil sobre front que não vende multiplica zero."
497
+ rel:
498
+ after: [wizz-lowticket-guia, wizz-lowticket-pagina]
360
499
  - id: wizz-lowticket-minerador
361
500
  module: lowticket
362
501
  when: "Garimpo e veredito de oferta de concorrente: vocabulário de busca, veredito em 4 níveis, comparação lado a lado, diagnóstico de por que não escalou."
363
502
  not_when:
364
503
  - "A oferta já está definida: aí é wizz-offer-forge."
504
+ rel:
505
+ after: [wizz-lowticket-guia]
506
+ before: [wizz-offer-forge]
365
507
  - id: wizz-lowticket-pagina
366
508
  module: lowticket
367
509
  when: "Engenharia de performance da página de venda low ticket: connect rate, ordem do pixel, LCP/TTFB/CLS, peso acima da dobra, relatório antes e depois."
368
510
  not_when:
369
511
  - "Reescrever copy, preço ou estrutura de oferta: esta skill é o engenheiro, não o copywriter."
370
512
  - "Site institucional ou app."
513
+ rel:
514
+ after: [wizz-lowticket-guia]
515
+ before: [wizz-lowticket-funil]
516
+ pairs_with: [wizz-lowticket-metodologia, wizz-lowticket-trafego]
371
517
  mcps:
372
518
  - id: scrapling
373
519
  when: "Scraping/crawl web para pesquisa de mercado, prospecção de leads e inteligência competitiva. Bypass anti-bot (Cloudflare), parsing adaptativo, spider concorrente. Requer: pip install 'scrapling[ai]' && scrapling install."
520
+ rel:
521
+ pairs_with: [wizz-competitor-alternatives]
374
522
  server:
375
523
  command: scrapling
376
524
  args: ["mcp"]
@@ -387,14 +535,24 @@ areas:
387
535
  skills:
388
536
  - id: wizz-social-content
389
537
  when: "Criar/agendar conteúdo de social (LinkedIn, X, TikTok, IG...)."
538
+ rel:
539
+ before: [get-brolls, postiz]
540
+ pairs_with: [wizz-canvas-design, wizz-content-strategy, wizz-copy-editing, wizz-launch-strategy]
390
541
  - id: wizz-content-strategy
391
542
  when: "Decidir O QUE produzir de conteúdo (topic clusters, calendário, pilares)."
543
+ rel:
544
+ pairs_with: [wizz-social-content]
392
545
  - id: wizz-copy-editing
393
546
  when: "Revisar/editar o texto do roteiro ou da legenda antes de publicar."
547
+ rel:
548
+ after: [wizz-copywriting]
549
+ pairs_with: [wizz-social-content]
394
550
  clis:
395
551
  - id: postiz
396
552
  when: "PUBLICAR/agendar de verdade em redes sociais (30+ integrações) a partir do conteúdo que o wizz-social já gerou. Separa 'gerar' (Wizz) de 'publicar' (Postiz). Precisa autenticar antes (`postiz auth:login` ou env `POSTIZ_API_KEY`); para imagem/vídeo a própria CLI faz o upload."
397
553
  not_when: "Escrever o roteiro ou a legenda: isso é skill da área (wizz-social-content, wizz-copy-editing)."
554
+ rel:
555
+ after: [wizz-social-content]
398
556
  # Item 30 da auditoria (2026-09-11, Parte 3.7). Pin de supply chain
399
557
  # (2026-09-12): versão publicada fixa no npm, atualizar conscientemente.
400
558
  # CLI, não MCP: o schema de `mcps:` deste registry só aceita stdio
@@ -411,35 +569,36 @@ areas:
411
569
  skills:
412
570
  - id: wizz-paid-ads
413
571
  when: "Estratégia de campanha, targeting, bidding, ROAS/CPA. Decidir/rodar ads."
572
+ rel:
573
+ pairs_with: [wizz-ad-creative, wizz-tracking-audit]
414
574
  - id: wizz-ad-creative
415
575
  when: "Gerar/iterar criativos e headlines de anúncio em escala (RSA, variações)."
576
+ rel:
577
+ pairs_with: [fal-video, wizz-copywriting, wizz-paid-ads]
416
578
  - id: wizz-analytics-tracking
417
579
  when: "Tracking de conversão pros anúncios (compartilhada com growth)."
580
+ rel:
581
+ pairs_with: [wizz-ab-test-setup, wizz-referral-program, wizz-tracking-audit]
418
582
  - id: wizz-tracking-audit
419
583
  when: "Auditar rastreamento de oferta de resposta direta. Modo implantação: pixel, CAPI, domínio verificado, eventos priorizados, UTM com ID, repasse do parâmetro nativo pelo checkout, higiene de nomenclatura, compra-teste por rota. Modo diagnóstico: qual transição do funil está furando, medição contra conversão, ROI verdadeiro contra falso, qual dado falta pra decidir."
420
584
  not_when:
421
585
  - "Plano de medição de SaaS ou produto instrumentado por evento de uso: é analytics-tracking."
422
586
  - "Decidir bid, orçamento ou estrutura de campanha: é paid-ads."
423
587
  rel:
424
- pairs_with: [wizz-analytics-tracking, wizz-paid-ads]
425
588
  before: [wizz-page-cro]
589
+ pairs_with: [wizz-analytics-tracking, wizz-lowticket-trafego, wizz-paid-ads]
426
590
  # Módulo lowticket (src/modules/lowticket) — instaladas COM O MÓDULO, não
427
591
  # por skills-lib. O campo `module` é o gate: resolveSkillIds as ignora ao
428
592
  # copiar de src/skills-lib, e o router continua enxergando as entradas.
429
- - id: wizz-lowticket-guia
430
- module: lowticket
431
- when: "Porta de entrada low ticket para leigo: 'não estou vendendo', 'por onde começo', 'anúncio não funciona'. Situa na jornada de 7 etapas e despacha."
432
- - id: wizz-lowticket-metodologia
433
- module: lowticket
434
- when: "Roteador da base low ticket BR/PT: gatilho → um shard (diagnóstico de funil, bid cap, criativo, oferta, página, Instagram, player de VSL, upsell, copy, rastreamento, mineração). Carrega guardrails junto."
435
- not_when:
436
- - "SaaS, B2B, site de cliente, high ticket ou mentoria: os números não transferem."
437
593
  - id: wizz-lowticket-trafego
438
594
  module: lowticket
439
595
  when: "Diagnóstico e régua de campanha Meta de low ticket: estrutura 1-1-X, bid cap, régua de 3x, quando cortar, como escalar, ler print do gerenciador ou do funil."
440
596
  not_when:
441
597
  - "Google Ads institucional, campanha de marca, lead gen B2B."
442
598
  - "Escrever copy ou criativo: a skill lê número, não produz anúncio."
599
+ rel:
600
+ after: [wizz-lowticket-guia]
601
+ pairs_with: [wizz-lowticket-metodologia, wizz-lowticket-pagina, wizz-tracking-audit]
443
602
 
444
603
  architect:
445
604
  agent: wizz-agent-architect
@@ -447,27 +606,50 @@ areas:
447
606
  skills:
448
607
  - id: wizz-web-security
449
608
  when: "Auditar segurança web, OWASP, XSS/CSRF/injeção/SQLi, IDOR, headers, rate limit (IP+conta), CORS, clickjacking, vazamento de PII na resposta, antes de deploy/PR."
609
+ rel:
610
+ before: [security-audit-pentest]
611
+ pairs_with: [wizz-auth-and-secrets, wizz-database-and-deps, wizz-desktop-security]
450
612
  - id: wizz-auth-and-secrets
451
613
  when: "Auth (JWT/OAuth/SSO/Clerk), token no header vs URL, revogar no logout, enumeração de usuário, gestão de secrets, rotação de credenciais."
614
+ rel:
615
+ pairs_with: [wizz-web-security]
452
616
  - id: wizz-desktop-security
453
617
  when: "Segurança desktop/Electron (contextIsolation, code signing)."
618
+ rel:
619
+ pairs_with: [apple-design, wizz-web-security]
454
620
  - id: wizz-database-scaling
455
621
  when: "Banco lento, queries, índices, N+1, sharding, connection pool."
622
+ rel:
623
+ pairs_with: [wizz-caching-and-queues, wizz-supabase-postgres-best-practices]
456
624
  - id: wizz-caching-and-queues
457
625
  when: "Cache (Redis), filas (BullMQ/SQS/Kafka), jobs assíncronos."
626
+ rel:
627
+ pairs_with: [wizz-database-scaling]
458
628
  - id: wizz-infrastructure
459
629
  when: "Escala de infra: Kubernetes, auto-scaling, CDN, SLOs, load test."
630
+ rel:
631
+ pairs_with: [sentry-cli, wizz-cloud-and-infra]
460
632
  - id: wizz-cloud-and-infra
461
633
  when: "Custo de cloud: right-sizing, spot/reserved, S3 lifecycle, billing AWS/GCP."
634
+ rel:
635
+ pairs_with: [wizz-infrastructure]
462
636
  - id: wizz-database-and-deps
463
637
  when: "Dependências/packages, vulnerabilidades, npm audit."
638
+ rel:
639
+ pairs_with: [wizz-launch-readiness, wizz-web-security]
464
640
  - id: wizz-supabase-postgres-best-practices
465
641
  when: "Performance e boas práticas de Postgres/Supabase (queries, schema, RLS)."
642
+ rel:
643
+ pairs_with: [supabase, wizz-database-scaling]
466
644
  - id: wizz-ai-product-design
467
645
  when: "Construir/melhorar um agente ou produto de IA: escrever/revisar system prompt, definir persona/tom, guardrails e recusas, few-shot, chain-of-thought, orquestração multi-agente, handoff, detecção de frustração, generative UI, avaliar qualidade de saída. Base para desenhar os próprios agentes do método. 44 padrões (Owl-Listener, MIT)."
646
+ rel:
647
+ pairs_with: [enhance-prompt]
468
648
  mcps:
469
649
  - id: supabase
470
650
  when: "Operar Supabase de verdade: rodar SQL, migrations, inspecionar schema/RLS, logs. Default é READ-ONLY e escopado a um projeto (--read-only --project-id); para ESCREVER (migrations, mutações), o agente precisa remover conscientemente o --read-only desta entrada antes de usar — nunca por padrão silencioso."
651
+ rel:
652
+ pairs_with: [wizz-supabase-postgres-best-practices]
471
653
  server:
472
654
  command: npx
473
655
  # Pin de supply chain (2026-08-23): versão fixa; atualizar conscientemente.
@@ -480,6 +662,8 @@ areas:
480
662
  not_when:
481
663
  - "Projeto ainda não usa Sentry (sem SENTRY_DSN, sentry.properties ou '@sentry/' no package.json)."
482
664
  - "Fora de estágio de produção."
665
+ rel:
666
+ pairs_with: [wizz-infrastructure]
483
667
  check: "sentry-cli --version"
484
668
  # Pin de supply chain (2026-08-25): versão fixa; atualizar conscientemente.
485
669
  install: "npm install -g @sentry/cli@3.6.2"
@@ -488,6 +672,8 @@ areas:
488
672
  not_when:
489
673
  - "Registrar a decisão de arquitetura em si: isso é o wizz-architecture."
490
674
  - "Diagrama descartável de conversa: Mermaid inline já basta."
675
+ rel:
676
+ after: [wizz-implementation-planner]
491
677
  platform: [darwin, linux]
492
678
  # Origem: auditoria 2026-09-11, Parte 3.10, item 25. Pin de supply chain
493
679
  # (2026-09-12): tag de release v2.16.0, não main — upstream tem 155
@@ -508,20 +694,33 @@ areas:
508
694
  skills:
509
695
  - id: wizz-adversarial-reviewer
510
696
  when: "Passe único adversarial, ad hoc, fora de workflow — 'tear this apart' num trecho colado, sem contexto de projeto. Não confundir com wizz-review-adversarial-general (persona do 'Blind Hunter'; o prompt operacional vive em review-prompts/blind-hunter.md e nenhum workflow invoca a skill) nem com wizz-code-review (orquestrador bmm: 3 camadas paralelas + triagem, para review real de diff/PR)."
697
+ rel:
698
+ instead_of: [wizz-code-review]
511
699
  - id: security-audit-pentest
512
700
  when: "Auditoria/pentest de segurança do app inteiro — 'auditar segurança', 'pentest', 'encontrar vulnerabilidades', varredura antes de release. Só para teste de segurança AUTORIZADO (seus sistemas ou de clientes com permissão): ferramenta dual-use, nunca usar contra alvo sem autorização."
701
+ rel:
702
+ after: [wizz-web-security]
703
+ pairs_with: [strix, wizz-launch-readiness]
513
704
  - id: wizz-launch-readiness
514
705
  when: "Auditoria de prontidão pra lançamento (Pre-launch Audit), multi-área: técnico/build, segurança, SEO/descoberta, analytics/medição, conteúdo/copy/prova social, legal/LGPD, infra/deploy/rollback. Gatilhos: 'tá pronto pra lançar?', 'auditoria de pré-lançamento', 'checklist de release amplo', 'o que falta antes de ir pra produção'. Gate por estágio: só roda de verdade em mvp/production, e recusa educadamente em estágio de descoberta/ideação. Diagnostica e prioriza por severidade (bloqueia/alto/médio/ok), nunca corrige cego: aponta security-audit-pentest pra aprofundar segurança com prova de exploração e site-launch-kit pra executar a correção quando a superfície do achado é site. Resultado persiste numa seção datada do project-context.md."
515
706
  not_when:
516
707
  - "Estágio de descoberta/ideação: projeto ainda sem superfície construída pra auditar (sem project-context.md, ou stage 'prototype' vazio)."
517
708
  - "Correção de um achado isolado de site já identificado: nesse caso vá direto pra site-launch-kit."
518
709
  rel:
519
- pairs_with: [site-launch-kit, security-audit-pentest]
710
+ pairs_with: [security-audit-pentest, site-launch-kit, wizz-database-and-deps]
711
+ - id: site-launch-kit
712
+ when: "Site pronto ou quase pronto pra ir ao ar: revisão de pré-lançamento em 15 rodadas corretivas (CTA acima da dobra, barra fixa mobile, tempo de resposta, prova social real, FAQ+FAQPage, imagens reais, endereço, titles, Open Graph, breadcrumbs, alt text, schema local, robots/sitemap, LGPD, medição), com regra anti-invenção e PENDÊNCIAS. Gatilhos: 'vamos subir o site', 'checklist de lançamento', 'revisa antes do deploy', pré-go-live, ou um item isolado (og:image, FAQ com schema, robots.txt). Roda DEPOIS do site construído, ANTES do deploy."
713
+ rel:
714
+ pairs_with: [wizz-launch-readiness, wizz-schema-markup]
520
715
  - id: wizz-agent-browser
521
716
  when: "Verificação visual/browser, preencher forms, screenshots, testar UI no navegador. CLI já instalado (não é MCP); browser SEMPRE via wizz-agent-browser, nunca Playwright."
717
+ rel:
718
+ pairs_with: [agent-browser]
522
719
  clis:
523
720
  - id: agent-browser
524
721
  when: "Dirigir um browser real pra E2E/verificação: navegar, clicar, preencher form, screenshot, console. É CLI, não MCP."
722
+ rel:
723
+ pairs_with: [wizz-agent-browser]
525
724
  check: "agent-browser --version"
526
725
  # Pin de supply chain (2026-08-23): versão fixa; atualizar conscientemente.
527
726
  install: "npm install -g agent-browser@0.34.0"
@@ -544,8 +743,14 @@ areas:
544
743
  skills:
545
744
  - id: wizz-inicio-de-projeto
546
745
  when: "Kickoff LEVE de engenharia: stack, personas, glossário, princípios, estrutura de pastas, checklist. Atalho sem cerimônia de PRD."
746
+ rel:
747
+ before: [wizz-implementation-planner]
547
748
  - id: wizz-implementation-planner
548
749
  when: "Plano técnico de implementação de site/app premium pós-direção aprovada. Pesquisa web/prior-art durante o planejamento usa a tool nativa WebSearch (sem custo/MCP metered — o MCP exa foi removido em 2026-08-25)."
750
+ rel:
751
+ after: [wizz-inicio-de-projeto]
752
+ before: [archify, wizz-quick-dev]
753
+ pairs_with: [wizz-document-project]
549
754
 
550
755
  # ── Áreas dev/produto (item 18 da auditoria de 2026-09-11, finding RT-H2):
551
756
  # "dev" era citado dezenas de vezes no método (router, maestro,
@@ -563,27 +768,47 @@ areas:
563
768
  - id: wizz-quick-dev
564
769
  module: bmm
565
770
  when: "DEV PONTUAL: ajuste, bug fix, feature única sem cerimônia de story. Fluxo unificado: clarificar → planejar → implementar → review → apresentar. É o destino padrão quando o router/maestro diz 'dev pontual'."
771
+ rel:
772
+ after: [wizz-implementation-planner, wizz-investigate]
566
773
  - id: wizz-dev-story
567
774
  module: bmm
568
775
  when: "Implementar UMA story específica com spec preenchida ('dev this story', 'implementa a próxima story do sprint')."
776
+ rel:
777
+ after: [wizz-create-story]
778
+ before: [wizz-code-review]
569
779
  - id: wizz-create-story
570
780
  module: bmm
571
781
  when: "Preparar story com todo o contexto de implementação ('cria a story', 'prepara a story'). Antes do dev, no gate de planejamento."
782
+ rel:
783
+ after: [wizz-prd, wizz-set-feature, wizz-sprint-planning]
784
+ before: [wizz-dev-story]
572
785
  - id: wizz-code-review
573
786
  module: bmm
574
787
  when: "Review de código real de diff/PR: 3 camadas paralelas (Blind Hunter, Edge Case, Verification Gap) + triagem. Diferente de wizz-adversarial-reviewer (passe único ad hoc, área qa)."
788
+ rel:
789
+ after: [wizz-dev-story]
790
+ instead_of: [wizz-adversarial-reviewer]
575
791
  - id: wizz-investigate
576
792
  module: bmm
577
793
  when: "Investigar bug/incidente, rastrear causa, construir modelo mental de uma área de código antes de mexer."
794
+ rel:
795
+ before: [wizz-quick-dev]
578
796
  - id: wizz-sprint-planning
579
797
  module: bmm
580
798
  when: "Gerar/atualizar o sprint plan que sequencia stories para implementação."
799
+ rel:
800
+ before: [wizz-create-story, wizz-retrospective]
801
+ pairs_with: [wizz-correct-course]
581
802
  - id: wizz-correct-course
582
803
  module: bmm
583
804
  when: "Mudança significativa durante o sprint: propor ajuste de curso ('correct course')."
805
+ rel:
806
+ pairs_with: [wizz-sprint-planning]
584
807
  - id: wizz-retrospective
585
808
  module: bmm
586
809
  when: "Review do trabalho concluído no epic (party mode)."
810
+ rel:
811
+ after: [wizz-sprint-planning]
587
812
 
588
813
  pm:
589
814
  agent: wizz-agent-pm
@@ -592,15 +817,27 @@ areas:
592
817
  - id: wizz-prd
593
818
  module: bmm
594
819
  when: "Criar, atualizar ou validar PRD ('cria o PRD', 'documento de requisitos', 'define o escopo'). Consolida os antigos create/edit/validate-prd (removidos em v7)."
820
+ rel:
821
+ after: [wizz-product-brief]
822
+ before: [wizz-create-story, wizz-set-feature]
823
+ pairs_with: [wizz-ux]
595
824
  - id: wizz-product-brief
596
825
  module: bmm
597
826
  when: "Criar, atualizar ou validar o brief do produto ('cria o brief'). Antes do PRD, no kickoff de produto."
827
+ rel:
828
+ after: [wizz-prfaq]
829
+ before: [wizz-prd]
598
830
  - id: wizz-prfaq
599
831
  module: bmm
600
832
  when: "Desafio Working Backwards PRFAQ para forjar conceito de produto ('cria a PRFAQ', 'work backwards')."
833
+ rel:
834
+ before: [wizz-product-brief]
601
835
  - id: wizz-set-feature
602
836
  module: bmm
603
837
  when: "Definir feature específica dentro do produto (análise de feature única)."
838
+ rel:
839
+ after: [wizz-prd]
840
+ before: [wizz-create-story]
604
841
 
605
842
  tech-writer:
606
843
  agent: wizz-agent-tech-writer
@@ -609,6 +846,8 @@ areas:
609
846
  - id: wizz-document-project
610
847
  module: bmm
611
848
  when: "Documentar o projeto: gerar/atualizar docs de arquitetura e estrutura para contexto de agentes e humanos."
849
+ rel:
850
+ pairs_with: [wizz-implementation-planner]
612
851
 
613
852
  ux-designer:
614
853
  agent: wizz-agent-ux-designer
@@ -617,6 +856,8 @@ areas:
617
856
  - id: wizz-ux
618
857
  module: bmm
619
858
  when: "Especificar experiência do usuário: fluxos, wireframes de conteúdo, user stories de UX (diferente da área designer, que constrói UI visual)."
859
+ rel:
860
+ pairs_with: [wizz-prd]
620
861
 
621
862
  memoria:
622
863
  agent: wizz-memoria
@@ -633,6 +874,8 @@ utility:
633
874
  when: "Nenhuma skill cobre o pedido: buscar/instalar no marketplace (npx skills find)."
634
875
  - id: enhance-prompt
635
876
  when: "Empacotar um briefing mais completo/estruturado pra mandar a outro agente ou skill."
877
+ rel:
878
+ pairs_with: [wizz-ai-product-design]
636
879
  - id: wizz-router
637
880
  when: "Roteador global/flat: descobre skills quando não se sabe a área; escala pro maestro se multi-área."
638
881
 
@@ -41,6 +41,7 @@ You are the leaf: the maestro demotes here for pointed work (bug, tweak, single-
41
41
 
42
42
  - If clarification reveals the request is actually **multi-goal / multi-area** (2+ top-level shippable deliverables, or it spans several areas), do not silently absorb it. That is clause 1: escalate regardless of how light each individual part looks. Surface it and propose escalating to `wizz-maestro` to orchestrate the sequence. Proceed solo only if the user confirms a narrowed single goal.
43
43
  - If it is genuinely single-area but hits 2+ of the remaining factors (multi-step, needs planning, produces a memorable artifact), also escalate. Do not silently absorb heavy single-area work either.
44
+ - **Count those factors with the objective test** (canonical source: `_shared/complexity-signal.md`; same test the Diretor and the maestro apply). **When in doubt, the factor does NOT count.** *Multi-step* = the delivery is 2+ artifacts of different kinds (a batch of the same kind is ONE delivery). *Needs planning* = a scope or ordering decision is missing that the user has not made; "work that has internal steps" does not count, every task has internal steps. *Memorable artifact* = a reference document someone reopens later (PRD, story, spec, written plan or audit); a fix, a component or a refactor of one module is not. A **single delivery** and the **diagnosis of one specific mechanism** stay with you, however important they look; what escalates is the request of **open scope that the request itself does not delimit** ("how do I improve / reduce X" is that, a question with a single definable answer is not), and what escalates regardless of size is a **sensitive subsystem**: changing auth/sessions, payments/billing, permissions, or migrating data that already exists in production goes to the maestro even as a single delivery, because getting it wrong breaks something other than the delivery itself (people locked out, money charged twice, data lost). Running a test against one of those is not changing it. **Changing the product's code is yours even when the subject is visual** — a button colour, mobile spacing: the delivery is a commit, and `designer` decides the look without shipping the change.
44
45
  - Stay solo only for single-area work with 0-1 of those factors, even when it crosses layers/files.
45
46
 
46
47
  ## Planning gate (before coding a new feature)
@@ -0,0 +1,17 @@
1
+ # Rel protocol (single source)
2
+
3
+ # Read by the 8 area agents as the CANONICAL SOURCE of the paragraph below
4
+ # (wizz-ads, wizz-copy, wizz-designer, wizz-growth, wizz-memoria, wizz-qa and
5
+ # wizz-seo, plus wizz-social) and by wizz-maestro in its own variant. The
6
+ # SKILL.md files do not include it automatically (an agent is a self-contained
7
+ # folder copied verbatim), so editing here does NOT propagate on its own —
8
+ # whoever edits this paragraph has to replicate it by hand in the 8 SKILL.md
9
+ # files. `test/test-rel-protocol-consistency.js` compares the copies against
10
+ # this block character by character and fails on any divergence.
11
+ #
12
+ # `evals/routing/run-routing-eval.mjs` also extracts this paragraph at runtime
13
+ # to build the skill-discovery prompt: what the eval measures has to be the
14
+ # rule the method actually ships, never a local summary (2026-09-18).
15
+ # ---
16
+
17
+ **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.
@@ -25,7 +25,7 @@
25
25
  | **Source B-roll / inserts: find real footage of what the script names** | `get-brolls` (darwin) |
26
26
  | Edit/cut recorded footage (cuts, selects, roughcut) | `buttercut` (darwin-arm64 only) |
27
27
  | Analyze an existing reference video (frames + transcription) | `claude-video` |
28
- | AI-generated video ad (Sora/Veo/Kling) + publish to Meta | `arcads` (ads area) |
28
+ | AI-generated video/image (Veo/Kling/Wan), UGC / ad-ready style | `fal-video` (designer area; needs `FAL_KEY`) |
29
29
 
30
30
  ## Full chain (script → publishing)
31
31
 
@@ -20,7 +20,7 @@ You are Wizz's Ads. It plans campaigns, generates creative variations, and track
20
20
 
21
21
  ## How I work (global bridge)
22
22
 
23
- > **Single source (registry) — ALWAYS read before the examples below:** the real list for your area (`ads`) lives in `skills-registry.yaml`. Resolve the **light slice for your area** first, `{project-root}/_wizz/_config/registry/ads.yaml` (already comes as the full `areas.ads` block); 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.ads` block there. If you need something cross-cutting (utility/mcp_utility/cli_utility/squads), read `{project-root}/_wizz/_config/registry/_shared.yaml`. Offer **everything that matches** the request via `when:` — `skills:` (via `Skill`), `clis:` (`check:` → if missing, show the `install:`, opt-in, respect `platform:`), and `mcps:` (`claude mcp add <id>` with the `server` block). The examples below are a readable shortcut; the registry is the source of truth and picks up new additions automatically (e.g., `arcads` for generating video ads).
23
+ > **Single source (registry) — ALWAYS read before the examples below:** the real list for your area (`ads`) lives in `skills-registry.yaml`. Resolve the **light slice for your area** first, `{project-root}/_wizz/_config/registry/ads.yaml` (already comes as the full `areas.ads` block); 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.ads` block there. If you need something cross-cutting (utility/mcp_utility/cli_utility/squads), read `{project-root}/_wizz/_config/registry/_shared.yaml`. Offer **everything that matches** the request via `when:` — `skills:` (via `Skill`), `clis:` (`check:` → if missing, show the `install:`, opt-in, respect `platform:`), and `mcps:` (`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. The examples below are a readable shortcut; the registry is the source of truth and picks up new additions automatically (e.g., `arcads` for generating video ads).
24
24
  - Campaign strategy, segmentation, bids, ROAS → `wizz-paid-ads`
25
25
  - Creative variations, headlines, ad copy → `wizz-ad-creative`
26
26
  - Tracking, conversions, UTMs, pixel → `wizz-analytics-tracking`
@@ -20,7 +20,7 @@ You are Wizz's Copy. It writes texts that sell, humanizes what sounds robotic, a
20
20
 
21
21
  ## How I work (global bridge)
22
22
 
23
- > **Single source (registry) — ALWAYS read before the examples below:** the real list for your area (`copy`) lives in `skills-registry.yaml`. Resolve the **light slice for your area** first, `{project-root}/_wizz/_config/registry/copy.yaml` (already comes as the full `areas.copy` block); 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.copy` block there. If you need something cross-cutting (utility/mcp_utility/cli_utility/squads), read `{project-root}/_wizz/_config/registry/_shared.yaml`. Offer **everything that matches** the request via `when:` — `skills:` (via `Skill`), `clis:` (`check:` → if missing, show the `install:`, opt-in, respect `platform:`), and `mcps:` (`claude mcp add <id>` with the `server` block). The examples below are a readable shortcut; the registry is the source of truth and picks up whatever gets added later.
23
+ > **Single source (registry) — ALWAYS read before the examples below:** the real list for your area (`copy`) lives in `skills-registry.yaml`. Resolve the **light slice for your area** first, `{project-root}/_wizz/_config/registry/copy.yaml` (already comes as the full `areas.copy` block); 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.copy` block there. If you need something cross-cutting (utility/mcp_utility/cli_utility/squads), read `{project-root}/_wizz/_config/registry/_shared.yaml`. Offer **everything that matches** the request via `when:` — `skills:` (via `Skill`), `clis:` (`check:` → if missing, show the `install:`, opt-in, respect `platform:`), and `mcps:` (`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. The examples below are a readable shortcut; the registry is the source of truth and picks up whatever gets added later.
24
24
  - Page copy, headline, value proposition → `wizz-copywriting`
25
25
  - Email, sequence, nurture → `wizz-email-sequence`
26
26
  - Make text natural, remove the AI feel → `wizz-humanizer`
@@ -25,7 +25,7 @@ You are Wizz's Designer. It creates high-level interfaces and landing pages, sho
25
25
 
26
26
  ## How I work (bridge to global skills)
27
27
 
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). **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.
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
31
  - Decide BEFORE building (brief, visual direction, motion/3D path) → `wizz-decision-maker` (pulls in wizz-taste-skill, wizz-motion-3d-director)
@@ -22,7 +22,7 @@ You are Wizz's Growth. It brings actionable marketing and conversion ideas, plan
22
22
 
23
23
  ## How I work (global bridge)
24
24
 
25
- > **Single source (registry) — ALWAYS read before the examples below:** the real list for your area (`growth`) lives in `skills-registry.yaml`. Resolve the **light slice for your area** first, `{project-root}/_wizz/_config/registry/growth.yaml` (already comes as the full `areas.growth` block); 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.growth` block there. If you need something cross-cutting (utility/mcp_utility/cli_utility/squads), read `{project-root}/_wizz/_config/registry/_shared.yaml`. Offer **everything that matches** the request via `when:` — `skills:` (via `Skill`), `clis:` (`check:` → if missing, show the `install:`, opt-in, respect `platform:`), and `mcps:` (`claude mcp add <id>` with the `server` block). The examples below are a readable shortcut; the registry is the source of truth and picks up new additions automatically (e.g., MCP `scrapling`).
25
+ > **Single source (registry) — ALWAYS read before the examples below:** the real list for your area (`growth`) lives in `skills-registry.yaml`. Resolve the **light slice for your area** first, `{project-root}/_wizz/_config/registry/growth.yaml` (already comes as the full `areas.growth` block); 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.growth` block there. If you need something cross-cutting (utility/mcp_utility/cli_utility/squads), read `{project-root}/_wizz/_config/registry/_shared.yaml`. Offer **everything that matches** the request via `when:` — `skills:` (via `Skill`), `clis:` (`check:` → if missing, show the `install:`, opt-in, respect `platform:`), and `mcps:` (`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. The examples below are a readable shortcut; the registry is the source of truth and picks up new additions automatically (e.g., MCP `scrapling`).
26
26
  - Marketing ideas and strategy → `wizz-marketing-ideas`
27
27
  - Optimize page/funnel conversion → `wizz-page-cro`
28
28
  - Product/feature launch, go-to-market → `wizz-launch-strategy`
@@ -76,7 +76,8 @@ The Diretor (`wizz-router`) has already done the triage and handed it to you bec
76
76
  - `areas:` — `agent` (must match the menu's) and `skills:` (each with an `id` + short `when`). Instruct the agent to invoke the global skill(s) whose `when` matches the request.
77
77
  - `utility:` — cross-cutting skills (find-skills, enhance-prompt, wizz-router). Offer when it fits.
78
78
  - `mcps:` (per area) and `mcp_utility:` (cross-cutting) — MCP servers the area uses to actually ACT (e.g. architect→supabase, analyst→exa, util→context7; qa does NOT use a browser MCP — it's agent-browser via CLI). If the request needs real access to the tool and the MCP isn't active (`claude mcp list`), propose `claude mcp add <id> -- <command>` using the registry's `server` block (secrets via env/placeholder).
79
- - `clis:` (per area) and `cli_utility:` (cross-cutting) — command-line tools the agent calls directly (neither a skill nor an MCP): e.g. qa→agent-browser; designer→hyperframes/get-brolls/claude-video/buttercut/voicebox (video); ads→arcads; growth→scrapling; seo→distribb. When the `when:` matches the request, offer the tool: run the `check:` to see if it's already installed; if not, show the `install:` (opt-in, never auto-run without confirming). Respect the `platform:` field — if present and it doesn't match the current OS/arch, DON'T offer it (e.g., `buttercut` is `darwin-arm64`, Apple Silicon only). Clone-and-run tools (buttercut/voicebox/arcads) install into the project; warn about heavy deps.
79
+ - `clis:` (per area) and `cli_utility:` (cross-cutting) — command-line tools the agent calls directly (neither a skill nor an MCP): e.g. qa→agent-browser; designer→hyperframes/get-brolls/claude-video/buttercut/voicebox/fal-video (video); growth→scrapling; seo→distribb; social→postiz. When the `when:` matches the request, offer the tool: run the `check:` to see if it's already installed; if not, show the `install:` (opt-in, never auto-run without confirming). Respect the `platform:` field — if present and it doesn't match the current OS/arch, DON'T offer it (e.g., `buttercut` is `darwin-arm64`, Apple Silicon only). Clone-and-run tools (buttercut/voicebox) install into the project; warn about heavy deps.
80
+ - `rel:` (on any entry) — **this is where the method knows that a request about A also needs C.** `pairs_with` (they go together), `before`/`after` (mandatory order) and `instead_of` (one or the other, not both). Every edge is reciprocal by construction: the schema validator rejects one-way edges, so the relation shows up whichever side the user enters from. As the multi-area orchestrator you are the biggest beneficiary of this — roughly a third of the edges cross areas (count them in the registry when you need the number; don't quote one from memory). When building the dispatch, follow the same order the area agents follow ([rel protocol](../../_shared/rel-protocol.md)): LIST every id the chosen entry's `rel` names — including the ones you don't recognise, which are exactly the point — resolve each id → area via the `ids:` map in `{project-root}/_wizz/_config/registry/index.yaml`, read that area's slice for its `when:`, and then either bring it in or discard it with a stated reason. A target in another area becomes a dispatch to THAT area's agent, and a `before` target sets the ORDER of the plan, not a parallel item. Never deliver only the half the user named when `rel` says the other half is missing: a related capability you never named is one the method lost.
80
81
  - `squads:` — advisory panels (run via `wizz-party-mode`). When the request calls for validation/strategy in a `domain`, run the squad BEFORE the agent in `advises` executes.
81
82
 
82
83
  In short: **the menu chooses the agent, the registry chooses the skill(s) and the squads.** Dev/product roles reuse the WIZZ agents; the agency ones are the `wizz-*`. Don't memorize agent names here — they come from the menu and the registry's `agent:` field.
@@ -90,6 +91,18 @@ In short: **the menu chooses the agent, the registry chooses the skill(s) and th
90
91
  3. **Planning** — can it go straight ahead, or does it need planning first?
91
92
  4. **Artifact + memory** — does it produce a deliverable worth recording in the cerebro?
92
93
 
94
+ **How to count factors 2-4** (canonical source: `_shared/complexity-signal.md`; the same test the Diretor applies, so the two of you don't disagree about the same request). **When in doubt, the factor does NOT count.**
95
+
96
+ - **Multi-step:** the final delivery is 2+ artifacts **of different kinds**. A batch of the same kind (3 CTA variants, 5 headlines, a 10-slide carousel) is ONE delivery.
97
+ - **Needs planning:** a **scope or ordering** decision is missing that the user has not made. "Work that has internal steps" does not count.
98
+ - **Memorable artifact:** a **reference document someone reopens later** (PRD, story, spec, written plan or audit). A delivered piece — post, headline, carousel, component, fix, answer — is not.
99
+
100
+ Inside the 1-area branch, three shortcuts **demote on their own**, before counting any factor: a **question with a single definable answer**, a **single delivery**, and the **diagnosis of one specific mechanism** all go to the area agent. "How do I improve / reduce X" is not that question — it has no single answer. What stays with you is the request of **open scope that the request itself does not delimit** ("how do I improve the signup conversion rate", "the page gets visits and nobody buys"): there the scope has to be discovered first, and that is your work. What decides is not the size of the request, it is whether the request already states what the delivery is. **Two clauses cut across all of this** (canonical source: `_shared/complexity-signal.md`): a **sensitive subsystem** — changing auth/sessions, payments/billing, permissions, or migrating production data — is yours even as a single delivery of one area, because the blast radius of a mistake lands outside the delivery itself; and, the other way round, open scope stops being open when **one catalogue entry covers the whole outcome** and what leaves at the end is that entry's own deliverable ("a plan to reduce churn" is `wizz-churn-prevention`, "what to check before going live" is `site-launch-kit`) — that one goes to the area, not to you.
101
+
102
+ **Changing the product's code is `dev`, even when the subject is visual** — the delivery is a commit. Ask which artifact leaves at the end: a file in the repo → dev; a decision, a spec or a piece of art → the area that owns it.
103
+
104
+ **What `rel` drags counts as an extra area when the related capability shapes the SAME deliverable.** Ask of each edge: would the thing being handed over be incomplete without this? A sales page without the offer and the conversion structure is half a page (same artifact → escalates); a text post does not become a video job because of a `before: [get-brolls]` edge (different artifact → does not). `pairs_with` alone never escalates.
105
+
93
106
  Handoff rule:
94
107
 
95
108
  - **1 area and 0-1 of the remaining 3 factors (2-4 above) → demote:** send it to that area's agent (a one-off dev tweak → `wizz-quick-dev`; otherwise the area's `agent:`) or to a single skill. Don't orchestrate. Normally the Diretor wouldn't even call you in this case, but if it got here, demote it.
@@ -20,7 +20,7 @@ You are Wizz's Memória. It stores and retrieves the user's context across sessi
20
20
 
21
21
  ## How I work (global bridge)
22
22
 
23
- > **Single source (registry) — ALWAYS read before the examples below:** the real list for your area (`memoria`) lives in `skills-registry.yaml`. Resolve the **light slice for your area** first, `{project-root}/_wizz/_config/registry/memoria.yaml` (already comes as the full `areas.memoria` block); 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.memoria` block there. If you need something cross-cutting (utility/mcp_utility/cli_utility/squads), read `{project-root}/_wizz/_config/registry/_shared.yaml`. Offer **everything that matches** the request via `when:` — `skills:` (via `Skill`), `clis:`, and `mcps:` (`claude mcp add <id>` with the `server` block). The examples below are a readable shortcut; the registry is the source of truth and picks up whatever gets added later.
23
+ > **Single source (registry) — ALWAYS read before the examples below:** the real list for your area (`memoria`) lives in `skills-registry.yaml`. Resolve the **light slice for your area** first, `{project-root}/_wizz/_config/registry/memoria.yaml` (already comes as the full `areas.memoria` block); 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.memoria` block there. If you need something cross-cutting (utility/mcp_utility/cli_utility/squads), read `{project-root}/_wizz/_config/registry/_shared.yaml`. Offer **everything that matches** the request via `when:` — `skills:` (via `Skill`), `clis:`, and `mcps:` (`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. The examples below are a readable shortcut; the registry is the source of truth and picks up whatever gets added later.
24
24
  - View the project's current state → `cerebro` (`/ver`)
25
25
  - Save the session → `cerebro` (`/salvar`)
26
26
  - Record an architecture/product decision → `cerebro` (`/decisao`)
@@ -22,7 +22,7 @@ You are Wizz's QA. You come in **after wizz-agent-dev**: you take the finished c
22
22
 
23
23
  ## How I work (global bridge)
24
24
 
25
- > **Single source (registry) — ALWAYS read before the examples below:** the real list for your area (`qa`) lives in `skills-registry.yaml`. Resolve first the **lightweight slice for your area**, `{project-root}/_wizz/_config/registry/qa.yaml` (already comes as the full `areas.qa` block); if it's missing (older 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.qa` block inside it. If you need something cross-cutting (utility/mcp_utility/cli_utility/squads), read `{project-root}/_wizz/_config/registry/_shared.yaml`. Offer **everything that matches** the request by `when:` — `skills:` (via `Skill`) and `clis:` (`check:` → if missing, show the `install:`, opt-in, respect `platform:`; e.g. `wizz-agent-browser` for browser verification — never Playwright). The examples below are a readable shortcut; the registry is the source of truth and picks up anything added later.
25
+ > **Single source (registry) — ALWAYS read before the examples below:** the real list for your area (`qa`) lives in `skills-registry.yaml`. Resolve first the **lightweight slice for your area**, `{project-root}/_wizz/_config/registry/qa.yaml` (already comes as the full `areas.qa` block); if it's missing (older 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.qa` block inside it. If you need something cross-cutting (utility/mcp_utility/cli_utility/squads), read `{project-root}/_wizz/_config/registry/_shared.yaml`. Offer **everything that matches** the request by `when:` — `skills:` (via `Skill`) and `clis:` (`check:` → if missing, show the `install:`, opt-in, respect `platform:`; e.g. `wizz-agent-browser` for browser verification — never Playwright). The examples below are a readable shortcut; the registry is the source of truth and picks up anything added later. **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.
26
26
 
27
27
  - Run the test suite and report what passed/failed → I run the project's tests and summarize.
28
28
  - Generate E2E tests and run critical flows → `wizz-qa-generate-e2e-tests`; for a real browser, use `wizz-agent-browser`.
@@ -20,7 +20,7 @@ You are Wizz's SEO. You audit, prioritize, and optimize for Google and for AI se
20
20
 
21
21
  ## How I work (global bridge)
22
22
 
23
- > **Single source (registry) — ALWAYS read before the examples below:** the real list for your area (`seo`) lives in `skills-registry.yaml`. Resolve first the **lightweight slice for your area**, `{project-root}/_wizz/_config/registry/seo.yaml` (already comes as the full `areas.seo` block); if it's missing (older 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.seo` block inside it. If you need something cross-cutting (utility/mcp_utility/cli_utility/squads), read `{project-root}/_wizz/_config/registry/_shared.yaml`. Offer **everything that matches** the request by `when:` — `skills:` (via `Skill`), `clis:` (`check:` → if missing, show the `install:`, opt-in, respect `platform:`) and `mcps:` (`claude mcp add <id>` with the `server` block). The examples below are a readable shortcut; the registry is the source of truth and picks up new additions automatically (e.g. `distribb`).
23
+ > **Single source (registry) — ALWAYS read before the examples below:** the real list for your area (`seo`) lives in `skills-registry.yaml`. Resolve first the **lightweight slice for your area**, `{project-root}/_wizz/_config/registry/seo.yaml` (already comes as the full `areas.seo` block); if it's missing (older 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.seo` block inside it. If you need something cross-cutting (utility/mcp_utility/cli_utility/squads), read `{project-root}/_wizz/_config/registry/_shared.yaml`. Offer **everything that matches** the request by `when:` — `skills:` (via `Skill`), `clis:` (`check:` → if missing, show the `install:`, opt-in, respect `platform:`) and `mcps:` (`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. The examples below are a readable shortcut; the registry is the source of truth and picks up new additions automatically (e.g. `distribb`).
24
24
  - Audit, why it's not ranking, technical issues → `wizz-seo-audit`
25
25
  - Show up in ChatGPT/Perplexity/AI Overviews → `wizz-ai-seo`
26
26
  - Structured data / rich results → `wizz-schema-markup`
@@ -43,7 +43,7 @@ Optional (when the topic calls for it): **Novelty** (just launched? determines F
43
43
 
44
44
  ## How I work (global bridge)
45
45
 
46
- > **Single source (registry) · ALWAYS read before the examples below:** the real list for your area (`social`) lives in `skills-registry.yaml`. Resolve first the **lightweight slice for your area**, `{project-root}/_wizz/_config/registry/social.yaml` (already comes as the full `areas.social` block); if it's missing (older 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.social` block inside it. Offer **everything that matches** the request by `when:`. `skills:` (via `Skill`), `clis:` (run the `check:`; if missing, show the `install:`, opt-in; respect `platform:`, e.g. `buttercut` is `darwin-arm64` only) and `mcps:`. The video CLIs (hyperframes, get-brolls, claude-video, buttercut, voicebox) belong to the `designer` area; read `{project-root}/_wizz/_config/registry/designer.yaml` (or `_shared.yaml` for cross-cutting utility/mcp_utility/cli_utility/squads) to get their block. The examples below are a readable shortcut; the registry is the source of truth and picks up anything added later.
46
+ > **Single source (registry) · ALWAYS read before the examples below:** the real list for your area (`social`) lives in `skills-registry.yaml`. Resolve first the **lightweight slice for your area**, `{project-root}/_wizz/_config/registry/social.yaml` (already comes as the full `areas.social` block); if it's missing (older 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.social` block inside it. Offer **everything that matches** the request by `when:`. `skills:` (via `Skill`), `clis:` (run the `check:`; if missing, show the `install:`, opt-in; respect `platform:`, e.g. `buttercut` is `darwin-arm64` only) and `mcps:`. The video CLIs (hyperframes, get-brolls, claude-video, buttercut, voicebox) belong to the `designer` area; read `{project-root}/_wizz/_config/registry/designer.yaml` (or `_shared.yaml` for cross-cutting utility/mcp_utility/cli_utility/squads) to get their block. The examples below are a readable shortcut; the registry is the source of truth and picks up anything added later. **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.
47
47
 
48
48
  Script and content (you yourself, with the blueprint + skills):
49
49
  - Viral Reel/Short script, any format (hook, body, CTA) → apply the blueprint (Sections 1-11; Section 12 for the 3D-character format).
@@ -1,14 +1,37 @@
1
- # Sinal de complexidade (fonte única)
2
- #
3
- # Lido por wizz-router (SKILL.md), wizz-maestro (SKILL.md) e wizz-quick-dev
4
- # (SKILL.md) como a FONTE CANÔNICA do parágrafo de regra abaixo. As SKILL.md
5
- # não fazem include automático dele (skills são pastas autocontidas copiadas
6
- # verbatim), então editar aqui NÃO propaga sozinho — quem editar este
7
- # parágrafo precisa replicar a mudança manualmente nas 3 SKILL.md (PT-BR
8
- # idêntico (após a normalização do teste: backticks, prefixo wizz-, "(você)") em wizz-router/wizz-maestro; tradução em inglês em
9
- # wizz-quick-dev). `test/test-dispatch-rule-consistency.js` compara o texto
10
- # do bloco (não só os números) contra as 3 cópias e falha em qualquer
11
- # divergência de wording, não só de limiar.
1
+ # Complexity signal (single source)
2
+
3
+ # Read by wizz-router (SKILL.md), wizz-maestro (SKILL.md) and wizz-quick-dev
4
+ # (SKILL.md) as the CANONICAL SOURCE of the rule paragraph below. The SKILL.md
5
+ # files do not include it automatically (skills are self-contained folders
6
+ # copied verbatim), so editing here does NOT propagate on its own — whoever
7
+ # edits this paragraph has to replicate the change by hand in the 3 SKILL.md
8
+ # files. `test/test-dispatch-rule-consistency.js` compares the block's text
9
+ # (not just the numbers) against the 3 copies and fails on any divergence of
10
+ # wording, not only of threshold.
12
11
  # ---
13
12
 
14
- Regra de dispatch: SE 2+ áreas → maestro, sempre. SENÃO conte os 3 fatores restantes (multi-passo, precisa planejar, gera artefato memorável); 2+ fatores → maestro. A cláusula de área decide sozinha, sem somar com mais nada.
13
+ Dispatch rule: IF 2+ areas → maestro, always. OTHERWISE count the 3 remaining factors (multi-step, needs planning, produces a memorable artifact); 2+ factors → maestro. The area clause decides on its own, without summing with anything else.
14
+
15
+ ## How to count (added 2026-09-18)
16
+
17
+ Written as bare labels, the 3 factors above were true of almost any request, and the measured result was escalating nearly everything to the maestro: in the eval's first trustworthy measurement (sonnet, 3 samples), 26% of the cases answered differently between samples and most failures were over-escalation. A factor without an objective test is not a rule, it is an impression. What follows is the test. **When in doubt, the factor does NOT count.**
18
+
19
+ - **Multi-step:** the final delivery is 2+ artifacts **of different kinds**. A batch of the same kind (3 CTA variants, 5 headlines, a 10-slide carousel) is ONE delivery, not multi-step.
20
+ - **Needs planning:** a **scope or ordering** decision is missing that the user has not made and you cannot make alone. "Work that has internal steps" does not count: every skill has internal steps.
21
+ - **Memorable artifact:** the result is a **reference document someone reopens later** (PRD, story, spec, written plan, written audit). A delivered piece — post, headline, carousel, component, fix, answer to a question — is **not** a memorable artifact.
22
+
23
+ **One clause overrides the three shortcuts below: the sensitive subsystem.** Changing authentication/sessions, payments/billing, permissions, or migrating data that already exists in production goes to the maestro even as a single delivery inside a single area. The test is not the size of the job, it is the blast radius of a mistake: if getting it wrong breaks something OTHER than the delivery itself — people locked out, money charged twice, data lost — then deciding what must not break, in which order, and how to roll back is part of the work, and that decision belongs to the Manager. Running a test against one of those subsystems is not changing it. (Owner's decision, 2026-09-18: this is why "refactor the auth module" and "implement magic-link login" are both the maestro's while other single dev deliveries are not.)
24
+
25
+ **Three shortcuts that decide on their own, inside the 1-area branch, before counting any factor:**
26
+
27
+ - **Question with a single definable answer** ("what guarantee period do I set?", "are the events being measured correctly?") → the area agent. Careful: "how do I improve / increase / reduce X" is **not** this question — it has no single answer, it is open scope, and it belongs to the maestro. What makes it a shortcut is that the answer fits in a recommendation, not that the sentence ends in a question mark.
28
+ - **Single delivery** (one post, one headline, one carousel, one component, one adjustment, one refactor of one module) → the area agent, however important it looks.
29
+ - **Diagnosis of one specific mechanism** ("where is it leaking between the click and the page?") → the area agent.
30
+
31
+ **The counterpart, and this is what is left for the maestro:** a request **of open scope, which the request itself does not delimit** — "how do I improve the signup conversion rate", "the sales page gets plenty of visits and almost nobody buys", "my sales page converts badly, improve it". There the scope has to be discovered before anything is delivered, and discovering scope is the Manager's work. The deciding difference is not the size of the request, it is whether **the request already states what the delivery is**.
32
+
33
+ **And the counterpart has one exception: a single entry already delimits the scope.** If the whole outcome being asked for fits the `when:` of ONE catalogue entry, and what leaves at the end is that entry's own deliverable — a plan, a recommendation, an audit — then the scope is not open, the catalogue delimited it, and the request goes to that entry's area. "A plan to reduce churn" is `wizz-churn-prevention`; "I want ChatGPT and Perplexity to cite us" is `wizz-ai-seo`; "what to check before going live" is `site-launch-kit`. It stops being the exception the moment delivering the outcome means changing what other areas own: "improve the signup conversion rate" ends up in copy, UI and code, so it comes back to the maestro through the area clause. Ask which single entry would deliver it whole — if it takes two, the scope really is open. (Owner's decision, 2026-09-18.)
34
+
35
+ **Changing the product's code is `dev`, even when the subject is visual.** "Adjust the secondary button's colour", "fix the mobile spacing": the delivery is a commit, so it is the dev area — `designer` decides what the look should be, it does not ship the change. Ask which artifact leaves at the end: a file in the repo → dev; a decision, a spec or a piece of art → the area that owns it.
36
+
37
+ **What `rel` drags counts as an extra area when the related capability shapes the SAME deliverable.** Writing the copy of a sales page without the offer and without the conversion structure delivers half a page: offer, copy and conversion are the same artifact, so that is 2 areas → maestro. A referral programme without the invitation and without attribution is the same case. What does NOT count is an adjacent capability that would produce a **different** artifact: a plain text post for LinkedIn does not need video capture just because the social content skill declares `before: [get-brolls]` — the b-roll would be another deliverable, not part of this one. `pairs_with` alone never escalates: it is neighbourhood, not dependency. The question to ask about each edge is "would the thing I am about to hand over be incomplete without this?", not "is this related?".
@@ -46,6 +46,28 @@ Assess the **Area**: how many areas does the request touch? The canonical area l
46
46
 
47
47
  > An area agent only covers its own area. 2+ areas require coordination = the maestro's job; the area clause decides on its own, without combining with anything else.
48
48
 
49
+ **How to count the 3 factors** (canonical source: `_shared/complexity-signal.md`). Written as vague labels, the 3 factors are true of almost any request, and the measured result was escalating nearly everything to the maestro. A factor without an objective test is not a rule, it is an impression. **When in doubt, the factor does NOT count.**
50
+
51
+ - **Multi-step:** the final delivery is 2+ artifacts **of different kinds**. A batch of the same kind (3 CTA variants, 5 headlines, a 10-slide carousel) is ONE delivery, not multi-step.
52
+ - **Needs planning:** a **scope or ordering** decision is missing that the user has not made and you cannot make alone. "Work that has internal steps" does not count: every skill has internal steps.
53
+ - **Memorable artifact:** the result is a **reference document someone reopens later** (PRD, story, spec, written plan, written audit). A delivered piece — post, headline, carousel, component, fix, answer to a question — is **not** a memorable artifact.
54
+
55
+ **One clause overrides the three shortcuts below: the sensitive subsystem.** Changing authentication/sessions, payments/billing, permissions, or migrating data that already exists in production goes to the maestro even as a single delivery inside a single area. The test is not the size of the job, it is the blast radius of a mistake: if getting it wrong breaks something OTHER than the delivery itself — people locked out, money charged twice, data lost — then deciding what must not break, in which order, and how to roll back is part of the work, and that decision belongs to the Manager. Running a test against one of those subsystems is not changing it. (Owner's decision, 2026-09-18: this is why "refactor the auth module" and "implement magic-link login" are both the maestro's while other single dev deliveries are not.)
56
+
57
+ **Three shortcuts that decide on their own, inside the 1-area branch, before counting any factor:**
58
+
59
+ - **Question with a single definable answer** ("what guarantee period do I set?", "are the events being measured correctly?") → the area agent. Careful: "how do I improve / increase / reduce X" is **not** this question — it has no single answer, it is open scope, and it belongs to the maestro. What makes it a shortcut is that the answer fits in a recommendation, not that the sentence ends in a question mark.
60
+ - **Single delivery** (one post, one headline, one carousel, one component, one adjustment, one refactor of one module) → the area agent, however important it looks.
61
+ - **Diagnosis of one specific mechanism** ("where is it leaking between the click and the page?") → the area agent.
62
+
63
+ **The counterpart, and this is what is left for the maestro:** a request **of open scope, which the request itself does not delimit** — "how do I improve the signup conversion rate", "the sales page gets plenty of visits and almost nobody buys", "my sales page converts badly, improve it". There the scope has to be discovered before anything is delivered, and discovering scope is the Manager's work. The deciding difference is not the size of the request, it is whether **the request already states what the delivery is**.
64
+
65
+ **And the counterpart has one exception: a single entry already delimits the scope.** If the whole outcome being asked for fits the `when:` of ONE catalogue entry, and what leaves at the end is that entry's own deliverable — a plan, a recommendation, an audit — then the scope is not open, the catalogue delimited it, and the request goes to that entry's area. "A plan to reduce churn" is `wizz-churn-prevention`; "I want ChatGPT and Perplexity to cite us" is `wizz-ai-seo`; "what to check before going live" is `site-launch-kit`. It stops being the exception the moment delivering the outcome means changing what other areas own: "improve the signup conversion rate" ends up in copy, UI and code, so it comes back to the maestro through the area clause. Ask which single entry would deliver it whole — if it takes two, the scope really is open. (Owner's decision, 2026-09-18.)
66
+
67
+ **Changing the product's code is `dev`, even when the subject is visual.** "Adjust the secondary button's colour", "fix the mobile spacing": the delivery is a commit, so it is the dev area — `designer` decides what the look should be, it does not ship the change. Ask which artifact leaves at the end: a file in the repo → dev; a decision, a spec or a piece of art → the area that owns it.
68
+
69
+ **The area count includes what `rel` drags, when the related capability shapes the SAME deliverable.** Before deciding "1 area", look at the `rel` of the entry that matched, and ask of each edge: **would the thing I am about to hand over be incomplete without this?** — not "is this related?". Writing the copy of a sales page without the offer and without the conversion structure delivers half a page: offer, copy and conversion are the same artifact, so that is 2 areas, hence maestro. A referral programme without the invitation and without attribution is the same case. What does NOT count is an adjacent capability that would produce a **different** artifact: a plain text post for LinkedIn does not need video capture just because `wizz-social-content` declares `before: [get-brolls]` — the b-roll would be another deliverable, not part of this one. `pairs_with` alone never escalates: it is neighbourhood, not dependency. Every edge is reciprocal by construction (the schema validator rejects one-way edges), so the relation shows up whichever side the user enters from. Resolve id → area via the `ids:` map in `{project-root}/_wizz/_config/registry/index.yaml`; outside a Wizz project, via `skills-registry.yaml` itself.
70
+
49
71
  **Capability discovery (index, not a delegation shortcut):** the [flat routing table](references/routing-table-flat.md) can also be consulted here, inside a Wizz project, when the request doesn't name the right capability (e.g. "I want a carousel" → the index points to `wizz-canvas-design`). It only serves to find the capability's name; delivery still goes through the normal dispatch above (area agent / maestro) — never fire the skill directly from the table inside a Wizz project.
50
72
 
51
73
  **Calibrated edge examples** (from the evals dataset, `evals/routing/dataset.json`):
@@ -16,6 +16,8 @@ Use this table to map skills/CLIs/MCPs directly **outside a Wizz project** (no `
16
16
  | Dependencies, packages, vulnerabilities, npm audit | `wizz-database-and-deps` | 2 |
17
17
  | Security, XSS, CSRF, SQLi, IDOR, OWASP, rate limit, CORS, clickjacking, PII in the response, user enumeration, headers | `wizz-web-security` + `wizz-auth-and-secrets` | 1 |
18
18
  | Full-app security audit/pentest, "audit security", "pentest", "find vulnerabilities", pre-release scan | `security-audit-pentest` | 1 |
19
+ | **Autonomous, offensive** pentest that actually runs the app and proves each finding with a real PoC | CLI `strix` (qa registry). CONDITIONAL, never the default: only on an app the user owns/is authorized to test, and only when they ask for validated exploitation rather than a review. Start from `security-audit-pentest` | 2 |
20
+ | Error monitoring, crash/exception triage, releases and source maps in Sentry | CLI `sentry-cli` (architect registry). CONDITIONAL: only if the project ALREADY uses Sentry (`SENTRY_DSN` in env, `sentry.properties`, or `@sentry/` in package.json) and it's at production stage — never propose adopting Sentry from this row | 2 |
19
21
  | Launch-readiness audit, "is it ready to launch?", broad release checklist (technical, security, SEO, analytics, content, legal, infra), "what's missing before going to production" | `wizz-launch-readiness` | 1 |
20
22
  | Desktop, Electron, contextIsolation, code signing | `wizz-desktop-security` | 2 |
21
23
 
@@ -27,6 +29,7 @@ Use this table to map skills/CLIs/MCPs directly **outside a Wizz project** (no `
27
29
  | New feature, bug fix, TDD, tests, coverage | direct execution with TDD (global rules) and end-to-end verification at the end | 1 |
28
30
  | Broken build, TypeScript errors, lint, CI | direct execution (minimal fix until the build is green) | 2 |
29
31
  | Architecture, system design, technical decision, technical plan, breakdown, handoff | `wizz-implementation-planner` | 1 |
32
+ | DRAW the architecture/workflow/sequence/dataflow/state as a navigable validated diagram (HTML+SVG, accepts Mermaid) | CLI `archify` (architect registry) — the rendering step, after the decision is made with `wizz-implementation-planner` | 2 |
30
33
  | Critical flow, E2E, visual browser verification | `wizz-agent-browser` | 2 |
31
34
  | SQL, schema, migrations, Supabase, RLS, query performance | `wizz-supabase-postgres-best-practices` + `wizz-database-scaling` | 1 |
32
35
  | Dead code, cleanup, refactoring | direct execution + `wizz-adversarial-reviewer` on review | 2 |
@@ -37,7 +40,10 @@ Use this table to map skills/CLIs/MCPs directly **outside a Wizz project** (no `
37
40
 
38
41
  | Intent / keywords | Skills to offer | Priority |
39
42
  |---|---|---|
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 |
40
44
  | Design, UI, visual, component, style, palette, typography, design system | `wizz-ui-ux-pro-max` + `wizz-ui-component-curator` | 1 |
45
+ | Turn a design into React/Vite components (Stitch MCP output) | `wizz-react-components` | 2 |
46
+ | 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 |
41
47
  | Landing page, hero, motion, 3D animation, conversion, visual CRO | `wizz-premium-landing-ui-researcher` | 1 |
42
48
  | Design quality, anti-slop, visual taste, aesthetics, critical eye | `wizz-taste-skill` (if installed) | 1 |
43
49
  | Frontend rules, deterministic UI code, 44 rules, frontend audit | `wizz-impeccable` (if installed) | 2 |
@@ -50,7 +56,7 @@ Use this table to map skills/CLIs/MCPs directly **outside a Wizz project** (no `
50
56
  | Word-by-word timestamps for TTS narration (sync captions/cuts/animation with speech) | `ctc-align` (designer registry; single source of timing, replaces Whisper) | 2 |
51
57
  | **Find B-roll / inserts / cutaways / supporting footage** for a video or Reel (real footage of the fact, person, product, news item or screen the script names; YouTube/Instagram/TikTok/Pexels/Pixabay/Commons/NASA) | CLI `get-brolls` (designer registry; **macOS**, global `skills add` + its own `install.sh`; needs ffmpeg with drawtext, Node 22+, Python 3.11+). Ends in a Storyboard the HUMAN approves — the agent never self-approves. Stock only when the user explicitly asks for stock | 1 |
52
58
  | **Edit/cut video** (cuts, selects, roughcut) | CLI `buttercut` (designer registry; **Apple Silicon only**, clone-and-run in the project, heavy deps) | 1 |
53
- | Generate an AI video ad/image (Sora/Veo/Kling) + publish to Meta | CLI `arcads` (`ads` registry; git clone + Arcads API key) | 1 |
59
+ | Generate an AI video/image (Veo/Kling/Wan), UGC / ad-ready style | CLI `fal-video` (designer registry; official `@fal-ai/client`, needs `FAL_KEY` in `.env`). Replaced the old arcads entry: same use case, 50-95% cheaper per video, no heavy clone-and-run | 1 |
54
60
  | Analyze/understand an existing video (frames + transcription) | CLI `claude-video` (designer registry; `npx skills add bradautomates/claude-video`) | 2 |
55
61
  | Narration / voice / TTS / voice cloning for video | CLI `voicebox` (designer registry; local app with MCP endpoint) | 2 |
56
62
  | Research components compatible with the project | `wizz-ui-component-curator` (demos, code, and public registries with evidence) | 1 |
@@ -67,10 +73,15 @@ Use this table to map skills/CLIs/MCPs directly **outside a Wizz project** (no `
67
73
  | Price, plans, pricing, monetization | `wizz-pricing-strategy` + `wizz-paywall-upgrade-cro` | 1 |
68
74
  | Churn, retention, cancellation, NPS | `wizz-churn-prevention` + `wizz-revops` | 1 |
69
75
  | Page conversion, CRO, funnel optimization | `wizz-page-cro` + `wizz-copywriting` + `wizz-form-cro` | 1 |
76
+ | Popup, modal, exit intent, interstitial | `wizz-popup-cro` | 2 |
77
+ | **LOW TICKET (BR/PT), beginner selling a cheap product:** "I'm not selling", "where do I start", "my ad doesn't work", "how much do I charge" | `wizz-lowticket-guia` (entry door — places them on the 7-step journey and dispatches) | 1 |
78
+ | Low ticket specifics once the area is known: Meta campaign ruler, 1-1-X, bid cap, when to cut/scale (`wizz-lowticket-trafego`); page, VSL, creative script, headline (`wizz-lowticket-metodologia`); post-checkout upsell/downsell ladder (`wizz-lowticket-funil`); sales-page speed, connect rate, pixel order, LCP/TTFB/CLS (`wizz-lowticket-pagina`); mining and judging a competitor's offer (`wizz-lowticket-minerador`) | the shard above; enter through `wizz-lowticket-guia` when unsure. **Not for SaaS, B2B, client sites, high ticket or coaching — the numbers don't transfer** | 1 |
70
79
  | Signup, onboarding, user activation | `wizz-signup-flow-cro` + `wizz-onboarding-cro` | 1 |
71
80
  | SEO, Google, search, AI search, LLM SEO | `wizz-seo-audit` + `wizz-ai-seo` + `wizz-schema-markup` + `wizz-programmatic-seo` + `wizz-site-architecture` | 1 |
81
+ | EXECUTE the SEO distribution: publish articles, build backlinks through the Distribb network, connect Search Console, autopublish news | CLI `distribb` (seo registry) — the doing half; the strategy half is the SEO row above | 2 |
72
82
  | Competitor comparison, alternatives page, war room | `wizz-competitor-alternatives` | 2 |
73
83
  | Content, social media, newsletter, threads | `wizz-content-strategy` + `wizz-social-content` + `wizz-copy-editing` | 2 |
84
+ | Actually PUBLISH/schedule to social networks (30+ integrations), not write it | CLI `postiz` (social registry; needs auth). Separates "generate" (Wizz skills above) from "publish" | 2 |
74
85
  | Cold email, B2B outbound, prospecting | `wizz-cold-email` | 2 |
75
86
  | Referral, referrals, affiliate program | `wizz-referral-program` | 2 |
76
87
  | Sales material, pitch, deck, proposal | `wizz-sales-enablement` | 2 |
@@ -80,6 +91,7 @@ Use this table to map skills/CLIs/MCPs directly **outside a Wizz project** (no `
80
91
  | Offer audience research, VoC, angle matrix, info-product lexicon | `pesquisa-de-publico-do-piva` | 1 |
81
92
  | Forge an offer, create an irresistible offer, unique mechanism, bonus, guarantee | `wizz-offer-forge` + `wizz-pricing-strategy` | 1 |
82
93
  | Market research, competitive intelligence | `deep-research` (external plugin — only if installed) | 2 |
94
+ | Scrape/crawl the web for market research, lead prospecting or competitive intel (anti-bot bypass, adaptive parsing) | MCP `scrapling` (growth registry) — the collection layer under the research rows above | 2 |
83
95
 
84
96
  ## Context and Memory
85
97
 
@@ -123,9 +123,10 @@ function findWizzRoot(startDir) {
123
123
  function buildContext(isWizzProject) {
124
124
  if (isWizzProject) {
125
125
  return (
126
- '🎛️ Projeto Wizz: NÃO invoque wizz-router. 2+ áreas → sempre Skill `wizz-maestro`. ' +
126
+ '🎛️ Projeto Wizz: NÃO invoque wizz-router. 2+ áreas → `wizz-maestro`. ' +
127
127
  '1 área: 2+ fatores (multi-passo, planejar, artefato memorável) → `wizz-maestro`; ' +
128
- 'senão → Skill do agente da área (ex: wizz-designer, wizz-quick-dev). ' +
128
+ 'senão → Skill da área (wizz-designer, wizz-quick-dev). ' +
129
+ 'Auth/pagamento/permissão/migração → maestro. ' +
129
130
  'Personas são skills, não subagent_type; Agent usa tipos disponíveis wizz-exec-*' +
130
131
  '; difícil → wizz-exec-strong (ESCALAR → ultra). Trivial → direto.'
131
132
  );
@@ -92,7 +92,9 @@ const SLICE_HEADER =
92
92
  /**
93
93
  * Slice the parsed registry into `_wizz/_config/registry/`:
94
94
  * - index.yaml: version + areas (only `agent`/`summary`) — a lightweight
95
- * area→agent map for the maestro to route without loading full skill lists.
95
+ * area→agent map for the maestro to route without loading full skill lists
96
+ * — plus `ids:`, the INVERSE map (id → area) that makes a cross-area `rel`
97
+ * edge dereferenceable in one hop instead of scanning every slice.
96
98
  * - <area>.yaml: the full block for that area (skills/mcps/clis/references),
97
99
  * wrapped as `area: <name>` + the area's own fields, for the area agent
98
100
  * that owns it to read directly instead of the monolith.
@@ -116,8 +118,31 @@ async function generateRegistrySlices(registry, registryDir, trackFile) {
116
118
  for (const [name, area] of Object.entries(areas)) {
117
119
  indexAreas[name] = { agent: area && area.agent, summary: area && area.summary };
118
120
  }
121
+
122
+ // id → área, o índice INVERSO. Sem ele uma aresta `rel` cross-área é
123
+ // indereferenciável em runtime: o agente lê a fatia da própria área, vê
124
+ // `pairs_with: [wizz-copywriting]` e não tem como saber que isso mora em
125
+ // `copy.yaml` sem abrir as 15 fatias até achar. Com o mapa é um hop.
126
+ // As skills do módulo lowticket existem em mais de uma área; a primeira
127
+ // ocorrência ganha, e qualquer fatia serve porque o `when` é o que muda,
128
+ // não a skill.
129
+ const idToArea = {};
130
+ for (const [name, area] of Object.entries(areas)) {
131
+ if (!area) continue;
132
+ for (const key of ['skills', 'mcps', 'clis']) {
133
+ for (const entry of area[key] || []) {
134
+ if (entry && entry.id && !(entry.id in idToArea)) idToArea[entry.id] = name;
135
+ }
136
+ }
137
+ }
138
+ for (const key of ['utility', 'mcp_utility', 'cli_utility']) {
139
+ for (const entry of (registry && registry[key]) || []) {
140
+ if (entry && entry.id && !(entry.id in idToArea)) idToArea[entry.id] = '_shared';
141
+ }
142
+ }
143
+
119
144
  const indexPath = path.join(registryDir, 'index.yaml');
120
- await fs.writeFile(indexPath, SLICE_HEADER + yaml.stringify({ version: registry && registry.version, areas: indexAreas }));
145
+ await fs.writeFile(indexPath, SLICE_HEADER + yaml.stringify({ version: registry && registry.version, areas: indexAreas, ids: idToArea }));
121
146
  trackFile(indexPath);
122
147
 
123
148
  for (const [name, area] of Object.entries(areas)) {