{"id":1140,"date":"2026-08-27T04:01:48","date_gmt":"2026-08-27T07:01:48","guid":{"rendered":"https:\/\/adrianosantostreina.com.br\/blog\/verificacao-documentacao-automatica-ia\/"},"modified":"2026-08-27T04:01:55","modified_gmt":"2026-08-27T07:01:55","slug":"verificacao-documentacao-automatica-ia","status":"publish","type":"post","link":"https:\/\/adrianosantostreina.com.br\/blog\/verificacao-documentacao-automatica-ia\/","title":{"rendered":"Docs Geradas por M\u00e1quina, Confi\u00e1veis por Contrato: Um Modelo de Verifica\u00e7\u00e3o para Documenta\u00e7\u00e3o Autom\u00e1tica com IA"},"content":{"rendered":"<p>Voc\u00ea j\u00e1 publicou uma documenta\u00e7\u00e3o gerada por IA que descrevia um comportamento que o c\u00f3digo nunca teve. N\u00e3o \u00e9 hip\u00f3tese \u2014 \u00e9 quase certeza estat\u00edstica para quem usa gera\u00e7\u00e3o autom\u00e1tica de docs h\u00e1 mais de alguns meses. O modelo l\u00ea a assinatura de uma fun\u00e7\u00e3o, infere a inten\u00e7\u00e3o a partir do nome dos par\u00e2metros, e escreve um par\u00e1grafo fluente, gramaticalmente perfeito, sobre um comportamento que existiu numa vers\u00e3o anterior, foi alterado num refactor silencioso, e nunca foi revisado por ningu\u00e9m porque &#8220;a IA j\u00e1 documentou&#8221;.<\/p>\n<p>O problema n\u00e3o \u00e9 a gera\u00e7\u00e3o. \u00c9 a aus\u00eancia de um contrato de verifica\u00e7\u00e3o entre o c\u00f3digo-fonte e o texto gerado. Enquanto a comunidade debate qual ferramenta escreve a prosa mais elegante, o risco real est\u00e1 em produ\u00e7\u00e3o: documenta\u00e7\u00e3o que parece autoritativa e est\u00e1 errada \u00e9 pior do que nenhuma documenta\u00e7\u00e3o, porque ela substitui a leitura do c\u00f3digo pela confian\u00e7a na prosa.<\/p>\n<h2>O ponto cego que a maioria dos pipelines de documenta\u00e7\u00e3o ignora<\/h2>\n<p>J\u00e1 existe um artigo aqui no blog tratando de &#8220;documenta\u00e7\u00e3o como efeito colateral&#8221; e de como transformar gera\u00e7\u00e3o de docs em parte do pipeline. Este texto assume que voc\u00ea j\u00e1 passou dessa fase \u2014 j\u00e1 tem um pipeline, j\u00e1 gera docstrings, README&#8217;s ou p\u00e1ginas de refer\u00eancia automaticamente. A pergunta que resta, e que raramente \u00e9 respondida na pr\u00e1tica, \u00e9: <strong>como voc\u00ea sabe que a documenta\u00e7\u00e3o gerada ainda \u00e9 verdadeira?<\/strong><\/p>\n<p>Voc\u00ea vai encontrar aqui um modelo de verifica\u00e7\u00e3o de tr\u00eas camadas \u2014 sint\u00e1tica, sem\u00e2ntica e comportamental \u2014 para tratar documenta\u00e7\u00e3o gerada por IA como um artefato que precisa de teste, assim como c\u00f3digo precisa de teste. Sem esse modelo, voc\u00ea n\u00e3o tem &#8220;documenta\u00e7\u00e3o autom\u00e1tica&#8221;, tem &#8220;prosa autom\u00e1tica com apar\u00eancia de documenta\u00e7\u00e3o&#8221;.<\/p>\n<blockquote><p><strong>\ud83d\udca1 Dica do Mestre:<\/strong> a distin\u00e7\u00e3o entre &#8220;documenta\u00e7\u00e3o descritiva&#8221; e &#8220;documenta\u00e7\u00e3o prescritiva&#8221; \u00e9 central aqui. Descritiva relata o que o c\u00f3digo faz agora; prescritiva define o que o c\u00f3digo deve fazer. IA generativa \u00e9 excelente na primeira e perigosa na segunda, porque tende a &#8220;corrigir&#8221; silenciosamente comportamentos que interpreta como bugs, documentando a inten\u00e7\u00e3o idealizada em vez do comportamento real. Veja a compara\u00e7\u00e3o de ferramentas de gera\u00e7\u00e3o de c\u00f3digo com foco em seguran\u00e7a em <a href=\"https:\/\/xygeni.io\/pt\/blog\/top-ai-coding-tools-for-secure-code\/\" target=\"_blank\" rel=\"noopener\">Melhores ferramentas de IA para programa\u00e7\u00e3o segura em 2026<\/a>, que trata exatamente desse tipo de desvio entre inten\u00e7\u00e3o documentada e comportamento real.<\/p><\/blockquote>\n<h2>Por que docstrings geradas por LLM degradam com o tempo (e por que isso \u00e9 diferente de c\u00f3digo legado)<\/h2>\n<p>C\u00f3digo legado degrada porque acumula complexidade acidental. Documenta\u00e7\u00e3o gerada por IA degrada por um motivo estrutural diferente: ela \u00e9 uma <em>fotografia de contexto<\/em>, tirada no momento da gera\u00e7\u00e3o, sem v\u00ednculo sem\u00e2ntico persistente com o c\u00f3digo que descreve. Um coment\u00e1rio escrito por um humano carrega inten\u00e7\u00e3o e mem\u00f3ria institucional \u2014 mesmo desatualizado, ele reflete uma decis\u00e3o consciente. Uma docstring gerada por IA reflete apenas o que o modelo inferiu a partir do texto vis\u00edvel naquele instante.<\/p>\n<p>Isso cria tr\u00eas modos de falha espec\u00edficos:<\/p>\n<ul>\n<li><strong>Drift silencioso:<\/strong> o c\u00f3digo muda, a doc n\u00e3o \u00e9 regenerada, e ningu\u00e9m percebe porque a doc continua &#8220;fazendo sentido&#8221; \u2014 apenas descreve a vers\u00e3o anterior.<\/li>\n<li><strong>Alucina\u00e7\u00e3o de contrato:<\/strong> o modelo descreve exce\u00e7\u00f5es, retornos ou efeitos colaterais que nunca existiram, porque s\u00e3o padr\u00f5es comuns em c\u00f3digo semelhante visto no treinamento.<\/li>\n<li><strong>Falso consenso de revis\u00e3o:<\/strong> o time aprova o PR porque &#8220;a doc est\u00e1 l\u00e1 e parece boa&#8221;, sem checar se ela reflete o diff.<\/li>\n<\/ul>\n<p>O ant\u00eddoto n\u00e3o \u00e9 gerar melhor. \u00c9 verificar de forma automatizada, assim como voc\u00ea n\u00e3o confia em c\u00f3digo sem su\u00edte de testes \u2014 mesmo que ele &#8220;pare\u00e7a&#8221; correto.<\/p>\n<h3>Camada 1 \u2014 Verifica\u00e7\u00e3o sint\u00e1tica: a documenta\u00e7\u00e3o aponta para o que existe?<\/h3>\n<p>\u00c9 a camada mais simples e, ainda assim, a mais negligenciada. Trata-se de garantir que toda refer\u00eancia na documenta\u00e7\u00e3o \u2014 nomes de fun\u00e7\u00f5es, par\u00e2metros, tipos, exce\u00e7\u00f5es citadas \u2014 exista de fato no c\u00f3digo-fonte atual. Ferramentas de linting de documenta\u00e7\u00e3o fazem isso de forma est\u00e1tica.<\/p>\n<p>Em Python, um exemplo com <code>pydocstyle<\/code> combinado a uma checagem de assinatura via AST:<\/p>\n<pre><code class=\"language-python\">import ast\nimport inspect\n\ndef verify_docstring_params(func):\n    \"\"\"Verifica se todos os par\u00e2metros citados na docstring existem na assinatura real.\"\"\"\n    sig = inspect.signature(func)\n    real_params = set(sig.parameters.keys())\n\n    doc = inspect.getdoc(func) or \"\"\n    documented_params = set()\n    for line in doc.splitlines():\n        line = line.strip()\n        if line.startswith(\":param\"):\n            # formato reStructuredText: :param nome: descri\u00e7\u00e3o\n            name = line.split(\":\")[1].replace(\"param\", \"\").strip()\n            documented_params.add(name)\n\n    missing_in_doc = real_params - documented_params - {\"self\", \"cls\"}\n    stale_in_doc = documented_params - real_params\n\n    if missing_in_doc:\n        raise ValueError(f\"Par\u00e2metros sem documenta\u00e7\u00e3o: {missing_in_doc}\")\n    if stale_in_doc:\n        raise ValueError(f\"Documenta\u00e7\u00e3o cita par\u00e2metros inexistentes: {stale_in_doc}\")\n\n    return True\n<\/code><\/pre>\n<p>Esse tipo de checagem, rodado em CI a cada PR, elimina a classe mais barata e mais comum de erro: doc que fala de um par\u00e2metro removido tr\u00eas refactors atr\u00e1s. N\u00e3o resolve alucina\u00e7\u00e3o sem\u00e2ntica, mas \u00e9 o piso m\u00ednimo \u2014 se a doc gerada n\u00e3o passa nem por essa checagem sint\u00e1tica, ela n\u00e3o deveria nem chegar a revis\u00e3o humana.<\/p>\n<h3>Camada 2 \u2014 Verifica\u00e7\u00e3o sem\u00e2ntica: a documenta\u00e7\u00e3o descreve o comportamento certo?<\/h3>\n<p>Aqui a coisa fica interessante e \u00e9 onde a maioria dos times para. Verifica\u00e7\u00e3o sem\u00e2ntica significa usar um segundo agente de IA \u2014 idealmente um modelo diferente do que gerou a documenta\u00e7\u00e3o \u2014 para <em>auditar<\/em> a doc contra o c\u00f3digo-fonte, n\u00e3o para regener\u00e1-la.<\/p>\n<p>A t\u00e9cnica \u00e9 conhecida como &#8220;critic model&#8221; ou &#8220;verificador adversarial&#8221;: voc\u00ea n\u00e3o pede para o modelo escrever, pede para ele apontar diverg\u00eancias.<\/p>\n<pre><code class=\"language-python\">import anthropic\n\nclient = anthropic.Anthropic()\n\ndef audit_documentation(source_code: str, generated_doc: str) -&gt; str:\n    prompt = f\"\"\"Voc\u00ea \u00e9 um auditor t\u00e9cnico rigoroso. Sua tarefa \u00e9 APENAS\napontar diverg\u00eancias factuais entre o c\u00f3digo-fonte abaixo e a documenta\u00e7\u00e3o\ngerada. N\u00e3o sugira melhorias de estilo. N\u00e3o reescreva a documenta\u00e7\u00e3o.\nListe cada diverg\u00eancia com: linha do c\u00f3digo, trecho da doc, e por que\ndiverge. Se n\u00e3o houver diverg\u00eancias, responda apenas \"SEM DIVERG\u00caNCIAS\".\n\nC\u00d3DIGO-FONTE:\n{source_code}\n\nDOCUMENTA\u00c7\u00c3O GERADA:\n{generated_doc}\n\"\"\"\n    response = client.messages.create(\n        model=\"claude-opus-4-5-20251101\",\n        max_tokens=2048,\n        messages=[{\"role\": \"user\", \"content\": prompt}]\n    )\n    return response.content[0].text\n<\/code><\/pre>\n<p>O ponto-chave de arquitetura aqui \u00e9 a <strong>separa\u00e7\u00e3o de responsabilidades entre gerador e auditor<\/strong>. Se voc\u00ea usa o mesmo modelo, com o mesmo contexto, para gerar e depois &#8220;revisar&#8221; a pr\u00f3pria gera\u00e7\u00e3o, est\u00e1 pedindo para o vi\u00e9s de confirma\u00e7\u00e3o se auto-validar \u2014 o modelo tende a concordar consigo mesmo. Trocar de modelo (por exemplo, gerar com um modelo e auditar com outro, ou pelo menos resetar completamente o contexto) reduz esse vi\u00e9s, embora n\u00e3o elimine.<\/p>\n<p>Esse padr\u00e3o de &#8220;segundo agente c\u00e9tico&#8221; \u00e9 o mesmo discutido no artigo sobre code review automatizado deste blog \u2014 a l\u00f3gica de que um aprovador de IA pode estar te enganando se ele for complacente por design se aplica integralmente \u00e0 documenta\u00e7\u00e3o.<\/p>\n<h3>Camada 3 \u2014 Verifica\u00e7\u00e3o comportamental: a documenta\u00e7\u00e3o sobrevive \u00e0 execu\u00e7\u00e3o?<\/h3>\n<p>\u00c9 a camada mais cara de implementar e a que gera mais valor. Consiste em extrair exemplos de c\u00f3digo citados na pr\u00f3pria documenta\u00e7\u00e3o e execut\u00e1-los como testes reais, num pipeline de CI. Se a doc afirma que uma fun\u00e7\u00e3o &#8220;lan\u00e7a <code>ValueError<\/code> quando o input \u00e9 negativo&#8221;, esse comportamento vira um teste automatizado gerado a partir da pr\u00f3pria doc.<\/p>\n<p>Em Python, isso \u00e9 literalmente nativo via <code>doctest<\/code>:<\/p>\n<pre><code class=\"language-python\">def calcular_desconto(preco: float, percentual: float) -&gt; float:\n    \"\"\"Calcula o pre\u00e7o final aplicando um desconto percentual.\n\n    &gt;&gt;&gt; calcular_desconto(100.0, 10)\n    90.0\n    &gt;&gt;&gt; calcular_desconto(100.0, -5)\n    Traceback (most recent call last):\n        ...\n    ValueError: percentual n\u00e3o pode ser negativo\n    \"\"\"\n    if percentual &lt; 0:\n        raise ValueError(&quot;percentual n\u00e3o pode ser negativo&quot;)\n    return preco * (1 - percentual \/ 100)\n\nif __name__ == &quot;__main__&quot;:\n    import doctest\n    doctest.testmod(verbose=True)\n<\/code><\/pre>\n<p>Quando a IA gera a docstring, force-a a gerar exemplos no formato doctest (ou equivalente na sua linguagem \u2014 Rust tem isso nativo via <code>cargo test --doc<\/code>, Go tem <code>Example<\/code> functions test\u00e1veis). Isso transforma a documenta\u00e7\u00e3o em algo que <strong>quebra visivelmente no CI<\/strong> quando o comportamento muda, em vez de ficar mentindo silenciosamente em produ\u00e7\u00e3o.<\/p>\n<pre><code class=\"language-bash\">python -m doctest calcular_desconto.py -v\n<\/code><\/pre>\n<p>Em Go, o padr\u00e3o de &#8220;Example functions&#8221; cumpre exatamente esse papel \u2014 documenta\u00e7\u00e3o que \u00e9, ao mesmo tempo, teste execut\u00e1vel:<\/p>\n<pre><code class=\"language-go\">func ExampleCalcularDesconto() {\n    resultado := CalcularDesconto(100.0, 10)\n    fmt.Println(resultado)\n    \/\/ Output: 90\n}\n<\/code><\/pre>\n<p>Se voc\u00ea trabalha em uma linguagem sem esse suporte nativo (como Delphi\/Object Pascal, por exemplo), a alternativa \u00e9 construir um script de extra\u00e7\u00e3o que varre coment\u00e1rios XMLDoc em busca de blocos de exemplo e os compila isoladamente como parte da su\u00edte de testes \u2014 mais trabalho de infraestrutura, mas o princ\u00edpio \u00e9 o mesmo: nenhum exemplo documentado deve existir fora de um contexto execut\u00e1vel.<\/p>\n<h2>Arquitetura de pipeline: onde cada camada entra no fluxo<\/h2>\n<p>Um erro comum \u00e9 tentar rodar as tr\u00eas camadas em todo commit, o que \u00e9 caro e lento. A arquitetura que funciona na pr\u00e1tica distribui as camadas por gatilho:<\/p>\n<ul>\n<li><strong>Pre-commit \/ pre-push:<\/strong> apenas verifica\u00e7\u00e3o sint\u00e1tica (r\u00e1pida, sem chamadas de API, roda local).<\/li>\n<li><strong>Pull Request (CI):<\/strong> verifica\u00e7\u00e3o sint\u00e1tica + sem\u00e2ntica, rodando apenas nos arquivos alterados no diff \u2014 n\u00e3o no reposit\u00f3rio inteiro, por custo de tokens e tempo.<\/li>\n<li><strong>Pipeline noturno \/ release:<\/strong> verifica\u00e7\u00e3o comportamental completa, executando todos os exemplos documentados como testes, incluindo os que n\u00e3o mudaram, para pegar regress\u00f5es introduzidas por depend\u00eancias externas.<\/li>\n<\/ul>\n<p>Um exemplo de job de CI (GitHub Actions) que roda a camada sem\u00e2ntica apenas sobre arquivos modificados:<\/p>\n<pre><code class=\"language-yaml\">name: audit-docs\non:\n  pull_request:\n    paths:\n      - '**\/*.py'\n\njobs:\n  audit:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\/checkout@v4\n        with:\n          fetch-depth: 0\n      - name: Get changed files\n        id: changed\n        run: |\n          echo \"files=$(git diff --name-only origin\/main...HEAD | grep '\\.py$' | tr '\\n' ' ')\" &gt;&gt; $GITHUB_OUTPUT\n      - name: Run doc audit\n        run: python scripts\/audit_docs.py ${{ steps.changed.outputs.files }}\n<\/code><\/pre>\n<blockquote><p><strong>\ud83d\udca1 Dica do Mestre:<\/strong> resista \u00e0 tenta\u00e7\u00e3o de rodar o auditor sem\u00e2ntico contra a base de c\u00f3digo inteira a cada PR. O custo de tokens cresce linearmente com o tamanho do reposit\u00f3rio e a maior parte da an\u00e1lise \u00e9 redundante. Restrinja ao diff e trate a auditoria completa como uma tarefa de manuten\u00e7\u00e3o peri\u00f3dica, n\u00e3o de gate de merge. Para comparar o custo-benef\u00edcio de diferentes ferramentas de gera\u00e7\u00e3o e an\u00e1lise de c\u00f3digo com IA, vale conferir o panorama em <a href=\"https:\/\/www.g2.com\/pt\/categories\/ai-code-generation\" target=\"_blank\" rel=\"noopener\">Melhor Software de Gera\u00e7\u00e3o de C\u00f3digo por IA \u2014 G2<\/a>.<\/p><\/blockquote>\n<h2>O caso dif\u00edcil: documenta\u00e7\u00e3o de arquitetura e decis\u00f5es (ADRs) \u2014 onde a IA n\u00e3o deveria escrever sozinha<\/h2>\n<p>Tudo o que foi discutido at\u00e9 aqui se aplica bem a documenta\u00e7\u00e3o de n\u00edvel de fun\u00e7\u00e3o e m\u00f3dulo \u2014 descrever comportamento observ\u00e1vel \u00e9 uma tarefa trat\u00e1vel por verifica\u00e7\u00e3o automatizada porque existe um &#8220;gabarito&#8221; objetivo: o pr\u00f3prio c\u00f3digo em execu\u00e7\u00e3o. Documenta\u00e7\u00e3o de arquitetura (Architecture Decision Records, diagramas de contexto, racionais de design) \u00e9 categoricamente diferente: n\u00e3o existe execu\u00e7\u00e3o que valide se o racional documentado \u00e9 verdadeiro, porque o racional \u00e9 uma afirma\u00e7\u00e3o sobre <em>inten\u00e7\u00e3o<\/em>, n\u00e3o sobre <em>comportamento<\/em>.<\/p>\n<p>Aqui, o uso correto de IA n\u00e3o \u00e9 gerar o ADR, \u00e9 gerar o <strong>rascunho estrutural<\/strong> a partir de artefatos existentes \u2014 PRs, discuss\u00f5es de issue, commits \u2014 e for\u00e7ar um humano a preencher a se\u00e7\u00e3o &#8220;consequ\u00eancias&#8221; e &#8220;alternativas consideradas&#8221;, que s\u00e3o exatamente as partes que exigem julgamento e n\u00e3o podem ser inferidas de forma confi\u00e1vel a partir de c\u00f3digo.<\/p>\n<pre><code class=\"language-python\">def draft_adr_from_pr(pr_diff: str, pr_description: str) -&gt; str:\n    \"\"\"Gera apenas o esqueleto de um ADR \u2014 nunca as se\u00e7\u00f5es de julgamento.\"\"\"\n    prompt = f\"\"\"A partir do diff e da descri\u00e7\u00e3o de PR abaixo, gere um\nesqueleto de ADR (Architecture Decision Record) com as se\u00e7\u00f5es:\nContexto, Decis\u00e3o (resumida objetivamente, sem avalia\u00e7\u00e3o de m\u00e9rito).\nN\u00c3O preencha 'Consequ\u00eancias' nem 'Alternativas Consideradas' \u2014\ndeixe marcadas como [PENDENTE DE REVIS\u00c3O HUMANA].\n\nDIFF:\n{pr_diff}\n\nDESCRI\u00c7\u00c3O:\n{pr_description}\n\"\"\"\n    # chamada ao modelo omitida por brevidade\n    return prompt\n<\/code><\/pre>\n<p>Essa distin\u00e7\u00e3o \u2014 o que a IA pode verificar objetivamente versus o que exige julgamento humano \u2014 \u00e9 a linha divis\u00f3ria mais importante deste artigo. Times que ignoram essa fronteira acabam com ADRs &#8220;completos&#8221; que documentam decis\u00f5es que ningu\u00e9m de fato tomou conscientemente, apenas o modelo inferiu como plaus\u00edveis.<\/p>\n<h2>M\u00e9tricas de sa\u00fade da documenta\u00e7\u00e3o: o que medir de verdade<\/h2>\n<p>Se voc\u00ea vai investir em um pipeline de verifica\u00e7\u00e3o, me\u00e7a o que importa. Tr\u00eas m\u00e9tricas t\u00eam valor pr\u00e1tico maior do que &#8220;cobertura de documenta\u00e7\u00e3o&#8221; (percentual de fun\u00e7\u00f5es documentadas), que \u00e9 uma m\u00e9trica de vaidade \u2014 100% de cobertura com 40% de conte\u00fado desatualizado \u00e9 pior do que 60% de cobertura confi\u00e1vel.<\/p>\n<ul>\n<li><strong>Taxa de diverg\u00eancia sem\u00e2ntica por release:<\/strong> quantas diverg\u00eancias a camada 2 encontrou proporcionalmente ao volume de mudan\u00e7as \u2014 indica se o processo de atualiza\u00e7\u00e3o de docs est\u00e1 acompanhando o ritmo do c\u00f3digo.<\/li>\n<li><strong>Idade m\u00e9dia da \u00faltima verifica\u00e7\u00e3o comportamental:<\/strong> h\u00e1 quanto tempo cada exemplo documentado foi de fato executado com sucesso \u2014 n\u00e3o quando foi escrito, quando foi <em>validado pela \u00faltima vez<\/em>.<\/li>\n<li><strong>Taxa de rejei\u00e7\u00e3o do auditor:<\/strong> quantas docs geradas pelo primeiro agente s\u00e3o rejeitadas pelo segundo agente antes de chegar a revis\u00e3o humana \u2014 um n\u00famero crescente aqui \u00e9 sinal de que o prompt de gera\u00e7\u00e3o precisa de ajuste, n\u00e3o de que o auditor est\u00e1 &#8220;sendo chato&#8221;.<\/li>\n<\/ul>\n<blockquote><p><strong>\ud83d\udca1 Dica do Mestre:<\/strong> ferramentas de gera\u00e7\u00e3o de c\u00f3digo voltadas a produtividade tendem a enfatizar velocidade de gera\u00e7\u00e3o como m\u00e9trica de sucesso \u2014 o que \u00e9 um incentivo perigoso quando aplicado a documenta\u00e7\u00e3o. Vale ler com esp\u00edrito cr\u00edtico o levantamento em <a href=\"https:\/\/www.kimi.ai\/pt-br\/resources\/best-ai-for-coding\" target=\"_blank\" rel=\"noopener\">10 ferramentas de IA para programa\u00e7\u00e3o mais inteligente<\/a> e perguntar, para cada ferramenta citada, n\u00e3o &#8220;qu\u00e3o r\u00e1pido ela gera&#8221; mas &#8220;como ela permite verificar o que gerou&#8221;.<\/p><\/blockquote>\n<h2>Quando N\u00c3O vale a pena automatizar a verifica\u00e7\u00e3o<\/h2>\n<p>Honestidade t\u00e9cnica exige reconhecer o custo. Construir as tr\u00eas camadas de verifica\u00e7\u00e3o \u00e9 investimento de infraestrutura n\u00e3o trivial \u2014 scripts de auditoria, pipelines de CI dedicados, or\u00e7amento de tokens para o segundo agente. Para projetos pequenos, times de duas ou tr\u00eas pessoas, ou c\u00f3digo com ciclo de vida curto (prot\u00f3tipos, provas de conceito, c\u00f3digo descart\u00e1vel), esse investimento n\u00e3o se paga. Nesses contextos, a alternativa pragm\u00e1tica \u00e9 mais simples: gerar documenta\u00e7\u00e3o com IA, mas tratar toda ela como rascunho \u2014 nunca mergear sem revis\u00e3o humana linha a linha, o que efetivamente substitui a camada sem\u00e2ntica por um revisor humano mais lento, mas suficiente na escala do projeto.<\/p>\n<p>O ponto de inflex\u00e3o em que vale investir na arquitetura completa \u00e9 quando a base de c\u00f3digo atinge um tamanho em que revis\u00e3o humana linha a linha de toda documenta\u00e7\u00e3o deixa de ser vi\u00e1vel \u2014 tipicamente sistemas com m\u00faltiplos times contribuindo no mesmo reposit\u00f3rio, ou bibliotecas com API p\u00fablica consumida por terceiros que nunca ver\u00e3o o c\u00f3digo-fonte.<\/p>\n<h2>Participe da Comunidade Dev&#8217;s AI<\/h2>\n<p>Discuss\u00f5es como essa \u2014 sobre arquitetura de verifica\u00e7\u00e3o, n\u00e3o apenas sobre qual ferramenta gera texto mais bonito \u2014 s\u00e3o o tipo de conversa que acontece na <a href=\"https:\/\/adrianosantos.link\/ComunidadeDevAI\" target=\"_blank\" rel=\"noopener\">Comunidade Dev&#8217;s AI<\/a>. Se voc\u00ea j\u00e1 passou da fase de &#8220;gerar documenta\u00e7\u00e3o com IA&#8221; e est\u00e1 enfrentando o problema real de mant\u00ea-la confi\u00e1vel em produ\u00e7\u00e3o, entre para trocar pipelines, scripts de auditoria e casos reais de drift sem\u00e2ntico com outros desenvolvedores s\u00eaniores enfrentando o mesmo desafio.<\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>Documenta\u00e7\u00e3o gerada por IA sem verifica\u00e7\u00e3o n\u00e3o \u00e9 um atalho \u2014 \u00e9 uma d\u00edvida t\u00e9cnica disfar\u00e7ada de produtividade. O valor real da automa\u00e7\u00e3o n\u00e3o est\u00e1 na velocidade de gera\u00e7\u00e3o, que j\u00e1 \u00e9 resolvida por praticamente qualquer ferramenta do mercado, como mostram os panoramas em <a href=\"https:\/\/focalx.ai\/pt-pt\/inteligencia-artificial\/geracao-codigo-ia\/\" target=\"_blank\" rel=\"noopener\">Focalx<\/a> e nas compara\u00e7\u00f5es setoriais citadas ao longo deste artigo. O valor est\u00e1 em construir o contrato de verifica\u00e7\u00e3o que transforma prosa gerada em artefato confi\u00e1vel: sintaxe checada em pre-commit, sem\u00e2ntica auditada por um segundo agente em PR, e comportamento validado por execu\u00e7\u00e3o real em pipeline de release.<\/p>\n<p>Trate cada docstring, cada ADR, cada exemplo de c\u00f3digo na sua documenta\u00e7\u00e3o exatamente como trataria uma linha de produ\u00e7\u00e3o: sem teste, n\u00e3o existe garantia \u2014 s\u00f3 a apar\u00eancia confort\u00e1vel de que existe.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Voc\u00ea j\u00e1 publicou uma documenta\u00e7\u00e3o gerada por IA que descrevia um comportamento que o c\u00f3digo nunca teve. N\u00e3o \u00e9 hip\u00f3tese \u2014 \u00e9 quase certeza estat\u00edstica para quem usa gera\u00e7\u00e3o autom\u00e1tica de docs h\u00e1 mais de alguns meses. O modelo l\u00ea a assinatura de uma fun\u00e7\u00e3o, infere a inten\u00e7\u00e3o a partir do nome dos par\u00e2metros, e [&hellip;]<\/p>\n","protected":false},"author":127,"featured_media":1141,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1140","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/1140","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/users\/127"}],"replies":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/comments?post=1140"}],"version-history":[{"count":1,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/1140\/revisions"}],"predecessor-version":[{"id":1142,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/1140\/revisions\/1142"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/media\/1141"}],"wp:attachment":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/media?parent=1140"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/categories?post=1140"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/tags?post=1140"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}