definido pelo seu catálogo interno |
| observed | Trecho, campo extraído ou cadeia de redirecionamento |
| expected | Condição esperada segundo o critério usado |
| criterion_ref | Documento, versão e seção que sustentam o diagnóstico |
| recommendation | Correção limitada ao que a evidência permite concluir |
| confidence | Nível de confiança e motivo |
| collection_status | Estado da coleta, renderização e interpretação |
O campo observed muda conforme o diagnóstico:
- Título ou meta description: devolva o conteúdo extraído, a quantidade encontrada e o seletor ou campo de origem.
- Canonical: registre o valor do
href, a URL final resolvida e qualquer divergência detectada. - Status HTTP: inclua o código recebido e a URL consultada.
- Redirecionamento: preserve a cadeia completa, como
URL A → 301 → URL B → 302 → URL C → 200. - Conteúdo renderizado: guarde o trecho relevante e informe se veio do HTML inicial ou do DOM após JavaScript.
- Diretiva de indexação: devolva o valor observado e sua origem, como cabeçalho HTTP ou elemento
meta.
Se a ferramenta não preencher a evidência mínima, o agente não deve completar o campo por inferência nem emitir o achado como diagnóstico. Ele deve registrar o campo avaliado como não verificado ou inconclusivo e informar o motivo da insuficiência de evidência.
Separe a observação do critério aplicado
A evidência mostra o que a página entregou. O critério explica por que isso representa um problema. Misturar os dois permite que o modelo transforme preferência em erro técnico.
Considere este caso:
- URL analisada:
/produto-a; - valor observado em
canonical:/categoria; - critério interno: páginas de produto devem apontar para a própria URL quando forem indexáveis;
- diagnóstico: canonical divergente do padrão do projeto;
- recomendação: revisar o
hrefe confirmar se a consolidação em/categoriafoi intencional.
A recomendação não pode avançar para “troque obrigatoriamente pela própria URL” sem consultar o padrão do projeto. A divergência pode representar uma configuração deliberada.
Disponibilize critérios internos pelo Brain
Use o Brain ou um armazenamento equivalente para fornecer ao agente:
- padrões de canonical e indexação do projeto;
- convenções para URLs, paginação e parâmetros;
- requisitos do CMS;
- exceções aprovadas pelo time;
- critérios de severidade;
- histórico de decisões técnicas;
- procedimentos de correção aceitos pela equipe.
Cada trecho recuperado precisa manter nome do documento, versão, seção e citação textual. Assim, o achado aponta tanto para a página observada quanto para o conhecimento usado na interpretação.
Por exemplo, o agente pode devolver:
Evidência da página:
canonical="/categoria"
Critério citado: “Páginas de produto indexáveis usam canonical autorreferente.”
Origem interna:Padrões SEO — versão 3 — seção Canonical
Na Catcher Agents, o Brain cumpre esse papel ao disponibilizar conhecimento com citação. Quando não encontra uma fonte interna capaz de sustentar o critério, o agente deve declarar essa ausência. Ele não deve substituir o padrão desconhecido por uma prática genérica apresentada como regra do projeto.
Trate falha de coleta como limite, não como diagnóstico
Uma página inacessível não é automaticamente uma página com erro de SEO. Diferencie estados como:
access_denied: autenticação, bloqueio ou restrição impediu o acesso;fetch_failed: a coleta não recebeu uma resposta utilizável;render_failed: o navegador não concluiu a renderização;content_missing: o campo necessário não apareceu no HTML ou DOM coletado;interpretation_uncertain: existem dados, mas eles não sustentam uma conclusão segura;completed: coleta e interpretação concluídas.
A resposta deve dizer exatamente o que ficou fora do alcance:
Não foi possível verificar o canonical porque a renderização não terminou. Nenhum diagnóstico foi emitido para esse campo.
Esse limite evita falsos positivos. Também orienta a próxima ação: repetir a coleta, fornecer autenticação, ajustar o renderizador ou encaminhar a página para revisão manual.
Antes de liberar qualquer achado, aplique três bloqueios:
- Há uma URL identificável?
- Existe uma evidência observada, como trecho, campo ou cadeia de redirecionamento?
- O critério e a recomendação estão sustentados pelo Brain ou por uma regra determinística registrada?
Se uma resposta for negativa, o agente não deve emitir o achado como diagnóstico. Ele deve registrar o campo avaliado como não verificado ou inconclusivo, informar o motivo e nunca preencher a lacuna com uma explicação plausível.
Teste o auditor com casos reproduzíveis
Uma arquitetura correta ainda pode falhar por mudança de prompt, parser, ferramenta ou modelo. O próximo passo é transformar os diagnósticos esperados em uma suíte de regressão.
Crie um conjunto de teste com falhas conhecidas
Não valide o agente em sites aleatórios. Monte um corpus versionado com páginas controladas, cada uma ligada a um resultado esperado.
Inclua casos positivos e negativos para cada categoria:
| Categoria | Página de teste | Resultado esperado |
|---|---|---|
| Status HTTP | URL retorna erro | Detectar o status e registrar a URL afetada |
| Redirecionamento | Cadeia entre URLs | Informar cada salto observado |
| Canonical | Canonical aponta para outra página | Identificar o destino declarado |
| Indexação | Diretiva bloqueia indexação | Exibir a diretiva encontrada |
| Metadados | Página sem title | Apontar ausência do elemento |
| Links internos | Link aponta para URL inexistente | Associar origem, destino e resposta |
| Renderização | Conteúdo aparece apenas após JavaScript | Diferenciar HTML inicial do conteúdo renderizado |
| Caso negativo | Página sem a falha avaliada | Não produzir achado para essa categoria |
Para cada fixture, salve:
- URL ou identificador da página;
- snapshot do HTML e das respostas HTTP;
- categoria avaliada;
- achados esperados;
- achados que não podem aparecer;
- evidência mínima exigida;
- severidade esperada, quando aplicável.
Esse conjunto vira a suíte de regressão. Um novo prompt, modelo ou parser só avança se continuar detectando as falhas conhecidas sem começar a acusar problemas nas páginas negativas.
Meça erro, cobertura e custo separadamente
Uma taxa geral de acerto esconde categorias frágeis. Calcule as métricas por tipo de diagnóstico e também para o conjunto completo.
- Verdadeiro positivo: o auditor encontrou uma falha presente no resultado esperado.
- Falso positivo: o auditor reportou uma falha ausente na página.
- Falso negativo: a falha existe, mas não apareceu no diagnóstico.
- Precisão: entre os achados produzidos, quantos estavam corretos.
- Recall: entre as falhas esperadas, quantas foram detectadas.
- Cobertura de URLs: quantas URLs previstas foram coletadas e analisadas.
- Custo:
cost_usdtotal, por URL processada e por achado válido. - Latência: tempo total da execução e percentis por etapa, como coleta, ferramenta e interpretação do modelo.
Acompanhe os resultados em uma matriz:
| Categoria | Esperados | Detectados | Falsos positivos | Falsos negativos | Cobertura | Custo | Latência | |---|---:|---:|---:|---:|---:|---:|---:| | Canonical | | | | | | | | | Indexação | | | | | | | | | Redirecionamento | | | | | | | | | Links internos | | | | | | | | | Renderização | | | | | | | |
Uma execução pode ter boa precisão e cobertura ruim. Isso acontece quando os diagnósticos emitidos estão corretos, mas parte do site não foi percorrida. Também pode ter recall alto e precisão baixa, sinal de que o agente encontra os erros conhecidos às custas de muitos alarmes falsos.
Compare uma mudança por vez
Use o mesmo snapshot de páginas para comparar versões. Se o corpus mudar junto com o prompt, você não saberá qual alteração causou a diferença.
Registre em cada rodada:
- versão e hash do prompt;
- modelo e parâmetros de geração;
- versão das regras determinísticas;
- versão de cada ferramenta;
- snapshot do corpus;
- limite de URLs e
budget; run_id, custo e latência;- saída estruturada e evidências retornadas.
Crie uma versão de controle e altere apenas uma variável por experimento:
- Prompt A versus prompt B, com o mesmo modelo, regras e ferramentas.
- Modelo A versus modelo B, com o mesmo prompt e entradas.
- Regra A versus regra B, sem trocar a interpretação do modelo.
- Ferramenta A versus ferramenta B, preservando o restante do fluxo.
Quando houver geração não determinística, execute cada variante várias vezes sobre o mesmo corpus. Compare a média e a variação dos resultados, não apenas a melhor execução. Uma versão que acerta uma vez e falha nas demais não serve como baseline de produção.
Defina critérios de aprovação antes do teste. Por exemplo: nenhum novo falso positivo em diretivas de indexação, cobertura integral das fixtures obrigatórias e custo por URL dentro do budget. Assim, a decisão de publicar uma versão deixa de depender de uma leitura subjetiva da resposta do agente.
Leve o agente ao runtime sem misturar clientes
No protótipo, uma variável global e um histórico compartilhado podem passar despercebidos. Em produção, cada execução precisa nascer vinculada a dois identificadores: o tenant que contratou o serviço e o usuário final que iniciou a auditoria.
Isole o contexto em quatro camadas
Não confie no prompt para separar clientes. Aplique o escopo no servidor, antes de recuperar memória, liberar ferramentas ou consultar evidências.
| Camada | Escopo recomendado | O que não pode acontecer |
|---|---|---|
| Memória | tenant_id + user_id | Um analista receber contexto salvo por outro cliente |
| Credenciais | tenant_id + ferramenta autorizada | Uma auditoria usar token ou propriedade de outro tenant |
| Histórico | tenant_id + user_id + sessão | O modelo incorporar conversas de outro usuário |
| Evidências | tenant_id + run_id + URL | Um achado apontar para HTML coletado em outra execução |
O tenant_id deve vir da autenticação do seu backend, não de um campo editável enviado pelo navegador. O mesmo vale para credenciais de APIs, crawlers e serviços externos: mantenha os segredos no servidor e entregue às ferramentas apenas a autorização necessária para aquela execução.
A memória também exige dois níveis. Dados permanentes do projeto, como domínio principal e preferências de rastreamento, podem pertencer ao tenant. Já decisões, comentários e auditorias anteriores devem respeitar o usuário final. Essa separação permite que uma agência opere vários clientes sem criar um histórico único e contaminado.
Transmita o progresso por REST e SSE
Uma auditoria pode percorrer muitas URLs e chamar várias ferramentas. Se o frontend esperar uma resposta única, a interface parece travada e o usuário não sabe se o agente está trabalhando ou falhou.
Exponha a execução por REST e publique eventos por SSE conforme o runtime avança:
- Descoberta: domínio validado, sitemap localizado e fila de URLs criada.
- Coleta: página processada, status recebido e evidência armazenada.
- Análise: regras executadas e páginas encaminhadas ao modelo.
- Conclusão: achados consolidados, custos registrados e relatório disponível.
Cada evento deve carregar pelo menos o run_id, a fase atual e um resumo seguro para exibição. Evite transmitir credenciais, HTML completo ou conteúdo interno de outras ferramentas.
Na Catcher Agents, a gente embute esse fluxo por REST + SSE em três chamadas: seu backend fornece um runtime token com escopo, o app abre a sessão e envia a mensagem acompanhando os eventos. Assim, você integra o auditor sem prender o produto a um SDK proprietário.
Torne cada auditoria reconstruível
O relatório final não basta para depurar produção. Você precisa saber qual ferramenta rodou, quanto tempo levou, que evidência retornou e quanto daquela execução consumiu o budget.
Registre estes campos desde o início:
run_id: identificador único usado em eventos, logs, evidências e relatório;tenant_ideuser_id: escopo que autorizou a execução;tool_calls: ferramenta, entrada autorizada, saída, erro e duração;- latência total e latência por etapa;
cost_usd: custo acumulado da execução;budget: limite definido antes de iniciar o trabalho;- referências das evidências usadas em cada achado;
- estado final: concluído, interrompido, expirado ou limitado pelo
budget.
Use o mesmo run_id em toda a cadeia. Se o agente afirmar que uma página não possui canonical, você deve conseguir localizar a coleta daquela URL, verificar o HTML observado, identificar a regra aplicada e conferir se o modelo apenas explicou o diagnóstico.
No Console da Catcher Agents, a gente centraliza turnos, tool calls, latência, cost_usd e uso do budget. Isso permite reconstruir uma auditoria específica sem combinar manualmente logs do backend, do crawler e do provedor do modelo. Para um SaaS B2B2C, essa rastreabilidade transforma agentes de IA para desenvolvedores em uma operação auditável por cliente, usuário e execução.
Corrija os bloqueios que mais quebram auditorias em produção
O fluxo pode funcionar no corpus e falhar em sites reais por causa de JavaScript, redirecionamentos, parâmetros, paginação e respostas instáveis. Esses casos precisam virar estados explícitos do pipeline.
Diferencie página limpa de página que o rastreador não conseguiu acessar
Um 200 OK não prova que o conteúdo útil estava disponível. O auditor precisa registrar como a página foi obtida, o que foi renderizado e por que uma URL ficou sem análise.
| Bloqueio | Falha comum | Tratamento no pipeline |
|---|---|---|
| JavaScript | Analisar apenas o HTML inicial e concluir que faltam conteúdo, links ou metadados | Compare HTML recebido e DOM renderizado. Acione navegador headless apenas quando a página depender de JavaScript |
| Loop de redirecionamento | Seguir a cadeia até atingir timeout | Guarde cada URL visitada, interrompa ao reencontrar uma delas e registre a cadeia completa |
| URLs duplicadas | Auditar separadamente versões com barra final, caixa diferente ou parâmetros equivalentes | Normalize a URL antes de enfileirar e mantenha a URL original como evidência |
| Parâmetros | Rastrear combinações de filtros, ordenação e rastreamento | Classifique parâmetros por função e defina quais alteram conteúdo relevante |
| Paginação | Parar na primeira página ou entrar em sequências sem fim | Detecte o padrão, registre relações entre páginas e aplique limite de profundidade |
| Respostas instáveis | Tratar um timeout ou erro temporário como problema permanente | Faça novas tentativas controladas e preserve status, horário, duração e hash da resposta |
| Bloqueio de rastreamento | Declarar que a página não existe quando houve bloqueio por autenticação, firewall ou política de rastreamento | Retorne estado blocked ou inconclusive, nunca passed |
O renderizador deve ser seletivo. Primeiro, faça uma requisição HTTP simples. Use JavaScript apenas quando o HTML inicial não contiver os elementos necessários ou quando a aplicação carregar conteúdo depois da resposta. Renderizar todas as páginas em navegador headless aumenta fila, latência e custo sem melhorar todos os diagnósticos.
Para redirecionamentos, mantenha um conjunto visited_urls por cadeia e um limite max_redirect_hops. Se a URL reaparecer, encerre a coleta com redirect_loop. Se o limite for atingido, retorne redirect_limit_exceeded. Não entregue essa decisão ao modelo.
Controle a expansão do rastreamento antes de chamar o modelo
Calendários, buscas internas, filtros e parâmetros podem gerar um espaço de URLs que cresce a cada página. Um auditor sem fronteiras continua descobrindo URLs até consumir o budget ou travar a fila.
Defina limites explícitos por execução:
max_urls: total de URLs que orun_idpode processar;max_depth: distância máxima desde as URLs de entrada;max_query_variants: variações aceitas para o mesmo caminho;max_redirect_hops: tamanho permitido para uma cadeia;max_rendered_pages: quantidade de páginas que pode usar navegador;max_retries: novas tentativas para respostas instáveis;timeout_ms: tempo máximo por requisição e por renderização;budget: teto operacional da execução.
Quando um limite for atingido, o relatório deve indicar cobertura parcial. Registre quantas URLs foram descobertas, processadas, ignoradas, bloqueadas e interrompidas pelo budget. Sem essa distinção, uma auditoria incompleta parece uma auditoria sem erros.
A fila também precisa de controle por domínio e por tenant. Separe descoberta, coleta, renderização e análise em jobs distintos. Assim, uma página lenta não segura toda a execução, e um site grande não ocupa os workers destinados a outros clientes.
Normalize sem apagar diferenças relevantes
Deduplicação não significa remover parâmetros indiscriminadamente. ?utm_source=x pode representar o mesmo conteúdo, enquanto ?page=2 ou ?color=azul pode alterar a página analisada.
Crie duas representações:
source_url: URL encontrada no HTML, sitemap ou redirecionamento;normalized_url: versão usada para deduplicação e controle de fila.
A normalização pode ajustar host, protocolo, fragmento, barra final e parâmetros classificados como irrelevantes. Preserve a transformação aplicada. Isso permite reconstruir por que duas URLs entraram no mesmo grupo.
Para paginação, não remova o parâmetro antes de identificar sua função. Agrupe as páginas pela coleção, mas mantenha cada posição necessária para verificar links, conteúdo e comportamento da sequência. Interrompa padrões que avancem sem produzir conteúdo novo, como calendários com datas indefinidas.
Não envie o HTML integral ao modelo
O HTML bruto carrega scripts, estilos, menus repetidos, dados de rastreamento e atributos que não ajudam no diagnóstico. Enviá-lo integralmente aumenta tokens, cost_usd e ruído de interpretação.
Faça a extração antes da chamada ao modelo. O payload pode conter:
- URL original e normalizada;
- status HTTP e cadeia de redirecionamentos;
- título e meta description;
- diretivas encontradas;
- headings em ordem;
- links internos relevantes;
- dados estruturados extraídos;
- texto principal em blocos;
- diferenças entre HTML inicial e DOM renderizado;
- identificadores das evidências armazenadas;
- erros, timeouts e bloqueios observados.
Mantenha o snapshot bruto fora do prompt. O agente recebe trechos selecionados e pode solicitar evidências adicionais por ferramenta quando precisar investigar uma hipótese. Isso reduz custo sem perder rastreabilidade.
Separe regra, interpretação e recomendação
Misturar tudo em um prompt transforma um resultado verificável em opinião difícil de reproduzir. Organize o pipeline em três saídas:
- Regra determinística: detecta status, ausência, contagem, duplicidade, loop ou divergência observável.
- Interpretação do modelo: explica contexto, prioridade provável e relação entre achados.
- Recomendação: propõe uma ação compatível com a evidência disponível.
O modelo não deve decidir se houve loop de redirecionamento ou se uma URL retornou determinado status. O coletor já possui esses dados. O modelo pode explicar o impacto provável e sugerir a investigação seguinte.
Também não aceite texto livre como resposta final. Valide a saída contra um schema com campos como finding_type, severity, confidence, source_url, evidence_ids, diagnosis, recommendation e requires_human_review. Rejeite objetos sem evidência, tipos desconhecidos ou severidade fora dos valores aceitos. Faça retry apenas do estágio que falhou, não do rastreamento inteiro.
Use cache sem esconder respostas instáveis
O cache deve evitar trabalho repetido, não substituir evidência recente sem aviso. Monte a chave com tenant, URL normalizada, método de coleta, configuração de renderização e versão do extrator.
Armazene junto:
- horário da coleta;
- status e cabeçalhos relevantes;
- hash do corpo;
- versão do pipeline;
- origem do resultado:
freshoucache; - tempo de expiração;
- tentativas realizadas.
Se duas coletas próximas retornarem status, conteúdo ou redirecionamentos diferentes, marque o achado como instável. Preserve as duas respostas. Escolher uma delas silenciosamente torna o diagnóstico impossível de reproduzir.
Exija revisão humana antes de mudanças de alto impacto
O auditor pode abrir tarefas e preparar correções. Ele não deve publicar automaticamente alterações amplas com base em uma única execução.
Encaminhe para revisão humana recomendações que envolvam:
- mudanças em
robots.txt; - aplicação de
noindex; - alteração de canonical;
- redirecionamentos em massa;
- remoção de páginas;
- mudanças em templates compartilhados;
- reescrita de navegação ou paginação;
- correções que afetem vários tenants, domínios ou ambientes.
A tela de revisão deve mostrar evidência, regra acionada, interpretação, URLs afetadas, cobertura da execução e limites atingidos. Preserve também run_id, configuração, versão das ferramentas, chamadas realizadas, latência e cost_usd. Assim, o time consegue repetir a auditoria, comparar duas execuções e descobrir se a diferença veio do site, do coletor, das regras ou do modelo.
Conclusão
Um auditor de SEO técnico confiável separa coleta, regras, interpretação e evidência. O modelo não decide sozinho o que existe na página. Ele recebe dados estruturados, interpreta achados verificáveis e devolve cada diagnóstico ligado ao trecho, status HTTP ou metadado que o produziu.
Comece com um único teste, como detectar divergências entre URL final e canonical. Crie páginas de teste com casos válidos e inválidos, execute o fluxo duas vezes e compare achado, evidência, severidade e recomendação. Só adicione novos diagnósticos quando esse resultado for reproduzível.
Ao levar o auditor para um SaaS, a Catcher Agents permite expor esse fluxo por REST + SSE, conectar ferramentas de coleta e manter cada tenant isolado. No Console, você reconstrói os turnos pelo run_id e inspeciona tool calls, latência, cost_usd e consumo de budget antes de ampliar a auditoria.