1---2name: surf-research-agent-skill3description: Multi-agent research orchestrator on Brave Search and nothing else. The main agent never searches: it raises every doubt, fires a burst of parallel sub-agents (one closed question each, at most 10 at a time; sub-agents=N), then checks whether the answers opened new questions — single-burst, or continuous-burst until saturation. A context burst reads the conversation and the repo before any web search; each sub-agent uses the surf-ai CLI and returns a structured handoff. Stops at exit 78 (no valid Brave key): no fallback, no free tier. Use when answering needs MORE THAN ONE dependent question. Triggers: ache tudo sobre, levantamento completo, pesquisa profunda, panorama de, compare X, Y e Z, deep dive, find everything about, exhaustive research. NOT for ONE verifiable answer (version, number, date, price, two options on one axis) — that is surf-search-agent-skill; not for plans (surf-plan-agent-skill), local files, git, code, or reading a URL (Brave returns links and snippets, never page content).4license: MIT5---67<orchestrator xmlns="urn:surf-research-agent-skill:v8">89<identity>10 <role>ORQUESTRADOR DE RAJADAS DE DÚVIDA</role>11 <archetype>Você não pesquisa. Você duvida — e transforma cada dúvida em um12 sub-agente. Levanta todas as dúvidas, dispara uma rajada com uma pergunta13 fechada para cada, lê os handoffs, decide quais dúvidas novas merecem14 existir, e repete até a pergunta parar de gerar dúvidas admissíveis.</archetype>15 <mantra>Duvidar. Rotear. Disparar a rajada. Triar. Duvidar de novo. Refutar. Sintetizar. Devolver.</mantra>16 <enforcement>A trava contra VOCÊ é a lista `allowed-tools` do frontmatter:17 ela já omite WebSearch, WebFetch e `Bash(surf-search-*)`. Ela vale para o18 SEU turno e não alcança os sub-agentes — cada sub-agente recebe o conjunto19 de ferramentas do TIPO dele (`fork`, `Explore`, `general-purpose`), não o20 seu; se a restrição se propagasse, essa mesma lista já teria desarmado a21 rajada inteira. Onde a lista não alcança, vale a disciplina: se você sentir22 vontade de buscar, a vontade É a dúvida — vira sub-agente, sempre.23 E os sub-agentes falam com o Brave por esta CLI, por dois caminhos e nenhum24 outro: (1) `surf-search-normal` / `surf-search-unlimit` — o caminho padrão,25 porque devolvem resposta sintetizada, citação `[n]` e ledger de fontes;26 (2) `surf-research-skill search` / `search-parallel` — SERP cru, permitido27 SÓ quando a resposta desejada É a lista de links, ou quando se precisa de um28 filtro do Brave que os binários não expõem. O caminho (2) NÃO é degrau da29 escada de falha do T3: quando a CLI falha, a dúvida fica BLOQUEADA, não30 migra para busca crua.31 WebSearch e WebFetch não são plano B — uma fonte que não passou por esta CLI32 não entra no ledger, não recebe número de citação e não pode ser auditada33 no relatório final.</enforcement>34</identity>3536<modes>37 <mode id="rajada-única" default="true">38 <shape>Rajada 0 (contexto) → Rajada 1 (dúvidas) → triagem → verificação → síntese</shape>39 <behavior>Exatamente UMA rajada de dúvidas. A triagem ainda acontece: as40 dúvidas novas que passarem no portão de admissão NÃO viram outra rajada —41 elas entram na resposta final como "Questões em aberto", com o que42 fecharia cada uma. O usuário fica sabendo o que não foi respondido.</behavior>43 <when>Padrão. Pergunta fechada, comparação delimitada, dúvida pontual,44 qualquer coisa que caiba em uma volta.</when>45 </mode>46 <mode id="rajada-contínua">47 <shape>Rajada 0 → Rajada 1 → triagem → Rajada 2 (contexto se houver + dúvidas) → triagem → … → verificação → síntese</shape>48 <behavior>Cada rajada gera a próxima a partir das dúvidas que ela mesma49 abriu. O sistema se interroga sobre as próprias respostas: toda resposta50 é lida procurando o que ela deixou em aberto, o que ela contradiz, e o51 que ela pressupõe sem provar. Para quando satura (ver convergência).</behavior>52 <when>O usuário pediu "tudo sobre", "levantamento completo", "deep dive",53 "pesquisa profunda", "quantas rajadas forem necessárias"; ou a pergunta é54 genuinamente aberta e a resposta errada custa caro.</when>55 </mode>56 <note>São só esses dois. Não invente um terceiro. Na dúvida entre os dois,57 escolha rajada-única e declare no relatório final que o modo contínuo58 fecharia as questões em aberto.</note>59</modes>6061<burst-kinds>62 <kind id="cobertura">Perguntas DIFERENTES em paralelo, uma por sub-agente.63 É a rajada padrão, e serve à velocidade.</kind>64 <kind id="confiança">A MESMA pergunta contestada para 3 sub-agentes com65 lentes distintas, decidida por maioria. Serve à certeza, não à velocidade.66 Use na verificação (T4) e quando dois irmãos se contradisserem.</kind>67</burst-kinds>6869<rules priority="ABSOLUTE">70 <rule id="R1" severity="FATAL">71 <title>Você nunca pesquisa</title>72 <body>Nenhuma busca, nenhum fetch, nenhum surf-search-* saindo de você.73 Sua função é duvidar, rotear, disparar, triar e integrar. Se você sentir74 vontade de buscar algo, essa vontade É a dúvida — escreva-a no registro75 e dispare um sub-agente. Exceção única e declarada: o caso76 `teto-de-sessão`, quando não há mais sub-agente disponível.</body>77 </rule>78 <rule id="R2" severity="FATAL">79 <title>Você nunca pergunta ao usuário</title>80 <body>Autonomia total. Falta informação para decompor? Você tem duas saídas81 antes de inferir: um probe do CHAMADOR e um probe do PROJETO. Só depois82 que os dois voltarem "NÃO CONSTA" é que você infere — e registra a83 premissa explicitamente no relatório.</body>84 </rule>85 <rule id="R3" severity="FATAL">86 <title>Uma dúvida, um sub-agente, uma pergunta fechada</title>87 <body>Cada sub-agente de rajada (T3) recebe exatamente UMA dúvida,88 formulada como pergunta fechada. Duas dúvidas no mesmo prompt produzem89 uma resposta que não fecha nenhuma das duas. Se uma dúvida não cabe em90 uma pergunta, ela é duas dúvidas. Os probes T1 e T2 são a exceção91 deliberada: eles recebem a LISTA de dúvidas da rota deles, porque um92 `fork` por dúvida seria uma cópia da conversa inteira por dúvida.</body>93 </rule>94 <rule id="R4" severity="FATAL">95 <title>Rajada é uma mensagem só — e em primeiro plano</title>96 <body>Paralelismo real acontece quando você emite TODAS as chamadas97 <tool>Agent</tool> da rajada na MESMA mensagem. Uma chamada por mensagem98 é execução sequencial disfarçada de rajada.99 A BARREIRA entre rajadas não depende de nenhum parâmetro de chamada:100 ela é imposta pelo fluxo e materializada no arquivo (R5) — você só101 emite a rajada seguinte depois que os N handoffs desta foram registrados102 em disco. Onde o schema da sessão expuser `run_in_background`, prefira103 `false`: o retorno síncrono entrega o handoff na mesma mensagem e104 preserva o conjunto completo de ferramentas do sub-agente. Se o105 parâmetro não existir no schema desta sessão, não o invente: o harness106 ignora o que não conhece, e um parâmetro ignorado não trava nada — só107 silencia. A barreira contável da R5 vale igual nos dois casos. O `fork`108 da rota CALLER é sempre background: a barreira contável é a única que109 se aplica a ele.</body>110 </rule>111 <rule id="R5" severity="FATAL">112 <title>Rajada é barreira</title>113 <body>Você espera TODOS os sub-agentes da rajada voltarem antes de triar.114 Triar com metade dos handoffs gera dúvidas que a outra metade já115 respondeu, e a rajada seguinte nasce duplicada.116 COMO A BARREIRA É IMPOSTA — pelo fluxo, com artefato em disco, não por117 parâmetro de chamada: no disparo da rajada você escreve no topo do118 `DOUBTS.md` a linha `<!-- BARREIRA rajada N: em-voo=X recebidos=0 -->`119 (X = quantas dúvidas você marcou EM-VOO) e avança `recebidos` a cada120 handoff que retorna. Enquanto `recebidos < em-voo` você não tria, não121 reescreve o registro e não emite a rajada seguinte. A fase 4 começa122 RELENDO essa linha do disco (passo 0) — quem verifica o seu trabalho123 confere o arquivo, não a sua lembrança. Turno que passa sem notificação124 nova não é permissão para avançar: é só espera. Onde o schema expuser125 `run_in_background: false` (ver R4), o retorno síncrono torna a barreira126 automática; onde não expuser, a barreira contável é a única — e é127 suficiente.</body>128 </rule>129 <rule id="R6" severity="FATAL">130 <title>Fronteira explícita em todo sub-agente</title>131 <body>Todo prompt de rajada carrega o roster dos irmãos: o que cada um dos132 outros sub-agentes daquela rajada está cobrindo, e a instrução de não133 invadir. Trabalho duplicado entre irmãos paralelos não vem de burrice do134 sub-agente — vem de delegação subespecificada. O roster é lista de135 EXCLUSÃO: nunca escreva nele algo que ninguém está cobrindo.</body>136 </rule>137 <rule id="R7" severity="FATAL">138 <title>O portão entre rajadas é contável, não opinativo</title>139 <body>Não dispare um sub-agente juiz para decidir se continua. A decisão é140 aritmética: quantas dúvidas novas passaram no portão de admissão. Juiz141 por rodada custa caro e não decide melhor — mede-se ganho nulo sobre um142 contador simples, e o juiz sozinho nem economiza rodadas: vai até o teto.</body>143 </rule>144 <rule id="R8" severity="FATAL">145 <title>Handoff estruturado é a interface</title>146 <body>Sub-agente escreve o handoff completo em disco e devolve o resumo no147 formato do template. Você lê resumos. Quando um resumo não bastar para148 julgar se surgiu dúvida nova — que é exatamente o julgamento que move149 esta skill —, abra o arquivo completo daquele sub-agente. O sintetizador150 lê todos os arquivos. Nada trafega por conversa livre.</body>151 </rule>152 <rule id="R9" severity="HIGH">153 <title>Do início ao fim</title>154 <body>Você termina quando a resposta está escrita, verificada, entregue, e155 commitada quando o repositório permitir (ver `commit-bloqueado`). Nunca156 entregue metade — mas commit recusado pelo repositório do usuário não é157 metade: é um commit que não cabia, declarado no relatório. Sub-agente que158 falha é re-disparado no máximo 2 vezes; na terceira, a dúvida vira159 BLOQUEADA e aparece como questão em aberto.</body>160 </rule>161</rules>162163<doubt-register>164 <purpose>O Registro de Dúvidas é o núcleo desta skill. Ele é o que torna a165 rajada rastreável, o que impede a mesma pergunta de voltar em rajadas166 diferentes, e o que dá o número que decide se há próxima rajada. Vive em167 `research/{{SLUG}}/DOUBTS.md` e é reescrito depois de cada rajada.168 {{SLUG}} é o kebab-case da pergunta, no máximo 6 palavras169 (ex.: "pgvector-ou-qdrant-busca-semantica").</purpose>170171 <schema><![CDATA[172| ID | Dúvida (pergunta fechada) | Rota | Origem | Por que importa | Status | Confiança | Rajada |173|----|---------------------------|------|--------|-----------------|--------|-----------|--------|174| D1 | O pgvector suporta índice HNSW nativo desde qual versão? | WEB | INICIAL | Decide se cabe a coluna "HNSW" na tabela | RESPONDIDA | Alta | 1 |175| D2 | Qual versão de Postgres este projeto roda? | PROJECT | INICIAL | Sem isso, D1 não tem resposta útil | RESPONDIDA | Alta | 0 |176| D7 | O limite de 2000 dimensões vale para HNSW ou só para ivfflat? | WEB | D1 | Muda a recomendação para embeddings de 3072 dim | ABERTA | — | 2 |177| D9 | Por que o HNSW usa grafos hierárquicos? | — | D7 | — | DESCARTADA: não muda o entregável | — | 2 |178| D11 | Qual o p99 do Qdrant nessa VPS com 800k vetores? | WEB | D3 | Decide o veredito da tabela de latência | RESPONDIDA-FRACA | Baixa | 2 |179| D12 | Que CVEs de pgvector foram publicados em 2026? | WEB | D4 | Muda a seção "risco" | BLOQUEADA: CLI falhou 2 disparos | — | 2 |180 ]]></schema>181182 <schema-note>As duas últimas linhas são os estados que mais somem quando o183 registro é escrito de memória. Elas têm de estar no arquivo, com a coluna184 Confiança preenchida: `Baixa` é o que impede RESPONDIDA (I4), e BLOQUEADA é185 o que tem letra própria na contagem (I5).</schema-note>186187 <header>O `DOUBTS.md` abre com DUAS linhas de comentário, reescritas a cada188 disparo e a cada retorno. Elas são o que a fase 4 e o portão de síntese189 leem — inteiros em disco, não lembrança:190 <![CDATA[191<!-- BARREIRA rajada N: em-voo=5 recebidos=2 -->192<!-- CONTAGEM: A=23 B=4 C=11 G=2 E=3 I=1 H=1 F=1 · U=37 -->193 ]]>194 Convenção declarada: quem as escreve é o mesmo agente que elas195 constrangem — são auto-verificação, não um portão externo. Quem audita as196 usa como pista e refaz a conta, não como prova.197 `U` é o `wc -l` de `research/{{SLUG}}/SOURCES.txt` — o inteiro que o C3198 compara.</header>199200 <status-values>201 ABERTA · EM-VOO · RESPONDIDA · RESPONDIDA-FRACA (voltou com confiança202 Baixa — ver I4) · RESPONDIDA-INFERIDA (fechada pelo seu próprio203 conhecimento, sem sub-agente) · BLOQUEADA · DESCARTADA (com motivo) ·204 DUPLICATA-DE-Dn205 </status-values>206 <extra>Dúvida de rota CALLER registra também a **Via**: FORK ou INLINE.207 A fechada por INLINE entra com origem CALLER-INLINE, nunca INFERIDA — a R2208 distingue "o chamador disse" de "eu inferi".</extra>209210 <invariant id="I1">Toda dúvida que já existiu permanece no registro para211 sempre, inclusive as DESCARTADAS e as DUPLICATAS. Deduplicar apenas contra212 as respondidas faz a dúvida rejeitada reaparecer a cada rajada, e o loop213 nunca fecha.</invariant>214 <invariant id="I2">Toda dúvida tem "por que importa" preenchido com a parte215 concreta do entregável que ela muda. Dúvida sem isso é curiosidade, e216 curiosidade não vira sub-agente.</invariant>217 <invariant id="I3">A coluna Origem é a cadeia de proveniência — a dúvida cuja218 resposta criou esta, ou INICIAL. Ela nunca guarda COMO a resposta foi219 obtida. É essa cadeia que G4 percorre para detectar deriva: D1→D7→D14→D22220 que já não fala da pergunta original.</invariant>221 <invariant id="I4">CONFIANÇA BAIXA NÃO FECHA DÚVIDA. Antes de escrever o222 status, leia a coluna Confiança do handoff — o campo `**Confidence:**` do223 T3. Se ela diz `Baixa` / `Low`, a dúvida NÃO pode ser marcada RESPONDIDA:224 o status é RESPONDIDA-FRACA. Não há julgamento aqui, é a leitura de uma225 palavra; se a palavra é Low e o status é RESPONDIDA, o registro está errado.226 Uma RESPONDIDA-FRACA:227 (a) NUNCA entra no CONTEXTO ESTABELECIDO de outro sub-agente;228 (b) em rajada-contínua é re-admitida na rajada seguinte, reformulada mais229 estreita, SEM passar pelo portão — o portão julga dúvida nova, ele não230 reabre dúvida malfeita;231 (c) em rajada-única entra OBRIGATORIAMENTE em "Questões em aberto", com o232 motivo "respondida com confiança baixa" e a evidência que faltou;233 (d) toda afirmação da resposta final que dependa dela carrega ressalva234 escrita, como uma SOLITÁRIA.235 Chegando assim na entrega, ela conta em H — nunca em C.</invariant>236 <invariant id="I5">A CONTAGEM FECHA — nenhuma dúvida evapora. Todo status237 terminal cai em EXATAMENTE uma letra, e esta identidade vale sempre:238239 **A = B + C + G + E + I + H + F**240241 | Letra | Conta | Status terminal no registro |242 |---|---|---|243 | A | todas as dúvidas que já existiram | total de linhas da tabela |244 | B | fechadas pelo contexto | RESPONDIDA com Rota CALLER ou PROJECT |245 | C | fechadas por busca | RESPONDIDA com Rota WEB |246 | G | fechadas por você, sem sub-agente | RESPONDIDA-INFERIDA |247 | E | recusadas no portão | DESCARTADA: <motivo> e DUPLICATA-DE-Dn |248 | I | bloqueadas | BLOQUEADA |249 | H | respondidas fraco | RESPONDIDA-FRACA |250 | F | abertas na entrega | ABERTA |251252 TETO DA INFERIDA: **G ≤ ⌈0,20 × A⌉** — no máximo 20% das dúvidas do253 registro fecha por inferência, arredondando para cima (A=100 → G até 20;254 a 21ª dispara; A=6 → G até 2; a 3ª dispara). Conta-se na linha CONTAGEM255 do `DOUBTS.md`, como a identidade: `G > ⌈A/5⌉` é registro errado, e a256 dúvida que estourou o teto só fecha disparando sub-agente. A trava de257 conteúdo da inferida (ver `routing`) proíbe as afirmações que envelhecem;258 este teto proíbe a inferência como sistema — sem ele, um run inferiria259 TODAS as respostas (G = A) e a identidade fecharia do mesmo jeito.260 Atingido o teto, INFERIDA está PROIBIDA mesmo para resposta limpa, sem261 número, versão, preço, data, limite ou nome de API.262263 EM-VOO não é terminal e não tem letra: na entrega ele tem de ser ZERO.264 Se a identidade não fechar, o REGISTRO está errado — conserte o registro,265 nunca o número. `D` (admitidas em rajadas posteriores) é métrica de fluxo:266 vai na tabela de rajadas e NÃO entra na identidade, senão a dúvida admitida267 na rajada 2 e respondida na rajada 2 é contada duas vezes.268 A tabela "Questões em aberto" do relatório tem exatamente **F + I + H**269 linhas — uma por dúvida que chega ao fim sem resposta usável. Nenhuma das270 três letras tem permissão de sumir num contador.</invariant>271</doubt-register>272273<routing>274 <purpose>Antes de disparar, cada dúvida recebe uma rota. Rota errada gasta275 uma busca na web para descobrir algo que estava no package.json.</purpose>276 <route id="CALLER" agent="fork" fallback="inline">277 <for>O que só a conversa que pediu a pesquisa responde: o que está sendo278 construído, o que já foi tentado, que restrição está fixada, que decisão279 já foi tomada.</for>280 <why>Um `fork` herda a SUA conversa inteira — a mesma em que esta skill foi281 carregada. É leitura barata do seu próprio contexto: o probe destila o282 que importa sem que você releia tudo. É também a metade de ida da troca283 com quem pediu a pesquisa; a volta é a fase 7.</why>284 <availability>O tipo `fork` só existe com fork mode ligado285 (`CLAUDE_CODE_FORK_SUBAGENT=1` ou rollout). Os embutidos são `Explore`,286 `Plan` e `general-purpose`. Se o spawn falhar por tipo inválido, NÃO287 re-dispare e não troque de tipo — nenhum sub-agente fresco enxerga sua288 conversa. Caia para INLINE: ver `fork-indisponível`.</availability>289 </route>290 <route id="PROJECT" agent="Explore">291 <for>O que o repositório responde: versões exatas, se o assunto já existe292 no código, convenções vigentes, restrições declaradas.</for>293 </route>294 <route id="WEB" agent="general-purpose">295 <for>Todo o resto — o que exige evidência externa e citável.</for>296 </route>297 <spawn-threshold>Uma dúvida merece sub-agente quando responder a ela geraria298 muito contexto que é irrelevante para você — a fronteira certa é a de299 CONTEXTO, não a de assunto. Dúvida cuja resposta cabe em uma linha e que300 você já sabe com certeza não precisa de sub-agente: responda inline e301 registre como RESPONDIDA-INFERIDA, preservando a Origem real.302 TRAVA DA INFERIDA: antes de escrever RESPONDIDA-INFERIDA, olhe a resposta303 que você ia dar. Se ela contém um NÚMERO, uma VERSÃO, um PREÇO, uma DATA,304 um LIMITE ou um nome de API/flag — ou se a afirmação vai carregar uma305 citação `[n]` no entregável —, INFERIDA está PROIBIDA: dispare o306 sub-agente. São exatamente as afirmações que envelhecem, e é para não307 chutá-las que esta skill existe. Uma INFERIDA só entra no CONTEXTO308 ESTABELECIDO com a etiqueta `(inferido, não verificado)`.309 E o TETO DA INFERIDA (I5) vale para TODA inferida, mesmo a limpa: fechadas310 por INFERIDA já são `⌈20% × A⌉` no registro? Então esta também dispara311 sub-agente, no lugar de inferir. As duas travas se leem da linha CONTAGEM312 do `DOUBTS.md` — a de conteúdo mora aqui, a de teto mora na identidade.</spawn-threshold>313 <ordering>Rotas CALLER e PROJECT vêm ANTES de qualquer WEB, em toda rajada —314 não só na 0. Buscar na web "melhor biblioteca de X" sem saber a versão do315 runtime do projeto produz uma resposta correta e inútil.</ordering>316</routing>317318<workflow>319320 <phase id="0" name="INTAKE">321 <steps>322 <step>EXTRAIA `sub-agents=N` de $ARGUMENTS ANTES de qualquer outra coisa.323 Aceite `sub-agents=8`, `--sub-agents=8` e `--sub-agents 8`. Remova o324 token do texto restante — se não remover, ele vira parte da pergunta e325 você pesquisa "sub-agents=8" na Brave. Sem o token, N = 10. Fora de326 1..20, corrija para o limite mais próximo e declare a correção.327 N é o TETO DE SIMULTANEIDADE da rajada (ver `budgets`).</step>328 <step>PORTÃO DA CHAVE — antes de qualquer rajada, rode329 `surf-research-skill gate`. Ele resolve o MESMO portão que todo comando330 de busca resolve e responde à única pergunta que importa: existe chave331 Brave utilizável AGORA? O veredito é o CÓDIGO DE SAÍDA, não a prosa:332 `0` = há chave utilizável, siga; `78` = PARE AQUI. Qualquer outro333 código de saída conta como 78. Precisando do veredito estruturado,334 `surf-research-skill gate --json`.335 NÃO use `surf-research-skill keys list` como portão. Ele lista o que336 está gravado em disco, não valida nada e sai 0 mesmo quando não há337 nenhuma chave utilizável — esperar 78 dele é esperar um código que ele338 nunca emite, e uma chave nunca sondada aparece na lista igual a uma boa.339 `keys list` serve para DIAGNOSTICAR depois que o portão reprovou, nunca340 para decidir se pode disparar.341 Ao parar: não dispare sub-agente nenhum — eles falhariam um a um, cada342 um gastando contexto para redescobrir a mesma coisa. Devolva a mensagem343 do portão ao usuário, verbatim, e encerre. Esta skill não tem plano B —344 não existe provedor alternativo, tier gratuito, nem WebSearch de345 reserva. Uma resposta sem Brave seria uma resposta inventada.</step>346 <step>Leia o resto de $ARGUMENTS. Classifique: factual · comparativa ·347 panorama · aprofundamento · procedural · depuração.</step>348 <step>Decida o MODO (ver `modes`). Padrão rajada-única.</step>349 <step>Escreva o ENTREGÁVEL em uma frase: a forma exata da resposta.350 Artigo, tabela comparativa, ranking, guia passo-a-passo, veredito.</step>351 <step>Defina {{SLUG}} e crie `research/{{SLUG}}/` e352 `research/{{SLUG}}/handoffs/`. Crie também353 `research/{{SLUG}}/SOURCES.txt` VAZIO: é o ledger de URLs que o C3 lê,354 e um C3 sem ele não dispara.</step>355 </steps>356 </phase>357358 <phase id="1" name="LEVANTAMENTO DE DÚVIDAS">359 <objective>Escrever TODAS as suas dúvidas antes de disparar qualquer coisa.360 Esta fase é o diferencial da skill — a qualidade da rajada é a qualidade361 desta lista.</objective>362 <taxonomy>Percorra as categorias e pergunte, em cada uma, "há algo aqui que363 eu não sei e que muda a resposta?":364 <item name="definição">O termo central tem acepções concorrentes?</item>365 <item name="universo">Quais são TODAS as opções? Falta alguma?</item>366 <item name="critério">Por qual métrica "melhor" está sendo medido?</item>367 <item name="evidência">Que número, benchmark ou spec sustentaria a resposta?</item>368 <item name="contexto">Que restrição do projeto muda a resposta? → CALLER/PROJECT</item>369 <item name="temporalidade">Isso mudou recentemente? Há deprecação, breaking change, EOL?</item>370 <item name="custo">Preço, licença, limite de tier gratuito.</item>371 <item name="risco">Modos de falha, CVE, armadilha em produção.</item>372 <item name="contraposição">Quem discorda, e qual o melhor argumento contra?</item>373 <item name="aplicabilidade">Vale na escala, runtime e plataforma deste caso?</item>374 </taxonomy>375 <aids>376 <aid name="teste da resposta agora">Tente escrever a resposta final377 AGORA. Cada lacuna, cada "depende", cada número que você inventaria é378 uma dúvida.</aid>379 <aid name="teste das duas respostas">Esboce duas respostas plausíveis e380 opostas. Onde elas divergem há uma dúvida — e a evidência que as separa381 é exatamente o que buscar.</aid>382 </aids>383 <steps>384 <step>Escreva cada dúvida como PERGUNTA FECHADA, com "por que importa".</step>385 <step>Roteie cada uma (CALLER · PROJECT · WEB).</step>386 <step>Publique `research/{{SLUG}}/DOUBTS.md`.</step>387 </steps>388 </phase>389390 <phase id="2" name="RAJADA 0 — CONTEXTO">391 <objective>Descobrir o que já é sabido antes de gastar uma busca com isso.392 Roda nos DOIS modos, sempre. Nunca pule.</objective>393 <steps>394 <step>Emita, NA MESMA MENSAGEM: um <tool>Agent</tool> com395 `subagent_type: "fork"` (template T1, com TODAS as dúvidas de rota396 CALLER) e um <tool>Agent</tool> com `subagent_type: "Explore"`397 (template T2, com TODAS as de rota PROJECT). Se não houver dúvida de398 uma das rotas, dispare mesmo assim com a pergunta original — o contexto399 que volta sempre reformula alguma dúvida WEB.400 Se o Agent recusar o tipo `fork`, NÃO repita a chamada: aplique401 `fork-indisponível` e siga em frente na mesma rajada.</step>402 <step>Barreira. Espere os dois.</step>403 <step><strong>Reescreva o registro com o que voltou:</strong> feche as404 dúvidas que o contexto respondeu; troque termos genéricos pelas versões405 e restrições reais nas dúvidas WEB; admita as dúvidas novas que o406 contexto criou. Este é o passo que faz a Rajada 1 valer o dobro.</step>407 <step>Guarde o resultado como CONTEXTO ESTABELECIDO — ele entra em todo408 prompt de todas as rajadas seguintes.</step>409 </steps>410 </phase>411412 <phase id="3" name="RAJADA N — DÚVIDAS">413 <repeat>Rajada 1 nos dois modos; rajadas 2..N só em rajada-contínua.</repeat>414 <steps>415 <step>Selecione as dúvidas ABERTAS desta rajada, qualquer rota, ordenadas416 por impacto no entregável. Aplique o teto de `budgets/teto-de-rajada`:417 no máximo N sub-agentes nesta rajada (N = `sub-agents`, default 10).418 O que não couber permanece ABERTA, com o motivo "excedeu o teto da419 rajada N": vira a próxima rajada (contínua) ou entra em "Questões em420 aberto" com o que a fecharia (única). Você PODE fundir duas excedentes421 que sejam a mesma pergunta. O que NUNCA faz é colar uma dúvida não422 disparada no roster de FRONTEIRAS de um irmão — o roster é lista de423 EXCLUSÃO, e pôr algo ali garante que ninguém pesquise aquilo.</step>424 <step>SUB-RAJADA DE CONTEXTO — só se esta rajada tiver dúvidas CALLER ou425 PROJECT. É `<ordering>` aplicado DENTRO da rajada: T1 (`fork`) e T2426 (`Explore`) na mesma mensagem ANTES de qualquer WEB, barreira, e então427 reescreva o registro como na fase 2. Três amarrações: (a) ela e a428 rajada WEB que a segue contam como UMA rajada para C4 e para o T8;429 (b) se depois dela não sobrar dúvida WEB ABERTA, vá direto para a fase430 4 — não dispare rajada WEB vazia; (c) num T1 depois da rajada 0, mande431 só as dúvidas CALLER e o CONTEXTO ESTABELECIDO, nunca o histórico.</step>432 <step>Monte o roster de irmãos: a lista "D3 cobre X, D4 cobre Y…" que433 entra no prompt de cada um.</step>434 <step><strong>Dispare TODAS as dúvidas WEB restantes na mesma435 mensagem</strong> — um <tool>Agent</tool> por dúvida,436 `subagent_type: "general-purpose"` (e `run_in_background: false`437 apenas onde o schema da sessão o expuser — a barreira não depende438 dele, ver R5), template T3 preenchido, marcando cada dúvida como439 EM-VOO.440 DIVIDA O ORÇAMENTO: cada comando surf-search-* no prompt T3 leva441 `--sub-agents=max(1, floor(N / <tamanho desta rajada>))`. Os dois níveis442 se somam, não se multiplicam — sem isso, 10 sub-agentes com o default de443 10 pedem 100 requisições ao Brave, que chegam ENFILEIRADAS e não444 simultâneas enquanto o limitador de taxa estiver armado. O preço é445 latência, não erro: a rajada inteira fica parada esperando a fila446 drenar no ritmo do plano. Dividir não corta cobertura: o447 `surf-search-normal` roda na sua onda única todas as queries que o448 planejador admitiu (até `--max-queries`, padrão 10), `--sub-agents` por449 vez.</step>450 <step>Barreira.</step>451 <step>Registre cada handoff: resposta, confiança, fontes, caminho do452 arquivo. O STATUS SAI DA LEITURA DE UMA PALAVRA, não de julgamento —453 olhe o campo `**Confidence:**` do handoff antes de escrever:454 `High` ou `Medium` → RESPONDIDA.455 `Low` → RESPONDIDA-FRACA, e nunca RESPONDIDA (I4). Ela não entra no456 CONTEXTO ESTABELECIDO, não vira citação sem ressalva, e conta em H.457 Contador de `cli-falhou` estourado → BLOQUEADA, que tem letra própria458 na contagem (I5, letra I) e linha própria em "Questões em aberto".459 Bloqueada não some.460 Esse contador conta disparos SEUS, nunca as tentativas internas do461 sub-agente.462 NÃO EXISTE MAIS FALLBACK. A v8 é Brave-only: se a CLI falhar, a dúvida463 fica BLOQUEADA e entra no relatório como tal. Um sub-agente que464 contorne a CLI com WebSearch/WebFetch produz uma fonte que a skill não465 pode auditar nem citar — trate esse handoff como BLOQUEADO, não como466 resposta. Se a CLI sair com 78 é a chave, não a rede: pare a rajada467 inteira (fase 0, portão da chave).</step>468 <step>ATUALIZE O LEDGER DE FONTES — é o que transforma o C3 em conta e469 não em palpite. Cada handoff T3 devolve470 `Arquivo de URLs: {{HANDOFF_DIR}}/{{DOUBT_ID}}.urls.txt`, com uma URL471 canônica por linha, extraída do `--json` da própria CLI. Leia esses472 arquivos, acrescente a `research/{{SLUG}}/SOURCES.txt` toda URL que473 ainda não estiver lá — e só essas —, e reescreva o arquivo com uma URL474 por linha, sem cabeçalho, sem linha em branco, sem repetição, e475 TERMINANDO com quebra de linha (sem ela o `wc -l` perde a última URL e476 o C3 dispara cedo). Então rode477 `wc -l research/{{SLUG}}/SOURCES.txt`. Esse inteiro é `U(N)`, o478 número de fontes distintas depois da rajada N: anote-o na linha479 CONTAGEM do `DOUBTS.md` e na tabela de rajadas do T8. O C3 compara480 `U(N)` com `U(N-1)` — dois inteiros lidos do disco, nada mais.</step>481 <step>Reescreva as duas linhas de comentário no topo do `DOUBTS.md`482 (BARREIRA e CONTAGEM) com os números desta rajada. A identidade I5 tem483 de fechar AQUI, não só na entrega.</step>484 </steps>485 </phase>486487 <phase id="4" name="TRIAGEM">488 <objective>Decidir quais dúvidas novas merecem existir. Você faz isto,489 sozinho, sem sub-agente. É barato e é a decisão mais importante do loop.</objective>490 <steps>491 <step>PASSO 0 — releia a linha `<!-- BARREIRA rajada N: em-voo=X492 recebidos=Y -->` no `DOUBTS.md` em disco. Se `Y < X`, você NÃO está na493 fase 4: volte a esperar (R5). Turno que passou sem notificação nova é494 espera, não permissão. Só com `Y == X` siga.</step>495 <step>Junte todas as "dúvidas novas" declaradas nos handoffs, mais as que496 VOCÊ tem ao ler as respostas: o que ficou pressuposto sem prova, o que497 duas fontes contam diferente, o que a resposta implica e não fecha.</step>498 <step>Passe cada candidata pelo PORTÃO DE ADMISSÃO. Precisa dos quatro:499 <gate id="G1" name="não-duplicata">Não é a mesma pergunta de nenhuma500 dúvida JÁ REGISTRADA — inclusive das DESCARTADAS e BLOQUEADAS.501 Se for, marque DUPLICATA-DE-Dn e descarte.</gate>502 <gate id="G2" name="decisão-relevante">A resposta muda uma parte503 CONCRETA do entregável, e você consegue nomear qual. "Seria504 interessante saber" reprova. Convenção declarada: o JUÍZO (a parte é505 mesmo concreta e afetada?) é seu e ninguém o verifica — o que este506 portão torna verificável é o REGISTRO, a coluna "por que importa"507 (I2) com a parte nomeada. Quem audita confere a coluna, não o seu508 julgamento.</gate>509 <gate id="G3" name="respondível">Existe evidência que plausivelmente a510 feche — publicada na web, no repositório, ou na conversa em que esta511 skill foi carregada. G3 reprova por UMA destas quatro causas, e só512 por elas; o motivo registrado tem de nomear a letra: (a) evento513 futuro; (b) intenção de terceiro; (c) dado privado não publicado;514 (d) a pergunta não é factual. Fora dessas quatro, NA DÚVIDA ADMITA —515 o custo de uma dúvida a mais é um sub-agente; o de uma a menos é uma516 resposta errada. Convenção declarada: o verificável é o REGISTRO —517 o motivo nomeia a letra a/b/c/d. O acerto do juízo ("existe518 evidência plausivelmente") é previsão sobre o mundo feita antes de519 olhar: um portão não transforma palpite em fato, só registra a520 declaração do palpite.</gate>521 <gate id="G4" name="não-regressiva">Não é mais um degrau de "por quê"522 sobre algo já suficientemente respondido, nem refinamento de precisão523 que a resposta não usa. Cheque a cadeia de origem (I3): se a dúvida524 está a três saltos da pergunta original e já não fala dela, é deriva.</gate>525 </step>526 <step>Toda candidata ADMITIDA recebe uma rota (CALLER · PROJECT · WEB) no527 ato da admissão, pela mesma regra de `routing`. Dúvida admitida sem528 rota é dúvida que ninguém dispara; a coluna Rota só fica "—" para529 DESCARTADA e DUPLICATA.</step>530 <step>Registre TODA candidata, inclusive as reprovadas, com o motivo da531 reprovação. Elas nunca mais voltam (I1). Cada reprovada em G2, G3 ou G4532 ganha também uma linha na tabela "Dúvidas recusadas no portão" do T8,533 com o portão e o motivo em uma linha (G3 nomeia a letra a/b/c/d). As534 reprovadas em G1 ficam só no contador, com o `Dn` de que são duplicata.535 Um `E` inteiro e mudo esconde justamente as perguntas que VOCÊ decidiu536 não fazer — e é isso que esta skill promete não fazer.</step>537 <step>Bifurque pelo modo:538 <branch mode="rajada-única">Pare. As admitidas viram "Questões em539 aberto" na resposta final, cada uma com o que a fecharia. Vá para a540 fase 5.</branch>541 <branch mode="rajada-contínua">Aplique a regra de convergência542 (`convergence`). Continuar → volte à fase 3 com as admitidas.543 Saturado → fase 5.</branch>544 </step>545 </steps>546 </phase>547548 <phase id="5" name="VERIFICAÇÃO">549 <objective>Atacar o que foi encontrado, e checar o que não foi.</objective>550 <steps>551 <step>PORTÃO DE SÍNTESE — passo 0, antes de emitir T4 ou T5. RELEIA552 `research/{{SLUG}}/DOUBTS.md` DO DISCO, linha a linha. Não use a sua553 lembrança do registro: depois de quatro rajadas ela diverge do arquivo,554 e é o ARQUIVO que o auditor e o sintetizador vão ler. Quatro perguntas,555 todas respondíveis com sim ou não olhando o arquivo:556 (1) Alguma linha ainda em EM-VOO? Se sim, você não está na fase 5 —557 volte a esperar (R5).558 (2) Toda linha ABERTA, BLOQUEADA ou RESPONDIDA-FRACA tem preenchido "o559 que a fecharia"? Se não, preencha antes de seguir. (Convenção560 declarada: o portão confere o PREENCHIMENTO da célula, e o561 conteúdo é texto livre — ninguém verifica se aquilo fecharia562 mesmo a dúvida.)563 (3) A identidade `A = B + C + G + E + I + H + F` fecha (I5)? Se não, o564 registro está errado — conserte o registro.565 (4) `wc -l research/{{SLUG}}/SOURCES.txt` bate com o último `U(N)`566 anotado na linha CONTAGEM, e o arquivo não tem URL repetida?567 Um "não" em qualquer uma das quatro impede a emissão do T4 e do T5.</step>568 <step>Consolide `research/{{SLUG}}/FINDINGS.md` a partir do registro569 inteiro — TODAS as rajadas, não só a última.</step>570 <step>Emita NA MESMA MENSAGEM: o revisor adversarial (T4) e o auditor de571 cobertura (T5). O primeiro pergunta "isto é verdade?"; o segundo,572 "isto responde a pergunta?". São falhas diferentes e precisam de olhos573 diferentes. Alto risco: três T4 em paralelo com lentes distintas574 (atualidade · autoridade · reprodutibilidade), matando a afirmação com575 2 de 3 refutações — é a rajada de confiança de `burst-kinds`.576 O T5 recebe o CAMINHO `research/{{SLUG}}/DOUBTS.md` e é instruído a577 lê-lo do disco. NUNCA cole o registro no prompt: um registro colado é a578 sua lembrança dele, e o que o auditor auditaria seria a lembrança.</step>579 <step>Afirmação REFUTADA sai ou é corrigida; SOLITÁRIA fica com ressalva580 escrita.</step>581 <step>Toda dúvida que o auditor marcou "nominalmente respondida,582 materialmente aberta" volta de RESPONDIDA para ABERTA no registro —583 nos DOIS modos. Sem isso o sintetizador a lê como fechada e a afirma584 sem ressalva.</step>585 <step>REPROVAÇÃO DE CONTABILIDADE do T5 — identidade que não fecha, linha586 ainda EM-VOO, ou linha RESPONDIDA cujo handoff diz `Confidence: Low` —587 NÃO é lacuna de pesquisa e não vira questão em aberto: é erro de588 registro, e erro de registro se conserta. A RESPONDIDA sobre handoff589 Low vira RESPONDIDA-FRACA; a EM-VOO recebe o status que o handoff590 dela manda; a identidade é refeita. Depois refaça as quatro perguntas591 do portão de síntese e siga. Isso não abre rajada e não gasta um592 segundo T5.</step>593 <step>Bifurque pelo veredito do auditor (T5) — ele escreve em inglês:594 `READY FOR SYNTHESIS` é PRONTO PARA SÍNTESE, `MISSING` é FALTA:595 <branch verdict="PRONTO PARA SÍNTESE">Fase 6.</branch>596 <branch verdict="FALTA" mode="rajada-contínua" condition="abaixo do teto vigente (6, ou 12 se estendido por C4)">597 Dispare uma rajada de correção com as lacunas apontadas. Quando ela598 voltar, re-dispare UM T4 restrito às afirmações que ela criou ou599 corrigiu — e nada mais. Esta é a única re-verificação permitida: não600 há segunda rajada de correção, e o que ainda faltar vira questão em601 aberto.</branch>602 <branch verdict="FALTA" mode="rajada-única, ou contínua sem orçamento">603 Não há rajada de correção. Cada parte órfã do entregável entra no604 registro como dúvida ABERTA com origem AUDITORIA e vai para "Questões605 em aberto" com o que a fecharia. O relatório declara em "Parada" que606 o modo (ou o teto) impediu o fechamento.</branch>607 </step>608 </steps>609 </phase>610611 <phase id="6" name="SÍNTESE">612 <steps>613 <step>UM sub-agente sintetizador (T6). Nunca dois. Leitura paraleliza;614 redação não — dois escritores produzem duas premissas implícitas615 incompatíveis.</step>616 <step>Ele recebe o CAMINHO `research/{{SLUG}}/DOUBTS.md` — nunca uma617 cópia colada — e lê do disco o registro inteiro, os handoffs completos618 e a auditoria de cobertura; então escreve `research/{{SLUG}}/ANSWER.md`619 no formato do entregável, com citações [n] e a tabela de fontes. A620 tabela "Questões em aberto" dele tem exatamente `F + I + H` linhas621 (I5), e toda afirmação apoiada numa RESPONDIDA-FRACA sai com ressalva622 escrita.</step>623 </steps>624 </phase>625626 <phase id="7" name="ENTREGA E COMMIT">627 <steps>628 <step>Se a SUA conversa é a de um sub-agente a serviço de outro agente,629 monte a devolução (T7): resposta curta, o que isso muda no projeto630 dele, as premissas dele que foram verificadas, e o que você ainda631 precisa dele. É a volta da troca aberta na Rajada 0. Invocada632 diretamente pelo usuário, o T8 já cumpre esse papel.</step>633 <step>Pré-voo do commit, só leitura: `git rev-parse --git-dir` e634 `git check-ignore -q research/{{SLUG}}`. ATENÇÃO ao código de saída do635 check-ignore, que é invertido: 0 = IGNORADO, 1 = versionável. Sem636 repositório (exit 128) ou caminho ignorado (exit 0) → não commite e637 não force; vá para `commit-bloqueado`.</step>638 <step>Havendo repositório e caminho versionável:639 `git add research/{{SLUG}} && git commit -m "docs(research): {{RESUMO}}" -- research/{{SLUG}}`.640 O pathspec no commit é obrigatório: sem ele, o que o usuário já tinha641 em stage entra no seu commit. O prefixo conventional-commit também é642 obrigatório — `research:` não é tipo válido e commitlint recusa.</step>643 <step>Apresente o RELATÓRIO FINAL (T8).</step>644 </steps>645 </phase>646647</workflow>648649<convergence>650 <applies-to>rajada-contínua</applies-to>651 <rule id="C1" name="rajada seca — e o que NÃO é seca">Rajada que ADMITIU652 pelo menos uma dúvida no portão não é seca: zere o contador de secas e653 siga. Só quando a rajada admitiu ZERO é que a pergunta importa — e ela tem654 duas respostas muito diferentes, que se separam por uma conta e não por655 impressão. Seja `S` o número de dúvidas DISPARADAS nela (as que você marcou656 EM-VOO) e `R` quantas voltaram RESPONDIDA com 657658…(truncated)