ChromaDB: Como usar um banco de dados vetorial para não fazer besteira ensinando

O problema: ensinar o que você ainda não ensinou Tenho um curso de programação com 47 aulas. Cada aula tem notes (onde explico as coisas) e labs (onde o aluno pratica). E tenho um problema: às vezes uso conceitos nos labs que ainda não expliquei nas notes. “Beleza, neste exercício usa map para transformar a lista.” O problema? Não expliquei o que diabos é map até três aulas depois. Isso acontece mais do que você pensa. Você tem o material na cabeça, pula de um lugar para outro, e sem perceber assume que o aluno sabe coisas que você ainda não contou para ele. O resultado: frustração, confusão, e alunos que pensam que são burros quando o burro é você. ...

18 de janeiro de 2026 · Fernando

Bun: O runtime que quer aposentar o Node (e agora tem grana para isso)

A notícia que ninguém viu chegando Na semana passada, enquanto você e eu estávamos tranquilamente brigando com o node_modules, a Anthropic soltou uma bomba: compraram o Bun. Isso mesmo, a empresa por trás do Claude decidiu que seu futuro passa por um runtime JavaScript escrito em Zig por um cara que pensou “e se fosse Node, mas rápido?”. O Claude Code acabou de atingir um bilhão de dólares em receita, e aparentemente a primeira coisa que você faz quando sobra dinheiro é comprar ferramentas de desenvolvimento. ...

18 de janeiro de 2026 · Fernando

Skills no Claude Code: Ensinando trucos novos ao cão velho

O problema de repetir tudo Já teve que explicar a mesma coisa para alguém vinte vezes? Pois imagine isso, mas com um robô que ainda por cima perde a memória a cada poucas horas. “Não, Claude, o commit tem que passar nos testes primeiro.” “Claude, já disse que usa o formato tipo: descrição.” “Para de adicionar emojis, cara!” Esse era o meu dia a dia até descobrir os Skills. Falando sem rodeios: são instruções que você escreve uma vez e o Claude segue para sempre. Como treinar um cachorro, mas sem as rações. ...

12 de janeiro de 2026 · Fernando

Linear e Beads: Como evitar que sua IA tenha Alzheimer

A amnésia do robô Imagine que você contrata um programador brilhante. Resolve problemas complexos, escreve código limpo, entende sua arquitetura. Mas tem um pequeno defeito: a cada poucas horas apagam a memória dele. Volta a começar do zero. Não lembra o que estava fazendo, o que vocês decidiram juntos, nem por que o código está como está. Pois é exatamente isso que acontece com Claude Code e outros agentes de IA. ...

12 de janeiro de 2025 · Fernando

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 --- title: "Meu setup: Claude Code + Ghostty + worktrees em um Mac" date: 2026-03-11T23:55:00+01:00 draft: false slug: "meu-setup-claude-code-ghostty-worktrees-mac" slug_en: "claude-code-ghostty-worktrees-mac-setup" description: "Como combino Ghostty, git worktrees e Claude Code no meu fluxo diário de desenvolvimento no macOS. Sem flickering, buffer infinito, e paralelismo real com worktrees." tags: ["claude-code", "ghostty", "git", "worktrees", "produtividade", "mac", "fluxo de trabalho", "setup"] categories: ["ferramentas"] translation: hash: "" last_translated: "" notes: | - "irse de cañas": "going out for beers". Spanish social ritual. Use local equivalent. - "dicho en cristiano": "in plain language". No religious connotation. - "de cojones": vulgar but affectionate intensifier meaning "really good / badass". Equivalent: "damn good" or "kickass". - "ñapa": "hack/bodge". Affectionate, not derogatory. - "currar": colloquial for "to work". Very common in Spain. - "mola": "it's cool / it's great". Casual. - "chapucilla": diminutive of "chapuza" (hack/kludge). Even more affectionate than "ñapa". - "Quick Terminal estilo Quake": reference to the dropdown console in Quake (1996 videogame). Widely known among devs. - "buffer del carajo": "huge-ass buffer". Vulgar but common intensifier. - "la guinda / el pastel": "the icing / the cake". Spanish version of "icing on the cake". social: publish: true scheduled_date: 2026-03-14 platforms: ["twitter", "linkedin"] excerpt: "Ghostty não pisca, tem um buffer gigantesco e suporta worktrees para três agentes Claude Code em paralelo. Meu setup de desenvolvimento no Mac, passo a passo." wordpress: publish: true categories: [1] tags: ["claude-code", "ghostty", "git", "worktrees", "produtividade", "mac"] video: generate: false style: "educational" --- Tenho três sessões do Claude Code abertas neste momento. Uma está traduzindo posts do blog. Outra está escrevendo testes para uma CLI. A terceira está me ajudando a depurar um pipeline de dados. Cada uma no seu próprio *worktree*, cada uma no seu próprio *split* do Ghostty, e eu alternando entre elas com `Cmd+Alt+Setas`. Não abro o iTerm2 há meses. Não mexo no tmux há semanas. Tudo vive em uma única janela do Ghostty. É o setup perfeito? Não. É o que mais me deixou produtivo até hoje? Sem dúvida. ## Por que Ghostty e não outro terminal Vou ser direto: O Ghostty suga a bateria como se estivesse minerando Bitcoin. Já contei em detalhes no [post sobre terminais GPU e bateria](/pt/posts/terminal-gpu-bateria-macbook-ghostty-iterm2/). Isso não mudou, e essa é sua maior desvantagem. Se estou usando bateria, fecho o Ghostty e abro o Terminal.app sem pensar duas vezes. Mas quando estou conectado à energia (o que acontece 80% do tempo, na minha mesa com o Studio Display), o Ghostty é imbatível por duas razões que não têm nada a ver com firulas estéticas: **1. Não tem flicker.** Parece besteira até você passar oito horas por dia olhando para um terminal. O iTerm2 tem micro-agitações no *scroll* rápido, artefatos ao redimensionar janelas, um *flicker* sutil ao trocar de abas. O Terminal.app é ainda pior. O Ghostty, rendendo via GPU, tem uma fluidez visual que não cansa os olhos. Quando Claude Code despeja 200 linhas de output e você faz *scroll* para revisá-las, a diferença entre um terminal que pisca e outro que não pisca é como a diferença entre ler um livro e ler um livro com alguém acendendo e apagando as luzes constantemente. **2. Você pode configurar um buffer gigantesco.** Com `scrollback-limit = 50000`, tenho 50.000 linhas de histórico por painel. Claude Code é prolixo: gera código, explica, executa, mostra o output, e às vezes estende a explicação por centenas de linhas. Com o iTerm2 ou o Terminal.app, o *scrollback* padrão é limitado e acaba perdendo o contexto. Com o Ghostty, consigo voltar ao início de uma sessão de duas horas atrás e encontrar exatamente o que preciso. Depois ainda há extras bacanas — *splits* nativos com `Cmd+D`, *Quick Terminal* estilo Quake com `Ctrl+\`` — mas esses são a cereja do bolo. O bolo mesmo é não piscar e não perder histórico. ## A anatomia da minha janela Quando estou no modo "paralelo" — várias tarefas independentes ao mesmo tempo — minha janela do Ghostty fica assim: ┌──────────────────────────────────┬──────────────────────────────────┐ │ │ │ │ Claude Code (worktree A) │ Claude Code (worktree B) │ │ feature/nova-validacao │ chore/traducoes │ │ │ │ │ │ │ ├──────────────────────────────────┴──────────────────────────────────┤ │ │ │ Repo principal (main) — testes, builds, git log │ │ │ └─────────────────────────────────────────────────────────────────────┘ ...

Fernando

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 title: "/loop no Claude Code: o cron que vive e morre com seu terminal" date: 2026-03-09T12:00:00+01:00 draft: false slug: "loop-cron-claude-code" slug_en: "claude-code-loop-vs-cron-scheduling" description: "Claude Code 2.1.71 traz /loop, um scheduler inline para tarefas recorrentes. O que faz, para que serve e por que não substitui um cron de verdade." tags: ["claude-code", "anthropic", "produtividade", "automação", "cron"] categories: ["opinião"] translation: hash: "" last_translated: "" notes: | - "de aquella manera": means "sort of / barely / in a half-baked way". Not literal. - "ojo": "watch out" / "here's the thing". Not the body part. - "chapuza": "hack/bodge/kludge". Quick-and-dirty solution. - "barra del bar": "bar counter" — casual conversation metaphor. - "chupar banquillo": sports metaphor meaning "to sit on the bench" / "wait unused". --- Faz meses que estou rodando tarefas do Claude Code com um cron caseiro. Um script Bash que inicia uma sessão headless, passa um prompt, espera terminar e fecha. Funciona. Mais ou menos, mas funciona. Está no [GitHub](https://github.com/frr149/claude-cron) caso alguém queira. E na sexta-feira, com a versão 2.1.71, a Anthropic introduziu o `/loop`. Um scheduler nativo. Dentro da própria sessão do Claude Code. Minha primeira reação foi: "Mataram meu projeto." Minha segunda reação, depois de testar: "Não. Mas quase." ## O que faz o /loop A sintaxe é direta: /loop 5m check the deploy status ...

Fernando

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 title: "Anatomia do Remote Control do Claude Code: a API oculta que você ainda não pode usar" date: 2026-02-27T18:00:00+01:00 draft: false slug: "claude-code-remote-control-api-oculta" slug_en: "claude-code-remote-control-hidden-api" description: "A Anthropic anunciou o Remote Control para o Claude Code. Investigamos a API do bridge, os WebSockets, os rastros em disco e por que, em fevereiro de 2026, isso ainda não funciona para todas as contas Max." tags: ["claude-code", "anthropic", "api", "websocket", "remote-control", "engenharia-reversa"] categories: ["opinião"] translation: hash: "" last_translated: "" notes: | - "grifo": metáfora para conceder/negarem acesso ("torneira"). Não traduzir como "grifon". - "com o traseiro de fora": "pego no flagra" / "exposto". Não é vulgar neste contexto. - "dito de forma clara": "em palavras simples". Sem conotação religiosa. - "gambiarra": "hack/adaptação improvisada". Não pejorativo, significa solução provisória. - "balcão do bar": "balcão do bar" — metáfora para conversa informal, não literal. - "legal": gíria que corresponde a "it's cool/neat". - "parece que": equivale a "pinta" no contexto. --- No dia 25 de fevereiro de 2026, a Anthropic anunciou o *Remote Control* para o Claude Code. A ideia: você inicia o Claude Code no seu terminal, vai para o sofá com o celular e continua a sessão a partir de claude.ai. Sem SSH. Sem *tmux*. Sem ter que ficar preso à tela do terminal remoto. Legal. Na teoria. Porque, na prática, quando ativei (`/rc` no terminal), ele me forneceu uma URL, abri no celular, fiz o login... e o site claude.ai me respondeu com um "this feature is not active in your organization". Fevereiro de 2026, conta Max 5x, tudo em dia. E nada. Então, fiz o que qualquer pessoa razoável faria: comecei a desmontar a API para entender o que está acontecendo nos bastidores. ## O que é o Remote Control (versão oficial) Em essência: uma ponte entre sua CLI local e o site claude.ai. A CLI do Claude Code continua rodando na sua máquina (com acesso ao seu código, terminal, arquivos), mas você pode visualizar, aprovar *tool calls* e enviar mensagens de qualquer navegador. A Anthropic apresentou isso como um "*research preview*", apenas para contas Max. A promessa é que você pode iniciar uma tarefa longa (`/rc` + seu prompt), fechar o laptop, ir à academia e revisar o progresso no celular. Na realidade, como veremos, as coisas são mais complexas. ## O que descobrimos nos bastidores Quando você executa `/rc`, o Claude Code faz várias coisas por trás das cortinas. E deixa rastros. Muitos rastros. Em arquivos JSONL, em *debug logs* e até nas respostas da API. Vamos por partes. ### 1. A Bridge API A primeira coisa que a CLI faz é registrar um "*environment*" na API da Anthropic: POST https://api.anthropic.com/v1/environments/bridge ...

Fernando

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 title: "O cache do seu LLM te cobra o dobro para economizar dinheiro (e faz sentido)" date: 2026-03-10T18:00:00+01:00 draft: false slug: "cache-llm-custo-contraditorio" slug_en: "llm-cache-cost-counterintuitive-savings" description: "O prompt caching reduz 90% o custo de input, mas escrever no cache custa 25% a mais. A conta aumenta antes de diminuir. Como funciona e o que você pode fazer para controlar os gastos." tags: ["llm", "claude", "anthropic", "custo", "prompt-caching", "api"] categories: ["opinião"] translation: hash: "" last_translated: "" notes: | - "olho no dado": coloquial, equivalente a "preste atenção nisso" / "essa é a questão". - "dito de forma simples": maneira informal de "em termos simples". Sem conotação religiosa. - "o cara do balcão": referência hipotética a uma pessoa numa conversa casual. - "balcão do bar": metáfora de conversa casual. - "tapa na cara": usado figurativamente para um custo inesperado na conta. - "ninguém consegue pagar isso": exagero para efeito dramático. - "gambiarra": solução improvisada, não necessariamente pejorativa. --- Algumas semanas atrás, publiquei um artigo explicando por que 99% do que você envia para o Claude já está em cache. Tensores KV, VRAM, SSDs locais — toda a maquinaria interna. Mas deixei de fora a parte que mais dói: a conta. ...

Fernando

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 title: "RustyClaw: vou reescrever um agente de IA em Rust (porque o meme pediu)" date: 2026-02-24T18:00:00+01:00 draft: false slug: "rustyclaw-manifesto-rewrite-it-in-rust" slug_en: "rustyclaw-manifesto-rewrite-ai-agent-rust" description: "Vou portar 8.300 linhas de Python para Rust usando LLMs como copiloto. O objetivo real: testar o desenvolvimento adversarial em um port puro e direto. Com dados honestos e um contador de alucinações." tags: ["rust", "python", "ia", "llm", "riir", "rustyclaw"] categories: ["rustyclaw"] series: ["RustyClaw: Rewrite It In Rust"] translation: hash: "" last_translated: "" notes: | - "RIIR": acrônimo do meme "Rewrite It In Rust". Não traduzir, é jargão universalmente conhecido na comunidade Rust. - "Sr. Cangrejo": referência ao Sr. Siriguejo (Mr. Krabs) de Bob Esponja (SpongeBob). Em inglês usar "Mr. Krabs", em português "Sr. Siriguejo", em francês "M. Krabs". - "chapuza": significa "trabalho mal feito". Não traduzir literalmente. - "me la pela": expressão vulgar no sentido de "não estou nem aí". Usar equivalente coloquial para passar o mesmo tom no idioma-alvo. - "ñapa": sinônimo de gambiarrão, solução rápida e improvisada. - "conejillo de indias": traduzir diretamente como "cobaia". - "barra del bar": traduzir como balcão (referência a conversas informais). - "otro gallo cantaría": significado de "seria outra história". Usar equivalente idiomático local. social: publish: true scheduled_date: 2026-02-28 platforms: ["twitter", "linkedin"] excerpt: "Vou portar um agente de IA de 8.300 linhas de Python para Rust. O objetivo: testar o desenvolvimento adversarial em um port real. Dados honestos de consumo, custo e alucinações. Porque o que é melhor do que uma AGI? Uma AGI reescrita em Rust." wordpress: publish: true categories: [1] tags: ["rust", "python", "ia", "llm", "riir", "rustyclaw"] video: generate: false style: "educational" --- > *"Sabe qual é a melhor coisa no Rust? Que ele não deixa você compilar gambiarras. Sabe qual é a pior coisa? Que tudo que você escreve no início é uma gambiarra."* > — Sr. Siriguejo (provavelmente) O que é melhor do que um agente de IA? Um agente de IA *reescrito em Rust*. Se você está na internet há mais de cinco minutos, conhece o meme. Não importa o projeto: um editor de texto, um servidor DNS, uma calculadora de IMC. Alguém sempre aparece nos comentários dizendo "você deveria reescrever isso em Rust". É o *Rewrite It In Rust* — RIIR para os íntimos — e é tão inevitável quanto a gravidade. Pois bem, eu vou fazer isso de verdade. Vou portar 8.300 linhas de um agente de IA de Python para Rust. Mas não porque o meme pediu (ok, talvez um pouco). Vou fazer porque preciso de uma cobaia. ## A tese Passei algumas semanas escrevendo sobre [*falhas silenciosas*](/pt/posts/silent-failure-ia-inventa-testes-tudo-bem/), sobre as [cinco defesas contra alucinações](/pt/posts/cinco-defesas-alucinacoes-codigo/), sobre como um LLM pode gerar código que compila, passa os testes e ainda assim está errado. Eu até lhe dei um nome: **desenvolvimento adversarial**. *Nunca confie, sempre verifique.* Muita teoria. Agora é hora de colocar isso à prova. Precisava de um projeto com três características: um escopo definido (nada de um aplicativo novo com requisitos em constante mudança), uma fonte confiável de verdade (o código Python que já funciona) e com complexidade suficiente para que as alucinações do LLM tenham espaço para aparecer. Um port puro e direto atende aos três requisitos. O *input* e o *output* esperado já existem. Se a versão em Rust não se comportar exatamente como a versão em Python, há um bug. Simples assim. E já que vou portar algo, por que não aproveitar para aprender Rust de verdade? O *borrow checker*, *ownership*, *lifetimes*... Passo anos lendo sobre tudo isso sem botar a mão na massa. Se em vez de estudar tutoriais pela milésima vez, eu me jogasse em um projeto real, outra seria a história. ## O paciente Chama-se [nanobot](https://github.com/HKUDS/nanobot). É um agente de IA pessoal derivado do OpenClaw: uma ferramenta que conecta LLMs (Claude, GPT, DeepSeek, o que vier) a canais de chat — Telegram, Discord, Slack, email — e os equipa com habilidades. Ele pode ler e editar arquivos, executar comandos, fazer buscas na web, programar tarefas com cron e ainda manter uma memória persistente entre as conversas. E funciona. Tem meses que funciona. Em Python. Qual é o problema? Ele é *single-threaded*. Processa uma mensagem por vez. Se você enviar três mensagens seguidas, ele as coloca em fila como o caixa de um mercado no sábado ao meio-dia. Usa apenas 50 MB de RAM para, basicamente, rotear JSON entre APIs. E o código tem aquelas técnicas de *error handling* que dão vergonha alheia: `return f"Erro: {str(e)}"` para todo lado. Traduzindo: funciona, mas é uma gambiarra ambulante. Candidato perfeito. ## Por que Rust (além do meme) Eu poderia consertar isso no Python. Poderia colocar mais *asyncio*, tipar melhor os erros com exceções personalizadas, otimizar a memória. Seria o mais sensato. Mas isso não me dá um *test bench* para o desenvolvimento adversarial. Um refactor em Python não tem uma fonte externa de verdade — o "antes" e o "depois" compartilham linguagem, bibliotecas e os mesmos vieses do LLM. Já portar para outra linguagem resolve isso. Se o output do Rust for diferente do output do Python para o mesmo *input*, algum está mentindo. E é exatamente esse o tipo de verificação que eu quero testar. Além disso, Rust tem propriedades que tornam o experimento mais interessante: - **O compilador como primeira defesa.** Nulls, *type mismatch*, *data races*: categorias inteiras de bugs que no Python passam despercebidos mas que, no Rust, não passam pela compilação. Quantas alucinações de LLM o compilador barra antes de atingir um teste? Quero medir isso. - **Concorrência real.** `tokio` permite um *spawn* por conversa. Em Python isso é um calvário. É a melhoria funcional que justifica o port. - **Binário estático.** Um executável de 10 MB em vez de um `pip install` com 47 dependências. Para distribuição, não tem preço. - **Porque é legal.** Ok, isso não é um motivo técnico. Mas não me importo. ## A aventura (e o convite) RustyClaw — assim se chama o port — será um experimento documentado publicamente. Cada módulo portado será um post. Com dados reais: quantos tokens consumi, quanto custou, quantas vezes a IA alucinou, quanto tempo demorei lutando com o *borrow checker*. Sem maquiagem. Se eu gastar 3 horas em algo que no Python faria em 10 minutos, vou contar. Se o LLM inventar um *crate* que não existe (spoiler: vai acontecer), será documentado. Se, ao final do port, ficar claro que não valeu a pena, vou admitir. Todo mundo diz "usei IA para escrever código". Ninguém publica quanto custou, quantas vezes a IA mentiu e se o resultado aguentou no ambiente de produção. É exatamente isso que vou fazer. E quero que você me acompanhe. Porque vai ser uma aventura — com brigas contra o compilador, momentos de "POR QUE não compila se é ÓBVIO?", e pequenas vitórias quando um teste diferencial passar no verde. Vai ser divertido. Ou pelo menos, honesto. ## A stack (o lembrete) Se você é pythonista, a coluna da esquerda será familiar. Se você é *rustacean*, a da direita. Se não é nenhum dos dois, bem-vindo ao caos. | Camada | Python (nanobot) | Rust (rustyclaw) | |--------|------------------|------------------| | Runtime async | `asyncio` | `tokio` | | HTTP | `httpx` | `reqwest` | | Roteamento de LLM | `litellm` | **Não existe** — roteador próprio | | Telegram | `python-telegram-bot` | `teloxide` | | Discord | `websockets` (raw) | `tokio-tungstenite` (raw) | | Config | `pydantic` | `serde` + `figment` | | CLI | `typer` | `clap` | | Erros | `str(e)` | `anyhow` + `thiserror` | | Logging | `loguru` | `tracing` | | Copiloto IA | — | Claude Code + Codex | | Task runner | `make` | `just` | | Issues | — | `linear` CLI | A linha que mais dói é LiteLLM. Em Python, ele roteia para mais de 100 provedores de LLM com uma única chamada. Em Rust não existe algo parecido. Teremos que construir um roteador próprio. A boa notícia é que 80% dos provedores são compatíveis com a API da OpenAI, então com `async-openai` + configuração de *base_url* custom cobrimos quase tudo. Anthropic exigirá uma implementação específica. Por volta de ~300 linhas de código Rust. Parece tranquilo. *Parece.* As três últimas linhas são o *meta-stack*: ferramentas que usarei durante o port. Claude Code para sessões interativas em que preciso "pensar alto" com o LLM. Codex para ports mecânicos, onde o contexto já está definido e prefiro velocidade. `just` em vez de `make`, porque quero testar algo que não depende de tabs literais para funcionar. E o CLI do `linear` para gerenciar o progresso sem sair do terminal. ## A estratégia anti-alucinações (a parte séria) É aqui que a teoria do desenvolvimento adversarial encontra a prática. Um LLM assistindo nesse tipo de port tem grande potencial de inventar coisas plausíveis. O risco principal não é que o código falhe ao compilar. Rust não deixa você compilar lixo. O risco é que compile, passe os testes e funcione de maneira errada sem alertar. Exatamente a *falha silenciosa* que documentei há duas semanas. Cinco camadas de defesa: **1. O compilador do Rust.** Elimina nulls, *type mismatch*, *data races*. Primeira linha de defesa gratuita. Mas compilar não significa que esteja correto. **2. Testes diferenciais.** Mesma entrada → nanobot Python → saída. Mesma entrada → rustyclaw Rust → saída. Se não forem idênticos, há um problema. A fonte de verdade é o código Python já funcional. Essa é a camada mais importante do experimento. **3. Rastreamento de proveniência.** Cada arquivo portado terá um *header* com o arquivo-fonte em Python original, a sessão do LLM que o gerou e os resultados nos testes diferenciais. Rastreabilidade total. **4. Verificação de crates.** Cada *crate* sugerido pelo LLM → verificação manual em crates.io e docs.rs. Os LLMs inventam crates que não existem e APIs que não funcionam assim. Tudo com a maior segurança do mundo, como quem afirma que Sydney é a capital da Austrália. **5. Log de incidentes.** Cada alucinação detectada → *issue* com tag `hallucination`. Material para os posts e para não cometer os mesmos erros. A regra de ouro: > **O sistema de verificação precisa ser externo ao gerador.** Se o LLM gera o código, os testes e os *fixtures*, você estará validando ficção usando mais ficção. Os testes diferenciais contra o código Python original são a camada que quebra esse ciclo. E a vantagem de um port é que essa camada existe naturalmente. ## *Vale a pena?* Vamos à pergunta incômoda. Será que realmente vale a pena portar isso para Rust? | Métrica | Python | Rust (estimado) | Vale a pena? | |---------|--------|-----------------|--------------| | Latência de resposta | ~200ms overhead | ~5ms overhead | Não. O LLM leva entre 2 e 5 segundos de qualquer jeito. | | RAM | ~50MB | ~5MB | Não. Meu servidor tem 8GB. | | Concorrência | 1 mensagem por vez | N mensagens simultâneas | **Sim.** | | Startup | ~2s | ~50ms | Meh. | | Binário | `pip install` + 47 deps | Um executável | **Sim.** | | Segurança de tipos | `str(e)` everywhere | `Result<T, E>` | **Sim.** | | Que é legal | Não | Sim | Subjetivo. | Três de sete. Sendo generoso, quatro. A melhoria na latência e no consumo de RAM é irrelevante porque o gargalo sempre será a chamada ao LLM. Concorrência, por outro lado, importa muito para múltiplos usuários. O binário estático é uma verdadeira melhoria. Já a segurança de tipos... depois de ver `str(e)` esconder bugs por meses, isso sim faz diferença. Vale semanas de trabalho? Como port isolado, provavelmente não. Mas como banco de provas para desenvolvimento adversarial com dados reais publicados, acredito que sim. Ao final da série teremos números para decidir, não opiniões. ## Os números, sem filtros Cada sessão de trabalho será registrada em um CSV no repositório: ```csv date,llm,model,module,tokens_in,tokens_out,cost_usd,duration_min,loc_python,loc_rust,hallucinations,tests_pass LLM usado, tokens consumidos, custo, duração, linhas portadas, alucinações detectadas, testes aprovados. Tudo público. Tudo verificável. ...

Fernando