<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>devfrs — Notas técnicas</title><description>O que eu aprendi construindo — medido, não achado.</description><link>https://devfrs.com/blog/</link><language>pt-br</language><atom:link href="https://devfrs.com/rss.xml" rel="self" type="application/rss+xml"/><item><title>O que eu construo, e por que escrevo sobre isso</title><link>https://devfrs.com/blog/o-que-eu-construo-e-por-que-escrevo/</link><guid isPermaLink="true">https://devfrs.com/blog/o-que-eu-construo-e-por-que-escrevo/</guid><description>Este blog existe porque eu esqueço o porquê das decisões — o código fica, a razão some. Um mapa do que faço no trabalho, do que construo fora dele e das escolhas de stack que eu defenderia numa revisão.</description><pubDate>Fri, 31 Jul 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Este blog existe por um motivo prático: eu esqueço.&lt;/p&gt;
&lt;p&gt;Não o que fiz — o &lt;strong&gt;porquê&lt;/strong&gt;. Seis meses depois de uma decisão de arquitetura o código continua lá, mas a razão evaporou. Sobram as consequências sem o argumento, e ninguém consegue revisar uma decisão que não sabe reconstruir. Escrever é a forma mais barata que encontrei de deixar o argumento junto com o resultado.&lt;/p&gt;
&lt;p&gt;O segundo motivo é menos nobre e igualmente verdadeiro: explicar por escrito revela na hora se eu entendi. Quase todo texto que comecei aqui mudou de conclusão no meio, porque a versão que estava na minha cabeça não sobreviveu a ser dita em voz alta.&lt;/p&gt;
&lt;h2 id=&quot;onde-eu-trabalho&quot;&gt;Onde eu trabalho&lt;/h2&gt;
&lt;p&gt;Sou desenvolvedor no Grupo Coagro desde julho de 2024. O trabalho lá é estender um ERP que continua sendo o ERP: mapear onde a regra dele termina e construir só a borda em que o negócio pede uma regra que ele não tem. CRM de campo, emissão de receita agronômica, acesso único. Escrevi sobre isso em &lt;a href=&quot;https://devfrs.com/blog/construindo-em-volta-do-winthor/&quot;&gt;Onde o ERP termina&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Fora do horário, pego projeto freelance de web e mobile. Não é vida dupla: é o mesmo problema em escalas diferentes — alguém precisa de software que funcione e de alguém que responda por ele.&lt;/p&gt;
&lt;h2 id=&quot;a-stack-e-por-que-é-essa&quot;&gt;A stack, e por que é essa&lt;/h2&gt;
&lt;p&gt;Lista de tecnologia não diz nada sobre ninguém. O que diz é o motivo de cada escolha.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Flutter&lt;/strong&gt; é onde passo a maior parte do tempo. A razão não é a linguagem: é que time pequeno não sustenta duas bases nativas, e a alternativa honesta ao multiplataforma quase sempre é &lt;em&gt;atender bem uma plataforma e mal a outra&lt;/em&gt;. Quando o app roda na mão de quem está em campo, com conexão ruim, o que importa é ele existir nos dois lugares e responder rápido.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;React&lt;/strong&gt; e &lt;strong&gt;Electron&lt;/strong&gt; para o que vive no navegador e no desktop. Electron tem má fama merecida por peso, e ainda assim continua sendo a resposta certa quando o requisito é acesso ao sistema de arquivos com a mesma interface do web.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Supabase&lt;/strong&gt; pela modelagem, não pelo atalho. O que ele resolve bem é entregar Postgres de verdade com RLS na frente — regra de acesso que mora no banco, não na aplicação. Regra de acesso em código de aplicação é regra que alguém esquece de aplicar em algum caminho.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker&lt;/strong&gt; e &lt;strong&gt;Kubernetes&lt;/strong&gt; para o que precisa subir igual em qualquer máquina. A parte que interessa não é o contêiner: é “funciona na minha máquina” deixar de ser uma frase possível.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CI/CD&lt;/strong&gt; com GitHub Actions — e o hábito que mais mudou meu dia: rodar o pipeline &lt;strong&gt;localmente, no terminal&lt;/strong&gt;, antes do push. Pipeline que só roda no servidor transforma cada erro de lint num ciclo de commit, push e espera. Rodando antes, o erro custa segundos e nunca vira ruído no histórico.&lt;/p&gt;
&lt;h2 id=&quot;o-que-eu-construo-fora-do-trabalho&quot;&gt;O que eu construo fora do trabalho&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;App de academia.&lt;/strong&gt; A parte visível é registro de treino; a parte difícil é a modelagem. Carga, série, repetição e progressão parecem quatro campos até você tentar responder “esta pessoa está evoluindo?” — aí viram histórico, comparação entre períodos e a diferença entre trocar de exercício e trocar de estímulo. É o tipo de problema em que errar o esquema cedo compra uma migração feia depois.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Integrações via API&lt;/strong&gt; com plataformas grandes, como Dropbox e Google Maps. Integração é sempre a mesma lição com roupa nova: o contrato é de outra pessoa, muda sem avisar, e falha de rede não é exceção — é estado normal que o código precisa saber tratar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SaaS e ferramentas com IA.&lt;/strong&gt; Ainda em exploração, e a pergunta que carrego é onde o modelo agrega de fato e onde ele só acrescenta uma fonte de erro plausível. Resposta plausível e errada é o defeito mais caro que existe, porque ninguém confere o que não pareceu estranho.&lt;/p&gt;
&lt;h2 id=&quot;o-que-vem-aqui&quot;&gt;O que vem aqui&lt;/h2&gt;
&lt;p&gt;Decisão de arquitetura com o argumento junto. Erro que me custou tempo, contado com o número que me fez perceber. Solução que procurei e não achei escrita em lugar nenhum.&lt;/p&gt;
&lt;p&gt;Não pretendo escrever tutorial de coisa que já tem documentação boa. Pretendo escrever o que eu teria gostado de encontrar às duas da manhã.&lt;/p&gt;</content:encoded><category>Carreira</category><category>Flutter</category><category>Supabase</category><category>DevOps</category><category>Arquitetura</category></item><item><title>Onde o ERP termina: estendendo o Winthor na Coagro</title><link>https://devfrs.com/blog/construindo-em-volta-do-winthor/</link><guid isPermaLink="true">https://devfrs.com/blog/construindo-em-volta-do-winthor/</guid><description>O Winthor é o ERP e vai continuar sendo. A pergunta que interessa não é trocar ou manter — é onde a regra dele termina e a do negócio continua. Três lacunas que viraram ferramenta: CRM de campo, receita agronômica e acesso único.</description><pubDate>Fri, 31 Jul 2026 11:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;/blog/coagro.png&quot; alt=&quot;Logo do Grupo Coagro sobre fundo preto com grade técnica&quot; /&gt;&lt;/p&gt;&lt;p&gt;O Winthor é o ERP do Grupo Coagro e vai continuar sendo. Estoque, faturamento, tabela de preço, cadastro, título a receber: está tudo lá, funciona, e ninguém no time quer mexer nisso.&lt;/p&gt;
&lt;p&gt;Por isso a pergunta que interessa nunca foi “trocar ou manter”. É outra, mais estreita e bem mais útil:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Onde a regra do ERP termina e a regra do negócio continua?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Um ERP de distribuição é projetado para o &lt;strong&gt;caso geral&lt;/strong&gt; — o que vale igualmente para quem vende parafuso, medicamento ou defensivo agrícola. É isso que o torna confiável ao longo de vinte anos, e é exatamente isso que deixa bordas: a parte do negócio que não é “distribuição genérica” não tem por que estar lá dentro.&lt;/p&gt;
&lt;p&gt;O trabalho mora nessas bordas. Não substituir o que o Winthor faz — &lt;strong&gt;acrescentar a regra que ele não teria motivo para ter.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;três-lugares-onde-a-borda-aparece&quot;&gt;Três lugares onde a borda aparece&lt;/h2&gt;
&lt;h3 id=&quot;o-pedido-existe-a-conversa-que-leva-até-ele-não&quot;&gt;O pedido existe. A conversa que leva até ele, não.&lt;/h3&gt;
&lt;p&gt;O ERP registra pedido. Mas pedido é o &lt;strong&gt;fim&lt;/strong&gt; de uma sequência: visita à propriedade, diagnóstico da lavoura, recomendação, proposta, negociação, retorno. Nada disso é venda ainda, e por isso nada disso cabia no lugar onde a venda mora.&lt;/p&gt;
&lt;p&gt;Sem lugar, essa sequência ficava na cabeça do vendedor e no caderno dele. Funciona — enquanto ele está lá. No dia em que ele sai de férias, a carteira sai junto.&lt;/p&gt;
&lt;p&gt;O CRM cobre esse trecho, e só ele. Lê do Winthor o que já é verdade (cliente, histórico de compra, limite de crédito, produto disponível) e guarda o que ainda não virou pedido. Quando vira, o pedido nasce no ERP, onde sempre nasceu.&lt;/p&gt;
&lt;p&gt;Feito em Flutter porque vendedor de insumo trabalha na fazenda, não na mesa. Um CRM que só abre no desktop vira preenchimento noturno, de memória — quando é preenchido.&lt;/p&gt;
&lt;h3 id=&quot;receita-agronômica-é-documento-legal-não-formulário&quot;&gt;Receita agronômica é documento legal, não formulário&lt;/h3&gt;
&lt;p&gt;Emitir receita agronômica é um ato com responsabilidade técnica: produto, cultura, alvo, dose, área, responsável e assinatura, dentro do que a legislação permite para aquela combinação. Não é um campo de texto — é uma regra que &lt;strong&gt;valida&lt;/strong&gt; antes de imprimir.&lt;/p&gt;
&lt;p&gt;Esse é o tipo de regra que um ERP de distribuição não tem por que carregar: ela não vale para quem vende parafuso. Vale para nós, e errar nela não é retrabalho, é risco regulatório.&lt;/p&gt;
&lt;p&gt;A ferramenta puxa do ERP o que já existe — produto, cliente, o que foi comprado — e aplica em cima a regra que o ERP não conhece. O agrônomo para de digitar o que o sistema já sabe e volta a decidir o que só ele pode decidir.&lt;/p&gt;
&lt;h3 id=&quot;lembrar-de-todos-os-sistemas-não-é-controle-de-acesso&quot;&gt;“Lembrar de todos os sistemas” não é controle de acesso&lt;/h3&gt;
&lt;p&gt;Cada ferramenta nova nasce com uma pergunta chata: quem entra? Resolvida ferramenta a ferramenta, a resposta vira um login por sistema — e desligar alguém passa a depender de &lt;strong&gt;lembrar&lt;/strong&gt; de todos eles.&lt;/p&gt;
&lt;p&gt;Lembrar não é um controle. É uma intenção.&lt;/p&gt;
&lt;p&gt;Centralizar o acesso não foi conforto de quem usa. É a diferença entre revogar um acesso e torcer para ter revogado — e, numa empresa que movimenta crédito e dado de cliente, essa diferença tem nome: auditoria.&lt;/p&gt;
&lt;h2 id=&quot;o-princípio-que-segurou-tudo&quot;&gt;O princípio que segurou tudo&lt;/h2&gt;
&lt;p&gt;Olhando os três casos lado a lado, o padrão é o mesmo:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;O dado é do ERP. A regra nova é nossa. E a regra nunca copia o dado.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Se a informação já tem dono no Winthor, ela é consultada, não replicada. Duplicar é mais rápido de escrever e mais barato de ler — e é exatamente por isso que é tentador. A conta chega depois, no dia em que as duas cópias divergem e ninguém sabe qual está certa. Ninguém quer descobrir isso pelo cliente.&lt;/p&gt;
&lt;p&gt;O que o Supabase guarda é só o que &lt;strong&gt;nasceu&lt;/strong&gt; com as ferramentas e não existe no ERP: sessão, permissão, rascunho de visita, a anotação que ainda não virou pedido.&lt;/p&gt;
&lt;h2 id=&quot;o-que-continua-difícil&quot;&gt;O que continua difícil&lt;/h2&gt;
&lt;p&gt;Ler de um banco que não é seu significa tratar o schema dele como uma API que você não controla — sem versionamento, sem changelog, sem deploy coordenado. Uma coluna que muda de significado não avisa; ela só passa a devolver outra coisa.&lt;/p&gt;
&lt;p&gt;A defesa é a de sempre, e não é sofisticada: &lt;strong&gt;falhar alto&lt;/strong&gt;. Integração que quebra em silêncio devolve um número plausível, e número plausível e errado é o defeito mais caro que existe — porque ninguém vai procurar o que não deu erro.&lt;/p&gt;
&lt;h2 id=&quot;o-que-eu-tiro-disso&quot;&gt;O que eu tiro disso&lt;/h2&gt;
&lt;p&gt;“Modernizar o ERP” quase nunca quer dizer trocar o ERP. Quer dizer mapear com precisão onde ele acerta — que costuma ser a maior parte — e construir só na borda em que o negócio pede uma regra que ele não tem.&lt;/p&gt;
&lt;p&gt;O Winthor continua sendo a fonte da verdade. O que mudou é que ele deixou de precisar responder sozinho por perguntas que nunca foram dele.&lt;/p&gt;</content:encoded><category>Agro</category><category>Winthor</category><category>ERP</category><category>Flutter</category><category>Arquitetura</category></item><item><title>O Lighthouse estava medindo a página errada</title><link>https://devfrs.com/blog/o-lighthouse-estava-medindo-a-pagina-errada/</link><guid isPermaLink="true">https://devfrs.com/blog/o-lighthouse-estava-medindo-a-pagina-errada/</guid><description>Um gate de performance que passa não vale nada se ele mede outra coisa. Como uma porta ocupada me deu perf 62 plausível e errado — e o que mudei para o erro nunca mais passar calado.</description><pubDate>Thu, 30 Jul 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Eu estava endurecendo o gate de Lighthouse do devfrs.com: sair de &lt;code&gt;warn&lt;/code&gt; e passar para &lt;code&gt;error&lt;/code&gt;, com SEO em 100. O primeiro resultado veio estranho.&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;rota&lt;/th&gt;&lt;th&gt;perf&lt;/th&gt;&lt;th&gt;seo&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;75&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;/en/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;38&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;/projeto/&amp;#x3C;slug&gt;/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;79&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Trinta e oito. Em páginas praticamente idênticas, geradas pelo mesmo build. E o SEO, que era o que eu estava mexendo, tinha chegado em 100 — então a tentação era comemorar e tratar a performance como ruído.&lt;/p&gt;
&lt;h2 id=&quot;o-sintoma-que-não-fechava&quot;&gt;O sintoma que não fechava&lt;/h2&gt;
&lt;p&gt;Junto com os números veio uma reprovação em &lt;code&gt;link-text&lt;/code&gt;: um link com o texto “Learn more” apontando para &lt;code&gt;docs.astro.build&lt;/code&gt;. Eu não tenho esse link em lugar nenhum. Procurei no &lt;code&gt;dist/&lt;/code&gt; inteiro:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-dark-default github-light-default&quot; style=&quot;background-color:#0d1117;--shiki-light-bg:#ffffff;color:#e6edf3;--shiki-light:#1f2328; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFA657;--shiki-light:#953800&quot;&gt;grep&lt;/span&gt;&lt;span style=&quot;color:#79C0FF;--shiki-light:#0550AE&quot;&gt; -r&lt;/span&gt;&lt;span style=&quot;color:#A5D6FF;--shiki-light:#0A3069&quot;&gt; &quot;docs.astro.build&quot;&lt;/span&gt;&lt;span style=&quot;color:#A5D6FF;--shiki-light:#0A3069&quot;&gt; dist/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nada. O link não existia no que eu tinha construído — mas existia na página que o Lighthouse mediu. Só há uma explicação para isso: &lt;strong&gt;a página medida não era a minha&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;a-causa&quot;&gt;A causa&lt;/h2&gt;
&lt;p&gt;Aquele “Learn more” é da barra de ferramentas do Astro, que &lt;strong&gt;só existe em modo dev&lt;/strong&gt;. O que o Lighthouse auditou foi o dev server, não o &lt;code&gt;dist/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;O motivo é bobo e é justamente por isso que passa despercebido: eu tinha um &lt;code&gt;npm run dev&lt;/code&gt; aberto na porta 4321, e meu servidor de teste tentava subir na mesma porta. Ele falhava, o processo morria em silêncio, e o Lighthouse encontrava &lt;em&gt;alguém&lt;/em&gt; respondendo em 4321. Mediu com prazer.&lt;/p&gt;
&lt;p&gt;Perf 62 num site em dev é um número perfeitamente plausível. É esse o problema. Um erro que grita é barato; um erro que devolve um número &lt;strong&gt;crível&lt;/strong&gt; custa horas.&lt;/p&gt;
&lt;h2 id=&quot;as-duas-correções&quot;&gt;As duas correções&lt;/h2&gt;
&lt;p&gt;A primeira é óbvia: porta separada para o gate. A segunda é a que importa:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-dark-default github-light-default&quot; style=&quot;background-color:#0d1117;--shiki-light-bg:#ffffff;color:#e6edf3;--shiki-light:#1f2328; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6EDF3;--shiki-light:#1F2328&quot;&gt;server.&lt;/span&gt;&lt;span style=&quot;color:#D2A8FF;--shiki-light:#8250DF&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color:#E6EDF3;--shiki-light:#1F2328&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#A5D6FF;--shiki-light:#0A3069&quot;&gt;&quot;error&quot;&lt;/span&gt;&lt;span style=&quot;color:#E6EDF3;--shiki-light:#1F2328&quot;&gt;, (&lt;/span&gt;&lt;span style=&quot;color:#FFA657;--shiki-light:#953800&quot;&gt;err&lt;/span&gt;&lt;span style=&quot;color:#E6EDF3;--shiki-light:#1F2328&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#FF7B72;--shiki-light:#CF222E&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#E6EDF3;--shiki-light:#1F2328&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FF7B72;--shiki-light:#CF222E&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E6EDF3;--shiki-light:#1F2328&quot;&gt; (err.code &lt;/span&gt;&lt;span style=&quot;color:#FF7B72;--shiki-light:#CF222E&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#A5D6FF;--shiki-light:#0A3069&quot;&gt; &quot;EADDRINUSE&quot;&lt;/span&gt;&lt;span style=&quot;color:#E6EDF3;--shiki-light:#1F2328&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6EDF3;--shiki-light:#1F2328&quot;&gt;    console.&lt;/span&gt;&lt;span style=&quot;color:#D2A8FF;--shiki-light:#8250DF&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#E6EDF3;--shiki-light:#1F2328&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A5D6FF;--shiki-light:#0A3069&quot;&gt;      `[serve-dist] porta ${&lt;/span&gt;&lt;span style=&quot;color:#79C0FF;--shiki-light:#0550AE&quot;&gt;PORT&lt;/span&gt;&lt;span style=&quot;color:#A5D6FF;--shiki-light:#0A3069&quot;&gt;} já está em uso — abortando.&lt;/span&gt;&lt;span style=&quot;color:#FF7B72;--shiki-light:#CF222E&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#A5D6FF;--shiki-light:#0A3069&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#FF7B72;--shiki-light:#CF222E&quot;&gt; +&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A5D6FF;--shiki-light:#0A3069&quot;&gt;        `Outro processo responderia no lugar do dist/ e o Lighthouse mediria a página errada.`&lt;/span&gt;&lt;span style=&quot;color:#E6EDF3;--shiki-light:#1F2328&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6EDF3;--shiki-light:#1F2328&quot;&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6EDF3;--shiki-light:#1F2328&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6EDF3;--shiki-light:#1F2328&quot;&gt;  process.&lt;/span&gt;&lt;span style=&quot;color:#D2A8FF;--shiki-light:#8250DF&quot;&gt;exit&lt;/span&gt;&lt;span style=&quot;color:#E6EDF3;--shiki-light:#1F2328&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79C0FF;--shiki-light:#0550AE&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E6EDF3;--shiki-light:#1F2328&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6EDF3;--shiki-light:#1F2328&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Falhar alto em vez de baixo. Se a porta está ocupada, ninguém mede nada — melhor derrubar o gate com uma mensagem clara do que publicar um número inventado.&lt;/p&gt;
&lt;p&gt;Com o servidor certo e mediana de três execuções, os números viraram 95 e 99. E aí sim dava para travar o gate.&lt;/p&gt;
&lt;h2 id=&quot;o-que-eu-tiro-disso&quot;&gt;O que eu tiro disso&lt;/h2&gt;
&lt;p&gt;Antes de acreditar numa medição, vale perguntar o que ela mediria se estivesse quebrada. Se a resposta for “um número parecido com o certo”, falta um sinal — não falta precisão.&lt;/p&gt;</content:encoded><category>Performance</category><category>Lighthouse</category><category>CI</category></item></channel></rss>