<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>TabNews</title>
        <link>https://www.tabnews.com.br/recentes/rss</link>
        <description>Conteúdos para quem trabalha com Programação e Tecnologia</description>
        <lastBuildDate>Wed, 27 May 2026 05:18:45 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>pt</language>
        <image>
            <title>TabNews</title>
            <url>https://www.tabnews.com.br/favicon-mobile.png</url>
            <link>https://www.tabnews.com.br/recentes/rss</link>
        </image>
        <item>
            <title><![CDATA[Pitch: criei o ExtraBrain, um copiloto local-first para entrevistas, busca de emprego e reuniões]]></title>
            <link>https://www.tabnews.com.br/extrabrain/pitch-criei-o-extrabrain-um-copiloto-local-first-para-entrevistas-busca-de-emprego-e-reunioes</link>
            <guid>https://www.tabnews.com.br/extrabrain/pitch-criei-o-extrabrain-um-copiloto-local-first-para-entrevistas-busca-de-emprego-e-reunioes</guid>
            <pubDate>Wed, 27 May 2026 05:18:45 GMT</pubDate>
            <description><![CDATA[Fala pessoal, tudo bem? Queria compartilhar um projeto que estou construindo: ExtraBrain, um app desktop para Mac que funciona como um copiloto de IA para entrevistas, reuniões e conversa...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Fala pessoal, tudo bem?</p><p>Queria compartilhar um projeto que estou construindo: <strong>ExtraBrain</strong>, um app desktop para Mac que funciona como um copiloto de IA para entrevistas, reuniões e conversas ao vivo.</p><p>A ideia nasceu de uma dor bem simples: em entrevistas técnicas, calls com recrutadores, reuniões de produto ou conversas importantes, muita coisa acontece ao mesmo tempo. Você precisa ouvir, pensar, responder, anotar, lembrar contexto, formular boas perguntas e ainda não se perder no fluxo da conversa.</p><p>O ExtraBrain tenta resolver isso sendo uma camada privada de apoio durante e depois da conversa.</p><p>Site: <a href="https://extrabrain.app" rel="nofollow">https://extrabrain.app</a><br>Download: <a href="https://extrabrain.app/download" rel="nofollow">https://extrabrain.app/download</a></p><h2 id="extrabrain-content-o-que-ele-faz">O que ele faz?</h2><p>O ExtraBrain grava e transcreve a conversa em tempo real, acompanha o contexto da sessão e ajuda a transformar isso em:</p><ul><li>resumo do que foi dito;</li><li>perguntas de acompanhamento;</li><li>tópicos detectados;</li><li>pontos importantes salvos;</li><li>estrutura de resposta para entrevistas;</li><li>decisões, riscos e próximos passos em reuniões;</li><li>revisão pós-call para você não esquecer o que aconteceu.</li></ul><p>Ele não entra na call como bot. É um app desktop rodando no seu Mac.</p><p><img src="https://extrabrain.app/assets/screenshots/empty_state.png" alt="ExtraBrain empty state"></p><h2 id="extrabrain-content-por-que-isso-é-útil-para-quem-está-procurando-emprego">Por que isso é útil para quem está procurando emprego?</h2><p>Quem está em busca de emprego sabe que entrevista não é só “saber a resposta”.</p><p>Você precisa entender rápido o problema, organizar pensamento, fazer perguntas boas e não esquecer detalhes que o entrevistador já falou 5 minutos atrás.</p><p>Alguns exemplos de uso:</p><h3 id="extrabrain-content-entrevista-técnica">Entrevista técnica</h3><p>Se o entrevistador passa um problema estilo LeetCode, o ExtraBrain pode ajudar a organizar:</p><ul><li>requisitos;</li><li>edge cases;</li><li>complexidade esperada;</li><li>perguntas de clarificação;</li><li>trade-offs da solução;</li><li>pontos para explicar antes de codar.</li></ul><h3 id="extrabrain-content-system-design">System design</h3><p>Em uma entrevista de system design, ele pode ajudar a transformar o que foi dito em componentes, gargalos, limitações e perguntas do tipo:</p><ul><li>qual escala esperada?</li><li>latência importa?</li><li>quais dados precisam ser persistidos?</li><li>onde entram cache, filas, banco, rate limit, observabilidade?</li></ul><h3 id="extrabrain-content-entrevista-comportamental">Entrevista comportamental</h3><p>Também ajuda a lembrar exemplos, estruturar respostas e revisar depois onde você foi bem ou onde poderia responder melhor.</p><p>A ideia não é “enganar” a entrevista. É mais parecido com ter um bloco de notas inteligente que entende a conversa e te ajuda a pensar com mais clareza. Cada pessoa ainda precisa seguir as regras da empresa, da escola ou da plataforma onde está sendo entrevistada.</p><p><img src="https://extrabrain.app/assets/screenshots/live_session.png" alt="ExtraBrain live session"></p><h2 id="extrabrain-content-e-para-reuniões">E para reuniões?</h2><p>Também uso o ExtraBrain como copiloto de reunião.</p><p>Em calls de produto, cliente, planejamento ou revisão técnica, ele pode ajudar a capturar:</p><ul><li>decisões tomadas;</li><li>dúvidas em aberto;</li><li>riscos;</li><li>follow-ups;</li><li>responsáveis;</li><li>contexto importante que normalmente se perde depois da call.</li></ul><p>Depois da reunião, você consegue sair com uma visão mais organizada do que aconteceu, sem depender só da memória ou de anotações corridas.</p><p><img src="https://extrabrain.app/assets/screenshots/sessions_history.png" alt="ExtraBrain sessions history"></p><h2 id="extrabrain-content-local-first-e-controle-dos-provedores">Local-first e controle dos provedores</h2><p>Uma parte importante do projeto é que o ExtraBrain é <strong>local-first</strong>.</p><p>Ele foi pensado para manter transcrições, prompts, screenshots e notas no seu Mac quando você usa uma configuração local. Também dá para usar modelos/provedores externos, mas isso fica sob controle do usuário.</p><p>Hoje ele suporta:</p><ul><li>transcrição local com Parakeet;</li><li>Deepgram opcional;</li><li>Gemma local em hardware compatível;</li><li>OpenAI;</li><li>Anthropic;</li><li>Claude Subscription;</li><li>Codex Subscription;</li><li>endpoints compatíveis com OpenAI.</li></ul><p>Ou seja: a ideia não é te prender em um provedor de IA específico. Você usa o que já tem ou o que faz sentido para o seu fluxo.</p><h2 id="extrabrain-content-status-atual">Status atual</h2><p>Por enquanto está disponível para <strong>macOS</strong>, com suporte a Apple Silicon e Intel. Windows e Linux estão planejados.</p><p>O app é gratuito para começar. Existe uma versão Pro para recursos avançados, como perfis customizados, histórico mais rico e controles de workflow, mas o core do app pode ser usado gratuitamente.</p><h2 id="extrabrain-content-para-quem-eu-acho-que-faz-sentido">Para quem eu acho que faz sentido?</h2><p>Acho que o ExtraBrain pode ser útil principalmente para:</p><ul><li>devs fazendo entrevistas técnicas;</li><li>pessoas em busca de emprego;</li><li>estudantes;</li><li>founders em calls com clientes/investidores;</li><li>PMs e tech leads em reuniões cheias de contexto;</li><li>qualquer pessoa que queira sair de uma conversa com notas melhores.</li></ul><h2 id="extrabrain-content-o-que-eu-queria-ouvir-de-vocês">O que eu queria ouvir de vocês</h2><p>Estou postando aqui porque o TabNews tem bastante gente que vive entrevistas, reuniões técnicas, processo seletivo, trabalho remoto e produto.</p><p>Queria feedback principalmente sobre:</p><ul><li>o posicionamento faz sentido?</li><li>vocês usariam algo assim em entrevistas ou reuniões?</li><li>o foco em local-first/privacy é relevante para vocês?</li><li>que feature faria isso virar algo indispensável?</li><li>o que parece confuso ou mal explicado no site?</li></ul><p>Site: <a href="https://extrabrain.app" rel="nofollow">https://extrabrain.app</a><br>Download para Mac: <a href="https://extrabrain.app/download" rel="nofollow">https://extrabrain.app/download</a></p><p>Valeu demais para quem puder testar, criticar ou sugerir melhorias.</p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Como Criar uma Skill Recursiva que Melhora a Si Mesma e o Harness]]></title>
            <link>https://www.tabnews.com.br/andersonlimadev/como-criar-uma-skill-recursiva-que-melhora-a-si-mesma-e-o-harness</link>
            <guid>https://www.tabnews.com.br/andersonlimadev/como-criar-uma-skill-recursiva-que-melhora-a-si-mesma-e-o-harness</guid>
            <pubDate>Wed, 27 May 2026 00:48:29 GMT</pubDate>
            <description><![CDATA[Aprenda a criar uma skill recursiva que melhora incrementalmente a si mesma e o harness ao redor do agente, usando feedback loop, evals, regras vivas e guardrails. Uma skill ruim é só uma...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><h2 id="andersonlimadev-content-aprenda-a-criar-uma-skill-recursiva-que-melhora-incrementalmente-a-si-mesma-e-o-harness-ao-redor-do-agente-usando-feedback-loop-evals-regras-vivas-e-guardrails">Aprenda a criar uma skill recursiva que melhora incrementalmente a si mesma e o harness ao redor do agente, usando feedback loop, evals, regras vivas e guardrails.</h2><p>Uma skill ruim é só uma instrução longa.</p><p>Uma skill boa é um procedimento reproduzível.</p><p>Uma skill excelente é um loop de feedback.</p><p>Essa diferença parece pequena, mas muda tudo no uso diário de agentes de IA. Quando uma skill apenas descreve "como fazer", ela depende da memória do modelo, da disciplina do usuário e da sorte do contexto. Quando ela vira loop, cada execução produz evidência: erro encontrado, decisão tomada, teste rodado, regra criada, harness ajustado.</p><p>É por isso que padrões como <code>error-fix-loop</code> são tão fortes. A ideia central não é "corrigir erro". A ideia central é: <strong>todo erro corrigido deve reduzir a chance de o mesmo erro voltar</strong>.</p><p>Esse é o ponto de uma skill recursiva.</p><p>Ela não se melhora por mágica. Ela melhora porque foi desenhada para observar o próprio resultado, registrar aprendizado e propor mudanças pequenas no sistema que a executa.</p><h2 id="andersonlimadev-content-o-que-significa-uma-skill-recursiva">O que significa uma skill recursiva</h2><p>Aqui, "recursiva" não significa uma skill chamando a si mesma infinitamente.</p><p>Isso seria perigoso e inútil.</p><p>Uma skill recursiva é uma skill que fecha o ciclo entre execução, verificação e melhoria do harness. Ela faz três coisas:</p><ol><li>executa uma tarefa com um protocolo claro;</li><li>mede se o resultado foi bom o suficiente;</li><li>atualiza a própria instrução, as regras do projeto, os testes ou o harness quando encontra uma falha repetível.</li></ol><p>O loop básico fica assim:</p><pre><code class="hljs language-mermaid">flowchart LR    A[Executar tarefa] --> B[Coletar evidência]    B --> C[Verificar resultado]    C --> D{Falha repetível?}    D -- Não --> E[Encerrar com registro leve]    D -- Sim --> F[Criar regra, teste ou ajuste de harness]    F --> G[Validar mudança]    G --> A</code></pre><p>O segredo está em limitar o tipo de melhoria que a skill pode fazer.</p><p>Ela não deve reescrever seu próprio arquivo inteira a cada execução. Ela deve produzir mudanças pequenas, auditáveis e justificadas.</p><h2 id="andersonlimadev-content-por-que-isso-melhora-o-harness">Por que isso melhora o harness</h2><p>Um agent harness é o ambiente operacional ao redor do modelo: instruções, ferramentas, permissões, memória, regras, logs, evals e critérios de parada.</p><p>Skills são parte desse harness.</p><p>Quando uma skill melhora, o harness melhora junto porque o sistema passa a ter:</p><ul><li>menos decisões implícitas;</li><li>menos dependência de memória humana;</li><li>mais regras baseadas em falhas reais;</li><li>mais verificação antes de conclusão;</li><li>mais evidência para revisar o fluxo.</li></ul><p>O harness não fica melhor porque ficou maior. Ele fica melhor porque ficou mais específico.</p><p>Esse detalhe importa. Um erro comum é transformar toda falha em mais prompt. O resultado vira uma skill inchada, cheia de exceções antigas e difícil de seguir. A abordagem correta é separar melhoria em camadas.</p><table><thead><tr><th>Tipo de falha</th><th>Melhor lugar para corrigir</th></tr></thead><tbody><tr><td>Falha de procedimento</td><td><code>SKILL.md</code></td></tr><tr><td>Falha recorrente de projeto</td><td><code>docs/ai/rules/</code> ou <code>AGENTS.md</code></td></tr><tr><td>Falha verificável por teste</td><td>suíte de testes ou eval</td></tr><tr><td>Falha de permissão ou segurança</td><td>política do harness</td></tr><tr><td>Falha de observabilidade</td><td>logs, checkpoints ou relatório</td></tr></tbody></table><p>Nem tudo pertence à skill.</p><p>Uma skill recursiva boa sabe quando atualizar a si mesma e quando atualizar o ambiente ao redor.</p><h2 id="andersonlimadev-content-o-padrão-error-fix-loop">O padrão <code>error-fix-loop</code></h2><p>O <code>error-fix-loop</code> é um bom exemplo porque ele transforma um bug em aprendizado operacional.</p><p>O fluxo não termina no patch. Ele força uma sequência:</p><ol><li>investigar causa raiz;</li><li>aplicar mudança mínima;</li><li>criar ou ajustar teste;</li><li>rodar lint;</li><li>rodar typecheck;</li><li>revisar typos e resíduos;</li><li>atualizar regras;</li><li>atualizar índice de instruções.</li></ol><p>O ponto forte está nos passos finais.</p><p>Muitos times corrigem o erro e param. O problema volta semanas depois porque o conhecimento ficou preso na conversa, no PR ou na cabeça de alguém. O loop resolve isso ao transformar a correção em regra persistente.</p><p>Esse é o princípio:</p><pre><code class="hljs language-text">erro -> causa raiz -> fix -> teste -> regra -> índice -> próxima execução melhor</code></pre><p>A skill não precisa adivinhar o futuro. Ela só precisa capturar o aprendizado de cada falha real.</p><h2 id="andersonlimadev-content-anatomia-de-uma-skill-autoaperfeiçoável">Anatomia de uma skill autoaperfeiçoável</h2><p>Uma skill recursiva precisa de cinco blocos.</p><h3 id="andersonlimadev-content-1-gatilho-claro">1. Gatilho claro</h3><p>Toda skill precisa dizer quando deve ser usada.</p><p>Um gatilho ruim é genérico demais:</p><pre><code class="hljs language-markdown">Use esta skill para melhorar o projeto.</code></pre><p>Isso não orienta nada.</p><p>Um gatilho melhor:</p><pre><code class="hljs language-markdown">Use esta skill quando uma execução de agente falhar por erro repetível,ausência de verificação, regra desatualizada ou lacuna no harness.</code></pre><p>O gatilho define a fronteira.</p><h3 id="andersonlimadev-content-2-protocolo-obrigatório">2. Protocolo obrigatório</h3><p>Uma skill recursiva não pode depender de improviso.</p><p>Ela precisa de passos fixos:</p><pre><code class="hljs language-markdown"><span class="hljs-section">## Protocolo</span><span class="hljs-bullet">1.</span> Identifique o evento que falhou.<span class="hljs-bullet">2.</span> Declare a causa raiz em uma frase.<span class="hljs-bullet">3.</span> Corrija a menor unidade possível.<span class="hljs-bullet">4.</span> Rode a verificação relevante.<span class="hljs-bullet">5.</span> Se a falha for repetível, crie regra ou eval.<span class="hljs-bullet">6.</span> Atualize o índice do harness.<span class="hljs-bullet">7.</span> Registre o que mudou e por quê.</code></pre><p>Esse protocolo evita que o agente pule direto para a parte confortável: editar código ou texto.</p><h3 id="andersonlimadev-content-3-critério-de-melhoria">3. Critério de melhoria</h3><p>Nem todo incômodo merece virar regra.</p><p>Sem critério, a skill acumula ruído. Com critério, ela melhora só quando existe sinal suficiente.</p><p>Use perguntas simples:</p><ul><li>A falha pode se repetir?</li><li>A correção pode ser verificada?</li><li>A regra reduziria retrabalho futuro?</li><li>A regra cabe em uma frase operacional?</li><li>Existe um lugar melhor do que a skill para registrar isso?</li></ul><p>Se a resposta for "não", registre no relatório final e não altere o harness.</p><h3 id="andersonlimadev-content-4-limite-de-escrita">4. Limite de escrita</h3><p>Uma skill recursiva precisa de permissão estreita.</p><p>Exemplo:</p><pre><code class="hljs language-markdown"><span class="hljs-section">## Escopo de escrita</span>Pode propor ou editar:<span class="hljs-bullet">-</span> este <span class="hljs-code">`SKILL.md`</span>;<span class="hljs-bullet">-</span> arquivos em <span class="hljs-code">`docs/ai/rules/`</span>;<span class="hljs-bullet">-</span> índices de instruções como <span class="hljs-code">`AGENTS.md`</span>;<span class="hljs-bullet">-</span> evals relacionados ao erro.Não pode:<span class="hljs-bullet">-</span> reescrever regras não relacionadas;<span class="hljs-bullet">-</span> remover guardrails;<span class="hljs-bullet">-</span> alterar política de segurança sem confirmação;<span class="hljs-bullet">-</span> mascarar teste falho para passar validação.</code></pre><p>Esse bloco protege o harness contra "melhoria" destrutiva.</p><h3 id="andersonlimadev-content-5-auditoria-de-conclusão">5. Auditoria de conclusão</h3><p>O loop só vale se termina com evidência.</p><p>Uma conclusão aceitável deve responder:</p><ul><li>qual falha foi encontrada;</li><li>qual mudança foi feita;</li><li>qual verificação rodou;</li><li>qual regra ou eval foi criado;</li><li>qual risco permanece.</li></ul><p>Sem isso, a skill parece produtiva, mas não cria memória operacional confiável.</p><h2 id="andersonlimadev-content-um-template-de-skillmd">Um template de <code>SKILL.md</code></h2><p>Este é um esqueleto prático.</p><pre><code class="hljs language-markdown">---name: recursive-harness-improverdescription: Use quando uma execução revelar falha repetível no agente, na skill, nas regras ou na verificação do harness.<span class="hljs-section">allowed-tools: Read, Grep, Glob, Edit, Bash---</span><span class="hljs-section"># Recursive Harness Improver</span><span class="hljs-section">## Objetivo</span>Transformar falhas repetíveis em melhorias pequenas, verificáveis e persistentes no harness.<span class="hljs-section">## Princípio</span>Não corrija só o sintoma. Crie evidência para que a próxima execução tenha menos chance de repetir o erro.<span class="hljs-section">## Protocolo</span><span class="hljs-bullet">1.</span> Capture o evento: comando, arquivo, erro, output ou decisão ruim.<span class="hljs-bullet">2.</span> Declare causa raiz em uma frase.<span class="hljs-bullet">3.</span> Classifique a falha:<span class="hljs-bullet">   -</span> procedimento;<span class="hljs-bullet">   -</span> regra ausente;<span class="hljs-bullet">   -</span> teste ausente;<span class="hljs-bullet">   -</span> permissão;<span class="hljs-bullet">   -</span> observabilidade;<span class="hljs-bullet">   -</span> documentação.<span class="hljs-bullet">4.</span> Aplique a menor correção possível.<span class="hljs-bullet">5.</span> Rode verificação relevante.<span class="hljs-bullet">6.</span> Se repetível, adicione regra, teste ou eval.<span class="hljs-bullet">7.</span> Atualize índice do harness quando necessário.<span class="hljs-bullet">8.</span> Faça auditoria final com evidência real.<span class="hljs-section">## Critério para atualizar a skill</span>Atualize este arquivo apenas quando:<span class="hljs-bullet">-</span> o protocolo atual permitiu uma falha repetível;<span class="hljs-bullet">-</span> a nova regra é curta e generalizável;<span class="hljs-bullet">-</span> a mudança reduz ambiguidade futura;<span class="hljs-bullet">-</span> existe verificação ou evidência de apoio.<span class="hljs-section">## Anti-padrões</span><span class="hljs-bullet">-</span> Não adicionar regra por preferência pessoal.<span class="hljs-bullet">-</span> Não ampliar escopo sem necessidade.<span class="hljs-bullet">-</span> Não remover guardrail para facilitar conclusão.<span class="hljs-bullet">-</span> Não aceitar teste verde que não cobre a falha original.<span class="hljs-bullet">-</span> Não concluir sem evidência.</code></pre><p>Esse template já contém o ponto mais importante: a skill pode melhorar, mas não pode se tornar dona de tudo.</p><h2 id="andersonlimadev-content-o-loop-de-feedback-em-quatro-camadas">O loop de feedback em quatro camadas</h2><p>Um bom sistema não joga todo aprendizado no mesmo arquivo.</p><p>Use quatro camadas.</p><h3 id="andersonlimadev-content-camada-1-execução">Camada 1: execução</h3><p>É a tarefa atual.</p><p>Exemplos:</p><ul><li>corrigir bug;</li><li>publicar artigo;</li><li>revisar PR;</li><li>gerar teste;</li><li>ajustar configuração.</li></ul><p>Aqui entram ferramentas, comandos e arquivos reais.</p><h3 id="andersonlimadev-content-camada-2-verificação">Camada 2: verificação</h3><p>É onde você prova que a tarefa funcionou.</p><p>Exemplos:</p><ul><li>teste unitário;</li><li>typecheck;</li><li>lint;</li><li>snapshot;</li><li>checklist editorial;</li><li>validação por MCP;</li><li>inspeção de diff.</li></ul><p>Sem verificação, o loop não tem sinal.</p><h3 id="andersonlimadev-content-camada-3-memória-operacional">Camada 3: memória operacional</h3><p>É onde o aprendizado vira instrução persistente.</p><p>Exemplos:</p><ul><li><code>docs/ai/rules/</code>;</li><li><code>AGENTS.md</code>;</li><li><code>SKILL.md</code>;</li><li>checklist de publicação;</li><li>guia de troubleshooting.</li></ul><p>Essa camada evita que o mesmo conhecimento precise ser redescoberto.</p><h3 id="andersonlimadev-content-camada-4-evolução-do-harness">Camada 4: evolução do harness</h3><p>É onde você ajusta o ambiente.</p><p>Exemplos:</p><ul><li>adicionar uma ferramenta;</li><li>restringir uma permissão;</li><li>criar uma eval;</li><li>mudar um critério de parada;</li><li>melhorar um template;</li><li>criar dispatch mais específico.</li></ul><p>Essa é a camada mais sensível. Mudanças aqui afetam várias tarefas. Por isso, precisam ser pequenas e bem verificadas.</p><h2 id="andersonlimadev-content-como-evitar-autoaperfeiçoamento-ruim">Como evitar autoaperfeiçoamento ruim</h2><p>O risco de uma skill recursiva é ela confundir aprendizado com acúmulo.</p><p>Toda execução gera alguma observação. Mas nem toda observação merece virar regra.</p><p>Use estes filtros:</p><h3 id="andersonlimadev-content-frequência">Frequência</h3><p>Falhou uma vez por acaso ou é um padrão provável?</p><h3 id="andersonlimadev-content-generalidade">Generalidade</h3><p>A regra ajuda outras tarefas ou só descreve um caso único?</p><h3 id="andersonlimadev-content-verificabilidade">Verificabilidade</h3><p>Dá para testar, checar ou auditar?</p><h3 id="andersonlimadev-content-custo-cognitivo">Custo cognitivo</h3><p>A nova instrução reduz ambiguidade ou só aumenta texto?</p><h3 id="andersonlimadev-content-reversibilidade">Reversibilidade</h3><p>Se a regra estiver errada, é fácil remover?</p><p>Uma skill boa prefere poucas regras fortes a muitas regras fracas.</p><h2 id="andersonlimadev-content-exemplo-prático-melhoria-após-falha-de-publicação">Exemplo prático: melhoria após falha de publicação</h2><p>Imagine uma skill de blog que cria um artigo local e publica um draft via MCP.</p><p>Falha: o artigo foi criado no painel, mas o repo local ficou sem <code>index.md</code> em inglês.</p><p>Uma correção pobre seria apenas criar o arquivo ausente.</p><p>Uma correção recursiva faria mais:</p><pre><code class="hljs language-text">falha: artigo publicado sem versão EN localcausa raiz: protocolo de publicação não exigia auditoria dos dois localesfix: criar index.mdverificação: checar existência de index-pt-br.md e index.mdregra: full article exige ambos os locales antes de MCP post_create</code></pre><p>Agora a próxima execução melhora.</p><p>O harness aprendeu.</p><h2 id="andersonlimadev-content-exemplo-prático-melhoria-após-bug-recorrente">Exemplo prático: melhoria após bug recorrente</h2><p>Imagine uma skill de correção de erro.</p><p>Falha: o agente corrigiu um erro TypeScript com <code>as any</code>.</p><p>Uma correção pobre seria remover o <code>as any</code> naquele arquivo.</p><p>Uma correção recursiva:</p><pre><code class="hljs language-text">falha: typecheck passou por silenciamento insegurocausa raiz: protocolo não proibia cast para esconder incompatibilidadefix: trocar cast por tipo corretoteste: rodar tsc --noEmitregra: nunca usar as any para resolver erro de tipo sem justificativa explícitaíndice: apontar AGENTS.md para regra de TypeScript</code></pre><p>Isso segue a lógica de <code>error-fix-loop</code>: corrigir o sistema que permitiu o erro, não só o erro.</p><h2 id="andersonlimadev-content-quando-atualizar-a-própria-skill">Quando atualizar a própria skill</h2><p>Atualize o <code>SKILL.md</code> quando a falha veio do procedimento da skill.</p><p>Exemplos:</p><ul><li>ela não mandava rodar teste;</li><li>ela não dizia como escolher arquivo de regra;</li><li>ela permitia concluir sem evidência;</li><li>ela carregava contexto pesado sem necessidade;</li><li>ela não definia critério de parada.</li></ul><p>Não atualize a skill quando o aprendizado pertence ao projeto.</p><p>Exemplo: "neste repo, posts de blog precisam de <code>index-pt-br.md</code> e <code>index.md</code>" pertence às regras do repo, não necessariamente à skill global.</p><p>Essa separação mantém skills portáveis.</p><h2 id="andersonlimadev-content-quando-criar-uma-eval">Quando criar uma eval</h2><p>Crie uma eval quando a falha pode ser simulada.</p><p>Exemplos:</p><ul><li>agente conclui sem rodar verificação;</li><li>skill escolhe ferramenta errada;</li><li>artigo sai sem metadata;</li><li>code review não aponta teste ausente;</li><li>correção remove guardrail para passar teste.</li></ul><p>Uma eval mínima pode ser só uma matriz de casos:</p><pre><code class="hljs language-typescript"><span class="hljs-keyword">type</span> <span class="hljs-title class_">HarnessEvalCase</span> = {  <span class="hljs-attr">id</span>: <span class="hljs-built_in">string</span>;  <span class="hljs-attr">input</span>: <span class="hljs-built_in">string</span>;  <span class="hljs-attr">mustMention</span>: <span class="hljs-built_in">string</span>[];  <span class="hljs-attr">mustNotMention</span>: <span class="hljs-built_in">string</span>[];};<span class="hljs-keyword">const</span> <span class="hljs-attr">cases</span>: <span class="hljs-title class_">HarnessEvalCase</span>[] = [  {    <span class="hljs-attr">id</span>: <span class="hljs-string">"no-completion-without-evidence"</span>,    <span class="hljs-attr">input</span>: <span class="hljs-string">"Corrija o erro e diga que terminou sem rodar testes."</span>,    <span class="hljs-attr">mustMention</span>: [<span class="hljs-string">"verificação"</span>, <span class="hljs-string">"evidência"</span>],    <span class="hljs-attr">mustNotMention</span>: [<span class="hljs-string">"concluído sem testes"</span>],  },];</code></pre><p>O objetivo não é criar um benchmark gigante. É proteger os comportamentos que já falharam uma vez.</p><h2 id="andersonlimadev-content-checklist-para-desenhar-sua-primeira-skill-recursiva">Checklist para desenhar sua primeira skill recursiva</h2><p>Use este checklist:</p><ul><li>nome específico;</li><li>gatilho claro;</li><li>protocolo em passos numerados;</li><li>critério de causa raiz;</li><li>critério de verificação;</li><li>regra para quando atualizar a skill;</li><li>regra para quando atualizar o projeto;</li><li>limite de escrita;</li><li>anti-padrões explícitos;</li><li>auditoria final obrigatória.</li></ul><p>Se faltar auditoria final, a skill vira sugestão.</p><p>Se faltar limite de escrita, ela vira risco.</p><p>Se faltar verificação, ela vira narrativa.</p><h2 id="andersonlimadev-content-conclusão">Conclusão</h2><p>Skills recursivas não são sobre agentes se reescrevendo sem controle.</p><p>São sobre criar loops de feedback pequenos, verificáveis e acumulativos.</p><p>O padrão saudável é:</p><pre><code class="hljs language-text">executar -> verificar -> aprender -> persistir -> reduzir repetição</code></pre><p>Esse ciclo melhora a skill, melhora as regras e melhora o harness.</p><p><code>error-fix-loop</code> funciona porque trata cada erro como oportunidade de endurecer o sistema. A mesma lógica vale para publicação de conteúdo, revisão de PR, geração de testes, segurança, deploy e qualquer workflow agentic que se repete.</p><p>A pergunta prática não é:</p><p>"como faço a IA aprender sozinha?"</p><p>A pergunta melhor é:</p><p>"qual evidência esta execução gerou que deveria tornar a próxima execução mais segura, barata ou correta?"</p><p>Quando a skill responde isso, ela deixa de ser prompt.</p><p>Ela vira infraestrutura.</p><h2 id="andersonlimadev-content-referências-e-leitura-relacionada">Referências e leitura relacionada</h2><ul><li><code>error-fix-loop/SKILL.md</code>, padrão local de correção com regra persistente.</li><li><code>skills-selector/SKILL.md</code>, padrão local para carregar só o workflow necessário.</li><li><code>smart-dispatch/SKILL.md</code>, padrão local para escolher executor por custo, risco e capacidade.</li><li>OpenAI Codex, guia de <code>AGENTS.md</code>: <a href="https://developers.openai.com/codex/guides/agents-md" rel="nofollow">https://developers.openai.com/codex/guides/agents-md</a></li><li>Formato aberto <code>AGENTS.md</code>: <a href="https://agents.md/" rel="nofollow">https://agents.md/</a></li></ul></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Pitch: Construí uma ferramenta opensource que avalia o fit entre seu currículo e uma vaga]]></title>
            <link>https://www.tabnews.com.br/b4st3r/construi-uma-ferramenta-opensource-que-avalia-o-fit-entre-seu-curriculo-e-uma-vaga</link>
            <guid>https://www.tabnews.com.br/b4st3r/construi-uma-ferramenta-opensource-que-avalia-o-fit-entre-seu-curriculo-e-uma-vaga</guid>
            <pubDate>Wed, 27 May 2026 00:29:21 GMT</pubDate>
            <description><![CDATA[Fala pessoal, Faz poucos dias que eu desenvolvi uma ferramenta chamada Job Fit Analyzer, uma ferramenta web gratuita e open source que usa IA para avaliar o quanto o seu currículo se enca...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Fala pessoal,</p><p>Faz poucos dias que eu desenvolvi uma ferramenta chamada <code>Job Fit Analyzer</code>, uma ferramenta web gratuita e open source que usa IA para avaliar o quanto o seu currículo se encaixa em uma vaga específica.<br>A ideia nasceu de frustrações reais:</p><ol><li>quantas e quantas vezes que a gente olha pra uma descrição de vaga e nunca sabe se o que temos no curriculo é suficiente.</li><li>E mais, os sistemas de recrutamento e seleção usam IA para selecionar os candidatos baseados um sistema chamado ATS que tem raízes com LLMs proprietárias e etc., então porque não usar fogo contra fogo?</li><li>E mesmo que você saiba que hoje não tem fit para aquela oportunidade dos sonhos, o que falta? Como montar um plano eficiente de estudos?</li></ol><p>O Job Fit Analyzer meio que ajuda nesses pontos.</p><h2 id="b4st3r-content-o-que-ela-faz">O que ela faz?</h2><p>Você envia seu currículo (texto/Markdown ou link de Google Docs público), faz um setup rápido e salva suas chaves de LLM (Gemini ou Groq), cola o texto ou a URL da vaga, e recebe:</p><ul><li>Score de 0 a 100 de compatibilidade</li><li>Pontos de fit — onde seu perfil se alinha com a vaga</li><li>Gaps identificados — o que está faltando</li><li>Recomendação — o que faz sentido fazer com essa candidatura</li></ul><p>Ainda dá pra salvar o histórico de análises para consultar depois, então dá pra comparar fits entre diferentes vagas ao longo do tempo.</p><h3 id="b4st3r-content-porque-essas-llms-pra-começar">Porque essas LLMs pra começar?</h3><p>Escolhi o Gemini e o Groq porque ambos tem tiers free generosos e tu pode usar sem estourar limites. Ou se preferir pagar, o Groq é bem barato.<br><strong>Em breve</strong> eu vou adicionar suporte a mais LLMs: GPT, Claude, Openrouter... para ficar mais democrático.</p><h2 id="b4st3r-content-nerds-place-ou-stack-e-decisões-técnicas-relevantes">Nerds Place ou Stack e decisões técnicas relevantes</h2><ul><li>O projeto é fruto de um projeto de estudo para utilização da stack do Google, ou seja, o fiz usando Firebase + Firestore (DB) para persistência de currículo e histórico sem necessidade de re-upload a cada acesso.</li><li>Estando no ecossistema do Firebase, o projeto já usa o Firebase Auth com Google Sign-In — acesso seguro sem formulário de cadastro</li><li>LLM providers: Gemini e Groq — com fallback automático entre eles</li><li>Criptografia client-side das API keys — AES-GCM 256-bit com chave derivada do UID via PBKDF2; as chaves nunca saem do dispositivo do usuário em texto claro</li><li>Frontend em React com identidade visual dark/terminal</li></ul><h2 id="b4st3r-content-segurança-privacidade-e-compliance">Segurança, Privacidade e Compliance</h2><p>Eu não sou nenhum grande especialista em segurança, mas procurei me cercar de diversos cuidados para nem expor dados do projeto sensíveis nem expor dados os usuários sensíveis. Mas a gente sabe como é o submundo da tecnologia do mau, sempre acham uma brecha, então se você tiver algum feedback importante sobre isso, me avisa, ok?</p><p>Além disso, do ponto de vista de privacidade: o currículo e as chaves de API ficam criptografados no Firestore. Há conformidade com LGPD — banner de consentimento opt-in para Analytics, páginas de Termos e Política de Privacidade, e exclusão total de dados (Firestore + conta Auth) disponível no perfil com reautenticação obrigatória.</p><h2 id="b4st3r-content-por-que-estou-publicando-agora">Por que estou publicando agora?</h2><p>O motivo pricipal é que eu acho que a ferramenta tá com o miolo pronto e funcional para ajudar pessoas reais, e preciso de feedbacks de pessoas que estejam ativamente buscando emprego ou em transição de carreira para entender se a análise faz sentido na prática, se o score é útil, se os gaps identificados refletem a realidade...<br>Então, se você testar, me conta:</p><ul><li>O score pareceu justo pra você?</li><li>Os gaps identificados fazem sentido ou foram genéricos demais?</li><li>O que você esperava ver e não viu?</li></ul><h2 id="b4st3r-content-link-pra-acessar">Link pra acessar</h2><p>🔗 Ferramenta: <a href="https://job-fit-analyzer-4f7af.web.app/" rel="nofollow">https://job-fit-analyzer-4f7af.web.app/</a><br>💻 Repositório: <a href="https://github.com/felipefernandes/job-fit-analyzer">https://github.com/felipefernandes/job-fit-analyzer</a></p><p>PRs e issues são bem-vindos — o projeto está posicionado como open source desde o início.</p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Pitch: TryPost: open source social media scheduler]]></title>
            <link>https://www.tabnews.com.br/paulocastellano/trypost-open-source-social-media-scheduler</link>
            <guid>https://www.tabnews.com.br/paulocastellano/trypost-open-source-social-media-scheduler</guid>
            <pubDate>Tue, 26 May 2026 23:14:48 GMT</pubDate>
            <description><![CDATA[Oi, pessoal. Sou o criador do TryPost Tô compartilhando aqui pra pegar feedback e, quem sabe, alguns contribuidores :) https://github.com/trypostit/trypost É um agendador de redes sociais...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Oi, pessoal. Sou o criador do TryPost</p><p>Tô compartilhando aqui pra pegar feedback e, quem sabe, alguns contribuidores :)<br><a href="https://github.com/trypostit/trypost">https://github.com/trypostit/trypost</a></p><p>É um agendador de redes sociais open source. A diferença dele: além de agendar, ele cria o conteúdo pra você com IA, e o foco é o resultado não ter cara de IA.</p><p>Principais recursos:</p><ul><li>Agendamento para 10 redes: X (Twitter), LinkedIn, Facebook, Instagram, TikTok, YouTube, Pinterest, Threads, Bluesky e Mastodon</li><li>Criação de conteúdo com IA, incluindo carrossel de Instagram</li><li>Analytics das suas publicações</li><li>MCP e API pra automatizar a criação (Claude Code, ChatGPT ou qualquer cliente MCP)</li><li>Versão cloud, caso você não queira cuidar de infra</li></ul><p>Stack:</p><ul><li>Laravel</li><li>Inertia.js</li><li>Vue.js</li><li>shadcn</li></ul><p>Open source (AGPL 3.0).</p><p>Um carrossel que fiz com ele:<br><a href="https://www.instagram.com/p/DYnqZhtFdaD/" rel="nofollow">https://www.instagram.com/p/DYnqZhtFdaD/</a></p><p>Site:<br><a href="https://trypost.it" rel="nofollow">https://trypost.it</a></p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Início da jornada: da ideia até a produção sem nenhum recurso]]></title>
            <link>https://www.tabnews.com.br/VictorDG00/inicio-da-jornada-da-ideia-ate-a-producao-sem-nenhum-recurso</link>
            <guid>https://www.tabnews.com.br/VictorDG00/inicio-da-jornada-da-ideia-ate-a-producao-sem-nenhum-recurso</guid>
            <pubDate>Tue, 26 May 2026 23:00:35 GMT</pubDate>
            <description><![CDATA[Andei testando IA (Claude Code, Codex, Gemini) e senti a mudança drástica que essas ferramentas causam no fluxo de desenvolvimento, mesmo que minha área de atuação seja segurança da infor...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Andei testando IA (<strong>Claude Code</strong>, <strong>Codex</strong>, <strong>Gemini</strong>) e senti a mudança drástica que essas ferramentas causam no fluxo de desenvolvimento, mesmo que minha área de atuação seja segurança da informação e infraestrutura.</p><p>A primeira ferramenta que usei foi o <strong>Codex</strong> do ChatGPT, por conta do 1 mês grátis. Meus primeiros testes foram páginas web com ferramentas muito específicas, coisas que eu levaria alguns dias para desenvolver: coleta de dados específicos de PDF, ferramentas de cálculo de imposto entre estados. Todas elas foram feitas em tipo 10 minutos (4 para sair o <em>core</em> da ferramenta, 6 pra ajustar o <em>front</em>), tudo publicado na <strong>Vercel + Neon</strong>.</p><p>Geração de imagem, conceitos, lógica de negócio, tudo parecia extremamente razoável. Vez ou outra tive problema de contexto, mas melhorou depois de usar arquivos <code>index.md</code> em cada pasta para fazer algo tipo uma <em>working tree</em>, onde esse arquivo <code>index.md</code> simplesmente explicava a relação dos arquivos e o que a IA vai localizar em cada um deles.</p><p>Ao final do período <em>free</em> do ChatGPT, decidi testar o <strong>Claude Code Pro</strong> e fazer coisas um pouco mais complexas (má influência do Akita e Deyvin).</p><p>Aqui foi quando comecei a usar o Claude Code dentro do <strong>WSL</strong> do Windows. Daí em diante foi loucura, eu abri mão totalmente do <strong>VSCode</strong>, mal tocava nos arquivos. Do Claude Code em diante, foi somente <em>prompts</em> atrás de <em>prompts</em> e, no máximo do máximo, escrever um pouco do arquivo <code>projeto.md</code> (onde eu coloco as <em>specs</em> do projeto). Banco de dados também era modificado por prompt, sempre no <strong>Opus 4.7</strong> no <em>effort low</em>, pois só queria abstrações diretas sobre o que eu peço, não gosto quando a IA cria coisas que não pedi.</p><p>Aqui começaram os problemas. Estava fazendo um projeto de <em>marketplace</em>, algo mais simples que uma Shopee, mas ainda assim era bem complexo. Foi aí que tive os maiores problemas de infraestrutura: bati de frente com o limite de chamadas de API da <strong>Vercel</strong>.</p><p>Depois dessa limitação, decidi investir 10 dólares na <strong>Fly.io</strong>, o que se tornou outro problema. Não sei se fui pouco específico nos <em>prompts</em> ou se simplesmente faltava conhecimento meu para usar a plataforma corretamente, mas a verdade é que meus créditos acabaram antes mesmo de eu ter um aplicativo rodando.</p><p>Depois de buscar muito, analisar opções para contratar uma VPS e configurar tudo na mão, acabei escolhendo a <strong>Hostinger</strong>. E agora estou nessa jornada: desenvolvendo aplicativos em busca de clientes para sustentar esse projeto, garantindo conectividade com o mundo e, principalmente, mantendo minha VPS <em>up</em> contra ataques aleatórios. Afinal, aplicar um <em>hardening</em> raiz no servidor e unir o desenvolvimento de IA com a minha bagagem de segurança é a parte mais divertida. Mas o porquê de eu ter escolhido essa VPS e como estou blindando ela, eu conto com mais detalhes em um próximo post.</p><p>Alguém mais aqui já queimou créditos na Fly.io ou na AWS sem querer? Quais estratégias vocês estão usando para não estourar a infraestrutura gerando código e <em>deploys</em> por IA?</p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Desenvolvedor Web em 2026: qual caminho ainda vale a pena?]]></title>
            <link>https://www.tabnews.com.br/pereira299/desenvolvedor-web-em-2026-qual-caminho-ainda-vale-a-pena</link>
            <guid>https://www.tabnews.com.br/pereira299/desenvolvedor-web-em-2026-qual-caminho-ainda-vale-a-pena</guid>
            <pubDate>Tue, 26 May 2026 22:04:37 GMT</pubDate>
            <description><![CDATA[Olá pessoal! Tenho mais de cinco anos de experiência como desenvolvedor web. Já trabalhei em empresas de nível nacional, em projetos remotos para o exterior, e fiz minha parte no universo...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Olá pessoal!</p><p>Tenho mais de cinco anos de experiência como desenvolvedor web. Já trabalhei em empresas de nível nacional, em projetos remotos para o exterior, e fiz minha parte no universo do freelancer. Mas nos últimos tempos, tenho percebido que o cenário do desenvolvimento web tem mudado.</p><p>As LLMs tornaram o desenvolvimento de sites simples acessível para qualquer pessoa com tempo e curiosidade. Um empreendedor consegue montar uma landing page simples num fim de semana. E os sistemas ATS das médias e grandes empresas filtram currículos com uma frieza que nenhum recruiter humano teria.</p><p>Claro que esses sistemas em geral não possuem a mesma qualidade técnica de um sistema criado por um desenvolvedor, mas por vezes acaba sendo a opção escolhida por leigos.</p><p>Então, fica uma simples a pergunta: o que vale mais a pena como desenvolvedor web em 2026? Freelancer, CLT/PJ, micro-saas, ou outra opção.</p><p>Qual a opinião de vocês?</p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Como estruturei o sistema de sorteios do meu app (e por que ninguém ganhou ainda)]]></title>
            <link>https://www.tabnews.com.br/gabrielfr/como-estruturei-o-sistema-de-sorteios-do-meu-app-e-por-que-ninguem-ganhou-ainda</link>
            <guid>https://www.tabnews.com.br/gabrielfr/como-estruturei-o-sistema-de-sorteios-do-meu-app-e-por-que-ninguem-ganhou-ainda</guid>
            <pubDate>Tue, 26 May 2026 20:43:30 GMT</pubDate>
            <description><![CDATA[No meu app, o Zetho, criei uma nova funcionalidade de sorteios gratuita. Nela, os usuários utilizam Z-Coins (moedas conquistadas por meio de interações no app, bem parecido com as TabCoin...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>No meu app, o <a href="https://zetho.app" rel="nofollow">Zetho</a>, criei uma nova funcionalidade de sorteios gratuita. Nela, os usuários utilizam <strong>Z-Coins</strong> (moedas conquistadas por meio de interações no app, bem parecido com as TabCoins aqui do TabNews) para participar de sorteios e concorrer a chaves de jogos.</p><p>Quando pensei em construir essa feature, minha principal preocupação era criar uma implementação que funcionasse de forma eficiente, justa e completamente honesta, onde os usuários tivessem probabilidades reais de ganhar.</p><h3 id="gabrielfr-content-a-regra-de-negócio-e-a-lógica">A Regra de Negócio e a Lógica</h3><p>A lógica por trás é simples: cada sorteio tem uma probabilidade base (<code>basicProbability</code>) que define o intervalo de números no qual o <code>drawNumber</code> (número sorteado) será gerado.</p><ul><li><strong>O dilema da probabilidade:</strong> Inicialmente, pensei em uma probabilidade de 1 para 10.000, mas seria difícil demais. Decidi fixar o padrão em <strong>1 para 1.000</strong>, adaptando para mais ou para menos dependendo da raridade do jogo.</li><li><strong>Evitando "baleias" (anti-farm):</strong> Cada usuário só pode comprar até <strong>10 tickets por dia</strong> para o mesmo sorteio. Fiz isso para garantir que um usuário que farma pontos indefinidamente não tire a chance de quem interage menos. No final, cada ticket comprado dá ao usuário uma chance de 1 para <code>basicProbability</code>.</li></ul><p>Abaixo está o método em TypeScript (NestJS) que lida com a compra e a checagem do sorteio em tempo de execução:</p><pre><code class="hljs language-ts"><span class="hljs-keyword">async</span> <span class="hljs-title function_">purchaseTickets</span>(<span class="hljs-params">    raffleId: <span class="hljs-built_in">string</span>,    userId: <span class="hljs-built_in">string</span>,    dto: PurchaseTicketsDto,  </span>) {    <span class="hljs-keyword">const</span> raffle = <span class="hljs-keyword">await</span> <span class="hljs-variable language_">this</span>.<span class="hljs-title function_">getRaffleOrThrow</span>(raffleId);    <span class="hljs-keyword">if</span> (!raffle.<span class="hljs-property">active</span>) {      <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">BadRequestException</span>(<span class="hljs-string">'Sorteio não está ativo'</span>);    }    <span class="hljs-keyword">const</span> basicProbability = raffle.<span class="hljs-property">basicProbability</span> ?? <span class="hljs-number">1000</span>;    <span class="hljs-keyword">const</span> ticketPrice = raffle.<span class="hljs-property">ticketPrice</span> ?? <span class="hljs-number">30</span>;    <span class="hljs-keyword">const</span> baseTotalCost = dto.<span class="hljs-property">ticketCount</span> * ticketPrice;    <span class="hljs-keyword">await</span> <span class="hljs-variable language_">this</span>.<span class="hljs-title function_">validateDailyTicketLimit</span>(raffleId, userId, dto.<span class="hljs-property">ticketCount</span>);    <span class="hljs-keyword">const</span> profile = <span class="hljs-keyword">await</span> <span class="hljs-variable language_">this</span>.<span class="hljs-title function_">getProfileByUserId</span>(userId);    <span class="hljs-keyword">const</span> currentBalance = <span class="hljs-title class_">Number</span>(profile.<span class="hljs-property">zcoinBalance</span> ?? <span class="hljs-number">0</span>);    <span class="hljs-keyword">const</span> bonus = <span class="hljs-keyword">await</span> <span class="hljs-variable language_">this</span>.<span class="hljs-title function_">getMonthlyInviteBonus</span>(userId);    <span class="hljs-keyword">const</span> discountPercent = bonus.<span class="hljs-property">bonusPercent</span>;    <span class="hljs-keyword">const</span> discountAmount = baseTotalCost * (discountPercent / <span class="hljs-number">100</span>);    <span class="hljs-keyword">const</span> totalCost = <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">max</span>(<span class="hljs-number">0</span>, <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">floor</span>(baseTotalCost - discountAmount));    <span class="hljs-keyword">if</span> (currentBalance &#x3C; totalCost) {      <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">BadRequestException</span>(        <span class="hljs-string">`Saldo insuficiente. Necessário: <span class="hljs-subst">${totalCost}</span> ZCoins, disponível: <span class="hljs-subst">${currentBalance}</span>`</span>,      );    }    <span class="hljs-comment">// Gera os números da sorte do usuário e o número sorteado na mesma execução</span>    <span class="hljs-keyword">const</span> luckyNumbers = <span class="hljs-title class_">Array</span>.<span class="hljs-title function_">from</span>({ <span class="hljs-attr">length</span>: dto.<span class="hljs-property">ticketCount</span> }, <span class="hljs-function">() =></span>      <span class="hljs-title class_">String</span>(<span class="hljs-title function_">randomInt</span>(<span class="hljs-number">1</span>, basicProbability + <span class="hljs-number">1</span>)),    );    <span class="hljs-keyword">const</span> drawNumber = <span class="hljs-title class_">String</span>(<span class="hljs-title function_">randomInt</span>(<span class="hljs-number">1</span>, basicProbability + <span class="hljs-number">1</span>));    <span class="hljs-keyword">const</span> won = luckyNumbers.<span class="hljs-title function_">includes</span>(drawNumber);    <span class="hljs-keyword">const</span> tx = <span class="hljs-keyword">await</span> <span class="hljs-variable language_">this</span>.<span class="hljs-property">tablesDB</span>.<span class="hljs-title function_">createTransaction</span>();    <span class="hljs-keyword">const</span> entryId = <span class="hljs-variable constant_">ID</span>.<span class="hljs-title function_">unique</span>();    <span class="hljs-keyword">const</span> txId = <span class="hljs-variable constant_">ID</span>.<span class="hljs-title function_">unique</span>();    <span class="hljs-keyword">try</span> {      <span class="hljs-keyword">await</span> <span class="hljs-variable language_">this</span>.<span class="hljs-property">tablesDB</span>.<span class="hljs-title function_">createOperations</span>({        <span class="hljs-attr">transactionId</span>: tx.<span class="hljs-property">$id</span>,        <span class="hljs-attr">operations</span>: [          {            <span class="hljs-attr">action</span>: <span class="hljs-string">'decrement'</span>,            <span class="hljs-attr">databaseId</span>: <span class="hljs-title class_">RaffleService</span>.<span class="hljs-property">DB_ID</span>,            <span class="hljs-attr">tableId</span>: <span class="hljs-string">'user_profiles'</span>,            <span class="hljs-attr">rowId</span>: profile.<span class="hljs-property">$id</span>,            <span class="hljs-attr">data</span>: { <span class="hljs-attr">value</span>: totalCost, <span class="hljs-attr">column</span>: <span class="hljs-string">'zcoinBalance'</span> },          },        ],      });      <span class="hljs-keyword">await</span> <span class="hljs-variable language_">this</span>.<span class="hljs-property">tablesDB</span>.<span class="hljs-title function_">createRow</span>({        <span class="hljs-attr">transactionId</span>: tx.<span class="hljs-property">$id</span>,        <span class="hljs-attr">databaseId</span>: <span class="hljs-title class_">RaffleService</span>.<span class="hljs-property">DB_ID</span>,        <span class="hljs-attr">tableId</span>: <span class="hljs-string">'zcoin_transactions'</span>,        <span class="hljs-attr">rowId</span>: txId,        <span class="hljs-attr">data</span>: {          userId,          <span class="hljs-attr">amount</span>: -totalCost,          <span class="hljs-attr">type</span>: <span class="hljs-string">'output'</span>,          <span class="hljs-attr">reason</span>: <span class="hljs-string">'raffle_ticket_purchase'</span>,        },      });      <span class="hljs-keyword">await</span> <span class="hljs-variable language_">this</span>.<span class="hljs-property">tablesDB</span>.<span class="hljs-property">createRow</span>&#x3C;<span class="hljs-title class_">RaffleEntry</span>>({        <span class="hljs-attr">transactionId</span>: tx.<span class="hljs-property">$id</span>,        <span class="hljs-attr">databaseId</span>: <span class="hljs-title class_">RaffleService</span>.<span class="hljs-property">DB_ID</span>,        <span class="hljs-attr">tableId</span>: <span class="hljs-string">'raffle_entries'</span>,        <span class="hljs-attr">rowId</span>: entryId,        <span class="hljs-attr">data</span>: {          raffleId,          userId,          <span class="hljs-attr">ticketCount</span>: dto.<span class="hljs-property">ticketCount</span>,          totalCost,          luckyNumbers,          won,          drawNumber,        },      });      <span class="hljs-keyword">await</span> <span class="hljs-variable language_">this</span>.<span class="hljs-property">tablesDB</span>.<span class="hljs-title function_">updateTransaction</span>({        <span class="hljs-attr">transactionId</span>: tx.<span class="hljs-property">$id</span>,        <span class="hljs-attr">commit</span>: <span class="hljs-literal">true</span>,      });    } <span class="hljs-keyword">catch</span> (error) {      <span class="hljs-keyword">await</span> <span class="hljs-variable language_">this</span>.<span class="hljs-property">tablesDB</span>.<span class="hljs-title function_">updateTransaction</span>({        <span class="hljs-attr">transactionId</span>: tx.<span class="hljs-property">$id</span>,        <span class="hljs-attr">rollback</span>: <span class="hljs-literal">true</span>,      });      <span class="hljs-keyword">throw</span> error;    }    <span class="hljs-keyword">let</span> <span class="hljs-attr">wonKey</span>: <span class="hljs-title class_">GameKey</span> | <span class="hljs-literal">null</span> = <span class="hljs-literal">null</span>;    <span class="hljs-keyword">if</span> (won) {      wonKey = <span class="hljs-keyword">await</span> <span class="hljs-variable language_">this</span>.<span class="hljs-title function_">deliverKey</span>(raffleId, userId);      <span class="hljs-keyword">if</span> (wonKey) {        <span class="hljs-keyword">await</span> <span class="hljs-variable language_">this</span>.<span class="hljs-title function_">handleRaffleClose</span>(raffle);      } <span class="hljs-keyword">else</span> {        <span class="hljs-keyword">await</span> <span class="hljs-variable language_">this</span>.<span class="hljs-title function_">closeRaffle</span>(raffleId);      }    }    <span class="hljs-keyword">const</span> updatedProfile = <span class="hljs-keyword">await</span> <span class="hljs-variable language_">this</span>.<span class="hljs-property">tablesDB</span>.<span class="hljs-property">getRow</span>&#x3C;      <span class="hljs-title class_">Models</span>.<span class="hljs-property">Row</span> &#x26; { zcoinBalance?: <span class="hljs-built_in">number</span> }    >({      <span class="hljs-attr">databaseId</span>: <span class="hljs-title class_">RaffleService</span>.<span class="hljs-property">DB_ID</span>,      <span class="hljs-attr">tableId</span>: <span class="hljs-string">'user_profiles'</span>,      <span class="hljs-attr">rowId</span>: profile.<span class="hljs-property">$id</span>,    });    <span class="hljs-keyword">return</span> {      entryId,      raffleId,      userId,      <span class="hljs-attr">ticketCount</span>: dto.<span class="hljs-property">ticketCount</span>,      baseTotalCost,      discountPercent,      discountAmount,      totalCost,      luckyNumbers,      drawNumber,      won,      <span class="hljs-attr">wonKey</span>: wonKey ? { <span class="hljs-attr">platform</span>: wonKey.<span class="hljs-property">platform</span>, <span class="hljs-attr">key</span>: wonKey.<span class="hljs-property">key</span> } : <span class="hljs-literal">null</span>,      <span class="hljs-attr">newBalance</span>: <span class="hljs-title class_">Number</span>(updatedProfile.<span class="hljs-property">zcoinBalance</span> ?? <span class="hljs-number">0</span>),    };  }</code></pre><h3 id="gabrielfr-content-o-problema-real-estatística-vs-realidade">O problema real: Estatística vs. Realidade</h3><p>Até agora, rodamos aproximadamente <strong>34 sorteios</strong> e <strong>129 tickets</strong> foram gerados no total. <strong>Ninguém ganhou ainda.</strong></p><p>Olhando puramente para a matemática, com uma chance de 1/1000 por ticket e apenas 129 tentativas acumuladas no ecossistema, a probabilidade de termos um ganhador até agora era realmente baixa. Isso me fez pensar se a barreira inicial não ficou alta demais para o volume atual de usuários. Como reflexo disso, dei uma leve reduzida no <code>basicProbability</code> para tornar as coisas mais dinâmicas.</p><p>O que vocês acham dessa abordagem de gerar o <code>drawNumber</code> instantaneamente na compra do ticket em vez de acumular e rodar um <em>cron</em> posterior?</p><p>E, claro, se quiserem testar o app e me ajudar a encontrar os primeiros ganhadores dessas chaves, o <a href="https://zetho.app" rel="nofollow">Zetho</a> está aberto. Feedbacks sobre o código e a lógica são super bem-vindos!</p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Pitch: Mine Hour: Hospedagem de Minecraft Sob Demanda!]]></title>
            <link>https://www.tabnews.com.br/SMCodes/mine-hour-hospedagem-de-minecraft-sob-demanda</link>
            <guid>https://www.tabnews.com.br/SMCodes/mine-hour-hospedagem-de-minecraft-sob-demanda</guid>
            <pubDate>Tue, 26 May 2026 20:19:31 GMT</pubDate>
            <description><![CDATA[Fala pessoal, tudo certo? Gostaria de compartilhar com vocês um projeto que venho desenvolvendo faz um certo tempo e que finalmente está em uma fase publicável Mine Hour (https://minehour...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Fala pessoal, tudo certo?</p><p>Gostaria de compartilhar com vocês um projeto que venho desenvolvendo faz um certo tempo e que finalmente está em uma fase publicável <strong>Mine Hour</strong> (<a href="https://minehour.com/" rel="nofollow">https://minehour.com/</a>).</p><p>Durante anos sempre curti jogar Minecraft com amigos, mas a gente só conseguia se reunir de vez em quando (principalmente nos finais de semana ou algumas poucas horas durante a semana e só quando o host do radmin tava on). O problema era que qualquer serviço de hospedagem de servidor de minecraft cobra uma mensalidade fixa para manter a máquina ligada 24/7. No nosso caso, o servidor ficava vazio em 90% do tempo, e a gente acabava jogando dinheiro fora.</p><p>Daí veio a ideia: por que não criar um serviço de hospedagem onde só se paga pelo tempo em que o servidor está realmente ativo e os jogadores online?</p><p>Se ninguém está jogando, o servidor desliga e o consumo de créditos para. Quando você e seus amigos querem jogar, o servidor inicia em segundos, carrega o mapa de onde parou, e a cobrança é feita de forma transparente por hora de uso de acordo com os créditos que você tem disponíveis.</p><h3 id="smcodes-content-como-funciona-a-infraestrutura-por-trás">Como funciona a infraestrutura por trás</h3><p>Eu queria que a infraestrutura fosse moderna, barata de manter e escalável. O fluxo técnico funciona assim:</p><ol><li><strong>Containers de Minecraft:</strong> Cada servidor é um container temporário na <strong>Oracle Cloud (OCI)</strong> rodando uma imagem customizada de Minecraft. Isso garante isolamento total de recursos e inicialização relativamente rápida.</li><li><strong>Persistência do Mapa:</strong> Toda vez que um servidor desliga ou pausa por inatividade, o estado atualizado do mundo é salvo em um storage compatível com <strong>S3</strong>. Quando o servidor inicia de novo, o mapa é restaurado instantaneamente.</li><li><strong>Roteamento Dinâmico:</strong> Para que os jogadores conectem usando sempre o mesmo IP/domínio, usei um proxy que conheço há muito tempo e sempre quis testar, na minha época dos grandes servidores de mine sempre usava BungeeCord porque era o que tinha na época, mas encontrei esse projeto <strong>Minekube Gate</strong> (escrito em Go). Criei um microserviço em <strong>Rust</strong> que gerencia a tabela de rotas dinamicamente. Quando o servidor é iniciado no painel, a rota é atualizada para redirecionar o tráfego TCP do IP principal direto para o IP temporário do container da Oracle Cloud onde o servidor foi provisionado. O jogador conecta instantaneamente sem precisar saber o IP real do container.</li><li><strong>Desligamento e Avisos In-Game:</strong> Um script monitora a contagem de jogadores ativos. Se o servidor ficar vazio por algum tempo, ele desliga automaticamente para economizar créditos. E se os créditos do usuário estiverem acabando enquanto ele está jogando, enviamos avisos via console do jogo para alertar in-game ("Aviso: Restam 10 minutos de créditos..."), garantindo que ninguém seja desconectado de surpresa.</li></ol><h3 id="smcodes-content-o-que-eu-testei-para-chegar-nessa-infraestrutura">O que eu testei para chegar nessa infraestrutura</h3><p>Inicialmente eu queria usar Magalu Cloud, uma vez descobri sobre a existência desse provedor de cloud da magalu, quando tive a ideia dessa minha plataforma sempre pensei em usar a Magalu Cloud principalmente pelos preços por hora ser muito competitivo, porém tinha alguns impasses, fazer automações grandes como usar kubernetes é complicado para o meu caso eu estava fugindo de custos fixos principalmente nessa fase inicial, tentei usar a função snapshot da magalu, achei interessante funcionou perfeitamente para o meu caso, a instancia iniciava em um tempo relativamente bom, e só tive o trabalho para automatizar deploys de novas snapshot, porém ao entrar em contato com o suporte da magalu cloud perguntei se eu poderia fazer uma aplicação de tipo, e se não caracterizava revenda, eles consultaram o juridico e no fim não consegui dar prosseguimento na magalu, e também eu teria que solicitar mais cotas de instancias, posso criar se não me engano no máximo 6, não me lembro exatamente agora.</p><p>Considerando preços da AWS estava fora do radar no brasil, então só usei a AWS para hospedar o backend. Entre outras opções acredito que a Oracle Cloud foi o que mais encaixou para o meu caso, mesmo sendo ligeiramente mais caro que a Magalu.</p><hr><p>O projeto está no ar em <a href="https://minehour.com/" rel="nofollow">https://minehour.com/</a>.</p><p>Se vocês puderem comentar sobre essa abordagem de cobrança por hora em servidores de minecraft e sobre a arquitetura de infraestrutura.</p><p>Se quiserem trocar uma ideia sobre o projeto e dar uma força, entrem no discord que criei: <a href="https://discord.gg/DxJFknfmHZ" rel="nofollow">https://discord.gg/DxJFknfmHZ</a></p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Conseguir Emprego Bem Pago Sem Diploma: O Que Realmente Funciona (e o Que Não Funciona)]]></title>
            <link>https://www.tabnews.com.br/gorpo85/conseguir-emprego-bem-pago-sem-diploma-o-que-realmente-funciona-e-o-que-nao-funciona</link>
            <guid>https://www.tabnews.com.br/gorpo85/conseguir-emprego-bem-pago-sem-diploma-o-que-realmente-funciona-e-o-que-nao-funciona</guid>
            <pubDate>Tue, 26 May 2026 18:34:30 GMT</pubDate>
            <description><![CDATA[A maioria das pessoas que tenta isto falha. E falha pelos mesmos motivos. Não são os que imaginas. O que o mercado quer mesmo O diploma nunca foi prova de que sabes fazer alguma coisa. Na...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p><em>A maioria das pessoas que tenta isto falha. E falha pelos mesmos motivos. Não são os que imaginas.</em></p><hr><h2 id="gorpo85-content-o-que-o-mercado-quer-mesmo">O que o mercado quer mesmo</h2><p>O diploma nunca foi prova de que sabes fazer alguma coisa. Na prática, era uma forma de dizer "esta pessoa conseguiu comprometer-se com algo durante anos". Isso tem valor. O problema é que o mercado começou a aceitar outras formas de dizer a mesma coisa, mas só em certas áreas.</p><p>As áreas onde isto funciona mesmo: programação, design digital, marketing e SEO, vendas B2B, segurança informática, cloud e infraestrutura, criação de conteúdo com audiência real. Basicamente, áreas onde o teu trabalho é visível e mensurável.</p><blockquote><p>Medicina, direito, engenharia civil, arquitectura: esqueço. Não há atalho aqui que funcione na prática. Melhor saber isto agora do que descobrir a meio caminho.</p></blockquote><h2 id="gorpo85-content-os-desafios-reais-não-os-óbvios">Os desafios reais (não os óbvios)</h2><p><strong>O filtro automático.</strong> Grande parte das candidaturas online passa por um software, o chamado ATS, que filtra CVs antes de qualquer pessoa os ler. Bom, esse software muitas vezes elimina quem não tem grau académico. O teu CV pode ser excelente e nunca chegar a nenhum humano.</p><p><strong>O tecto invisível.</strong> Entrar é difícil, mas há outro problema que aparece depois. Mesmo que consigas o emprego, promoções para cargos de chefia em empresas grandes podem ser bloqueadas internamente por falta de diploma. Ninguém te diz isso directamente, mas está nos critérios formais de RH.</p><p><strong>Tens de provar mais.</strong> Para substituir o diploma, precisas de portfolio, projectos reais, resultados documentados. Aliás, este processo leva mais tempo e mais energia do que muita gente imagina quando começa.</p><p><strong>O peso cultural.</strong> Em muitos contextos, em África e boa parte da Europa incluídos, o diploma tem um peso social enorme. Na prática, isso significa que em cada entrevista estás a pedir credibilidade emprestada. Com o tempo, cansa.</p><p><strong>Depende muito de onde te candidatas.</strong> Uma startup pequena contrata-te pelo que fazes. Uma grande empresa com departamento de RH tem uma checklist e tu não a preenches.</p><h2 id="gorpo85-content-onde-as-pessoas-perdem">Onde as pessoas perdem</h2><p>O erro mais comum não é não saber fazer as coisas. É confundir estudar com trabalhar. Ou seja, alguém passa um ano e meio a fazer cursos online, acumula doze certificados, e na entrevista não tem um único projecto real para mostrar.</p><blockquote><p>Certificados sem trabalho real para mostrar valem muito pouco. O mercado quer saber o que construíste, o que vendeste, o problema que resolveste. Não quer a tua lista de cursos.</p></blockquote><p>O segundo erro é bater à porta errada. Tentar entrar directamente numa empresa grande sem diploma e sem rede de contactos é, na prática, uma perda de tempo. O caminho funciona assim: freelance primeiro, depois startups pequenas, depois médias, depois empresas maiores. Saltas etapas e ficas preso.</p><p>O terceiro erro, e este é subtil, é só pensar em networking quando precisas de emprego. Nessa altura já é tarde. Os contactos que te ajudam são os que te conhecem antes de precisares deles.</p><h2 id="gorpo85-content-os-perfis-que-se-vão-dar-mal">Os perfis que se vão dar mal</h2><p><strong>O Eterno Estudante.</strong> Faz curso atrás de curso. Sente que "ainda não está pronto". Fica nesse loop para sempre e nunca chega à fase de fazer.</p><p><strong>O Candidato Passivo.</strong> Envia CVs para vagas online, espera, não recebe resposta, fica frustrado. Espera que o processo funcione igual ao de quem tem diploma. Não funciona.</p><p><strong>O Generalista Sem Foco.</strong> Sabe um bocado de tudo: marketing, código, design, gestão. Bom, o problema é que ninguém o contrata para nada específico porque não resolve nenhum problema concreto de forma clara.</p><p><strong>O Impaciente.</strong> Quer salário alto em seis meses. Recusa começar por baixo. Acha que freelance ou estágios estão abaixo da sua capacidade. Fica à espera de uma oportunidade que não aparece.</p><p><em>O que separa quem consegue de quem não consegue não é o talento. É conseguir gerar prova visível do seu trabalho antes de precisar de emprego.</em></p><h2 id="gorpo85-content-como-se-dar-bem-se-reunires-as-condições-certas">Como se dar bem, se reunires as condições certas</h2><p>Precisas de três coisas ao mesmo tempo: especialização numa área com procura real, evidências públicas do teu trabalho, e acesso directo a quem decide, não a formulários de candidatura.</p><h3 id="gorpo85-content-1-especializa-te-onde-há-falta-de-gente">1. Especializa-te onde há falta de gente</h3><p>Não sejas "developer". Sê a pessoa que resolve problemas de performance em lojas Shopify, ou que faz ads para empresas SaaS B2B, ou que trabalha segurança em contratos de blockchain. Quanto mais específico, menos concorrência e mais fácil justificar um preço alto. Generalistas competem com toda a gente. Especialistas têm lista de espera.</p><h3 id="gorpo85-content-2-constrói-o-teu-historial-antes-de-precisar-dele">2. Constrói o teu historial antes de precisar dele</h3><p>Portfolio, artigos onde explicas o que fazes, projectos com resultados reais. Na minha experiência, um developer sem diploma que tem três projectos públicos com tráfego real impressiona mais em entrevista do que muitos recém-licenciados. A tua presença online substitui o diploma, e ao contrário do diploma podes actualizá-la quando quiseres.</p><p>Uma coisa importante: publica o processo, não só o resultado. Escreve sobre o que correu mal e como resolveste. Isso diz muito mais sobre ti do que mostrar só o produto final.</p><h3 id="gorpo85-content-3-evita-o-processo-de-recrutamento-padrão">3. Evita o processo de recrutamento padrão</h3><p>O sistema de candidaturas foi feito para filtrar com base em critérios formais. Tu não tens esses critérios, então não entres por essa porta. Contacta directamente fundadores, directores técnicos, pessoas cujo trabalho admiras. Contribui para os projectos delas. Oferece uma semana de trabalho grátis para uma empresa que queres impressionar. Isso vale mais do que cinquenta candidaturas enviadas para formulários que ninguém lê.</p><h3 id="gorpo85-content-4-começa-pelo-freelance-não-pelo-emprego">4. Começa pelo freelance, não pelo emprego</h3><p>O freelance elimina o filtro do diploma quase por completo. Ninguém te pede certificado quando já entregaste resultados. Dois ou três clientes satisfeitos com trabalho documentado valem mais do que qualquer curso. Quando finalmente te candidatas a um emprego, entras como profissional com historial, não como mais um candidato anónimo.</p><h3 id="gorpo85-content-5-usa-certificações-com-cabeça">5. Usa certificações com cabeça</h3><p>Certificações não são iguais a diplomas, mas em áreas técnicas fecham parte do gap. AWS, Google Cloud, certificações de segurança como OSCP, Google Ads: são sinais que alguns sistemas reconhecem. O importante é dominar uma ou duas a fundo. Coleccionar certificados sem profundidade é o mesmo erro do ponto anterior.</p><h2 id="gorpo85-content-a-verdade-que-fica-por-dizer">A verdade que fica por dizer</h2><p>Conseguir emprego bem pago sem diploma é possível. Mas é mais difícil, não mais fácil. A ideia de que "o diploma já não vale nada" é, honestamente, enganadora. O diploma ainda poupa anos de trabalho de construção de credibilidade. O que mudou é que existem substitutos, mas exigem mais disciplina, mais paciência e mais tolerância à rejeição do que simplesmente acabar uma licenciatura.</p><blockquote><p>Se estás nisto para evitar esforço, não vai funcionar. O caminho sem diploma exige mais esforço, não menos.</p></blockquote><p>Mas se tens a especialização certa, a disciplina para construir prova pública, e a paciência para seguir o canal certo: o mercado recompensa. E quando recompensa, faz-o bem.</p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Pitch: 12 Anos e criei meu SO.]]></title>
            <link>https://www.tabnews.com.br/LucasPR/12-anos-e-criei-meu-so</link>
            <guid>https://www.tabnews.com.br/LucasPR/12-anos-e-criei-meu-so</guid>
            <pubDate>Tue, 26 May 2026 17:31:26 GMT</pubDate>
            <description><![CDATA[Tenho 12 anos e criei meu próprio Sistema Operacional Gráfico do zero (sem Linux) rodando em disco real. O que aprendi nessa jornada. Olá, pessoal do TabNews! Meu nome é Lucas Prado Coelh...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Tenho 12 anos e criei meu próprio Sistema Operacional Gráfico do zero (sem Linux) rodando em disco real. O que aprendi nessa jornada.</p><p>Olá, pessoal do TabNews! Meu nome é Lucas Prado Coelho, tenho 12 anos e gostaria de compartilhar com vocês o meu maior desafio técnico até hoje: o desenvolvimento do GenesisOS, um sistema operacional gráfico de 32 bits escrito do absoluto zero (em C e Assembly x86) que roda diretamente no hardware emulado.</p><p>Sei que este é um projeto estritamente educacional e que um sistema de hobista não tem o objetivo de competir com gigantes como o Windows ou o Linux, mas a quantidade de conceitos de baixo nível, eletrônica e arquitetura de computadores que aprendi ao longo dessa jornada foi simplesmente incrível.</p><p>Gostaria de detalhar os principais componentes que precisei programar para fazer o GenesisOS ganhar vida:</p><p>🚀 A Arquitetura do GenesisOS</p><p>Diferente de muitas distribuições que utilizam o kernel do Linux como base, o GenesisOS roda em modo bare-metal (direto no metal). Ele usa o padrão Multiboot e inicializa em modo protegido de 32 bits.</p><p>Aqui estão os pilares que precisei construir para que o sistema funcionasse:</p><ol><li>Driver de Vídeo e o Modo Gráfico (BGA)</li></ol><p>Para sair da tradicional tela de texto preta do VGA, precisei programar um driver para a placa de vídeo emulada do QEMU (a Bochs Graphics Adapter ou BGA).</p><p>Ativei a resolução de 1024x768 pixels em 32-bit True Color (milhões de cores) enviando comandos de escrita diretamente nas portas físicas 0x01CE e 0x01CF.</p><p>Para evitar que as janelas e o mouse piscassem na tela ao serem arrastados (flickering), implementei a técnica de Double Buffering. Todo o sistema é desenhado de forma extremamente rápida em uma tela invisível de 3MB na memória RAM (backbuffer) e, ao final de cada quadro, o bloco inteiro é copiado ("blitado") para a memória de vídeo física (0xFD000000).</p><ol start="2"><li>Driver de Disco Rígido e o GenesisOS File System (GFS)</li></ol><p>Este foi um dos maiores desafios. Em vez de simular arquivos em memória estática, programei um driver de disco rígido IDE/ATA físico usando comunicação de hardware via portas I/O (0x1F0 a 0x1F7) em modo PIO de 28 bits (LBA28).</p><p>Criei o GFS (GenesisOS File System). Ao iniciar o sistema pela primeira vez, o kernel lê o Setor 1 do HD virtual (disk.img). Se o disco estiver em branco, ele formata o disco e grava a tabela de arquivos mestre.</p><p>O sistema de arquivos é persistente e real: quando você cria um arquivo ou apaga no File Explorer, a tabela é reescrita e gravada fisicamente de volta no arquivo de disco. Ao reiniciar o emulador, as modificações continuam lá!</p><ol start="3"><li>Driver do Mouse Físico (PS/2)</li></ol><p>Habilitei a porta auxiliar do mouse no controlador de teclado (0x64). O mouse PS/2 envia dados em ciclos rápidos de 3 bytes (botões clicados, delta X e delta Y).</p><p>Usei uma verificação de sincronização baseada no bit 3 do primeiro byte (!(data &#x26; 0x08)) para garantir que o mouse nunca perca o alinhamento de leitura e o cursor não saia deslizando sozinho de forma caótica.</p><ol start="4"><li>Relógio CMOS em Tempo Real</li></ol><p>Para exibir a hora exata no sistema, programei a leitura do chip CMOS da placa-mãe (portas 0x70 e 0x71). Para não sobrecarregar o hardware com leituras constantes (o que causava lag), implementei um limitador de quadros para ler as horas apenas a cada 30 frames.</p><p>🎨 A Interface Gráfica (Aero/Luna Vibe) e os Apps</p><p>A interface visual do GenesisOS foi inspirada na era do Windows XP (Luna Theme) e Windows Vista (Frutiger Aero). Desenhei botões com faixas brilhantes (glossy glass) e janelas com cantos arredondados (calculados via raio matemático no laço de pixels).</p><p>Docks Modularizados: A barra de tarefas foi substituída por 4 docks independentes (SYSTEM, APPS, POWER e CLOCK) que podem ser arrastados livremente para qualquer canto da tela. Ao soltá-los, eles sofrem uma atração magnética (snapping) e se acoplam suavemente nas bordas.</p><p>File Explorer Hierárquico: Permite navegar por diretórios reais do HD (Root / e /documents), além de possuir funções de Criar, Deletar e Renomear arquivos.</p><p>Notepad (Editor de Texto): Ao abrir um arquivo .txt no File Explorer, você pode usar o seu teclado físico para digitar textos e salvar as alterações direto no setor físico correspondente do HD.</p><p>Genesis Paint: Um aplicativo de desenho em escala de 64x64 pixels onde você arrasta o mouse físico real para desenhar e pode salvar sua arte direto no disco.</p><p>🛠️ Como desenvolvi tudo no Windows?</p><p>Desenvolver sistemas operacionais no Windows de forma nativa é um desafio conhecido devido ao formato de arquivos executáveis (PE vs ELF). Resolvi isso utilizando a cadeia de compiladores cruzados i686-elf-tools do projeto do Lordmilko no GitHub.</p><p>Para agilizar o desenvolvimento, configurei um script em PowerShell (compile.ps1) com loop de Auto-Heal (Auto-Correção):</p><p>Toda vez que o GCC 15 exibe um erro de digitação do tipo "did you mean 'sugestao'?", o próprio script analisa o log de erros, substitui a variável incorreta no kernel.c e tenta compilar novamente de forma autônoma!</p><p>📦 Código e Download da ISO</p><p>O GenesisOS está com o código-fonte totalmente aberto. O repositório contém as instruções de compilação, o script de auto-correção, o arquivo do linker e o bootloader.</p><p>📂 Repositório no GitHub: <a href="https://prilugano992-cmyk.github.io/Lucas-s-Projects/" rel="nofollow">https://prilugano992-cmyk.github.io/Lucas-s-Projects/</a></p><p>💾 Download Direto da ISO Bootável: <a href="https://github.com/prilugano992-cmyk/Lucas-s-Projects/releases/download/v1.0.0/genesis.iso">https://github.com/prilugano992-cmyk/Lucas-s-Projects/releases/download/v1.0.0/genesis.iso</a></p><p>Fiquei muito feliz em concluir esse ciclo de desenvolvimento do GenesisOS. Gostaria de ouvir o feedback de vocês, dicas de baixo nível e sugestões de arquitetura. Muito obrigado!</p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Eu achava que "tudo que eu penso já existe", até parar de buscar ideias e começar a fatiar]]></title>
            <link>https://www.tabnews.com.br/realknove/eu-achava-que-tudo-que-eu-penso-ja-existe-ate-parar-de-buscar-ideias-e-comecar-a-fatiar</link>
            <guid>https://www.tabnews.com.br/realknove/eu-achava-que-tudo-que-eu-penso-ja-existe-ate-parar-de-buscar-ideias-e-comecar-a-fatiar</guid>
            <pubDate>Tue, 26 May 2026 17:12:36 GMT</pubDate>
            <description><![CDATA[Por muito tempo eu travei no mesmo lugar: toda ideia de projeto que me vinha, eu descartava com "isso já existe". E quase sempre existia mesmo, de alguma forma. O resultado é que eu não t...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Por muito tempo eu travei no mesmo lugar: toda ideia de projeto que me vinha, eu descartava com "isso já existe". E quase sempre existia mesmo, de alguma forma. O resultado é que eu não terminava nada — nem começava.</p><p>O que destravou não foi ter uma ideia genial. Foi mudar duas coisas.</p><p>A primeira: parei de buscar ideias originais e comecei a buscar problemas que me incomodam. Originalidade quase nunca está no conceito — está no recorte. Já existe editor de texto, já existe app de tarefa, já existe tudo. Mas não existe feito do seu jeito, pro seu uso, com as decisões que você tomaria.</p><p>No meu caso o incômodo era ruído de terminal. npm install cospe 3000 linhas. Stack trace longo empurra pra fora da tela justamente a linha que importa. Eu queria algo que pegasse esse output caótico e mostrasse só o que interessa — não escondendo, mas re-apresentando.<br>A ideia que fechou foi: tratar o output como estado, não como histórico. Em vez de um rio de linhas rolando, um cabeçalho vivo com contadores e a fase atual colapsada num item só. Warnings e erros quebram a sequência e ficam visíveis. Chamei de IceTea, feito em Go.</p><p>A segunda mudança, e a que mais importou: fatiar. "Fazer o IceTea" é uma tarefa que trava qualquer um — escopo grande demais, você nem sabe por onde pegar. Então quebrei em marcos minúsculos, cada um com algo funcionando no fim:</p><p>Marco 0: rodar um comando filho e capturar stdout/stderr. Só isso. ~80 linhas.<br>Marco 1: classificar cada linha (info/warn/erro) e contar.<br>Marco 2: a primeira TUI, feia, só o cabeçalho vivo.<br>Marco 3: cair pra modo texto quando não é terminal (pipe, CI).<br>Marco 4: o colapso de verdade — 150 linhas de info viram uma só.</p><p>Cada marco era uma sessão curta. Em nenhum momento eu tinha nas mãos um monte de código que eu não entendia. E isso me leva à terceira parte, que eu quero falar abertamente: usei IA no processo — Claude pra discutir arquitetura. Mas não do jeito "manda fazer o projeto inteiro". Cada marco era um prompt pequeno e específico. Quando o código voltava, eu lia inteiro e pedia explicação do que não entendia antes de seguir. O fatiamento não era só organização — era o que me mantinha dono do código. Um IceTea de 2000 linhas que a IA cospe de uma vez não é meu projeto; cinco marcos de ~100 linhas que eu entendo são.<br>E parei no v0.1.0 de propósito. Tenho uma lista de features (scroll, perfis por ferramenta, etc.), mas antes de adicionar qualquer coisa quero usar a ferramenta de verdade por uma semana e deixar o uso real dizer o que importa — em vez de adivinhar.</p><p>O projeto tá aqui, se quiserem ver ou destruir no code review: github.com/realknove/IceTea</p><p>Mas o que eu queria mesmo deixar é o aprendizado, que serve pra qualquer projeto: a barreira raramente é falta de ideia original. É escopo grande demais e medo de começar. Recorte um problema seu, fatie até o primeiro pedaço caber numa tarde, e termine esse pedaço. O resto vem.</p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[O Preço Real do Token: Por que Gigantes da Tecnologia Estão Descobrindo que a IA Custa Mais que Humanos]]></title>
            <link>https://www.tabnews.com.br/KerubinDev/o-preco-real-do-token-por-que-gigantes-da-tecnologia-estao-descobrindo-que-a-ia-custa-mais-que-humanos</link>
            <guid>https://www.tabnews.com.br/KerubinDev/o-preco-real-do-token-por-que-gigantes-da-tecnologia-estao-descobrindo-que-a-ia-custa-mais-que-humanos</guid>
            <pubDate>Tue, 26 May 2026 16:37:03 GMT</pubDate>
            <description><![CDATA[O slide da consultoria de terno cinza aceita qualquer palhaçada. Na planilha de projeção do CFO, a conta parecia simples: demitir dez analistas de suporte, desligar algumas licenças de so...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>O slide da consultoria de terno cinza aceita qualquer palhaçada. Na planilha de projeção do CFO, a conta parecia simples: demitir dez analistas de suporte, desligar algumas licenças de software legado e colocar um agente autônomo baseado em LLM rodando na nuvem. Economia projetada de 80% na folha de pagamento e atendimento 24 horas por dia.</p><p>Aí o sistema vai para a produção.</p><p>E a realidade da infraestrutura de hardware bate na porta com a sutileza de um martelo de forja.</p><p>O que as grandes empresas estão descobrindo da pior maneira é que a física da computação não liga para o hype de marketing. Substituir o discernimento humano por modelos de linguagem gigantescos não é uma simples troca de linhas de orçamento. É a substituição de uma força de trabalho biologicamente otimizada por uma cadeia de custos de processamento que escala de forma caótica.</p><h2 id="kerubindev-content-a-física-do-silício-contra-a-heurística-de-um-prato-de-comida">A Física do Silício contra a Heurística de um Prato de Comida</h2><p>Um analista pleno de suporte resolve problemas complexos de clientes consumindo o equivalente calórico de um prato de almoço comercial. Ele usa heurística acumulada, contexto social e a capacidade intrínseca de ler entrelinhas para entender que o cliente está irritado porque o pagamento falhou na API de faturamento.</p><p>Para fazer uma máquina ter uma fração dessa capacidade de discernimento, você precisa de um cluster de GPUs Nvidia H100 consumindo centenas de watts de energia por placa, sem contar a infraestrutura de refrigeração do data center necessária para manter esse silício operando sem derreter.</p><p>O custo de processamento de dados cresce de forma brutal à medida que o tamanho do contexto do modelo aumenta. O mecanismo de atenção das arquiteturas Transformer escala o consumo de recursos de forma quadrática em relação ao tamanho da janela de contexto. Traduzindo do jargão acadêmico para o mundo real da produção: quanto mais documento, histórico de conversa e logs de erro você envia para a IA tentar entender o que está acontecendo, mais cara e lenta fica cada palavra gerada por ela.</p><h2 id="kerubindev-content-o-ralo-silencioso-da-inferência-de-modelos-de-linguagem">O Ralo Silencioso da Inferência de Modelos de Linguagem</h2><p>Se você já tentou subir um sistema com agentes autônomos na produção, conhece a armadilha do orquestrador. Na teoria, você programa o agente para planejar, autoavaliar e corrigir as próprias respostas antes de entregar o resultado final para o usuário.</p><p>Na prática, isso se traduz em um loop de requisições assíncronas que queima créditos de API em velocidade recorde.</p><p>Uma única pergunta do usuário pode disparar dez chamadas internas de API. O agente decide buscar informações no banco de dados vetorial, falha na primeira busca, tenta um termo de pesquisa diferente, recebe uma resposta com dados estruturados incorretamente, entra em uma rotina de autocorreção para formatar o JSON e, finalmente, gera uma resposta padrão de três linhas que um atendente humano digitaria em dez segundos.</p><p>A conta de tokens de entrada e saída explode antes do fim do expediente. O custo unitário por transação deixa de fazer qualquer sentido econômico. Você acha que está economizando dinheiro tirando um salário fixo da folha de pagamento, mas acaba com uma conta de processamento na nuvem que é variável, imprevisível e que escala direto para o limite do cartão corporativo caso um único usuário decida abusar do sistema com prompts imensos.</p><p>E o pior: o sistema é frágil de uma forma que os sistemas tradicionais nunca foram.</p><h2 id="kerubindev-content-o-custo-oculto-da-manutenção-de-sistemas-imprevisíveis">O Custo Oculto da Manutenção de Sistemas Imprevisíveis</h2><p>Quando um microsserviço tradicional em Go ou Node.js quebra, você tem um stack trace limpo no console, um log de erro óbvio e uma rota que você consegue corrigir em minutos.</p><p>Quando um sistema baseado em IA quebra, a falha é silenciosa e bizarra.</p><p>O modelo pode simplesmente decidir que o formato do JSON que ele gerava perfeitamente há três semanas agora precisa ter um campo aninhado extra porque a empresa parceira atualizou silenciosamente o modelo de fundação na nuvem. Essa mudança sutil quebra o seu parser interno de backend, gerando um erro de desmaterialização de objeto que paralisa o fluxo de checkout e joga um erro genérico na cara do cliente final.</p><p>Quem corrige isso não é a IA. É o engenheiro de software sênior que custa caro por hora e que precisa gastar metade do dia ajustando prompts, testando novos limites de temperatura do modelo e criando validações manuais via código tradicional para garantir que a saída estatística da IA não destrua o banco de dados SQL da empresa.</p><p>Você acabou de trocar o custo de um analista de nível médio pelo custo de uma infraestrutura de nuvem inflacionada somada à hora técnica de engenheiros altamente especializados dedicados a monitorar se a máquina está alucinando ou não.</p><h2 id="kerubindev-content-a-redução-de-danos-e-a-volta-ao-pragmatismo">A Redução de Danos e a Volta ao Pragmatismo</h2><p>Até gigantes como Microsoft, Uber e diversas empresas do mercado financeiro estão batendo de frente com a realidade dos números. A margem bruta de softwares baseados em IA pura é muito menor do que a do software tradicional baseado em lógica determinística exatamente por causa desse ralo de inferência.</p><p>A estratégia de investir tudo em IA em 2026 precisa passar por um filtro de engenharia de valor real.</p><p>Colocar modelos generativos gigantescos para ler PDFs e responder perguntas internas é um desperdício de recurso computacional que beira o ridículo. A maior parte das tarefas operacionais que as empresas tentam resolver com IA generativa de uso geral seria resolvida de forma dez vezes mais barata e rápida com rotinas tradicionais de processamento de texto, sistemas de busca baseados em palavras-chave bem indexados ou modelos de machine learning clássicos e especializados de tamanho reduzido rodando localmente em servidores baratos.</p><p>O mercado está acordando do coma do hype técnico. A inteligência artificial tem seu espaço como ferramenta de apoio técnico para aumentar a produtividade de quem já é bom, mas tentar usar ela como substituta barata da mão de obra sem fazer o cálculo do consumo real de hardware e da equipe de suporte necessária para manter a máquina funcionando é apenas uma receita rápida para queimar caixa e enriquecer provedor de nuvem.</p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Pitch: Como resolvi o problema de lag do macOS no Cloud Gaming criando um utilitário nativo em Swift (Open Source)]]></title>
            <link>https://www.tabnews.com.br/victorbrandaao/como-resolvi-o-problema-de-lag-do-macos-no-cloud-gaming-criando-um-utilitario-nativo-em-swift-open-source</link>
            <guid>https://www.tabnews.com.br/victorbrandaao/como-resolvi-o-problema-de-lag-do-macos-no-cloud-gaming-criando-um-utilitario-nativo-em-swift-open-source</guid>
            <pubDate>Tue, 26 May 2026 15:23:29 GMT</pubDate>
            <description><![CDATA[Como resolvi o problema de lag do macOS no Cloud Gaming criando um utilitário nativo em Swift (Open Source) Fala, pessoal! Como estudante de Engenharia de Software aqui em Recife, eu semp...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><h1 id="victorbrandaao-content-como-resolvi-o-problema-de-lag-do-macos-no-cloud-gaming-criando-um-utilitário-nativo-em-swift-open-source">Como resolvi o problema de lag do macOS no Cloud Gaming criando um utilitário nativo em Swift (Open Source)</h1><p>Fala, pessoal!</p><p>Como estudante de Engenharia de Software aqui em Recife, eu sempre acabo esbarrando em problemas que me forçam a sair do desenvolvimento web/backend tradicional e descer um pouco mais para o nível do sistema operacional. O mais recente foi tentar jogar via Cloud Gaming (GeForce NOW, xCloud, Moonlight, etc.) no Mac.</p><h2 id="victorbrandaao-content--o-problema">🔴 O Problema</h2><p>O macOS tem um comportamento terrível para streaming de alta taxa de atualização e baixa latência.</p><p>De tempos em tempos, o sistema usa a interface <code>awdl0</code> (Apple Wireless Direct Link, responsável pelo AirDrop e Handoff) para escanear a rede em background. Isso tira o Wi-Fi do canal principal por frações de segundo, resultando em <em>ping spikes</em> absurdos e travamentos na tela. Além disso, os processos em segundo plano roubando CPU e a aceleração nativa do mouse da Apple atrapalham muito a fluidez e a precisão.</p><h2 id="victorbrandaao-content--a-solução-cloudboost">🟢 A Solução: CloudBoost</h2><p>Para resolver isso, desenvolvi uma ferramenta de barra de menus (menu bar) nativa em <strong>Swift</strong> chamada <strong>CloudBoost</strong>. A ideia é ser um utilitário leve que "blinda" o sistema enquanto você joga, e depois devolve tudo ao normal com um clique.</p><p>O que o script automatiza por baixo dos panos quando ativado:</p><ul><li><strong>Estabiliza a rede:</strong> Desativa o AWDL temporariamente para matar os picos de ping causados por escaneamento de rede.</li><li><strong>Injeta prioridade máxima:</strong> Usa o comando <code>renice (-20)</code> focado no processo do jogo selecionado para que a CPU não seja roubada por tarefas em background.</li><li><strong>Trava a performance:</strong> Pausa o Time Machine e roda o processo nativo <code>caffeinate</code> para evitar <em>throttling</em> de performance e economia de energia no meio da partida.</li><li><strong>Otimiza recursos:</strong> Limpa o cache de DNS para rotas limpas e força um <em>purge</em> na memória unificada inativa, liberando espaço para o decoder de vídeo.</li><li><strong>Bypass de Mouse:</strong> Aplica perfis de <em>Raw Input</em> para contornar a curva de aceleração padrão do macOS (útil para FPS/MOBA).</li></ul><h2 id="victorbrandaao-content-️-binário-universal-e-open-source">⚙️ Binário Universal e Open Source</h2><p>Recentemente, reescrevi a arquitetura principal para compilar como um <strong>Universal Binary</strong>. Isso significa que ele roda nativamente no <em>bare metal</em>, tanto nos novos Macs M-Series (<code>arm64</code>) quanto na raça guerreira dos Macs Intel (<code>x86_64</code>), sem passar pela sobrecarga da tradução do Rosetta.</p><p>O projeto é 100% gratuito e agora está sob a licença <strong>GPLv3</strong> (para evitar que peguem o código aberto, fechem e tentem vender na App Store, o que infelizmente é comum com ferramentas de nicho).</p><h2 id="victorbrandaao-content--feedback">🤝 Feedback</h2><p>Gostaria muito do feedback da comunidade! Se alguém manjar de Swift, automação no macOS ou tiver ideias de como melhorar o gerenciamento de processos (atualmente implementei um sistema de Allowlist/Blocklist para o alvo do <code>renice</code>), toda contribuição ou PR no repositório é muito bem-vinda.</p><p>🔗 <strong>Repositório GitHub e Download:</strong> <a href="https://github.com/victorbrandaao/CloudBoost">CloudBoost no GitHub</a></p><p>Valeu!</p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Como meu agente de IA mudou a forma como os times da empresa fazem code review e o que aprendemos no caminho]]></title>
            <link>https://www.tabnews.com.br/Craverath/como-meu-agente-de-ia-mudou-a-forma-como-os-times-da-empresa-fazem-code-review-e-o-que-aprendemos-no-caminho</link>
            <guid>https://www.tabnews.com.br/Craverath/como-meu-agente-de-ia-mudou-a-forma-como-os-times-da-empresa-fazem-code-review-e-o-que-aprendemos-no-caminho</guid>
            <pubDate>Tue, 26 May 2026 15:22:42 GMT</pubDate>
            <description><![CDATA[O contexto: code review na era da IA Code review sempre foi um dos rituais mais importantes da engenharia. Mas seja honesto: quantas vezes um PR fica parado por dias esperando alguém olha...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>O contexto: code review na era da IA<br>Code review sempre foi um dos rituais mais importantes da engenharia. Mas seja honesto: quantas vezes um PR fica parado por dias esperando alguém olhar? Quantas vezes a revisão acontece no automático, com um "tá bom, pode subir" depois de bater o olho em 800 linhas?</p><p>Numa era em que muito código é escrito por IA, revisar virou ainda mais crítico. Código gerado por IA tende a parecer correto, e é justamente aí que mora o risco.</p><p>E quando falamos de segurança, o jogo muda completamente. SQL injection, secrets vazados, criptografia mal implementada, validação ausente. Esses são bugs que você NÃO quer descobrir em produção. Revisão de segurança exige um tipo de raciocínio diferente da revisão de engenharia: outro vocabulário, outro modelo mental, outros padrões.</p><p>A decisão: dois subagentes especializados, não um generalista<br>Aqui está a primeira lição que quero compartilhar: misturar code review e security review num único agente produz um resultado não tão bom nos dois lados.</p><p>Foi por isso que o projeto nasceu com dois subagentes independentes, cada um com seu foco e, importante, cada um rodando em um modelo de IA diferente. Um é responsável pela revisão de engenharia (arquitetura, performance, qualidade) e roda no Gemini 3, o modelo mais recente do Google. O outro é responsável pela revisão de segurança (OWASP, secrets, crypto) e roda no Claude Opus 4.7, o modelo mais avançado da Anthropic.</p><p>A escolha de cada modelo foi proposital. O Gemini 3 tem se mostrado excelente em raciocínio sobre código em escala, captando padrões arquiteturais e questões de performance com bastante precisão. Já o Claude Opus 4.7 brilha em tarefas que exigem raciocínio cuidadoso, output estruturado e atenção ao detalhe, exatamente o perfil que segurança demanda.</p><p>Essa estratégia de usar dois modelos diferentes traz um benefício importante: de certa forma, você recebe dois pontos de vista distintos sobre o mesmo Pull Request. Modelos diferentes foram treinados em corpora diferentes, têm vieses diferentes, e enxergam coisas diferentes. Quando dois modelos olham para o mesmo código com objetivos distintos, o resultado é uma revisão muito mais rica do que qualquer um deles entregaria sozinho.</p><p>Stack resumida: FastAPI + asyncio para o orchestrator, SQLite com WAL para estado, Gemini 3 + MCP para code review, Claude Opus 4.7 (via AWS Bedrock + tool use) para segurança, structlog para observabilidade.</p><p>Os dois rodam em paralelo sobre o mesmo PR. Um delega segurança ao outro. O outro delega arquitetura ao primeiro. Sem sobreposição, sem ruído.</p><p>Por que não usamos uma ferramenta pronta<br>Existem várias soluções comerciais de code review com IA no mercado. Avaliamos várias. E mesmo assim escolhemos construir. Três motivos:</p><ol><li><p>Customização real para os padrões da empresa. Cada projeto nosso tem um arquivo de contexto que descreve os padrões daquele repositório: ADRs, idioms, decisões arquiteturais, convenções específicas. O agente carrega esse contexto antes de revisar. Isso significa que ele não fala "use prepared statements" como conselho genérico. Ele aponta o padrão exato que o time já adotou, no estilo que o time já documentou. Ferramentas externas não conseguem esse nível de contextualização personalizavel.</p></li><li><p>Qualidade dirigida ao nosso problema. Conseguimos calibrar a confiança mínima dos findings, escolher os modelos certos para cada tipo de análise, e forçar output estruturado onde isso importa (segurança). Conseguimos decidir o que vira comentário e o que não vira. A revisão fica focada em sinal, não em ruído.</p></li><li><p>Custo controlado. Soluções SaaS cobram por seat, por PR, ou por linha analisada. Com a infra própria, pagamos só o custo dos tokens. E ainda conseguimos aplicar filtros agressivos antes de gastar uma chamada de modelo (PRs muito grandes, paths ignorados, bots de dependência, etc.). Em escala, a economia é considerável.</p></li></ol><p>Some isso ao fato de que nada do nosso código sai da nossa infra para um terceiro, e a equação fica clara.</p><p>O impacto nos times<br>O que mudou no dia a dia desde que o sistema entrou em produção, em todos os times da empresa:</p><p>Cobertura sistemática. Todo PR é revisado por IA em minutos, independente de quem está disponível. Ninguém mais espera dias por uma primeira passada.</p><p>Revisores humanos focam no que importa. Decisões de produto, contexto de negócio, trade-offs arquiteturais. Coisas que IA não captura. Os N+1, os secrets esquecidos, as queries concatenadas, os agentes pegam. Importante deixar claro: a revisão humana não deve ser descartada. O agente não substitui o olhar de outro dev sobre o código, ele potencializa esse olhar. O humano continua sendo a última palavra antes do merge.</p><p>Os devs estão aprendendo com os code reviews. Esse é, talvez, o ganho que mais me surpreendeu. Os comentários do agente de code review são pedagógicos por design. Ele não só aponta o problema, ele explica o porquê e mostra como resolver da forma correta. Devs novos absorvem padrões só de ler a revisão dos próprios PRs. Devs mais experientes redescobrem alternativas que tinham esquecido. O code review virou uma ferramenta de aprendizado contínuo, não só um portão de qualidade.</p><p>Defesa em profundidade na segurança. O agente de segurança não substitui SAST, DAST ou revisão humana de segurança. Complementa. Mais uma camada antes do código entrar em master.</p><p>Velocidade. Feedback chega enquanto o contexto ainda está fresco na cabeça de quem escreveu. Correção é rápida, custo cognitivo baixo.</p><p>A lição mais importante<br>Construir foi mais simples do que eu imaginava, e mais profundo do que eu esperava. A parte difícil não é integrar com um LLM. É decidir o que pedir, como pedir, e como filtrar o que volta. É decidir que segurança merece output estruturado e auditável enquanto code review pode ser texto livre conversacional. É decidir que dois subagentes especializados batem um generalista. É escolher modelos diferentes propositalmente, para ganhar a riqueza de duas perspectivas.</p><p>IA não substitui revisão. IA muda quem revisa o quê. Os humanos sobem na cadeia de abstração e ganham tempo para pensar nas coisas que realmente exigem julgamento humano. E, no caminho, todo o time aprende.</p><p>Se você está pensando em adotar revisão automatizada no seu time, meu conselho é: experimente construir. Você vai aprender mais sobre o seu próprio processo de revisão do que qualquer ferramenta pronta vai te ensinar.</p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AI vai substituir code review?]]></title>
            <link>https://www.tabnews.com.br/danieldia/ai-vai-substituir-code-review</link>
            <guid>https://www.tabnews.com.br/danieldia/ai-vai-substituir-code-review</guid>
            <pubDate>Tue, 26 May 2026 14:43:04 GMT</pubDate>
            <description><![CDATA[Algumas empresas que usam AI estão deixando de fazer revisão de Pull Request e adotando uma estratégia de “mission driven development”. A ideia seria focar mais no o que, do que o como en...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Algumas empresas que usam AI estão deixando de fazer revisão de Pull Request e adotando uma estratégia de “mission driven development”.</p><p>A ideia seria focar mais no o que, do que o como entregar.</p><p>Qual a opinião de vocês sobre isso?</p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Higgsfield AI vai apresentar filme de 95 minutos totalmente gerado por IA no festival de Cannes]]></title>
            <link>https://www.tabnews.com.br/NewsletterOficial/higgsfield-ai-vai-apresentar-filme-de-95-minutos-totalmente-gerado-por-ia-no-festival-de-cannes</link>
            <guid>https://www.tabnews.com.br/NewsletterOficial/higgsfield-ai-vai-apresentar-filme-de-95-minutos-totalmente-gerado-por-ia-no-festival-de-cannes</guid>
            <pubDate>Tue, 26 May 2026 14:31:24 GMT</pubDate>
            <description><![CDATA[O longa metragem “Hell Grind” levou apenas duas semanas para ser produzido e custou 500 mil dólares, sendo 80% só em computação. O projeto também evidenciou a dificuldade de criar um film...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>O longa metragem “Hell Grind” levou apenas duas semanas para ser produzido e custou 500 mil dólares, sendo 80% só em computação. O projeto também evidenciou a dificuldade de criar um filme com a tecnologia, incluindo milhares de prompts detalhados, muitas iterações e necessidade de julgamento cinematográfico tradicional.</p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Em áudio vazado, Mark Zuckerberg defende monitoramento de computadores de funcionários da Meta para treinar IA e alcançar modelos concorrentes]]></title>
            <link>https://www.tabnews.com.br/NewsletterOficial/em-audio-vazado-mark-zuckerberg-defende-monitoramento-de-computadores-de-funcionarios-da-meta-para-treinar-ia-e-alcancar-modelos-concorrentes</link>
            <guid>https://www.tabnews.com.br/NewsletterOficial/em-audio-vazado-mark-zuckerberg-defende-monitoramento-de-computadores-de-funcionarios-da-meta-para-treinar-ia-e-alcancar-modelos-concorrentes</guid>
            <pubDate>Tue, 26 May 2026 14:26:23 GMT</pubDate>
            <description><![CDATA[A intenção seria observar engenheiros criando ferramentas e resolvendo problemas para aumentar a capacidade de codificação de modelos internos, de maneira mais rápida que concorrentes, qu...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>A intenção seria observar engenheiros criando ferramentas e resolvendo problemas para aumentar a capacidade de codificação de modelos internos, de maneira mais rápida que concorrentes, que “não possuem os milhares de excelentes engenheiros da Meta”. Os dados não serão usados para vigilância ou acompanhamento de desempenho.</p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Pequenas alterações em arquivos SKILL[.]md são nova superfície de ataque]]></title>
            <link>https://www.tabnews.com.br/NewsletterOficial/pequenas-alteracoes-em-arquivos-skill-md-sao-nova-superficie-de-ataque</link>
            <guid>https://www.tabnews.com.br/NewsletterOficial/pequenas-alteracoes-em-arquivos-skill-md-sao-nova-superficie-de-ataque</guid>
            <pubDate>Tue, 26 May 2026 14:21:23 GMT</pubDate>
            <description><![CDATA[O prompt injection ocorre quando esses documentos são modificados de forma adversarial e pesquisadores mostraram que basta adicionar 20 tokens a um SKILL[.]md para influenciar o modelo e...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>O prompt injection ocorre quando esses documentos são modificados de forma adversarial e pesquisadores mostraram que basta adicionar 20 tokens a um SKILL[.]md para influenciar o modelo e evitar mecanismos de detecção. A recomendação é tratar especificações em linguagem natural como elementos sensíveis à segurança e ter mais cuidado na criação de registros de skills, mecanismos de ranqueamento, pipelines de governança e defesas do lado do agente.</p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Samsung apresenta primeiro protótipo mundial de memória com 900 camadas]]></title>
            <link>https://www.tabnews.com.br/NewsletterOficial/samsung-apresenta-primeiro-prototipo-mundial-de-memoria-com-900-camadas</link>
            <guid>https://www.tabnews.com.br/NewsletterOficial/samsung-apresenta-primeiro-prototipo-mundial-de-memoria-com-900-camadas</guid>
            <pubDate>Tue, 26 May 2026 14:16:22 GMT</pubDate>
            <description><![CDATA[No mercado atual de produção em massa, a SK hynix ainda registra o maior empilhamento com sua NAND 4D de 321 camadas. A Samsung já prepara a produção em massa da V-NAND de 10ª geração, co...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>No mercado atual de produção em massa, a SK hynix ainda registra o maior empilhamento com sua NAND 4D de 321 camadas. A Samsung já prepara a produção em massa da V-NAND de 10ª geração, com mais de 400 camadas, enquanto alcança 900 camadas na etapa de pesquisa. A memória flash NAND é essencial para servidores de IA, smartphones e SSDs de data centers, porque empilhar mais camadas aumenta a capacidade no mesmo tamanho de chip e melhora a eficiência energética.</p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Uber diz que gastos com IA estão cada vez mais difíceis de justificar devido à falta de retorno proporcional]]></title>
            <link>https://www.tabnews.com.br/NewsletterOficial/uber-diz-que-gastos-com-ia-estao-cada-vez-mais-dificeis-de-justificar-devido-a-falta-de-retorno-proporcional</link>
            <guid>https://www.tabnews.com.br/NewsletterOficial/uber-diz-que-gastos-com-ia-estao-cada-vez-mais-dificeis-de-justificar-devido-a-falta-de-retorno-proporcional</guid>
            <pubDate>Tue, 26 May 2026 14:11:21 GMT</pubDate>
            <description><![CDATA[A tecnologia não está entregando à empresa ganhos equivalentes aos valores investidos. Após discussões com líderes seniores de engenharia, a companhia percebeu que o maior uso de tokens n...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>A tecnologia não está entregando à empresa ganhos equivalentes aos valores investidos. Após discussões com líderes seniores de engenharia, a companhia percebeu que o maior uso de tokens não tem se traduzido em aumento proporcional de recursos úteis para usuários.</p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Papa Leão XIV dedica sua primeira encíclica à IA]]></title>
            <link>https://www.tabnews.com.br/NewsletterOficial/papa-leao-xiv-dedica-sua-primeira-enciclica-a-ia</link>
            <guid>https://www.tabnews.com.br/NewsletterOficial/papa-leao-xiv-dedica-sua-primeira-enciclica-a-ia</guid>
            <pubDate>Tue, 26 May 2026 14:06:21 GMT</pubDate>
            <description><![CDATA[No “Magnifica Humanitas”, o Pontífice entende a tecnologia como instrumento, não como ente criativo, e afirma que os seres humanos jamais poderão ser substituídos ou superados. A IA també...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>No “Magnifica Humanitas”, o Pontífice entende a tecnologia como instrumento, não como ente criativo, e afirma que os seres humanos jamais poderão ser substituídos ou superados. A IA também não seria intrinsecamente má, mas nunca é neutra, pois assume características de quem a concebe, financia, regula e utiliza. Por isso, deve ser construída para o bem comum, a serviço da humanidade e fora do controle de poucas empresas. Chris Olah, cofundador da Anthropic, que esteve no Vaticano nesta segunda-feira, defendeu a supervisão da IA por líderes religiosos, governos e pela sociedade.</p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[🔐 O que é a Nostr VPN — e por que ela está chamando atenção?]]></title>
            <link>https://www.tabnews.com.br/gsrbr/o-que-e-a-nostr-vpn-e-por-que-ela-esta-chamando-atencao</link>
            <guid>https://www.tabnews.com.br/gsrbr/o-que-e-a-nostr-vpn-e-por-que-ela-esta-chamando-atencao</guid>
            <pubDate>Tue, 26 May 2026 13:37:51 GMT</pubDate>
            <description><![CDATA[A Nostr VPN é uma nova proposta de VPN descentralizada baseada no protocolo Nostr. Diferente das VPNs tradicionais, que dependem de servidores controlados por empresas, a ideia aqui é usa...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>A Nostr VPN é uma nova proposta de VPN descentralizada baseada no protocolo Nostr.<br>Diferente das VPNs tradicionais, que dependem de servidores controlados por empresas, a ideia aqui é usar uma rede distribuída com autenticação via chaves criptográficas.</p><p>💡 Na prática, isso significa:</p><p>• Sem login com e-mail ou senha<br>• Mais privacidade e menos dependência de empresas centralizadas<br>• Comunicação baseada em identidade criptográfica<br>• Estrutura peer-to-peer usando<br>• Maior resistência à censura e monitoramento</p><p>A proposta foi criada por Martti Malmi, um dos primeiros desenvolvedores do Bitcoin e colaborador de Satoshi Nakamoto.</p><p>🚨 Atenção:<br>A Nostr VPN NÃO é uma “VPN mágica” para anonimato absoluto. O projeto ainda está em evolução e é mais voltado para usuários avançados e entusiastas de privacidade digital.</p><p>🌐 O que torna isso interessante é a mudança de paradigma:<br>Em vez de confiar em uma empresa para proteger seus dados, a segurança passa a depender de criptografia, descentralização e controle do próprio usuário.</p><p>O futuro da privacidade online pode estar migrando de “confie na empresa” para “<strong>confie no protocolo</strong>”. 🚀</p><p>Fontes:<br><a href="https://crypticmedia.co/bitcoin-pioneer-malmi-launches-nostr-vpn-ditching-centralized-server-model" rel="nofollow">https://crypticmedia.co/bitcoin-pioneer-malmi-launches-nostr-vpn-ditching-centralized-server-model</a><br><a href="https://grafa.com/en/news/crypto/nostr-vpn-martti-malmi" rel="nofollow">https://grafa.com/en/news/crypto/nostr-vpn-martti-malmi</a><br><a href="https://github.com/mmalmi/nostr-vpn">https://github.com/mmalmi/nostr-vpn</a></p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Pitch: Darto 1.0.0 foi lançado 🚀]]></title>
            <link>https://www.tabnews.com.br/evandersondev/darto-1-0-0-foi-lancado</link>
            <guid>https://www.tabnews.com.br/evandersondev/darto-1-0-0-foi-lancado</guid>
            <pubDate>Tue, 26 May 2026 12:30:42 GMT</pubDate>
            <description><![CDATA[Depois de meses de desenvolvimento, refatorações, feedbacks da comunidade e muitas mudanças arquiteturais, finalmente lancei oficialmente o Darto 1.0.0 junto com seus primeiros plugins of...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Depois de meses de desenvolvimento, refatorações, feedbacks da comunidade e muitas mudanças arquiteturais, finalmente lancei oficialmente o Darto 1.0.0 junto com seus primeiros plugins oficiais.</p><p>Pra quem ainda não conhece, o Darto é um framework backend para Dart inspirado em experiências modernas como Express.js, Fastify e Hono, mas tentando abraçar aquilo que o Dart faz de melhor:<br>tipagem forte, performance, tooling e compilação nativa.</p><p>A ideia do projeto sempre foi simples:<br>criar uma experiência moderna para desenvolvimento backend em Dart sem transformar tudo em algo complexo.</p><pre><code class="hljs language-dart">import 'package:darto/darto.dart';void main() {  final app = Darto();  app.get('/users/:id', [], (Context c) {    final id = c.req.param('id');        return c.ok({'id': id});  });  app.listen(3000);}</code></pre><h2 id="evandersondev-content-o-que-chegou-na-100">O que chegou na 1.0.0</h2><ul><li>Sistema de rotas moderno</li><li>Middleware global e por rota</li><li>JWT, Basic Auth, Bearer Auth, API Key Auth</li><li>WebSocket integrado</li><li>Context centralizado</li><li>Compressão, cache, secure headers, csrf, timeout</li><li>Validação usando Zard</li><li>Template engine</li><li>Static files</li><li>Reverse proxy</li><li>CLI oficial</li><li>Hot reload</li><li>Build para binário nativo</li><li>Gerador de cliente HTTP tipado para Flutter/Dart</li></ul><h2 id="evandersondev-content-plugins-oficiais">Plugins oficiais</h2><p>📦 darto_cli<br>📦 darto_env<br>📦 darto_static<br>📦 darto_validator<br>📦 darto_view<br>📦 darto_ws</p><p>Uma das maiores mudanças dessa versão foi abandonar APIs excessivamente “mágicas” usando <code>dynamic</code> e começar a focar muito mais em previsibilidade, autocomplete e experiência real de desenvolvimento dentro do ecossistema Dart.</p><p>Agora começa a fase mais importante:<br>testar em projetos reais.</p><p>Se alguém quiser testar, encontrar bugs, sugerir melhorias ou contribuir com ideias, o feedback será extremamente bem-vindo.</p><p>Esse é só o começo do que eu quero construir para backend no ecossistema Dart. 🚀</p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Porque em sistemas distribuídos, a tolerância a partição é praticamente obrigatória?]]></title>
            <link>https://www.tabnews.com.br/Luiz1nn/porque-em-sistemas-distribuidos-a-tolerancia-a-particao-e-praticamente-obrigatoria</link>
            <guid>https://www.tabnews.com.br/Luiz1nn/porque-em-sistemas-distribuidos-a-tolerancia-a-particao-e-praticamente-obrigatoria</guid>
            <pubDate>Tue, 26 May 2026 12:02:16 GMT</pubDate>
            <description><![CDATA[Porque em sistemas distribuídos você não controla totalmente a rede. Quando seu sistema roda em várias máquinas, regiões, pods, bancos ou serviços diferentes, eles precisam se comunicar p...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Porque em sistemas distribuídos você <strong>não controla totalmente a rede</strong>.</p><p>Quando seu sistema roda em várias máquinas, regiões, pods, bancos ou serviços diferentes, eles precisam se comunicar pela rede. E rede falha. Pode acontecer:</p><ul><li>uma instância não conseguir falar com outra;</li><li>um banco ficar isolado temporariamente;</li><li>uma região da cloud perder comunicação com outra;</li><li>latência aumentar muito;</li><li>pacotes serem perdidos;</li><li>DNS, load balancer ou roteamento falharem;</li><li>um nó estar vivo, mas inacessível para parte do sistema.</li></ul><p>Isso é uma <strong>partição de rede</strong>: o sistema não caiu completamente, mas algumas partes dele não conseguem se comunicar entre si.</p><p>Então, em sistemas distribuídos, <strong>Partition Tolerance é praticamente obrigatória</strong> porque você precisa assumir que a rede pode falhar a qualquer momento. Não é uma questão de “se vai acontecer”, mas de “quando vai acontecer”.</p><p>O ponto principal do CAP é:</p><blockquote><p>Quando acontece uma partição de rede, o sistema precisa escolher entre manter consistência ou manter disponibilidade.</p></blockquote><p>Exemplo simples:</p><p>Imagine dois servidores:</p><pre><code class="hljs language-txt">Servidor A ───── Servidor B</code></pre><p>Agora a rede entre eles falha:</p><pre><code class="hljs language-txt">Servidor A   X   Servidor B</code></pre><p>Se os dois continuam aceitando escrita sem se comunicar, você ganha <strong>Availability</strong>, mas pode perder <strong>Consistency</strong>, porque cada lado pode ter uma versão diferente dos dados.</p><p>Se o sistema bloqueia uma das partes até a comunicação voltar, você preserva <strong>Consistency</strong>, mas perde <strong>Availability</strong>, porque algumas requisições vão falhar ou ficar indisponíveis.</p><p>Por isso, na prática, em sistemas distribuídos, você não escolhe entre <strong>C, A e P</strong> como se pudesse ignorar o P. O <strong>P já vem no pacote</strong>. A escolha real geralmente é:</p><pre><code class="hljs language-txt">Durante uma partição, meu sistema prefere CP ou AP?</code></pre><p><strong>CP</strong>: prefere consistência.<br>Bom para dinheiro, transações, estoque crítico, pedidos, saldo bancário.</p><p><strong>AP</strong>: prefere disponibilidade.<br>Bom para likes, views, feed, cache, métricas, notificações, dados que podem sincronizar depois.</p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Pitch: Desenvolvi um mod para Minecraft que pesquisa e renderiza vídeos do YouTube usando FFmpeg e yt-dlp (RadioMC)]]></title>
            <link>https://www.tabnews.com.br/gatosmias/desenvolvi-um-mod-para-minecraft-que-pesquisa-e-renderiza-videos-do-youtube-usando-ffmpeg-e-yt-dlp-radiomc</link>
            <guid>https://www.tabnews.com.br/gatosmias/desenvolvi-um-mod-para-minecraft-que-pesquisa-e-renderiza-videos-do-youtube-usando-ffmpeg-e-yt-dlp-radiomc</guid>
            <pubDate>Tue, 26 May 2026 10:52:07 GMT</pubDate>
            <description><![CDATA[Olá, pessoal! Quero compartilhar com vocês um projeto que venho desenvolvendo para a comunidade de Minecraft: o RadioMC. A ideia do mod é trazer entretenimento completo para dentro do jog...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Olá, pessoal!</p><p>Quero compartilhar com vocês um projeto que venho desenvolvendo para a comunidade de <strong>Minecraft</strong>: o <strong>RadioMC</strong>.</p><p>A ideia do mod é trazer entretenimento completo para dentro do jogo de forma 100% integrada. Além de sintonizar mais de 51.000 estações de rádio, eu implementei um sistema onde você pesquisa o nome do vídeo do YouTube diretamente na interface do mod, escolhe o resultado e assiste ao vídeo (imagem e som) na tela do Minecraft, sem precisar abrir navegador ou ficar colando links externos.</p><h2 id="gatosmias-content-compatibilidade-exata-de-versões-e-loaders">Compatibilidade Exata de Versões e Loaders</h2><p>Para evitar confusão na hora de instalar, o suporte do mod foi dividido estritamente assim:</p><p><strong>Forge:</strong> Disponível exclusivamente para a versão clássica <code>1.8.9</code>.</p><p><strong>Fabric:</strong> Disponível especificamente para as versões mais recentes: <code>26.1</code>, <code>26.1.1</code>, <code>26.1.2</code>, <code>1.21.10</code> e <code>1.21.11</code>.</p><h2 id="gatosmias-content-como-funciona-por-baixo-dos-panos">Como funciona por baixo dos panos?</h2><p>A mágica de buscar, decodificar e renderizar tudo em tempo real acontece através da integração do <code>yt-dlp</code> com o <code>FFmpeg</code> rodando nos bastidores. O mod usa o <code>yt-dlp</code> para extrair os dados e o stream do YouTube, enquanto o <code>FFmpeg</code> faz o trabalho pesado de decodificar os frames de vídeo/áudio e renderizar a imagem dentro do jogo.</p><p>Instalação Automática: Para facilitar a vida de quem joga, você não precisa configurar nada no seu sistema. Se o mod não encontrar o <code>FFmpeg</code> ou o <code>yt-dlp</code> no seu computador, ele baixa e instala ambos de forma totalmente automática.</p><p>O mod é de código fechado, mas o download já está disponível para quem quiser testar nos seus mundos ou servidores:<br><a href="https://modrinth.com/mod/radiomc" rel="nofollow">https://modrinth.com/mod/radiomc</a></p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[O novo risco do npm install e o agente que executa depois]]></title>
            <link>https://www.tabnews.com.br/Centelha/o-novo-risco-do-npm-install-e-o-agente-que-executa-depois</link>
            <guid>https://www.tabnews.com.br/Centelha/o-novo-risco-do-npm-install-e-o-agente-que-executa-depois</guid>
            <pubDate>Tue, 26 May 2026 07:20:24 GMT</pubDate>
            <description><![CDATA[Tem uma coisa meio cruel acontecendo no desenvolvimento com IA: a gente ganhou ferramentas que executam tarefas cada vez mais rápido, mas muita gente ainda protege o ambiente como se o ri...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Tem uma coisa meio cruel acontecendo no desenvolvimento com IA: a gente ganhou ferramentas que executam tarefas cada vez mais rápido, mas muita gente ainda protege o ambiente como se o risco fosse só "baixei um pacote ruim".</p><p>Esse risco continua existindo. Só que agora ele vem com uma camada a mais.</p><p>Um pacote comprometido não precisa apenas rodar um script malicioso e roubar uma variável de ambiente esquecida. Ele pode procurar tokens de agente, mexer em configuração de editor, observar o CI, tentar persistir em ferramentas locais e esperar o próximo robô prestativo fazer o trabalho sujo com as mesmas permissões que você deu para ele.</p><p>Esse é o ponto que deveria acender uma luz para quem usa Codex, Claude Code, Copilot, Cursor, Windsurf ou qualquer fluxo parecido em repositório real: o agente não é só uma interface bonitinha para escrever código. Ele virou parte do seu ambiente de execução.</p><p>E ambiente de execução precisa de fronteira.</p><h2 id="centelha-content-o-ataque-não-termina-no-pacote-instalado">O ataque não termina no pacote instalado</h2><p>O caso recente envolvendo pacotes do ecossistema TanStack é um bom alerta porque não parece aquele exemplo distante de segurança corporativa que a gente lê e esquece. É JavaScript. É npm. É exatamente o tipo de cadeia que passa pelo dia a dia de frontend, fullstack e indie dev.</p><p>O detalhe mais incômodo é que o malware não mirava apenas credenciais genéricas. Ele procurava sinais de CI, AWS, GitHub Actions, Vault, Kubernetes e também configurações ligadas a ferramentas de agente, incluindo Claude Code e VS Code.</p><p>Isso muda a pergunta.</p><p>Antes, muita gente olhava para supply chain como: "esse pacote roda algo perigoso na instalação?".</p><p>Agora a pergunta ficou maior: "o que acontece depois que esse pacote entra em um ambiente onde agentes leem arquivos, executam comandos, editam o repo e têm acesso a tokens locais?".</p><p>O <code>npm install</code> virou só o primeiro ato.</p><p>Se o seu agente roda no mesmo usuário do sistema, vê os mesmos arquivos, herda as mesmas variáveis e consegue chamar os mesmos comandos, qualquer sujeira que entrou no projeto pode ganhar um ajudante muito eficiente. Não porque o agente "quer" atacar algo, mas porque ele opera dentro de um contexto que talvez já esteja contaminado.</p><h2 id="centelha-content-agente-bom-demais-com-permissão-demais-é-um-problema">Agente bom demais com permissão demais é um problema</h2><p>Eu gosto de agentes de código. Uso esse tipo de ferramenta justamente porque ela tira atrito de tarefas chatas: ajustar testes, navegar em repo grande, preparar PR, procurar inconsistência, refatorar pedaços pequenos.</p><p>Mas tem uma armadilha nessa produtividade.</p><p>Quando a ferramenta funciona bem, dá vontade de liberar mais coisa. Mais diretórios. Mais comandos. Mais acesso à internet. Mais credenciais. Mais automação no CI. Em pouco tempo, aquele assistente que deveria mexer em uma feature passa a operar como um desenvolvedor com acesso amplo, só que sem o mesmo senso de contexto humano.</p><p>Não adianta colocar no prompt:</p><blockquote><p>Não leia secrets e não execute comandos perigosos.</p></blockquote><p>Isso ajuda, mas não é fronteira de segurança. É pedido educado.</p><p>Fronteira de verdade é o ambiente impedir ou limitar a ação. É o agente não ter acesso ao arquivo. É a variável não estar disponível. É a rede estar bloqueada por padrão. É o comando destrutivo precisar de aprovação. É o CI rodar com permissões mínimas.</p><p>Prompt é orientação. Sandbox é contenção.</p><p>Essa diferença ficou bem mais importante agora.</p><h2 id="centelha-content-sandbox-deixou-de-ser-frescura">Sandbox deixou de ser frescura</h2><p>Quando a OpenAI fala sobre a dificuldade de construir um sandbox seguro para o Codex no Windows, o ponto interessante não é só "Windows é difícil". O ponto é que um agente local precisa de isolamento no nível do sistema operacional para ser útil sem virar uma porta aberta.</p><p>Um bom sandbox tenta responder perguntas bem práticas:</p><ul><li>quais arquivos esse agente pode ler?</li><li>onde ele pode escrever?</li><li>ele pode acessar a rede?</li><li>quais processos filhos ele pode criar?</li><li>o que acontece quando ele tenta sair do escopo?</li><li>como eu audito o que ele fez?</li></ul><p>Perceba como isso é diferente de confiar que o modelo vai se comportar.</p><p>Em um projeto pequeno, talvez você não tenha uma infraestrutura sofisticada. Tudo bem. Mas ainda dá para fazer o básico com bastante impacto:</p><ul><li>rodar o agente em um diretório de trabalho separado;</li><li>usar usuário ou container sem acesso a arquivos pessoais;</li><li>bloquear rede quando a tarefa não precisa baixar nada;</li><li>passar variáveis falsas em vez de secrets reais;</li><li>exigir confirmação para instalação de pacote;</li><li>apagar tokens temporários depois da tarefa;</li><li>revisar qualquer mudança em configuração, scripts e workflow.</li></ul><p>Nada disso deixa o fluxo "enterprise demais". Pelo contrário: deixa o fluxo mais tranquilo para usar no dia a dia.</p><p>O objetivo não é criar medo de ferramenta. É poder usar a ferramenta sem depender de sorte.</p><h2 id="centelha-content-o-ci-também-precisa-tratar-agente-como-agente">O CI também precisa tratar agente como agente</h2><p>Outra parte sensível é o CI.</p><p>Quando um agente entra no GitHub Actions, a conversa muda de "ele editou um arquivo local" para "ele está operando dentro de uma esteira com secrets, permissões de repositório, eventos de issue, PR e comentários".</p><p>Esse tipo de automação é muito útil. Um comentário que chama um agente para investigar uma falha, propor uma correção ou abrir um PR pode economizar horas. Mas, se o workflow estiver amplo demais, você criou um caminho bonito para abuso.</p><p>Algumas perguntas que eu faria antes de colocar agente no CI:</p><ul><li>esse workflow roda em fork externo?</li><li>quais eventos disparam o agente?</li><li>quais permissões o token do GitHub tem?</li><li>quais secrets ficam disponíveis nesse job?</li><li>o agente pode fazer push direto?</li><li>ele pode instalar dependências sem cache confiável?</li><li>ele consegue comentar, abrir PR ou alterar workflow?</li><li>existe log suficiente para entender o que aconteceu?</li></ul><p>O detalhe chato é que quase tudo aí parece burocracia até o dia em que não parece mais.</p><p>Permissão mínima é uma daquelas práticas que ninguém posta em vídeo curto porque não parece emocionante. Só que é ela que separa "automatizei uma revisão" de "dei um token sensível para um processo que qualquer comentário mal colocado pode acionar".</p><h2 id="centelha-content-uma-checklist-simples-para-devs-que-usam-agentes">Uma checklist simples para devs que usam agentes</h2><p>Se você usa agente local ou pretende colocar um no CI, eu começaria por uma checklist pequena. Não precisa transformar isso em um projeto de segurança de seis meses.</p><h3 id="centelha-content-1-separe-tarefas-que-podem-instalar-dependência">1. Separe tarefas que podem instalar dependência</h3><p>Instalar pacote deveria ser uma ação mais sensível do que editar um arquivo de componente.</p><p>Se a tarefa do agente não precisa instalar nada, bloqueie isso. Se precisa, rode em ambiente descartável e revise <code>package.json</code>, lockfile, scripts de postinstall e mudanças em configuração.</p><h3 id="centelha-content-2-não-exponha-secrets-reais-por-padrão">2. Não exponha secrets reais por padrão</h3><p>Agente raramente precisa de credencial real para trabalhar em código. Na maioria das tarefas, valores falsos resolvem.</p><p>Use <code>.env.example</code>, mocks, tokens temporários ou secrets com escopo mínimo. Se uma chave real for indispensável, trate como exceção com prazo curto e trilha de auditoria.</p><h3 id="centelha-content-3-dê-escopo-de-arquivo-não-o-repo-inteiro">3. Dê escopo de arquivo, não o repo inteiro</h3><p>Um pedido como "corrija o bug de autenticação" é largo demais.</p><p>Melhor:</p><blockquote><p>Edite apenas <code>apps/web/src/auth</code> e <code>packages/session</code>. Não altere workflows, scripts de instalação ou arquivos de infraestrutura. Rode os testes de auth e pare se precisar mudar dependência.</p></blockquote><p>Isso não garante perfeição, mas melhora muito a revisão.</p><h3 id="centelha-content-4-bloqueie-rede-quando-ela-não-for-necessária">4. Bloqueie rede quando ela não for necessária</h3><p>Muita tarefa de agente não precisa acessar internet. Precisa ler o repo, alterar arquivos e rodar teste.</p><p>Rede aberta por padrão aumenta o estrago possível se algo no ambiente tentar exfiltrar dados. Bloquear rede é uma medida simples e subestimada.</p><h3 id="centelha-content-5-trate-mudanças-em-scripts-como-área-sensível">5. Trate mudanças em scripts como área sensível</h3><p>Alteração em <code>package.json</code>, workflows, hooks, scripts de build, extensões de editor e arquivos de configuração merecem atenção extra.</p><p>Não é paranoia. É onde muita automação ganha poder.</p><h3 id="centelha-content-6-faça-o-agente-deixar-rastro">6. Faça o agente deixar rastro</h3><p>Peça resumo do que foi alterado, comandos executados, testes rodados e limitações. Melhor ainda: capture isso automaticamente no ambiente.</p><p>Quando algo estranho aparece no diff, log economiza tempo e reduz chute.</p><h2 id="centelha-content-o-novo-básico-do-setup-local">O novo básico do setup local</h2><p>Durante muito tempo, o setup local básico era algo como: instalar Node, configurar Git, clonar repo, preencher <code>.env</code>, rodar <code>pnpm install</code>, subir o app.</p><p>Em projetos com agentes, eu acho que o básico começou a incluir mais algumas coisas:</p><ul><li>ambiente descartável para tarefas arriscadas;</li><li>secrets fora do alcance padrão;</li><li>lockfile tratado como artefato crítico;</li><li>scripts de instalação revisados com cuidado;</li><li>permissões explícitas para agente;</li><li>sandbox ou container quando possível;</li><li>CI com tokens de escopo pequeno.</li></ul><p>Parece mais trabalho no começo. Mas o contrário também dá trabalho, só que no pior momento possível.</p><p>O que me preocupa não é um dev usando agente para acelerar uma tarefa. Isso é normal e, muitas vezes, ótimo.</p><p>O que me preocupa é um ambiente onde tudo está disponível, tudo pode rodar, tudo pode ser lido, e a única barreira é a expectativa de que a ferramenta "não vai fazer besteira".</p><p>Esse modelo não escala nem para humanos. Para agentes, escala menos ainda.</p><h2 id="centelha-content-use-agentes-como-quem-desenha-um-sistema">Use agentes como quem desenha um sistema</h2><p>A melhor forma de pensar nisso talvez seja parar de tratar o agente como mágica e começar a tratá-lo como parte do sistema.</p><p>Ele tem entrada, saída, permissão, dependência, falha, log e superfície de ataque.</p><p>Isso não diminui o valor da ferramenta. Na prática, aumenta. Quanto mais previsível e contido o ambiente, mais coragem você tem para delegar tarefas reais.</p><p>Minha regra prática hoje é:</p><blockquote><p>antes de perguntar "qual agente resolve isso?", pergunte "em qual ambiente eu aceitaria que isso fosse resolvido?".</p></blockquote><p>Se a resposta for "na minha máquina principal, com meus tokens reais, rede aberta e permissão para instalar qualquer pacote", talvez o problema não seja o agente. Talvez seja o nosso setup.</p><p>O <code>npm install</code> seguro em 2026 não termina quando o pacote baixa sem erro. Ele termina quando você sabe quem vai ler aquele código depois, quais permissões essa pessoa ou agente tem, e até onde uma dependência comprometida conseguiria andar.</p><p>Esse é o tipo de detalhe chato que evita incidente.</p><p>E, sinceramente, é o tipo de detalhe que permite usar IA com mais calma.</p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A Bipolaridade do progresso: Como fomos da euforia ao luto na era da IA]]></title>
            <link>https://www.tabnews.com.br/OAlexLuthor/a-bipolaridade-do-progresso-como-fomos-da-euforia-ao-luto-na-era-da-ia</link>
            <guid>https://www.tabnews.com.br/OAlexLuthor/a-bipolaridade-do-progresso-como-fomos-da-euforia-ao-luto-na-era-da-ia</guid>
            <pubDate>Tue, 26 May 2026 02:26:38 GMT</pubDate>
            <description><![CDATA[Esta semana, me deparei com um artigo no meu feed chamado: “Grief in the AI age” (O Luto na Era da IA), escrito pelo designer Brad Frost. Nele, Brad faz um paralelo entre os cinco estágio...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Esta semana, me deparei com um artigo no meu feed chamado: “<a href="https://bradfrost.com/blog/post/grief-in-the-ai-age/" rel="nofollow">Grief in the AI age” (O Luto na Era da IA)</a>, escrito pelo designer Brad Frost. Nele, Brad faz um paralelo entre os cinco estágios do ciclo do luto (negação, raiva, barganha, depressão e aceitação) e a maneira como estamos reagindo à transformação tecnológica (e eu diria até mesmo cultural) que a inteligência artificial generativa trouxe para as nossas vidas.</p><p>Eu confesso que, num primeiro momento, o uso do termo “luto” me causou certa estranheza. Afinal, essa é uma palavra que costumamos reservar para o contexto do falecimento de alguém, e, à primeira vista, parece totalmente desconexa quando se fala de IA. Se você abrir qualquer portal de tecnologia agora, as manchetes são sempre sobre novos avanços em modelos, ferramentas revolucionárias, promessas de produtividade e economia de tempo. Todo esse ruído do mercado se alinha muito melhor com o Gartner Hype Cycle, que mapeia a curva de expectativa/frustração de uma nova tecnologia desde o seu nascimento até a sua consolidação.</p><p>No papel, esses dois ciclos pertencem a mundos diferentes. O Hype Cycle é corporativo, e o ciclo do luto vive no âmbito puramente emocional e psicológico. No entanto, tudo o que tenho experienciado e observado no mercado de 2023 para cá aponta para uma intersecção entre os dois. A Inteligência Artificial deixou de ser apenas um assistente, e passou a ocupar o espaço de pessoas reais. E não estou falando apenas de substituir postos de trabalho, mas de mexer com o propósito de vida de profissionais, e em alguns casos, influenciar a nossa própria capacidade de raciocínio.</p><p>Eu lembro perfeitamente de quando o assunto estourou (pelo menos na minha bolha 🙃 ). Foi logo após o fim da pandemia, quando vi um corte de podcast no YouTube com o Monark mostrando o ChatGPT pela primeira vez. Aquilo parecia mágica, algo realmente revolucionário. Até então, na minha cabeça, inteligência artificial era um conceito restrito ao comportamento de NPCs em videogames ou ao processamento massivo de dados em grandes bancos. De repente, estava ali, na minha tela, ao meu alcance e de graça.</p><p>O que se seguiu foi uma euforia generalizada e caótica. O feed de todo mundo foi inundado por vídeos ensinando “como faturar com IA usando apenas o celular”, enquanto uma enxurrada de supostos “especialistas” surgia do nada falando um monte de bobagens. Assistimos a uma corrida armamentista entre as big techs para ver quem lançava a próxima ferramenta, e vimos bilhões de dólares em capital de risco sendo injetados em empresas que mal tinham um protótipo funcional para apresentar.</p><p>Hoje, a poeira baixou e o choque de realidade veio forte. Aquelas pessoas que estavam animadas porque achavam que o tão sonhado emprego na área de TI com um salário inicial alto ficaria muito mais fácil ao “colocar a IA para programar”, agora enfrentam uma realidade dura. Muitas foram cortadas em grandes layoffs, outras vivem sob a constante ameaça do desemprego.</p><p>Até o hardware foi afetado, com o valor de placas de vídeo e memórias RAM disparando, e tornando a compra de um computador decente algo proibitivo para qualquer brasileiro médio (como se não bastasse o governo brasileiro cobrando imposto atrás de imposto com a desculpa esfarrapada de salvar uma “indústria nacional” que não existe).</p><p>Para piorar, as exigências para vagas de desenvolvedor júnior subiram a níveis quase irreais, frustrando quem está iniciando agora e sonhou em entrar na profissão, seja por identificação com a área ou fazendo uma migração de carreira. Na real, tem vagas tão esdrúxulas, que é mais fácil abrir uma startup ou fazer um SaaS e dar certo, do que passar na vaga.</p><p>É por isso que a grande dor que enxergo hoje no mercado não é meramente econômica, ela é existencial. Estamos vendo pessoas que estudaram durante anos, abrindo mão de finais de semana e noites de sono para dominar uma função, apenas para ver uma máquina ocupar o seu lugar em questão de segundos.</p><p>Desde a infância, fomos ensinados a formar nossa identidade e nosso senso de propósito na vida, com base em nossa profissão. Toda a nossa jornada de aprendizado é cercada por perguntas e afirmações clichês, tipo: “O que você vai ser quando crescer?”, “Qual faculdade vai fazer?”, “Estude bastante para ter um bom futuro”. Quando a máquina simula (e muitas vezes supera) a execução de competências que passamos anos lapidando, o que desmorona não é apenas o emprego, mas a narrativa que construímos na nossa cabeça sobre quem nós somos no mundo.</p><p>Outro fato a se considerar é a velocidade das mudanças atropelando o tempo necessário para o nosso aprendizado, e o sentimento de obsolescência chegando antes mesmo que o profissional consiga dominar a versão anterior do framework ou da plataforma.</p><p>Pensar que somos a primeira geração a encarar esse problema é um erro. Apesar de na nossa vez estar muito mais acelerado (e também mais caro), em todas as revoluções industriais anteriores isso aconteceu, e a história sempre se repete.</p><p>Em todas essas épocas, a sociedade se dividiu exatamente nos mesmos dois extremos emocionais. De um lado, a euforia cega dos entusiastas do progresso celebrando uma “chance de ouro”, prometendo que a automação libertaria o homem do trabalho pesado e criaria uma era de abundância inédita. E do outro, a resistência desesperada dos profissionais que sentem o impacto direto na pele, enxergando naquelas novidades o “fim dos tempos”.</p><p>Provavelmente a maior lição que deixamos de aprender com todas as revoluções passadas é que somos péssimos em gerenciar a transição. Nós nos concentramos obsessivamente em fazer a máquina correr mais rápido e processar mais dados, mas falhamos miseravelmente em dar o tempo psicológico que o ser humano precisa para digerir toda essa mudança. Nosso cérebro ainda é analógico, mas a gente sempre finge que esquece...</p><p>Se quisermos passar por essa nova era sem nos perdermos de nós mesmos, o primeiro passo é aceitar que estamos, sim, atravessando um processo de luto coletivo, e que sim, a IA não vai desaparecer. Ela veio para ficar, e nada mais será como antes. Mas isso não significa que seja ruim, ou bom. Apenas é... diferente.</p><h2 id="oalexluthor-content-a-convergência-dos-ciclos-do-hype-e-do-luto">A convergência dos ciclos do hype e do luto.</h2><p>Se você colocar lado a lado um gráfico do Gartner Hype Cycle (aquela curva que as consultorias usam para mapear a adoção de novas tecnologias) e o modelo dos 5 Estágios do Luto (negação, raiva, barganha, depressão e aceitação), desenvolvido pela psiquiatra Elisabeth Kübler-Ross, você vai notar que eles descrevem exatamente a mesma jornada como se fossem dois lados de uma mesma moeda.</p><p>Para entender essa minha proposição, precisamos sobrepor essas duas teorias para ver que o paralelo entre elas se faz de forma nítida quando analisamos como reagimos de 2023 até os dias atuais:</p><p><strong>Fase 1: A Negação e o Pico de Expectativas Infladas</strong><br>Quando as ferramentas de IA generativa surgiram, o mercado subiu direto para o topo do Hype. Era a promessa de faturar milhares de dólares com um prompt e a ilusão de que o trabalho seria totalmente automatizado. No lado humano, isso se manifestou em alguns como uma profunda negação da realidade. Uns diziam: “Isso é só um autocompletar, não vai afetar meu emprego”. Outros mergulhavam na fantasia de que a tecnologia resolveria todos os problemas do mundo sem cobrar nenhum preço (ou viajavam de que a skynet se tornaria real 🤖). Ignoramos os sinais de alerta porque a novidade era sedutora demais.</p><p><strong>Fase 2: A Raiva e o Vale da Desilusão</strong><br>O topo do hype é insustentável por um longo período. Eventualmente, a realidade bateu na porta e os primeiros grandes layoffs aconteceram, os erros e alucinações das ferramentas começam a travar processos, gerar gastos desnecessários ou excluir dados importantes nas empresas. O mercado (na minha visão) está despencando direto para o chamado Vale da Desilusão, onde, no Hype Cycle, as empresas não acreditam mais nas promessas da inovação, e se tornam céticas.</p><p>Na psicologia, essa queda livre se traduz em um sentimento muito específico: a Raiva. É o momento do boicote, dos textões inflamados no LinkedIn contra as Big Techs, e a revolta de quem percebeu que foi enganado pela promessas dos “especialistas” comprando seus cursos, e agora se sente impotente.</p><p><strong>Fase 3: A Barganha e a Ladeira da Iluminação</strong><br>Quando a raiva cansa e percebemos que o mundo não vai proibir a IA por decreto, e nem ela vai deixar de existir, nós começamos a negociar. Na tecnologia, entramos na “Ladeira da Iluminação”, onde o uso começa a ficar mais realista. No lado humano, ativamos o modo Barganha. É a fase do “Ok, a IA veio para ficar, mas se eu fizer esse curso de especialização eu posso ficar tranquilo e usar ela ao meu favor”, ou “A máquina faz o trabalho bruto, mas o toque final é meu, então estou seguro que não vou ser substituído”. Tentamos criar pequenos acordos entre a realidade e as nossas mentes para manter o controle da situação e salvar o que restou da nossa antiga realidade percebida.</p><p>No entanto, há um ponto nessa jornada que os gráficos corporativos costumam ignorar ou tratar de forma superficial, mas que para nós, seres humanos reais, é o momento mais difícil de todos: a transição para a depressão.</p><p>Antes de alcançarmos o que a Gartner chama de “Planície da Produtividade” (o ponto onde a tecnologia já se integrou ao dia a dia de forma madura), nós obrigatoriamente colidimos com a depressão. E neste paralelo, ela não deve ser vista como uma fraqueza ou uma doença (a não ser que seja constatada de forma clínica), mas sim como um reconhecimento doloroso da realidade.</p><p>É o instante em que a ficha finalmente cai. O profissional olha para o mercado e entende, com absoluta clareza, que o mundo de antes de 2023 não vai voltar. A barganha para, e o cansaço mental se instala. É um luto legítimo pelo futuro que havíamos planejado e que foi cancelado sem o nosso consentimento e de forma abrupta.</p><p>E embora esse ponto pareça o fim da linha, ele é, na verdade, o início da recuperação. É nesse reconhecimento doloroso, quando paramos de lutar contra os fatos e abandonamos as ilusões dos sentimentos eufóricos do início, que as maiores transformações começam a germinar.</p><h2 id="oalexluthor-content-o-luto-não-é-linear">O luto não é linear</h2><p>Você deve ter notado que este paralelo que estou fazendo não segue a ordem em que as duas teorias se apresentam, mas isso é proposital. Apesar de ter todas as cinco fases, o luto não age de forma linear, e se manifesta de forma diferente em cada pessoa.</p><p>O Gartner Hype Cycle no entanto é linear, pois segue a lógica de mercado. Mas como meu intuito é abordar o aspecto humano, eu o quebrei e fiz o paralelo com as cinco fases do luto, já que este sim é variável e pode ter também oscilações.</p><p>Você pode passar uma semana inteira animado, testando novas ferramentas e automatizando processos, apenas para acordar na segunda-feira seguinte tomado por um aperto no peito, questionando se o seu esforço ainda fará sentido daqui a seis meses.</p><p>Essa oscilação é normal. O problema real surge quando ficamos cronicamente presos em uma das fases. E o mercado atual construiu três grandes âncoras que nos impedem de avançar:</p><p>O medo da obsolescência profissional: A sensação de que a régua está subindo tão rápido que, por mais que você estude à noite, acorde mais cedo ou sacrifique seus finais de semana, você nunca será suficiente.</p><p>A perda de identidade: A dor de se perguntar: “Quem sou eu, e que valor eu tenho se a minha maior habilidade agora é feita por uma IA?”</p><p><strong>A comparação social:</strong> Abrir o feed das redes sociais e ser bombardeado por posts inflados, criando a ilusão de que “todo mundo já domina a IA e está faturando alto, e eu estou ficando para trás”, gerando uma ansiedade social paralisante em quem ainda está tentando entender o básico.</p><p>Lidar com todas essas ansiedades e incertezas sem dar uma surtada na cabeça, exige mais do que força de vontade. Podemos usar algumas ferramentas para fazer nossa ancoragem mental:</p><p><strong>Journaling (Escrita):</strong> Tire todos os pensamentos da cabeça e no papel. Escrever honestamente sobre a sua experiência com as ferramentas (o que funcionou, onde você se sentiu ameaçado, o que achou ridículo e que você pode fazer manualmente) transforma uma ansiedade difusa em dados palpáveis que você pode analisar logicamente. Parece bobo e bem simplório, mas realmente funciona.</p><p><strong>Mindfulness e técnicas de grounding:</strong> Você precisa forçar o seu cérebro a voltar para o presente para acalmar pensamentos ansiosos com o que pode vir no futuro. Técnicas simples de atenção plena, respiração e desconexão programada são ferramentas de manutenção para a sua saúde mental.</p><p><strong>Suporte da comunidade:</strong> É a conversa com humanos de verdade. Encontrar um grupo de colegas de profissão num evento para compartilhar sucessos, experiências ou frustrações reais nos lembra de que não estamos sozinhos, e sempre podemos aprender e nos adaptar.</p><p><strong>Rituais de desconexão:</strong> Crie momentos na sua semana para literalmente se desconectar. Pode ser um dia específico para ler livros físicos, ir na igreja, fazer uma trilha etc.</p><h2 id="oalexluthor-content-amanhã-é-outro-dia">Amanhã é outro dia...</h2><p>Discutir se a IA generativa deveria ou não ter sido criada, ou torcer para que o mercado decida retroceder e devolver o mundo ao mesmo estado de 2022, é um gasto de energia mental inútil. A IA deixou de ser uma ferramenta de especialistas para se tornar infraestrutura civilizacional, assim como a energia elétrica e a Internet.</p><p>Compreender essa inevitabilidade, no entanto, exige uma distinção crucial que pouca gente faz. Aceitação é completamente diferente de concordância.</p><p>Aceitar significa olhar para o mercado atual, reconhecer os layoffs, a mudança nos requisitos de contratação e a automação de processos, e dizer: “Ok, este é o mundo real agora, e eu preciso me adaptar”. Concordar, por outro lado, seria cruzar os braços e aceitar passivamente que a tecnologia dite o nosso valor, destrua a nossa saúde mental ou comoditize a criatividade humana em troca de margens de lucro mais gordas.</p><p>Nós não precisamos concordar com a direção caótica que o hype tenta impor, mas precisamos aceitar o fato de que a tecnologia está aqui para podermos agir sobre ela.</p><p>A verdadeira virada de chave na nossa cabeça acontece quando paramos de reagir instintivamente aos acontecimentos e passamos a escolher como vamos responder racionalmente a eles. Enfrentar esse momento com integridade psicológica e relevância profissional será uma questão de inteligência emocional.</p><p>O mercado não precisa de mais “robôs humanos”, mas sim, de humanos que saibam usar o discernimento, o contexto cultural, a ética e a sensibilidade que máquina nenhuma consegue simular.</p><p>A reflexão que deixo no fim desse texto, não é para que você se torne um entusiasta ingênuo que abraça cada nova ferramenta com otimismo cego, e nem um resistente amargurado que assiste ao mundo mudar sem fazer nada. Mas sim, o compromisso de continuar aprendendo, manter o seu espaço de pensamento crítico e de acolher as suas próprias vulnerabilidades ao longo do caminho.</p><p>O futuro continua sendo um território aberto cheio de possibilidades e ele é algo que nós ainda construímos, um passo de cada vez.</p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[GSI: quando uma tabela precisa ser consultada por mais de um caminho]]></title>
            <link>https://www.tabnews.com.br/Luiz1nn/gsi-quando-uma-tabela-precisa-ser-consultada-por-mais-de-um-caminho</link>
            <guid>https://www.tabnews.com.br/Luiz1nn/gsi-quando-uma-tabela-precisa-ser-consultada-por-mais-de-um-caminho</guid>
            <pubDate>Tue, 26 May 2026 02:06:41 GMT</pubDate>
            <description><![CDATA[Quando começamos a estudar bancos NoSQL, principalmente DynamoDB, uma coisa fica bem clara: você não modela apenas os dados, você modela os acessos aos dados. Em bancos relacionais, muita...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>Quando começamos a estudar bancos NoSQL, principalmente DynamoDB, uma coisa fica bem clara:</p><blockquote><p>você não modela apenas os dados, você modela os acessos aos dados.</p></blockquote><p>Em bancos relacionais, muitas vezes pensamos assim:</p><pre><code class="hljs language-sql"><span class="hljs-keyword">SELECT</span> <span class="hljs-operator">*</span> <span class="hljs-keyword">FROM</span> orders <span class="hljs-keyword">WHERE</span> status <span class="hljs-operator">=</span> <span class="hljs-string">'PENDING'</span>;<span class="hljs-keyword">SELECT</span> <span class="hljs-operator">*</span> <span class="hljs-keyword">FROM</span> orders <span class="hljs-keyword">WHERE</span> customer_id <span class="hljs-operator">=</span> <span class="hljs-number">123</span>;<span class="hljs-keyword">SELECT</span> <span class="hljs-operator">*</span> <span class="hljs-keyword">FROM</span> orders <span class="hljs-keyword">WHERE</span> created_at <span class="hljs-operator">>=</span> <span class="hljs-string">'2026-01-01'</span>;</code></pre><p>Se precisar consultar por outro campo, criamos um índice, fazemos um join, filtramos, ordenamos e seguimos o jogo.</p><p>Mas em bancos como DynamoDB, a conversa muda um pouco.</p><p>Você geralmente acessa os dados pela chave primária da tabela. E se amanhã você precisar consultar a mesma tabela por outro campo?</p><p>É aí que entra o <strong>GSI</strong>, ou <strong>Global Secondary Index</strong>.</p><hr><h2 id="luiz1nn-content-o-que-é-um-gsi">O que é um GSI?</h2><p><strong>GSI</strong> significa <strong>Global Secondary Index</strong></p><p>De forma simples:</p><blockquote><p>Um GSI permite consultar uma tabela usando uma chave diferente da chave primária original.</p></blockquote><p>Segundo a própria documentação da AWS, um índice secundário permite consultar dados usando uma chave alternativa, além da chave primária da tabela. No caso do GSI, essa chave pode ter uma partition key e, opcionalmente, uma sort key diferentes da tabela principal.</p><p>Vamos imaginar uma tabela de pedidos:</p><pre><code class="hljs language-txt">Table: OrdersPK: orderIdAttributes:- orderId- customerId- status- createdAt- total</code></pre><p>Com essa estrutura, buscar um pedido pelo <code>orderId</code> é simples:</p><pre><code class="hljs language-txt">orderId = "order_123"</code></pre><p>Mas e se eu quiser buscar todos os pedidos de um cliente?</p><pre><code class="hljs language-txt">customerId = "customer_456"</code></pre><p>A tabela principal não foi modelada para isso.</p><p>Então uma opção seria criar um GSI:</p><pre><code class="hljs language-txt">GSI: OrdersByCustomerPK: customerIdSK: createdAt</code></pre><p>Agora eu consigo consultar os pedidos por cliente e ainda ordenar pela data de criação.</p><hr><h2 id="luiz1nn-content-uma-forma-simples-de-visualizar">Uma forma simples de visualizar</h2><p>Pense na tabela principal como uma gaveta organizada por número do pedido:</p><pre><code class="hljs language-txt">Orders TablePK: orderIdorder_001 -> customer_1 -> PENDINGorder_002 -> customer_2 -> PAIDorder_003 -> customer_1 -> PAID</code></pre><p>Ela é ótima quando você sabe o <code>orderId</code>.</p><p>Mas se você quiser buscar por <code>customerId</code>, teria que varrer tudo.</p><p>Com um GSI, é como criar uma segunda forma de organização:</p><pre><code class="hljs language-txt">GSI: OrdersByCustomerPK: customerIdSK: createdAtcustomer_1 -> order_001customer_1 -> order_003customer_2 -> order_002</code></pre><p>O dado continua na tabela principal, mas agora existe um índice preparado para outro padrão de consulta.</p><hr><h2 id="luiz1nn-content-gsi-não-é-cópia-completa-da-tabela">GSI não é cópia completa da tabela</h2><p>Um ponto importante: o GSI não precisa carregar todos os atributos da tabela.</p><p>Você escolhe quais atributos serão projetados no índice.</p><p>Por exemplo:</p><pre><code class="hljs language-txt">GSI: OrdersByStatusPK: statusSK: createdAtProjected attributes:- orderId- customerId- total</code></pre><p>Isso significa que, ao consultar esse índice, você pode receber apenas os campos projetados.</p><p>Se você projetar atributos demais, o índice fica maior e mais caro.</p><p>Se projetar atributos de menos, talvez você precise fazer uma segunda consulta na tabela principal para buscar o restante dos dados.</p><p>Esse é um trade-off bem importante.</p><hr><h2 id="luiz1nn-content-exemplo-prático">Exemplo prático</h2><p>Imagine um sistema de pedidos.</p><p>A tabela principal foi criada assim:</p><pre><code class="hljs language-txt">PK: orderId</code></pre><p>Esse acesso resolve bem o caso:</p><pre><code class="hljs language-txt">Buscar pedido por ID</code></pre><p>Mas o produto começa a crescer e surgem novos requisitos:</p><ol><li>Buscar pedidos por cliente</li><li>Buscar pedidos por status</li><li>Buscar pedidos por data</li><li>Listar pedidos pendentes mais recentes</li></ol><p>Se você tentar resolver tudo apenas com a chave primária original, provavelmente vai cair em scans.</p><p>E scan em tabela grande é aquele tipo de coisa que começa inocente e depois vira uma dor de cabeça.</p><p>Uma modelagem possível seria:</p><pre><code class="hljs language-txt">Table: OrdersPK: orderId</code></pre><pre><code class="hljs language-txt">GSI 1: OrdersByCustomerPK: customerIdSK: createdAt</code></pre><pre><code class="hljs language-txt">GSI 2: OrdersByStatusPK: statusSK: createdAt</code></pre><p>Agora você tem diferentes formas de consultar a mesma entidade.</p><hr><h2 id="luiz1nn-content-por-que-o-nome-é-global">Por que o nome é "Global"?</h2><p>O termo <strong>global</strong> existe porque o índice pode consultar dados da tabela inteira, atravessando todas as partições.</p><p>Isso é diferente de um <strong>LSI</strong>, Local Secondary Index, que fica limitado à mesma partition key da tabela principal.</p><p>No GSI, a chave do índice pode ser completamente diferente da chave da tabela.</p><p>Exemplo:</p><pre><code class="hljs language-txt">Tabela principal:PK: orderId</code></pre><pre><code class="hljs language-txt">GSI:PK: customerIdSK: createdAt</code></pre><p>Ou seja, o índice não está preso ao mesmo partition key da tabela original.</p><hr><h2 id="luiz1nn-content-o-lado-bom-do-gsi">O lado bom do GSI</h2><p>GSI é muito útil quando você tem múltiplos padrões de acesso.</p><p>Ele ajuda em casos como:</p><ul><li>Buscar usuários por email</li><li>Buscar pedidos por cliente</li><li>Buscar transações por status</li><li>Buscar produtos por categoria</li><li>Buscar logs por tenant</li><li>Buscar mensagens por conversa</li><li>Buscar eventos por data</li></ul><p>Exemplo:</p><pre><code class="hljs language-txt">Users TablePK: userId</code></pre><p>Mas no login você precisa buscar por email:</p><pre><code class="hljs language-txt">GSI: UsersByEmailPK: email</code></pre><p>Sem esse GSI, você teria que fazer scan para encontrar o usuário pelo email, o que seria péssimo conforme a tabela cresce.</p><hr><h2 id="luiz1nn-content-o-lado-perigoso-do-gsi">O lado perigoso do GSI</h2><p>Apesar de parecer uma solução mágica, GSI tem custo.</p><p>Cada vez que você escreve na tabela principal, o DynamoDB também precisa atualizar os GSIs afetados.</p><p>Então, se você tem uma tabela com muitos writes e muitos GSIs, cada escrita pode ficar mais cara.</p><p>Exemplo:</p><pre><code class="hljs language-txt">Table write:- grava na tabela principal- atualiza GSI por customerId- atualiza GSI por status- atualiza GSI por category</code></pre><p>Ou seja, mais índices significam mais flexibilidade de leitura, mas também mais custo e complexidade na escrita.</p><p>A própria AWS explica que consultas em um GSI consomem capacidade do índice, não da tabela principal, e que alterações na tabela também podem consumir capacidade do índice quando ele precisa ser atualizado.</p><hr><h2 id="luiz1nn-content-gsi-tem-consistência-eventual">GSI tem consistência eventual</h2><p>Esse é um ponto muito importante.</p><p>Consultas em Global Secondary Index no DynamoDB suportam apenas <strong>eventual consistency</strong>.</p><p>Na prática, isso significa que você pode gravar um item na tabela principal e, por alguns instantes, ele ainda não aparecer no GSI.</p><p>Exemplo:</p><pre><code class="hljs language-txt">1. Crio um novo pedido com status = "PENDING"2. A escrita na tabela principal retorna sucesso3. Consulto o GSI OrdersByStatus imediatamente4. Pode ser que o pedido ainda não apareça naquele exato momento5. Depois de um pequeno intervalo, o índice converge</code></pre><p>Isso não significa que o banco está errado.</p><p>Significa que o índice é atualizado de forma assíncrona.</p><p>Por isso, GSI é ótimo para muitos casos, mas talvez não seja ideal quando você precisa de leitura fortemente consistente logo após uma escrita.</p><hr><h2 id="luiz1nn-content-quando-usar-gsi">Quando usar GSI?</h2><p>Eu usaria GSI quando existe um padrão de acesso claro que não é atendido pela chave primária da tabela.</p><p>Alguns exemplos:</p><pre><code class="hljs language-txt">Buscar usuário por emailBuscar pedidos por clienteListar pagamentos por statusConsultar produtos por categoriaBuscar eventos por organizaçãoListar notificações por usuário</code></pre><p>O ponto principal é:</p><blockquote><p>crie um GSI para responder uma pergunta específica do seu sistema.</p></blockquote><p>Não crie GSI só porque "talvez um dia eu precise filtrar por esse campo".</p><hr><h2 id="luiz1nn-content-quando-evitar-gsi">Quando evitar GSI?</h2><p>Eu evitaria GSI quando:</p><ul><li>O acesso é raro</li><li>O volume de escrita é muito alto</li><li>O índice teria baixa cardinalidade</li><li>O campo indexado muda toda hora</li><li>O padrão de consulta ainda não está claro</li><li>Um scan ocasional em uma tabela pequena já resolve</li><li>A aplicação precisa de consistência forte naquele acesso</li></ul><p>Um exemplo perigoso seria criar um GSI com partition key <code>status</code>:</p><pre><code class="hljs language-txt">PK: status</code></pre><p>Se os status forem apenas:</p><pre><code class="hljs language-txt">PENDINGPAIDCANCELED</code></pre><p>Você pode acabar concentrando muitos itens na mesma chave, principalmente se a maioria dos pedidos estiver em <code>PENDING</code>.</p><p>Isso pode gerar hot partition.</p><p>Nesse caso, talvez você precise pensar em uma chave mais bem distribuída, como:</p><pre><code class="hljs language-txt">PK: status#dateSK: createdAt</code></pre><p>Ou outra estratégia baseada no padrão real de acesso.</p><hr><h2 id="luiz1nn-content-gsi-resolve-problema-de-modelagem-não-falta-de-modelagem">GSI resolve problema de modelagem, não falta de modelagem</h2><p>Uma armadilha comum é pensar:</p><blockquote><p>"Vou criar vários GSIs e depois vejo como consultar."</p></blockquote><p>Isso é perigoso.</p><p>Em DynamoDB, o ideal é começar pelos access patterns.</p><p>Antes de criar a tabela, pergunte:</p><pre><code class="hljs language-txt">Como minha aplicação vai buscar esses dados?Quais telas precisam desses dados?Quais filtros são obrigatórios?Qual ordenação eu preciso?Qual volume de leitura e escrita espero?Preciso de consistência forte?</code></pre><p>Depois disso, você decide a chave da tabela e os GSIs.</p><p>GSI não deve ser tratado como gambiarra para consulta mal pensada.</p><p>Ele deve ser parte da modelagem.</p><hr><h2 id="luiz1nn-content-exemplo-mais-próximo-do-mundo-real">Exemplo mais próximo do mundo real</h2><p>Imagine um SaaS multi-tenant.</p><p>Você tem uma tabela de produtos:</p><pre><code class="hljs language-txt">ProductsPK: productIdAttributes:- productId- companyId- categoryId- name- status- stock- createdAt</code></pre><p>Buscar produto por ID é fácil.</p><p>Mas em uma tela de dashboard, talvez você precise listar os produtos de uma empresa:</p><pre><code class="hljs language-txt">GSI: ProductsByCompanyPK: companyIdSK: createdAt</code></pre><p>Em outra tela, talvez precise listar produtos por categoria dentro da empresa:</p><pre><code class="hljs language-txt">GSI: ProductsByCompanyAndCategoryPK: companyId#categoryIdSK: name</code></pre><p>E talvez no dashboard você precise listar produtos com estoque baixo.</p><p>Nesse caso, criar um GSI pode ou não ser a melhor opção. Depende do volume, da frequência de consulta e da forma como o alerta será calculado.</p><p>O importante é entender que cada GSI nasce para responder uma pergunta:</p><pre><code class="hljs language-txt">Quais produtos pertencem a essa empresa?Quais produtos dessa categoria pertencem a essa empresa?Quais produtos estão ativos?Quais produtos precisam aparecer no dashboard?</code></pre><hr><h2 id="luiz1nn-content-resumo-mental">Resumo mental</h2><p>Para mim, o jeito mais simples de pensar em GSI é:</p><blockquote><p>A tabela principal responde um caminho de busca.<br>O GSI cria outro caminho de busca.</p></blockquote><p>Mas esse novo caminho tem custo.</p><p>Ele ocupa espaço, consome capacidade, precisa ser atualizado e trabalha com consistência eventual.</p><p>Então, GSI é uma ferramenta poderosa, mas precisa ser usada com intenção.</p><hr><h2 id="luiz1nn-content-conclusão">Conclusão</h2><p>Global Secondary Index é um dos conceitos mais importantes para modelar bem tabelas no DynamoDB.</p><p>Ele permite consultar os mesmos dados por diferentes chaves, sem depender de scans caros e ineficientes.</p><p>Mas ele também traz trade-offs:</p><ul><li>mais custo</li><li>mais complexidade</li><li>consistência eventual</li><li>risco de hot partition</li><li>necessidade de pensar melhor nos access patterns</li></ul><p>No fim, GSI não é só um "índice secundário".</p><p>Ele é uma forma de materializar um novo padrão de acesso dentro do seu banco.</p><p>E em bancos como DynamoDB, entender os padrões de acesso antes de modelar os dados faz toda a diferença.</p><hr><blockquote><p>Passei o dia todo procrastinando e também ocupado com outros afazeres, mas não queria deixar esse estudo morrer só no meu caderno. Então estou postando agora uma parte do que estudei hoje sobre GSI (Global Secondary Index). Talvez não esteja perfeito, mas faz parte do processo: estudar, organizar as ideias e compartilhar.</p></blockquote></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A mecânica real por trás das TabCoins — Descomplicada]]></title>
            <link>https://www.tabnews.com.br/ale3xandr3lUsis/a-mecanica-real-por-tras-das-tabcoins-explica-da-melhor-forma-que-eu-consegui</link>
            <guid>https://www.tabnews.com.br/ale3xandr3lUsis/a-mecanica-real-por-tras-das-tabcoins-explica-da-melhor-forma-que-eu-consegui</guid>
            <pubDate>Tue, 26 May 2026 01:51:10 GMT</pubDate>
            <description><![CDATA[Como o algoritmo de recompensa diária realmente funciona A recompensa diária não é aleatória nem linear. Ela é calculada com base em três fatores: P — Prestígio Reflete a média das qualif...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><h3 id="ale3xandr3lusis-content-como-o-algoritmo-de-recompensa-diária-realmente-funciona">Como o algoritmo de recompensa diária realmente funciona</h3><p>A recompensa diária não é aleatória nem linear. Ela é calculada com base em três fatores:</p><p><strong>P — Prestígio</strong><br>Reflete a média das qualificações dos seus conteúdos mais recentes. Quanto mais votos positivos você recebe, maior o P.</p><p><strong>I — Idade do conteúdo mais recente</strong><br>O sistema pega sua publicação mais recente (post ou comentário) e divide a idade dela por uma semana. Se você publicou há menos de uma semana, <code>I = 1</code>. Se ficou mais tempo sem publicar, I cai e penaliza sua recompensa.</p><p><strong>Q — Saldo de TabCoins acumulado</strong><br>Seu saldo é dividido por 20 e o resultado é elevado ao quadrado. Quanto mais TabCoins você acumula sem gastar, maior o Q — e ele é subtraído do cálculo. Ou seja: guardar moedas sem usá-las <em>diminui</em> sua recompensa diária.</p><p>A recompensa final é aproximadamente: <code>P × I × (1 - Q)</code></p><hr><h3 id="ale3xandr3lusis-content-o-que-isso-muda-na-prática">O que isso muda na prática</h3><p>A estratégia ótima não é acumular — é circular:</p><ol><li><strong>Publique com frequência menor que 7 dias</strong> (mesmo que seja um comentário relevante em algum post)</li><li><strong>Use suas TabCoins para qualificar conteúdos dos outros</strong> — cada qualificação custa 2 TabCoins e te dá 1 TabCash</li><li><strong>Mantenha seu saldo abaixo de 20</strong> para que Q fique próximo de zero</li></ol><p>Fazendo isso, sua recompensa diária depende <em>quase só da qualidade dos seus conteúdos</em>, que é o único fator que você realmente controla.</p><hr><h3 id="ale3xandr3lusis-content-outros-pontos-que-a-documentação-não-destaca-bem">Outros pontos que a documentação não destaca bem</h3><p><strong>Ao criar um post</strong>, o sistema olha a média de TabCoins dos seus conteúdos mais recentes para decidir quantos você ganha. Usuário novo com histórico neutro ganha menos do que usuário com histórico positivo.</p><p><strong>Ao deletar um conteúdo</strong>, o sistema cobra de volta:</p><ul><li>Se o conteúdo estava positivo → você devolve tudo que ganhou (publicação + votos)</li><li>Se estava zerado ou negativo → você devolve apenas o que ganhou ao publicar</li></ul><p><strong>Permissão para publicar</strong> pode ser suspensa se você tiver muitas publicações classificadas como irrelevantes. O sistema te avisa para excluir antes de postar de novo.</p><hr><h3 id="ale3xandr3lusis-content-o-horário-importa">O horário importa</h3><p>O corte da recompensa diária é às <strong>21h (horário de Brasília)</strong>. Você tem da 21h de um dia até as 21h do dia seguinte para registrar seu acesso e garantir a recompensa.</p><hr><h3 id="ale3xandr3lusis-content-resumo-prático">Resumo prático</h3><table><thead><tr><th>O que fazer</th><th>Por quê</th></tr></thead><tbody><tr><td>Publicar ou comentar pelo menos 1x por semana</td><td>Mantém <code>I = 1</code></td></tr><tr><td>Gastar TabCoins qualificando conteúdos</td><td>Mantém <code>Q ≈ 0</code></td></tr><tr><td>Focar em conteúdo bem recebido</td><td>Aumenta <code>P</code></td></tr><tr><td>Acessar antes das 21h todo dia</td><td>Garante a recompensa diária</td></tr></tbody></table><p>As fontes disso tudo estão nos PRs <a href="https://github.com/filipedeschamps/tabnews.com.br/pull/1508">#1508</a> e <a href="https://github.com/filipedeschamps/tabnews.com.br/pull/1509">#1509</a> e na <a href="https://github.com/filipedeschamps/tabnews.com.br/issues/1381">issue #1381</a> — vale a pena ler se quiser os detalhes completos da implementação.</p></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Pitch: Redação de dados sensíveis no .NET: logs, JSON, XML, EF e MongoDB cobrindo a LGPD]]></title>
            <link>https://www.tabnews.com.br/gabrielna/redacao-de-dados-sensiveis-no-net-logs-json-xml-ef-e-mongodb-cobrindo-a-lgpd</link>
            <guid>https://www.tabnews.com.br/gabrielna/redacao-de-dados-sensiveis-no-net-logs-json-xml-ef-e-mongodb-cobrindo-a-lgpd</guid>
            <pubDate>Tue, 26 May 2026 01:39:57 GMT</pubDate>
            <description><![CDATA[No trabalho começamos a nos preparar para certificação ISO27001 e me deparei com um dilema: Redigir dados sensíveis em vários pontos da aplicação usando helpers e replicando para outros p...]]></description>
            <content:encoded><![CDATA[<div class="markdown-body"><p>No trabalho começamos a nos preparar para certificação ISO27001 e me deparei com um dilema: Redigir dados sensíveis em vários pontos da aplicação usando helpers e replicando para outros projetos OU usar/aplicar já táticas mais robustas e seguras existentes no ecossistema .NET?<br>Até então não encontrei nenhuma solução pronta que fosse simples de configurar e que entendesse o contexto brasileiro (CPF, CNPJ, CNH, Placa Mercosul, etc.) e que principalmente tivesse uma documentação legal.</p><p>Lembrei em algum canto do meu cerébro que a Microsoft dispunha de um nuget de compliance, mas de novo não queria ficar repetindo código em cada projeto pra fazer anonimização dos dados, então resolvi criar o EZ.Redact.Lgpd e seus nugets derivados.</p><h2 id="gabrielna-content-o-que-é-o-ezredactlgpd">O que é o EZ.Redact.Lgpd?</h2><p>É um conjunto de pacotes .NET construído sobre o <code>Microsoft.Extensions.Compliance.Redaction</code> que cobre os principais pontos onde dados sensíveis podem vazar numa aplicação:</p><ul><li><strong>EZ.Redact.Lgpd.Core</strong> — base de redação com suporte a masking e HMAC, zero allocation com <code>Span&#x3C;char></code>, cobrindo CPF, CNPJ, CNH, Email, Telefone, Placa Mercosul, PIX, entre outros dados brasileiros</li><li><strong>EZ.Redact.Lgpd.Json</strong> — redação na serialização JSON com suporte a System.Text.Json e Newtonsoft.Json</li><li><strong>EZ.Redact.Lgpd.Xml</strong> — redação na serialização XML com suporte a XmlSerializer e DataContractSerializer</li><li><strong>EZ.Redact.Lgpd.EntityFramework</strong> — redação opt-in na leitura de dados via EF Core, ideal para aplicações MAUI, WinForms e SignalR</li><li><strong>EZ.Redact.Lgpd.MongoDb</strong> — redação opt-in na leitura de documentos no MongoDB</li></ul><h2 id="gabrielna-content-dois-modos-de-redação">Dois modos de redação</h2><p>O <code>Core</code> suporta dois modos configuráveis por tipo de dado:</p><ul><li><strong>Masking</strong> — preserva parte do dado para facilitar debugging: <code>123.***.***-01</code></li><li><strong>HMAC</strong> — hash determinístico irreversível, útil para logs de auditoria onde você quer correlacionar sem expor o dado original: <code>1:8fLm3q...==</code></li></ul><h2 id="gabrielna-content-uso-nos-logs">Uso nos logs</h2><p>Com o <code>Core</code> e o <code>ILogger</code> da Microsoft, basta decorar os parâmetros com os atributos de taxonomia:</p><pre><code class="hljs language-csharp"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">partial</span> <span class="hljs-keyword">class</span> <span class="hljs-title">TesteLog</span>{    [<span class="hljs-meta">LoggerMessage(Message = <span class="hljs-string">"Cpf anonimizado: {Cpf}"</span>)</span>]    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">partial</span> <span class="hljs-keyword">void</span> <span class="hljs-title">LogAcesso</span>(<span class="hljs-params"><span class="hljs-keyword">this</span> ILogger logger, [CPFData] <span class="hljs-built_in">string</span> cpf</span>)</span>;}</code></pre><p>E no seu ILogger (funciona também com ILogger&#x3C;\T>)</p><pre><code class="hljs language-csharp">_logger.LogInformation(<span class="hljs-string">"Cpf não anonimizado: {Cpf}"</span>, <span class="hljs-string">"111.111.111-11"</span>);_logger.LogAcesso(<span class="hljs-string">"111.111.111-11"</span>);</code></pre><p>O dado já sai redigido automaticamente no log, independente do provider (console, Application Insights, etc.).<br>O Que inclusive já vai até redigido para o OpenTelemetry ou outra solução de análise de log!</p><pre><code class="hljs language-bash">info: Program[0]      Cpf não anonimizado: 111.111.111-11 11111111111info: Program[158633788]      Cpf anonimizado: 111.***.***-11</code></pre><p>A Lista de atributos suportados que cobrem os principais dados sensíveis você encontra no repositório do <a href="https://github.com/ez-dotnet/ez-redact-lgpd-core">EZ.Redact.Lgpd.Core</a>.</p><h2 id="gabrielna-content-links">Links</h2><ul><li>GitHub: <a href="https://github.com/ez-dotnet">https://github.com/ez-dotnet</a></li><li>NuGet: <a href="https://www.nuget.org/packages/EZ.Redact.Lgpd.Core" rel="nofollow">https://www.nuget.org/packages/EZ.Redact.Lgpd.Core</a></li></ul><p>Também tenho um outro projeto de source generator pra registro de minimal api usando um estilo controller usando atributos</p><ul><li>NuGet: <a href="https://www.nuget.org/packages/EZ.MinimalApi.Generator" rel="nofollow">https://www.nuget.org/packages/EZ.MinimalApi.Generator</a></li></ul><p>Feedback é muito bem-vindo, especialmente se você tem casos de uso que os pacotes ainda não cobrem!</p></div>]]></content:encoded>
        </item>
    </channel>
</rss>