<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Open-Source on Lucas Oliveira</title>
        <link>https://luks.dev.br/tags/open-source/</link>
        <description>Recent content in Open-Source on Lucas Oliveira</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>pt-BR</language>
        <copyright>Lucas Oliveira Dantas</copyright>
        <lastBuildDate>Wed, 28 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://luks.dev.br/tags/open-source/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>A Alibaba acaba de abrir o código-fonte de algo insano</title>
        <link>https://luks.dev.br/p/a-alibaba-acaba-de-abrir-codigo-fonte/</link>
        <pubDate>Wed, 28 Oct 2026 00:00:00 +0000</pubDate><guid>https://luks.dev.br/p/a-alibaba-acaba-de-abrir-codigo-fonte/</guid>
        <description>&lt;img src="https://i.imgur.com/S5s938Y.jpeg" alt="Featured image of post A Alibaba acaba de abrir o código-fonte de algo insano" /&gt;&lt;p&gt;O &lt;a class=&#34;link&#34; href=&#34;https://github.com/alibaba/open-code-review&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;OpenCodeReview&lt;/strong&gt;&lt;/a&gt; é um revisor de código com IA que encontra bugs, falhas de segurança e erros antes que eles cheguem à produção.&lt;/p&gt;
&lt;p&gt;E é &lt;strong&gt;gratuito e de código aberto&lt;/strong&gt; (licença Apache-2.0).&lt;/p&gt;
&lt;p&gt;Não tem licença por assento, não prende você a um fornecedor e não tem uma IA pulando discretamente metade dos arquivos do seu PR.&lt;/p&gt;
&lt;p&gt;Não é um projeto de fim de semana. Durante cerca de dois anos ele foi o assistente oficial de code review da Alibaba. Segundo o repositório, foi usado por dezenas de milhares de desenvolvedores e apontou milhões de defeitos antes de virar open-source.&lt;/p&gt;
&lt;h2 id=&#34;o-que-ele-faz&#34;&gt;O que ele faz&lt;/h2&gt;
&lt;p&gt;Na prática, é uma CLI (&lt;code&gt;ocr&lt;/code&gt;) que lê o diff do Git, manda os arquivos alterados para um LLM configurável por meio de um agente com ferramentas e devolve comentários presos à linha exata do problema.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Revisa o diff&lt;/strong&gt; do Git (staged, unstaged e untracked), de uma branch contra outra ou de um commit específico.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traz regras prontas&lt;/strong&gt; por linguagem: ponteiro nulo, thread-safety, XSS e SQL injection, entre outras. A cobertura varia de linguagem para linguagem, como mostro no teste mais abaixo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Busca contexto além do diff.&lt;/strong&gt; Ele lê o arquivo inteiro, pesquisa no codebase e olha os outros arquivos alterados no mesmo PR.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Escaneia código sem diff&lt;/strong&gt; com o &lt;code&gt;ocr scan&lt;/code&gt;, útil para auditar um módulo legado inteiro.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Funciona com qualquer endpoint compatível com OpenAI ou Anthropic.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pode ser usado de dentro do seu agente&lt;/strong&gt;: Claude Code, Codex, Cursor, Kimi Code, OpenCode e outros que aceitam skills.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Roda em CI/CD&lt;/strong&gt;: GitHub Actions, GitLab CI, GitFlic CI e Gerrit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inclui recursos de operação&lt;/strong&gt;: retomada de sessão, visualizador de sessões, suporte a MCP e telemetria via OpenTelemetry.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;por-que-um-agente-genérico-não-basta&#34;&gt;Por que um agente genérico não basta&lt;/h2&gt;
&lt;p&gt;Quem já pediu para um agente de propósito geral &amp;ldquo;revisar esse PR&amp;rdquo; conhece os problemas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Em PRs grandes, &lt;strong&gt;arquivos são pulados&lt;/strong&gt; sem nenhum aviso.&lt;/li&gt;
&lt;li&gt;Os comentários &lt;strong&gt;apontam para a linha errada&lt;/strong&gt;, porque o número da linha foi alucinado ou ficou desatualizado.&lt;/li&gt;
&lt;li&gt;A qualidade &lt;strong&gt;muda com pequenas alterações no prompt&lt;/strong&gt;, então a mesma revisão feita duas vezes dá dois resultados diferentes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A causa é a mesma nos três casos: deixar para o modelo decisões que não deveriam depender de julgamento. Escolher quais arquivos revisar ou em qual linha colocar um comentário são tarefas determinísticas e não têm por que passar pelo LLM.&lt;/p&gt;
&lt;h2 id=&#34;a-arquitetura-código-onde-tem-que-ser-código-ia-onde-tem-que-ser-ia&#34;&gt;A arquitetura: código onde tem que ser código, IA onde tem que ser IA&lt;/h2&gt;
&lt;p&gt;A ideia central do OpenCodeReview é dividir as responsabilidades.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parte determinística (código):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Seleção de arquivos.&lt;/strong&gt; O código decide o que entra na revisão. Nenhum arquivo é &amp;ldquo;esquecido&amp;rdquo; pelo modelo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agrupamento.&lt;/strong&gt; Arquivos relacionados, como os arquivos de localização de um mesmo recurso, viram uma única unidade para um sub-agente, com contexto isolado.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Match de regras.&lt;/strong&gt; As regras são aplicadas por arquivo a partir de templates, e não porque o modelo &amp;ldquo;lembrou&amp;rdquo; delas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Posicionamento e reflexão.&lt;/strong&gt; Módulos separados cuidam de ancorar o comentário na linha certa e de revisar o próprio resultado.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Parte do LLM (agente):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Decide o que for dinâmico: se aquilo é mesmo um problema, quão grave é e que contexto ainda falta.&lt;/li&gt;
&lt;li&gt;Busca esse contexto com um conjunto de ferramentas próprio e prompts ajustados para cada cenário.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;É a mesma lição que vale para qualquer sistema com agentes em produção: &lt;strong&gt;quanto menos o modelo tiver que decidir, mais previsível o sistema fica.&lt;/strong&gt; A IA entra onde agrega valor, que é no julgamento. O resto fica no código, que é auditável e repetível.&lt;/p&gt;
&lt;p&gt;Isso também explica a economia de tokens. O modelo não precisa ler o repositório inteiro para descobrir o que revisar, porque já recebe uma unidade de trabalho pronta e delimitada.&lt;/p&gt;
&lt;h2 id=&#34;o-benchmark&#34;&gt;O benchmark&lt;/h2&gt;
&lt;p&gt;Para comparar, a Alibaba montou o &lt;strong&gt;AACR-Bench&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://github.com/alibaba/open-code-review/raw/main/imgs/benchmark-en.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;benchmark&#34;
	
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;200 pull requests reais&lt;/li&gt;
&lt;li&gt;50 repositórios open-source&lt;/li&gt;
&lt;li&gt;10 linguagens&lt;/li&gt;
&lt;li&gt;1.505 problemas reais anotados e validados por mais de 80 engenheiros sênior&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;O resultado divulgado, comparando com o Claude Code &lt;strong&gt;usando o mesmo modelo por baixo&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Precisão e F1 maiores&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cerca de 1/9 dos tokens&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Revisões mais rápidas&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;O trade-off, que o próprio projeto assume: &lt;strong&gt;o recall é menor&lt;/strong&gt;. Ou seja, ele encontra menos problemas no total, e isso é proposital. A escolha é por menos ruído e menos falsos alarmes.&lt;/p&gt;
&lt;p&gt;Na minha opinião, essa é a decisão certa para um revisor que roda em todo PR. Um revisor que gera 30 comentários dos quais 25 são irrelevantes treina o time a ignorar todos eles. Um revisor que gera 5 comentários e acerta 4 vira alguém que o time ouve.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Um ponto de atenção: o benchmark foi feito pela própria Alibaba e os números detalhados estão em imagens no README. Vale olhar com calma e, de preferência, rodar no seu próprio código antes de tirar conclusões.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;como-começar&#34;&gt;Como começar&lt;/h2&gt;
&lt;p&gt;Pré-requisitos: &lt;strong&gt;Git 2.41+&lt;/strong&gt; e um endpoint de LLM (compatível com OpenAI ou Anthropic). Roda em Windows, macOS e Linux.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install -g @alibaba-group/open-code-review
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;O comando instalado é o &lt;code&gt;ocr&lt;/code&gt;. Configure o provedor e o modelo (o setup interativo pede a chave de API e testa a conexão):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ocr config provider
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ocr config model
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Selecione um provedor integrado ou adicione um personalizado:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://github.com/alibaba/open-code-review/raw/main/imgs/providers.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;aliba-code-review&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Escolha um modelo para o provedor ativo&lt;/p&gt;
&lt;p&gt;Também dá para instalar por script, pelo binário do GitHub Release ou compilando do código-fonte. Os detalhes estão na &lt;a class=&#34;link&#34; href=&#34;https://open-codereview.ai/docs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;documentação&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;comandos-base&#34;&gt;Comandos base&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Revisa as mudanças locais (staged, unstaged e untracked)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ocr review
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Revisa uma branch contra a base do merge&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ocr review --from main --to feature-branch
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Revisa um commit específico&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ocr review --commit abc123
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Escaneia um diretório inteiro, sem diff&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ocr scan --path internal/agent
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Saída em JSON para integrar com outras ferramentas&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ocr review --format json --output result.json
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Lista e retoma revisões interrompidas&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ocr session list
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ocr review --from main --to feature-branch --resume &amp;lt;id&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;modo-delegação-sem-chave-de-api-própria&#34;&gt;Modo delegação: sem chave de API própria&lt;/h3&gt;
&lt;p&gt;Se você já usa Claude Code, Codex ou Cursor, existe o &lt;strong&gt;modo delegação&lt;/strong&gt;. Nele o OCR continua fazendo a parte determinística (seleção de arquivos e regras), e o LLM do agente que você já usa faz a revisão. Não é preciso configurar uma chave de API separada para o OCR.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ocr delegate preview
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ocr delegate rule &amp;lt;arquivos&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;É um bom ponto de partida para testar a ferramenta sem mexer em credenciais nem em custo.&lt;/p&gt;
&lt;h2 id=&#34;testei-na-prática-sem-chave-de-api&#34;&gt;Testei na prática (sem chave de API)&lt;/h2&gt;
&lt;p&gt;Quis ver o que a ferramenta entrega de fato antes de recomendar. Instalei a versão &lt;strong&gt;1.13.3&lt;/strong&gt; no meu Windows 11 (Git 2.56, Node 24) e montei um repositório de teste: uma API Express de pedidos e clientes, com um PR (&lt;code&gt;feature/customer-portal&lt;/code&gt;) de 71 linhas.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As imagens desta seção mostram a saída real dos comandos que rodei, renderizada numa janela de terminal para facilitar a leitura. O texto não foi editado. O prompt da janela é apenas ilustrativo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://i.imgur.com/dDgkE9U.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Ambiente do teste: OpenCodeReview v1.13.3 instalado e o repositório ocr-demo com dois commits, a base da API e o PR feature/customer-portal com 71 linhas novas em 3 arquivos.&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Nesse PR eu &lt;strong&gt;plantei 8 problemas de propósito&lt;/strong&gt; e anotei o gabarito antes de rodar qualquer comando:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;#&lt;/th&gt;
          &lt;th&gt;Problema plantado&lt;/th&gt;
          &lt;th&gt;Onde&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;1&lt;/td&gt;
          &lt;td&gt;SQL injection (concatenação de &lt;code&gt;status&lt;/code&gt; na query)&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;orders.js&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2&lt;/td&gt;
          &lt;td&gt;Paginação errada (&lt;code&gt;offset = page * pageSize&lt;/code&gt; pula a primeira página)&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;orders.js&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;3&lt;/td&gt;
          &lt;td&gt;Chave de API de pagamento hardcoded&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;customers.js&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;4&lt;/td&gt;
          &lt;td&gt;XSS refletido (&lt;code&gt;name&lt;/code&gt; da query direto no HTML)&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;customers.js&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;5&lt;/td&gt;
          &lt;td&gt;Null dereference (&lt;code&gt;customer&lt;/code&gt; pode não existir)&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;customers.js&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;6&lt;/td&gt;
          &lt;td&gt;Path traversal + IDOR no download de faturas&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;customers.js&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;7&lt;/td&gt;
          &lt;td&gt;Race condition no saque (checa saldo, cobra e só depois debita)&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;customers.js&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;8&lt;/td&gt;
          &lt;td&gt;Handlers &lt;code&gt;async&lt;/code&gt; sem tratamento de erro, &lt;code&gt;fetch&lt;/code&gt; sem checar &lt;code&gt;response.ok&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;customers.js&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Fiz o teste &lt;strong&gt;sem nenhuma chave de API&lt;/strong&gt;, usando o modo delegação. Isso tem uma consequência importante: sem LLM, o OCR executa só a parte determinística, ou seja, decide &lt;strong&gt;o que&lt;/strong&gt; revisar e &lt;strong&gt;com quais regras&lt;/strong&gt;. O julgamento fica com o agente hospedeiro. Então este teste &lt;strong&gt;não mede&lt;/strong&gt; precisão, recall nem consumo de tokens do benchmark. Ele mostra a base sobre a qual o modelo trabalha.&lt;/p&gt;
&lt;h3 id=&#34;seleção-de-arquivos&#34;&gt;Seleção de arquivos&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://i.imgur.com/wrzVnWT.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;ocr delegate preview: o OCR calcula o merge-base entre main e a branch do PR e lista os 3 arquivos alterados, todos marcados para revisão (3 reviewable / 3 total).&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Aqui está a promessa de &amp;ldquo;não pular arquivo&amp;rdquo;: a lista é calculada pelo código a partir do merge-base, não pelo modelo. Os 3 arquivos do PR entraram.&lt;/p&gt;
&lt;h3 id=&#34;as-regras-que-ele-aplica&#34;&gt;As regras que ele aplica&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://i.imgur.com/Wk6Sw1x.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;ocr delegate rule: a saída completa das regras embutidas que o OCR entrega ao modelo para arquivos JS/TS. Tem seções de React, async e segurança de front-end (XSS, innerHTML, eval), mas nenhuma menção a SQL, caminhos de arquivo ou concorrência.&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Os três arquivos caíram no mesmo grupo de regras, o de JS/TS. Isso também é a parte determinística: a regra é escolhida pelo padrão do arquivo, não pela memória do modelo.&lt;/p&gt;
&lt;h3 id=&#34;o-que-o-teste-revelou-a-cobertura-depende-da-linguagem&#34;&gt;O que o teste revelou: a cobertura depende da linguagem&lt;/h3&gt;
&lt;p&gt;Cruzando o gabarito com as regras de JS:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;#&lt;/th&gt;
          &lt;th&gt;Problema&lt;/th&gt;
          &lt;th&gt;Regra explícita para JS?&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;3&lt;/td&gt;
          &lt;td&gt;Segredo hardcoded&lt;/td&gt;
          &lt;td&gt;✅ &lt;em&gt;Sensitive Information&lt;/em&gt; e &lt;em&gt;Hardcoding&lt;/em&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;4&lt;/td&gt;
          &lt;td&gt;XSS&lt;/td&gt;
          &lt;td&gt;✅ &lt;em&gt;XSS Protection&lt;/em&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;5&lt;/td&gt;
          &lt;td&gt;Null dereference&lt;/td&gt;
          &lt;td&gt;✅ &lt;em&gt;Null Checks&lt;/em&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;8&lt;/td&gt;
          &lt;td&gt;Erros async não tratados&lt;/td&gt;
          &lt;td&gt;✅ &lt;em&gt;Async Handling: Error Handling&lt;/em&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;1&lt;/td&gt;
          &lt;td&gt;SQL injection&lt;/td&gt;
          &lt;td&gt;❌ não mencionado&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2&lt;/td&gt;
          &lt;td&gt;Paginação errada&lt;/td&gt;
          &lt;td&gt;❌ (bug de lógica, nenhuma regra cobre)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;6&lt;/td&gt;
          &lt;td&gt;Path traversal / IDOR&lt;/td&gt;
          &lt;td&gt;❌ não mencionado&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;7&lt;/td&gt;
          &lt;td&gt;Race condition&lt;/td&gt;
          &lt;td&gt;❌ não mencionado&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;4 de 8&lt;/strong&gt; problemas têm uma regra explícita apontando para eles. O conjunto de JS é claramente voltado para front-end: tem seção inteira de React, &lt;code&gt;innerHTML&lt;/code&gt; e &lt;code&gt;document.write&lt;/code&gt;, mas nada sobre SQL, caminhos de arquivo ou concorrência no back-end.&lt;/p&gt;
&lt;p&gt;Para comparar, rodei &lt;code&gt;ocr rules check&lt;/code&gt; em arquivos de outras linguagens.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://i.imgur.com/PMoScF8.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Contagem de linhas das regras embutidas que citam “sql”, “traversal” ou “check-then-act”: 0 em JS, 5 em Go, 1 em Java e 3 em Python. Embaixo, as linhas das regras de Go. Nem toda menção é sobre injeção (sql.Rows, por exemplo, trata de fechar recursos), mas a regra de Go pede explicitamente validação de SQL, paths e URLs montados com entrada não confiável.&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;As regras de &lt;strong&gt;Go&lt;/strong&gt; pedem explicitamente para checar &amp;ldquo;SQL, shell commands, URLs, paths [&amp;hellip;] assembled from untrusted input&amp;rdquo; e &lt;em&gt;check-then-act&lt;/em&gt;. As de &lt;strong&gt;Java&lt;/strong&gt; e &lt;strong&gt;Python&lt;/strong&gt; têm seções de thread-safety com &lt;em&gt;check-then-act&lt;/em&gt;. Ou seja, a lista &amp;ldquo;ponteiro nulo, thread-safety, XSS e SQL injection&amp;rdquo; do README é verdadeira &lt;strong&gt;para o conjunto de linguagens&lt;/strong&gt;, mas não vale igualmente para cada uma.&lt;/p&gt;
&lt;p&gt;Isso não quer dizer que o modelo não vá encontrar a SQL injection num arquivo JS. Um LLM decente provavelmente encontra, por julgamento próprio. Mas nesse caso a detecção depende do modelo, não da regra, e é exatamente essa variação que a arquitetura do OCR tenta eliminar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Na prática:&lt;/strong&gt; se o seu back-end é Node, vale escrever regras próprias (o OCR aceita um arquivo de regras via &lt;code&gt;--rule&lt;/code&gt;) cobrindo injeção, path traversal, autorização e concorrência. Sem isso, você está contando com o modelo justamente nos pontos mais críticos de um back-end.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Para a revisão completa, com os comentários na linha e as métricas de tokens e tempo, é preciso configurar um provedor de LLM (&lt;code&gt;ocr config provider&lt;/code&gt;). Esse é o próximo teste que pretendo fazer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;onde-ele-se-encaixa-num-pipeline-devsecops&#34;&gt;Onde ele se encaixa num pipeline DevSecOps&lt;/h2&gt;
&lt;p&gt;Ele não substitui SAST, SCA, linters nem revisão humana. Ele se soma a eles:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Antes do commit, na máquina do dev&lt;/strong&gt;: &lt;code&gt;ocr review&lt;/code&gt; ou o modo delegação, dentro do agente que o time já usa.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No PR, via CI&lt;/strong&gt;: GitHub Actions, GitLab CI ou Gerrit comentando direto nas linhas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Na auditoria de legado&lt;/strong&gt;: &lt;code&gt;ocr scan&lt;/code&gt; em módulos que nunca passaram por revisão decente.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;O ganho real está no meio do caminho. Ferramentas de SAST são boas em padrões conhecidos, mas não entendem intenção. O revisor humano entende intenção, mas não tem tempo para ler cada linha de um PR de 40 arquivos. O OpenCodeReview ocupa esse espaço: tem regras explícitas como base, usa julgamento de LLM por cima e coloca o comentário na linha certa.&lt;/p&gt;
&lt;p&gt;E isso fica ainda mais relevante agora, com cada vez mais código gerado por IA entrando nos repositórios. Se a geração ficou barata, a revisão tem que ficar escalável. E escalável não quer dizer &amp;ldquo;mais um agente opinando&amp;rdquo;. Quer dizer um processo previsível, que não pula arquivo.&lt;/p&gt;
&lt;h2 id=&#34;pontos-de-atenção&#34;&gt;Pontos de atenção&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Recall menor.&lt;/strong&gt; Ele vai deixar passar coisas. Não trate o &amp;ldquo;nenhum comentário&amp;rdquo; como garantia.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Benchmark próprio.&lt;/strong&gt; Os números são da Alibaba, com um dataset da Alibaba. Valide no seu contexto.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custo e dados.&lt;/strong&gt; Fora do modo delegação, o código vai para o provedor de LLM que você configurar. Em ambientes regulados, avalie usar um endpoint interno ou self-hosted.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Regras desiguais entre linguagens.&lt;/strong&gt; No meu teste, as regras de JS não mencionam SQL injection, path traversal nem concorrência. Em back-end Node, complemente com regras próprias.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dependência de Git 2.41+.&lt;/strong&gt; Imagens antigas de runner de CI podem precisar de atualização.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;conclusão&#34;&gt;Conclusão&lt;/h2&gt;
&lt;p&gt;O mais interessante do OpenCodeReview não é &amp;ldquo;a IA da Alibaba ser melhor que o Claude Code&amp;rdquo;. É a abordagem: &lt;strong&gt;tirar do modelo tudo o que não exige julgamento&lt;/strong&gt;. É isso que faz ele ser mais barato, mais rápido e mais confiável que um agente genérico revisando código só com prompt.&lt;/p&gt;
&lt;p&gt;Vale testar. No mínimo, vale estudar a arquitetura.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Repositório:&lt;/strong&gt; &lt;a class=&#34;link&#34; href=&#34;https://github.com/alibaba/open-code-review&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/alibaba/open-code-review&lt;/a&gt;
&lt;strong&gt;Documentação:&lt;/strong&gt; &lt;a class=&#34;link&#34; href=&#34;https://open-codereview.ai/docs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://open-codereview.ai/docs&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
