Pular para o conteúdo principal
Engenharia de IA

node_modules como Inteligência: a Virada Silenciosa para Frameworks AI-Native

O Next.js 16 entrega sua própria documentação dentro do pacote, expõe um endpoint MCP embutido e escreve AGENTS.md por padrão. Um teardown do que a Vercel está realmente construindo, e por que frameworks agora precisam ser machine-readable.

13 de maio de 2026
15 min read
Também disponível em

Boa parte da conversa sobre IA em 2026 ainda gira em torno dos modelos. Qual é mais inteligente. Qual escreve React mais limpo. Qual benchmark acabou de subir dois pontos.

Essa conversa é cada vez mais a errada.

O trabalho interessante deste ano acontece uma camada abaixo do modelo: no formato dos codebases que o modelo lê. Enquanto todo mundo assiste Anthropic, OpenAI e Google entregarem janelas de contexto maiores, autores de frameworks vêm redesenhando seus pacotes silenciosamente para que essas janelas tenham algo útil para ler.

O Next.js 16 é o exemplo mais claro que vi até agora. Depois de passar uma noite dissecando node_modules/next neste repositório, o quadro é difícil de ignorar: a Vercel não está mais otimizando o Next.js só para humanos. Está otimizando o Next.js para ser inferido por agentes.

Este artigo é um teardown do que eles realmente entregaram, o que isso implica para o design de frameworks, e por que acho que node_modules/ está prestes a virar uma camada de inteligência por si só.

Tese central

O desenvolvimento assistido por IA moderno está migrando do conhecimento estático de framework pré-treinado para inteligência de repositório em runtime. O framework que você tem instalado localmente está se tornando mais autoritativo do que qualquer coisa cozida no modelo.

O problema do conhecimento pré-treinado de framework

Todo assistente de código em produção hoje carrega um corte de conhecimento. Mesmo com retrieval augmentation, os priors que um modelo traz para uma tarefa são formados muito antes do projeto existir.

Para a maioria dos domínios isso tudo bem. Para frameworks como o Next.js é um problema estrutural.

Três coisas dão errado ao mesmo tempo:

  1. APIs depreciam mais rápido que os ciclos de retraining. Uma nova convenção do App Router pode aterrissar em uma única minor version, e ciclos de pré-treino não são eventos semanais.
  2. Modelos alucinam APIs plausíveis-mas-erradas. Quem já viu um LLM confiantemente fazer import { getServerSideProps } from "next/app" em um projeto App Router conhece o modo de falha.
  3. Ruído de migração vira ruído de treino. Anos de blog posts, respostas no Stack Overflow e tutoriais no YouTube descrevendo versões mais antigas do Next.js ficam no corpus de treino como texto indiferenciado. O modelo não tem como ponderar 13.4 contra 16.2 de forma confiável.

A resposta tradicional foi "retrieval por cima do site público de docs". Ajuda, mas tem seus próprios modos de falha: as docs que o agente encontra online podem não bater com a versão que ele está editando, a busca custa latência e tokens, e a resolução entre o framework rodando e o snapshot indexado vai derivando ao longo do tempo.

A resposta da Vercel no Next.js 16 é mais agressiva. Eles moveram a fonte de verdade.

O Next.js entrega documentação atrelada à versão dentro do pacote next, permitindo que agentes de código de IA referenciem APIs e padrões precisos e atualizados. Um arquivo AGENTS.md na raiz do seu projeto direciona os agentes para essas docs empacotadas em vez de seus dados de treino.

Docs do Next.jsnode_modules/next/dist/docs/01-app/02-guides/ai-agents.md

O que o Next.js 16 realmente entrega

Eu fui ver. Eis o que está sentado no disco neste repositório exato após pnpm install next@16.2.4.

node_modules/next/dist/docs/
  • node_modules/next/dist/docs
    • index.md
    • 01-app
      • 01-getting-started
      • 02-guides
      • 03-api-reference
    • 02-pages
    • 03-architecture

Um find nessa subárvore retorna 421 arquivos. Cada guia e página de referência de API da documentação pública é espelhada em disco, com versão presa ao pacote instalado. O layout do diretório espelha deliberadamente o nextjs.org/docs, então um agente que já tenha crawleado o site público não precisa aprender um novo modelo mental.

O enquadramento no arquivo de índice deixa a intenção explícita. Este é literalmente o primeiro parágrafo de node_modules/next/dist/docs/index.md depois do frontmatter:

node_modules/next/dist/docs/index.md
1---
2title: Next.js Docs
3description: Welcome to the Next.js Documentation.
4---
5
6{/_ AI agent hint: If fixing slow client-side navigations, Suspense alone is not enough.
7You must also export `unstable_instant` from the route.
8Read docs/01-app/02-guides/instant-navigation.mdx before making changes. _/}

Esse comentário MDX não é para humanos. Humanos não veem; renderizadores MDX o removem. Ele existe para enviesar um agente que lê o arquivo antes de tocar na camada de roteamento. A Vercel está escrevendo dicas inline destinadas a leitores LLM, embutidas na documentação que vai dentro do pacote.

Essa é a parte que eu fico revisitando. Não é um efeito colateral de uma ferramenta interna. É uma escolha de design.

AGENTS.md: uma convenção que carrega peso

create-next-app@canary agora escreve dois arquivos em todo projeto novo por padrão: AGENTS.md e CLAUDE.md. O conteúdo default do AGENTS.md é propositalmente pequeno.

AGENTS.md
1<!-- BEGIN:nextjs-agent-rules -->
2
3# Next.js: ALWAYS read docs before coding
4
5Before any Next.js work, find and read the relevant doc in
6`node_modules/next/dist/docs/`. Your training data is outdated.
7The docs are the source of truth.
8
9<!-- END:nextjs-agent-rules -->

CLAUDE.md é um one-liner que re-importa o mesmo conteúdo usando a sintaxe @ do Claude Code:

CLAUDE.md
1@AGENTS.md

Três detalhes pequenos merecem atenção porque revelam mais do que o snippet sugere:

  • Os marcadores de comentário BEGIN/END são um protocolo de versionamento. Eles avisam aos futuros codemods quais linhas eles possuem. A Vercel consegue entregar um novo bloco de AGENTS.md sem sobrescrever suas instruções específicas de projeto, porque só substituem o que está entre os marcadores. É o mesmo padrão que o Husky e o git-attributes adotaram: um contrato silencioso, aditivo.
  • A instrução em si é anti-confiança. Ela não diz "use padrões do Next.js 16". Diz: seus dados de treino estão desatualizados, vá ler o disco. O framework está pedindo ao modelo que desconfie de seus próprios priors.
  • O opt-out default é --no-agents-md. A direção on-by-default importa. Convenção vence configuração; a convenção agora é agent-aware.

Para projetos que antecedem o Next.js 16.2, existe um codemod (npx @next/codemod@latest agents-md) que materializa as docs em .next-docs/ em vez de node_modules/, e aponta o AGENTS.md gerado para essa localização. O caminho exato é negociável. O princípio de que as docs vão junto com o código não é.

O que isto é, estruturalmente

AGENTS.md é um arquivo de manifesto para um consumidor separado do seu repositório. Está para agentes de IA como package.json está para gerenciadores de pacote, ou como robots.txt está para crawlers. O framework reconhece que agora existem múltiplas populações de leitores, e entrega configuração apontada para uma não humana.

O endpoint MCP: estado vivo, não só docs estáticas

Docs estáticas atreladas à versão são metade do que a Vercel entregou. A outra metade vive atrás do dev server.

O Next.js 16 expõe um endpoint MCP embutido em /_next/mcp. Combine com o pacote npm next-devtools-mcp, jogue um .mcp.json na raiz do repo, e qualquer agente MCP-aware (Claude Code, Cursor, Copilot) ganha uma superfície de tools para a aplicação rodando.

.mcp.json
1{
2 "mcpServers": {
3 "next-devtools": {
4 "command": "npx",
5 "args": ["-y", "next-devtools-mcp@latest"]
6 }
7 }
8}

As tools que o agente recebe não são acesso shell genérico; são introspecção específica de domínio do runtime do Next.js:

ToolO que o agente pode perguntar
get_errorsErros de build ao vivo, erros em runtime e erros de tipo vindos do dev server.
get_logsCaminho do arquivo de log do dev, incluindo saída do console do navegador e logs de servidor.
get_routesLista de rotas derivada do filesystem, agrupada por appRouter / pagesRouter, com padrões de segmento dinâmico.
get_page_metadataMetadados por rota: quais componentes renderizam, quais configs de segmento se aplicam.
get_project_metadataEstrutura do projeto, configuração e URL do dev server.
get_server_action_by_idLookup reverso: converte um ID de Server Action de volta para arquivo fonte e função.

Essa é a segunda metade da virada. Docs estáticas respondem "qual é a API atual?". O endpoint MCP responde "como a aplicação rodando parece neste momento?".

Juntos substituem os dois modos de falha que descrevi antes: priors desatualizados são substituídos por docs com versão presa, e estrutura inferida da aplicação é substituída por introspecção. Rotas alucinadas se tornam impossíveis, porque o agente consegue listar as reais.

Por que isso importa para o custo de tokens

Sem um endpoint MCP de introspecção, o agente precisa caminhar seu filesystem, parsear sua árvore de rotas e re-derivar metadados a cada sessão, pagando isso em tokens de entrada. Com get_routes e companhia, a mesma informação chega como resposta estruturada, geralmente algumas centenas de tokens no máximo. Eficiência de tokens está começando a ser uma preocupação de framework.

node_modules como camada de inteligência

Se você dá zoom out, node_modules/next no 16.2 não é só uma dependência em runtime. É um canal de distribuição de contexto machine-readable, do qual os bundles JavaScript são apenas um payload.

Olhe o que agora está embutido dentro de um único pacote instalado:

Dentro de node_modules/next@16.2.4

421
Arquivos de documentação entregues em disco
60+
Subpath entrypoints declarados em `files[]`
1:1
Arquivos .d.ts para esses entrypoints
/_next/mcp
Endpoint MCP embutido em dev
sim
Dicas inline para agentes nas docs
AGENTS.md
Manifesto default de agente em novos projetos

Cada um desses itens, isoladamente, é trivial. Juntos descrevem um pacote cuja superfície de área é intencionalmente legível para um leitor não humano.

Alguns padrões que valem nomear:

  • Declarações de tipo 1 para 1. Todo subpath público em package.json#files entrega seu próprio .d.ts. Um agente não precisa adivinhar a forma de next/cache, next/headers, next/og, next/navigation, next/form, next/script, next/dynamic, next/image, next/server, next/jest, next/web-vitals. Cada entrypoint anuncia um contrato tipado antes de qualquer documentação ser consultada.
  • Enumeração explícita de subpaths. O array files[] no next/package.json lista cada entrypoint suportado pelo nome. Esse array em si é uma superfície de descoberta, então um agente que quer saber o que next exporta consegue lê-lo diretamente sem imports especulativos.
  • Estrutura codificada por convenção. Os prefixos numéricos de pasta (01-app, 02-guides, 03-api-reference) dão aos agentes um caminho de traversal ordenado, semanticamente sortable, que bate com a hierarquia de informação do site público.
  • Codemods como artefatos de primeira classe. @next/codemod é publicado como pacote separado. Migrações não são blog posts; são transformações executáveis que o agente pode sugerir e rodar. Agentes raciocinando sobre upgrades têm algo concreto para chamar.
O pacote está virando o manual.

Isso é uma mudança arquitetural real em como um framework é entregue, e tem implicações bem além do Next.js.

Memória pré-treinada vs. inferência em runtime

O velho contrato entre LLMs e frameworks parecia mais ou menos assim:

Como agentes raciocinam sobre um framework

FeaturePropriedadeModelo de memória pré-treinada
Fonte de verdade para formas de APISnapshot do corpus de treino`.d.ts` e docs de `node_modules` locais
Fonte de verdade para layout do projetoInferido de padrões de nome de arquivoMCP `get_routes` / `get_project_metadata`
Reação a uma nova minor versionAlucina ou recusaRelê as docs empacotadas
Reação a uma API depreciadaSugere mesmo assim, frequentemente com confiançaMostra a depreciação pela assinatura tipada ou pela doc
Modelo de custoBarato se acertar, caro se errar (retrabalho)Algumas centenas de tokens extras para carregar contexto
Direção de confiançaConfia no modelo, verifica o códigoConfia no disco, usa o modelo para raciocinar
Modo de falha primárioAlucinações confiantesContexto local desatualizado ou ausente

O modelo de inferência em runtime não é melhor em toda dimensão. Custa mais tokens por sessão, depende de o agente realmente ler os arquivos que lhe disseram para ler, e empurra a correção para a disposição do framework de manter artefatos machine-readable.

Mas compõe muito melhor com a forma como os times de fato trabalham.

Um modelo que raciocina sobre o repositório local consegue:

  • Bater com a versão que sua aplicação está rodando, não a versão em que foi treinado.
  • Ver sua configuração customizada, incluindo partes que nunca iriam para as docs públicas.
  • Inspecionar o estado de erro ao vivo e raciocinar a partir de evidência observada, não suposições.
  • Errar e se autocorrigir, porque a próxima resposta é informada por uma releitura dos mesmos arquivos.

Esse é o padrão que se vê emergindo em todo loop de agente bem desenhado em 2026: o modelo é o motor de raciocínio, o repositório é a base de conhecimento, e o framework decide o quão legível essa base de conhecimento é.

O que isso significa para autores de framework

Se você constrói um framework, uma biblioteca, ou até um SDK interno não trivial, o release do Next.js 16 se lê como uma prévia das table stakes que vêm por aí.

Entregue docs dentro do pacote

Empacote uma árvore de docs atrelada à versão em disco. Espelhe a estrutura do seu site público para que agentes que já o crawlearam continuem orientados.

Tipifique todo subpath público

Um agente nunca deveria precisar adivinhar. Um `.d.ts` por entrypoint exportado, declarado em `package.json#files` e `exports`.

Adote AGENTS.md como manifesto

Use marcadores `BEGIN`/`END` para que codemods possam atualizar seu bloco sem atropelar instruções do usuário. Trate como configuração, não conteúdo.

Exponha uma superfície de introspecção em runtime

Construa um endpoint MCP ou equivalente. Torne rotas, erros e configuração consultáveis. Pare de forçar agentes a re-derivar estrutura.

Publique codemods, não guias de migração

Transformações executáveis são agent-friendly; prosa longa de migração não é. Faça `npx <sua-cli> codemod` virar uma API de primeira classe.

Escreva dicas inline para leitores não humanos

Comentários MDX, tags JSDoc e avisos de depreciação estruturados agora fazem parte da superfície de DX, não só das docs.

Princípio unificador: pare de assumir que o único consumidor do seu repositório é um humano lendo no GitHub.

Para onde isso está indo

Algumas coisas seguem de onde estamos agora.

node_modules/ vira um corpus de contexto. Assim que um framework grande entrega docs no pacote, o caminho passa a carregar peso. Outras bibliotecas vão seguir com node_modules/<nome>/dist/docs/, e o tooling, incluindo harnesses de agentes, vai começar a tratar isso como uma localização padrão de lookup. A convenção AGENTS.md só funciona quando vira convenção.

Definições de tipo se tornam mais importantes que docs. Um .d.ts é um contrato estruturado, machine-readable, atrelado à versão. Quando agentes precisarem escolher entre scrapear prosa e ler uma declaração tipada, vão ler a declaração. Frameworks que subinvestirem em seus tipos públicos vão ver sua DX assistida por IA ficar para trás.

Dicas para o compilador viram superfície de documentação. Comentários MDX inline, anotações JSX {/* AI agent hint */} e JSDoc estruturado são todos sinais direcionados a leitores não humanos. Espere plugins de IDE, linters e codemods começarem a emiti-los e validá-los.

MCP vira o protocolo de introspecção de framework. Já está acontecendo com next-devtools-mcp. Outros frameworks têm um template óbvio para seguir: entregue um endpoint, entregue um pacote npm fino que faz a ponte com o editor do usuário, documente as tools, evolua a superfície. Os provedores de modelo não precisam padronizar isso; os autores de framework precisam.

Benchmarks migram de código genérico para tarefas de framework. A Vercel publica nextjs.org/evals especificamente para medir o quão bem agentes lidam com trabalho real de Next.js. Conforme mais frameworks investirem em superfícies legíveis para agente, espere benchmarks específicos de framework se multiplicarem, e espere que adoção de framework seja em parte impulsionada por eles.

A armadilha a evitar

Nada disso significa despejar tudo em AGENTS.md. Manifestos de agente longos e prescritivos são ruído; são cacheados, relidos, retokenizados a cada turno. O default do Next.js é uma única instrução precisamente porque tem que ser: redirecione o agente para uma fonte mais rica, não tente ser a fonte.

Pensamento final

Dois anos atrás discutíamos se LLMs poderiam escrever código frontend de produção. A discussão se resolveu sozinha, silenciosamente: podem, quando o framework deixa.

O que o Next.js 16 está fazendo (empacotar docs dentro do pacote, defaultar AGENTS.md em todo projeto novo, expor um endpoint MCP embutido, embutir dicas inline em comentários MDX) não é uma feature de IA. É uma mudança de arquitetura de framework, feita porque a população de desenvolvedores lendo o framework agora inclui agentes, e agentes leem diferente de humanos.

Os frameworks que vão vencer a próxima década não serão os com os truques de runtime mais inteligentes. Serão os mais legíveis para qualquer combinação de humano e máquina que estiver raciocinando sobre o codebase em qualquer momento.

node_modules/ nunca foi só dependências. Daqui pra frente, é também contexto.

Leia o disco. Confie no disco. Entregue um disco que vale ser lido.