27 KiB
Design: crescimento SEO e GEO do portfólio
Status: pronto para execução somente após o hardening técnico
Data: 2026-09-04
Pesquisa-base: .superpowers/seo-research-2026-09-04.md
Plano predecessor: docs/superpowers/plans/2026-09-04-portfolio-hardening.md
Objetivo
Melhorar descoberta, compreensão e confiança do portfólio em busca orgânica e experiências generativas sem redesenhar a interface, criar páginas por cidade ou publicar alegações sem prova. A implementação corrige frescor e entidades, torna metadados e Open Graph específicos por rota, conecta serviços a evidências, aprofunda três cases sustentados pelo próprio repositório e por código público, separa os caminhos de contratação e consultoria e documenta medição/operações externas sem alegar que foram executadas.
Gate de sequência
SEO começa depois do gate final do hardening. Na data deste design, apenas a Task 1 do hardening estava concluída; as Tasks 2–12 ainda alterariam arquivos compartilhados. O executor deve aceitar como baseline o estado final comprovado pelo predecessor, não restaurar o estado observado durante esta pesquisa.
Interfaces finais que este design consome:
PortfolioProjectViewpreserva todo projeto editorial e anexademoAvailability/demoCheckedAt.app/layout.tsxé server-first, sem providers globais de scroll/animação, e mantém Header, overlays leves, conteúdo e analytics.GoogleAnalyticsusa consentimento opt-in, chaveevandro.analytics-consent.v1, valoresgranted | denied, endpoint oficial do Google e revogação alcançável.package.jsonoferecepnpm lint,pnpm typecheck,pnpm test,pnpm build; Node 22, pnpm 9.15.9 e Next 16.3.0 ficam fixados pelo ruling de segurança do hardening.Footer,Contact, hero command-center, globo, starfield, notebook, tipografia, paleta preto/papel/verde ácido, cartões e tokensds-*permanecem como direção visual invariável.data/project-health.jsone oglobals.cssnão rastreado da raiz continuam fora deste escopo.
Se o gate final do hardening não estiver verde, a execução deste plano não começa. Não se adapta SEO ao código intermediário.
Princípios e limites
Sempre
- Uma URL canônica por intenção; páginas existentes são enriquecidas em vez de duplicadas.
- Conteúdo factual, legível no HTML e apoiado por fonte verificável.
- Base em Garuva e atendimento no Norte de Santa Catarina/remoto somente no alcance já declarado pelo site.
Personé a entidade prestadora e autora;WebSiteé o site;ProfilePageexiste na rota de currículo; cada serviço temService; rotas não-home têmBreadcrumbListquando a trilha existe na interface.- Metadata API e convenções de imagem do Next.js 16; sem pacote novo.
- CTAs usam os componentes/classes atuais. A separação é semântica e de destino, não um novo layout.
- Privacidade descreve exatamente o comportamento do consentimento entregue pelo hardening.
Nunca
- Página-clone de Garuva, Joinville, Curitiba ou outra cidade.
llms.txt,FAQPage,keywordsem metadata,ProfessionalService, ouLocalBusinesssem negócio/local comprovado.- Coordenada, endereço postal, preço, cliente, review, volume, ranking, resultado comercial ou métrica de performance não comprovados.
- Afirmação de que framework, schema ou formatação garante ranking/citação.
- Mudança de paleta, tipografia, grid, hero, efeitos preservados, arquitetura de informação ou biblioteca visual.
- Dependência, commit, branch ou ação em Search Console/Bing/Cloudflare nesta iniciativa de documentação.
Arquitetura de conteúdo
lib/site-content.ts continua sendo a fonte das páginas de serviço e case. Não será criada uma CMS ou segunda camada de dados. A extensão mínima é:
export const intentCtas = {
hiring: {
label: "Avaliar perfil para contratação",
href: "/curriculo",
},
consulting: {
label: "Solicitar consultoria técnica",
href: "/#contact",
},
} as const;
export type CtaIntent = keyof typeof intentCtas;
export interface EvidenceSource {
id: string;
label: string;
url: string;
}
export interface SourcedStatement {
text: string;
sourceIds: string[];
}
export interface CaseStudyDetail {
answer: SourcedStatement;
challenge: SourcedStatement;
implementation: SourcedStatement[];
boundaries: SourcedStatement[];
sources: EvidenceSource[];
}
export interface ServicePageContent {
slug: string;
navLabel: string;
eyebrow: string;
seoTitle: string;
metaDescription: string;
headline: string;
answer: string;
intro: string;
audience: string[];
outcomes: string[];
process: string[];
stack: string[];
ctaIntent: "consulting";
ctaLabel: string;
ctaHref: string;
relatedCaseIds: string[];
faq?: { question: string; answer: string }[];
}
export interface CaseStudyContent {
id: string;
title: string;
subtitle: string;
summary: string;
impact: string;
stack: string[];
demoUrl?: string | null;
githubUrl?: string | null;
detail?: CaseStudyDetail;
}
detail é opcional porque somente três cases têm evidência suficiente nesta rodada. O conjunto deve ser exatamente as-servicos, nutriscan e twins-lab, sem depender da ordem. Afirmações técnicas/factuais em answer, challenge, implementation e limites comparativos exigem pelo menos um sourceId externo. O limite puramente editorial de AS Serviços mantém sourceIds: []: não será criada URL fictícia ou circular para uma decisão deste design. Qualquer ID presente deve resolver para uma fonte única dentro do mesmo case, e toda EvidenceSource.url deve ser um permalink GitHub /blob/<SHA de 40 hex>/.... A página exibe as fontes ao final do conteúdo aprofundado.
A relação existente ServicePageContent.relatedCaseIds permanece como única fonte de relacionamento. A função nova:
export function getRelatedServices(caseId: string): ServicePageContent[] {
return servicePages.filter(({ relatedCaseIds }) =>
relatedCaseIds.includes(caseId),
);
}
permite links recíprocos sem manter duas listas divergentes.
CTAs
Os seis serviços mantêm ctaIntent: "consulting" e levam a /#contact, com rótulo específico de conversa técnica/projeto. As páginas de case mostram dois caminhos usando o sistema visual existente:
- “Avaliar perfil para contratação” →
/curriculo(hiring); - “Solicitar consultoria técnica” →
/#contact(consulting).
O currículo mantém o caminho de contratação e oferece um link secundário para /servicos a quem procura consultoria. Não há formulário, modal ou estado de URL novo.
Cases escolhidos e fonte de cada campo
1. AS Serviços (as-servicos)
Foi escolhido por ter demo pública, repositório público atual, README técnico, manifesto e implementação legível da cena.
| Campo novo | Texto factual autorizado | Fontes |
|---|---|---|
detail.answer |
“Site institucional em Next.js 16 que representa quatro frentes de engenharia com uma cena Three.js gerada em código: uma casa wireframe e uma placa-mãe ligadas ao progresso da rolagem.” | README.md, package.json, lib/three/engine.ts |
detail.challenge |
“Representar engenharia física e software na mesma narrativa visual sem depender de um modelo 3D pronto.” | README.md, lib/three/engine.ts |
detail.implementation[0] |
“O motor monta casa, instalação elétrica e placa-mãe com geometrias e linhas do Three.js.” | lib/three/engine.ts |
detail.implementation[1] |
“O canvas converte a rolagem em progresso de 0 a 1 e o entrega ao motor da cena.” | components/scene/scene-canvas.tsx |
detail.implementation[2] |
“A qualidade pode cair para static, low, medium ou high conforme WebGL, reduced motion, economia de dados, conexão e capacidade do dispositivo.” |
lib/three/engine.ts |
detail.boundaries[0] |
“O case demonstra implementação e decisões técnicas; não atribui geração de leads, ranking ou ganho de performance.” | Limite puramente editorial deste design; sourceIds: [] |
Fontes imutáveis de referência:
https://github.com/evandrodevbr/as-servicos/blob/abeb9946a704139336942bfd41ad163ccfe1e685/README.mdhttps://github.com/evandrodevbr/as-servicos/blob/abeb9946a704139336942bfd41ad163ccfe1e685/package.jsonhttps://github.com/evandrodevbr/as-servicos/blob/abeb9946a704139336942bfd41ad163ccfe1e685/lib/three/engine.tshttps://github.com/evandrodevbr/as-servicos/blob/abeb9946a704139336942bfd41ad163ccfe1e685/components/scene/scene-canvas.tsx
2. NutriScan (nutriscan)
Foi escolhido porque o código público confirma fluxos concretos de busca, validação e fallback, embora a documentação e o manifesto discordem sobre versão e persistência. O texto novo usa apenas o cruzamento verificável.
| Campo novo | Texto factual autorizado | Fontes |
|---|---|---|
detail.answer |
“Aplicação web para consultar produtos alimentícios por nome ou código de barras, combinando cache JSON com a API Open Food Facts.” | app/api/search/route.ts, app/api/products/[barcode]/route.ts, lib/openFoodFactsApi.ts |
detail.challenge |
“Reduzir a dependência da API externa e manter um caminho explícito para buscas e consulta por código.” | app/api/search/route.ts, app/api/products/[barcode]/route.ts |
detail.implementation[0] |
“A busca consulta o cache primeiro, permite modo somente-cache e recorre ao Open Food Facts quando faltam resultados.” | app/api/search/route.ts |
detail.implementation[1] |
“A consulta por código remove caracteres não numéricos, aceita de 8 a 13 dígitos, consulta cache e usa a API externa como fallback.” | app/api/products/[barcode]/route.ts |
detail.implementation[2] |
“O wrapper cancela requisições após oito segundos e diferencia busca por nome de busca por código.” | lib/openFoodFactsApi.ts |
detail.boundaries[0] |
“A página não afirma PWA, MongoDB, histórico de usuários, disponibilidade, volume de produtos ou resultado de saúde, porque as fontes atuais não sustentam esse conjunto de forma consistente.” | package.json, prisma/schema.prisma, README e código comparados |
Fontes imutáveis de referência:
https://github.com/evandrodevbr/nutriscan/blob/ef0e6d4eca1f8588bb6981c1cfa58e4b7db1302b/app/api/search/route.tshttps://github.com/evandrodevbr/nutriscan/blob/ef0e6d4eca1f8588bb6981c1cfa58e4b7db1302b/app/api/products/%5Bbarcode%5D/route.tshttps://github.com/evandrodevbr/nutriscan/blob/ef0e6d4eca1f8588bb6981c1cfa58e4b7db1302b/lib/openFoodFactsApi.tshttps://github.com/evandrodevbr/nutriscan/blob/ef0e6d4eca1f8588bb6981c1cfa58e4b7db1302b/package.jsonhttps://github.com/evandrodevbr/nutriscan/blob/ef0e6d4eca1f8588bb6981c1cfa58e4b7db1302b/prisma/schema.prismahttps://github.com/evandrodevbr/nutriscan/blob/ef0e6d4eca1f8588bb6981c1cfa58e4b7db1302b/README.md
3. Twins Lab (twins-lab)
Foi escolhido porque o repositório contém um simulador, persistência, autenticação e uma rota de streaming observáveis. As métricas promocionais e recursos marcados como futuros no README são excluídos.
| Campo novo | Texto factual autorizado | Fontes |
|---|---|---|
detail.answer |
“Protótipo de gêmeo digital industrial com autenticação, simulador de reator, persistência MongoDB e streaming de eventos do servidor.” | package.json, app/api/reactor/stream/route.ts, simulators/reactor/reactor-simulator.ts |
detail.challenge |
“Expor estados simulados do reator a uma interface autenticada e manter histórico/status do simulador.” | app/api/reactor/stream/route.ts, simulators/reactor/reactor-simulator.ts |
detail.implementation[0] |
“A rota exige sessão do NextAuth antes de abrir o stream.” | app/api/reactor/stream/route.ts |
detail.implementation[1] |
“A resposta usa text/event-stream, envia estados/dados/erros em intervalos de dois segundos e limita a conexão a dez minutos.” |
app/api/reactor/stream/route.ts |
detail.implementation[2] |
“O simulador salva dados e estado no MongoDB e notifica clientes quando execução ou cenário mudam.” | simulators/reactor/reactor-simulator.ts |
detail.boundaries[0] |
“O case não usa as alegações de economia, ROI, precisão, manutenção preditiva futura, equipamento real, WebSocket, OpenRouter ou atualização sub-segundo.” | README comparado ao código público |
Fontes imutáveis de referência:
https://github.com/evandrodevbr/twins-lab/blob/f83f99a7417f16ece0cd7fe4832ba122e7152d0c/package.jsonhttps://github.com/evandrodevbr/twins-lab/blob/f83f99a7417f16ece0cd7fe4832ba122e7152d0c/app/api/reactor/stream/route.tshttps://github.com/evandrodevbr/twins-lab/blob/f83f99a7417f16ece0cd7fe4832ba122e7152d0c/simulators/reactor/reactor-simulator.tshttps://github.com/evandrodevbr/twins-lab/blob/f83f99a7417f16ece0cd7fe4832ba122e7152d0c/README.md
Resposta factual cedo
A primeira descrição abaixo do H1 deve responder o que é oferecido ou demonstrado sem slogan genérico:
- Serviços usam o novo
answerantes das listas de público/processo. - Os três cases aprofundados usam
detail.answer.textno hero; os demais mantêm osummaryatual, após remoção de afirmações não comprovadas. - Hubs explicam em uma frase o que o usuário encontra e para qual próximo passo cada cartão aponta.
- Currículo começa com profissão, base e modalidades já declaradas; não promete disponibilidade, prazo de resposta ou presença física nova.
Texto regional comum autorizado: “Base em Garuva, atendimento a projetos no Norte de Santa Catarina e atuação remota.” Ele substitui enumerações extensas de cidades onde a página não demonstra presença local.
Modelo de entidades e dados estruturados
IDs canônicos, exportados por lib/seo.ts:
export const SEO_IDS = {
website: `${siteUrl}/#website`,
person: `${siteUrl}/#person`,
profilePage: `${siteUrl}/curriculo#profile-page`,
} as const;
Grafo raiz
Somente:
{
"@type": "WebSite",
"@id": "https://evandro.dev.br/#website",
"url": "https://evandro.dev.br",
"name": "Evandro.dev.br",
"inLanguage": "pt-BR",
"publisher": { "@id": "https://evandro.dev.br/#person" }
}
{
"@type": "Person",
"@id": "https://evandro.dev.br/#person",
"name": "Evandro Fonseca Junior",
"url": "https://evandro.dev.br",
"image": "https://evandro.dev.br/edev.jpg",
"homeLocation": { "@type": "Place", "name": "Garuva, Santa Catarina, Brasil" },
"sameAs": ["GitHub público", "LinkedIn público"]
}
Não há endereço postal, coordenada, preço, raio, catálogo de ofertas ou Instagram divergente sem validação.
Currículo
ProfilePage aparece somente em /curriculo, referencia SEO_IDS.person, define isPartOf para SEO_IDS.website e não inclui dateModified até existir uma data editorial persistida. A pessoa pode ser referenciada por @id; não é duplicada com propriedades divergentes.
Serviço
Cada /servicos/[slug] emite:
Servicecom@id: ${pageUrl}#service,url,name,description,provider: { "@id": SEO_IDS.person };areaServedlimitado a Garuva e Norte de Santa Catarina, sem coordenada/raio/endereço;BreadcrumbListcom@id: ${pageUrl}#breadcrumbe posições contíguas 1–3.
Hubs, cases e privacidade
Hubs preservam CollectionPage/ItemList quando os itens visíveis coincidem com a lista. Cases removem Article incompleto; usam BreadcrumbList, pois autoria/datas/imagem de artigo não estão comprovadas como publicação editorial. Currículo, hubs, cases, serviços e privacidade têm breadcrumbs visíveis/estruturados coerentes.
Frescor
app/sitemap.tsnão incluilastModifiedenquanto não houver data editorial estável por URL.changeFrequencyeprioritytambém são removidos: não há fonte operacional que os mantenha e mecanismos os tratam apenas como dicas./curriculoremovenew Date().toISOString().- Nenhuma data muda por build ou request.
Critério determinístico: duas chamadas consecutivas de sitemap() em instantes diferentes retornam estruturas profundamente iguais.
Metadata e Open Graph por rota
Toda rota indexável tem title, description e canonical próprios. Nenhuma metadata contém keywords. Title e description refletem a intenção da rota e não enumeram cidades.
Open Graph usa ImageResponse e a convenção de arquivo do Next.js, com 1200×630, image/png, alt específico e template visual compartilhado em lib/og-card.tsx. O template reutiliza preto, papel e verde ácido e apenas tipografia/texto; não introduz nova direção visual nem asset falso.
Arquivos por segmento:
app/opengraph-image.tsx— marca/home;app/servicos/opengraph-image.tsx— hub de serviços;app/servicos/[slug]/opengraph-image.tsx— serviço selecionado pelos params;app/cases/opengraph-image.tsx— hub de cases;app/cases/[slug]/opengraph-image.tsx— case selecionado pelos params;app/curriculo/opengraph-image.tsx— perfil profissional;app/privacidade/opengraph-image.tsx— privacidade e consentimento.
Metadata dinâmica usa o mesmo conteúdo de site-content.ts que a página e a imagem; slug inválido retorna resposta 404 da imagem, sem imagem genérica enganosa. Twitter herda o mesmo card grande.
Links recíprocos
- Cada cartão de case relacionado dentro de um serviço recebe link interno “Ler case: {título}” antes dos links externos de demo/código.
- Cada case lista os serviços encontrados por
getRelatedServices(caseId)com anchors descritivos. - O hub de cases mantém “Ler case”. O hub de serviços mantém “Abrir página”, sem link direto externo.
- Demo/GitHub continuam externos, com
rel="noreferrer"ounoopener noreferrer. - Estado de demo continua obedecendo
PortfolioProjectView; SEO não reintroduz filtragem ou health fetch.
Privacidade e consentimento
Criar /privacidade com metadata/canonical/OG próprios e conteúdo factual:
- responsável e contato: Evandro Fonseca Junior, e-mail já publicado;
- contato do formulário: os dados digitados são transformados em mensagem e abrem o WhatsApp; o site não possui endpoint próprio de armazenamento desse formulário;
- analytics: antes de
granted, nenhuma tag Google é carregada; a escolha fica emlocalStoragesobevandro.analytics-consent.v1; publicidade permanece negada; concessão pode criar cookies_ga*; revogação desativa novas coletas e expira cookies acessíveis conforme o hardening; - links externos: GitHub, LinkedIn, Instagram, demos e WhatsApp seguem políticas próprias;
- alteração de preferência: usar o controle “Preferências de privacidade” entregue pelo hardening;
- direitos/contato: solicitações são encaminhadas ao e-mail publicado;
- data de vigência fixa: 2026-09-04.
A página não declara certificação jurídica, retenção que não foi configurada, compartilhamento que não foi verificado ou conformidade automática. O diálogo de consentimento e o Footer passam a ter link crawlable para /privacidade, usando estilos atuais.
Documento operacional externo
A implementação cria docs/seo-geo-operations.md como runbook declarativo. Cada ação começa desmarcada e inclui evidência esperada, sem texto que sugira execução:
- Google Search Console: verificar propriedade, submeter sitemap, inspecionar as 17 URLs finais (as 16 atuais + privacidade), registrar canônica/cobertura e baseline de 90 dias, abrir relatórios de IA quando disponíveis na conta.
- Bing Webmaster Tools: verificar/importar propriedade, submeter sitemap, inspecionar URLs e registrar AI Performance; IndexNow fica fora até haver atualização frequente.
- Cloudflare: comparar
robots.tscom resposta pública, Managed Robots, AI Crawl Control e WAF; registrar política separada de busca/citação e treino; conferir200/403/429em logs. - Medição: p75 de LCP/INP/CLS por template em CrUX/RUM, consultas/landing/conversão, caminhos case→serviço→contato e citações reportadas pelas plataformas.
- Ações que exigem conta, publicação ou painel externo continuam humanas e consequenciais; o plano apenas documenta.
Matriz de conflitos
| Área | Hardening/SEO envolvidos | Conflito | Regra |
|---|---|---|---|
app/layout.tsx |
Hardening Task 4; SEO entidades | Hardening achata providers sem tocar JSON-LD | SEO relê o arquivo final e altera apenas metadata/JSON-LD após Task 12. |
app/components/GoogleAnalytics.tsx |
Hardening Task 11; SEO privacidade | Consentimento ainda não existe no baseline atual | SEO consome a chave/estados finais e adiciona somente link/cópia coerente. |
app/components/Footer.tsx |
Hardening Task 9 ajusta testes; SEO adiciona privacidade | Teste e links podem mudar | Hardening primeiro; SEO preserva o contrato acessível final. |
lib/portfolio-data.ts/JSON |
Hardening Tasks 2–3; SEO cases | Tipo de projeto/health muda | SEO não altera o loader nem PortfolioProjectView; modifica apenas fatos dos três registros JSON. |
app/cases/[slug]/page.tsx |
SEO conteúdo/schema/metadata | Mesma rota em múltiplas preocupações | Uma única slice de case possui toda a rota; OG fica em arquivo irmão. |
app/servicos/[slug]/page.tsx |
SEO resposta/schema/links/CTA/metadata | Mesmo arquivo | Uma única slice de serviço possui toda a rota; OG fica em arquivo irmão. |
lib/site-content.ts |
Conteúdo factual, serviços e cases | Fonte compartilhada | Contrato e valores fecham na primeira tarefa; slices posteriores são somente consumidoras. |
lib/og-card.tsx |
Todas as imagens OG | Template compartilhado | Criar uma vez; arquivos de segmento só fornecem texto. |
app/sitemap.ts |
Frescor e nova rota privacidade | Task de entidades remove datas; privacidade adiciona URL | A task de privacidade adiciona a URL ao sitemap já sem datas; reler antes de editar. |
Critérios observáveis de aceite
- O gate completo do hardening está verde antes do primeiro arquivo de produção SEO ser alterado.
- Duas execuções de
sitemap()produzem a mesma saída e incluem 17 URLs canônicas semlastModifiedartificial. - Nenhum HTML contém
ProfessionalService,LocalBusiness,FAQPage, metakeywords, coordenada, preço ou endereço postal não comprovado. - O grafo raiz tem um
WebSitee umaPerson;/curriculotem umProfilePageque referencia a mesma pessoa; serviços têmService; breadcrumbs têm posições contíguas e URLs canônicas. - Todas as rotas indexáveis têm title, description, canonical e OG coerentes; cada endpoint de imagem responde
200 image/pngem 1200×630 e alt específico. - Serviço → case e case → serviço são links internos reais com nome descritivo.
- AS Serviços, NutriScan e Twins Lab exibem resposta, desafio, implementação, limites e fontes; nenhuma página atribui resultado comercial.
- Demais cases não recebem profundidade genérica nem campos vazios.
- A primeira descrição de cada serviço/case responde factualmente ao propósito da URL.
- Texto regional usa base em Garuva, Norte de Santa Catarina e atuação remota, sem alegar escritórios ou presença por cidade.
- CTAs de contratação levam a
/curriculo; CTAs de consultoria levam a/#contact; ambos mantêm o sistema visual atual. /privacidadedescreve o consentimento final, está linkada pelo diálogo e Footer e não afirma ação/garantia jurídica inexistente.- O runbook externo registra ações e evidências esperadas sem marcar nenhuma como feita.
- Desktop, mobile e reduced motion preservam direção visual, conteúdo, foco e fluxo de consentimento do hardening.
- Jest focado, Biome, TypeScript, build e smoke em navegador encerram verdes.
Riscos e mitigação
| Risco | Impacto | Mitigação |
|---|---|---|
| Executar sobre hardening incompleto | Alto | Gate explícito e releitura dos arquivos finais compartilhados. |
Duplicar ou divergir fatos entre JSON e site-content.ts |
Alto | Atualizar somente os três cases na mesma tarefa e testar frases proibidas/links de fonte. |
| Fonte pública mudar | Médio | URLs com SHA fixo; tratar o case como retrato técnico daquela revisão. |
| Converter README promocional em fato | Alto | Usar somente código/manifests cruzados; registrar exclusões por case. |
| Schema válido sintaticamente, mas semanticamente incorreto | Alto | Grafo mínimo, propriedades visíveis e testes de IDs/referências/breadcrumbs. |
| OG aumentar duplicação | Médio | Um componente visual puro e arquivos de segmento mínimos. |
| Link de privacidade contradizer consentimento | Alto | Consumir literalmente chave/estados/comportamento final do hardening e testar juntos. |
| Texto regional virar doorway | Alto | Nenhuma nova rota de cidade; uma frase factual compartilhada. |
| CTA separar só a aparência | Médio | Destinos observáveis distintos: contratação /curriculo, consultoria /#contact. |
| Testes fixarem classes/copy incidental | Médio | Assertar rotas, links, schema, fontes e comportamentos; não classes ou wrappers. |
Auto-revisão contra as 57 fontes
| Grupo do relatório | Quantidade | Como o design incorporou | Conflito evitado |
|---|---|---|---|
| Google [G1–G13] | 13 | Conteúdo útil/original, canônicas, schema visível, sem frescor falso e medição em ferramentas próprias | Sem city-clone, escala artificial, schema especial de IA ou promessa de ranking. |
| Bing + Web Vitals [B1–B3, W1] | 4 | Resposta cedo, páginas focadas, evidência, runbook de AI Performance e p75 de campo | Sem IndexNow prematuro ou score de laboratório alegado como resultado. |
| Schema.org [S1–S6] | 6 | Person, Service, ProfilePage, BreadcrumbList mínimos e conectados |
ProfessionalService, LocalBusiness e FAQPage excluídos. |
| Next.js [N1–N7] | 7 | Metadata por rota, generateMetadata, imagens por segmento e build estático |
Sem nonce, pacote experimental ou alteração de CSP/analytics do hardening. |
| GEO/crawlers [A1–A2, C1–C4, L1] | 7 | Fontes visíveis e medição tratadas como experimento; política de bots só documentada | Sem llms.txt, allowlist executada ou causalidade de citação. |
| Mercado observado | 20 | Clareza de intenção, links, projetos e prova de primeira mão | Sem stuffing, endereço, testemunho, métrica ou autoridade inferida de concorrente. |
| Total | 57 | Todos os grupos possuem decisão correspondente. | Nenhuma recomendação proibida foi reintroduzida. |
A revisão também confirmou: oito slices bastam; não há dependência nova; os três cases têm fonte por campo técnico/factual, com exceção explícita apenas para o limite editorial de AS; ações externas não são executadas; e a direção visual permanece invariável.