Apagando código morto, e pegando um motivo errado para uma resposta certa
Coisa pequena hoje: uma issue de limpeza para sobras de uma integração com o Medium que arranquei semanas atrás (o blog-manager agora publica no Medium através do Postiz, não por um fluxo nativo). A issue listava quatro coisas para apagar: um initializer de CORS, uma extensão de navegador, uma rake task, e três gems, cada uma com um motivo declarado. Normalmente eu não questiono uma issue que eu mesmo escrevi. Dessa vez questionei mesmo assim, e ainda bem.
O que eu construí
Apaguei config/initializers/cors.rb (CORS com wildcard restrito a uma rota que não existe mais), a extensão de navegador extension/ (que tinha essa mesma rota morta hardcoded), lib/tasks/medium.rake, e três gems agora sem uso do Gemfile. Direto ao ponto.
O que me surpreendeu
A issue dizia que a rake task devia sumir porque ela “mira o webhook removido.” Abri o arquivo para confirmar antes de apagar, e ele não menciona o webhook em nenhum momento. São três tasks para preencher retroativamente estado de sindicação do Medium e imagens de destaque a partir de snapshots de produção, uma preocupação completamente diferente. Então por que apagar?
Chequei o que ela realmente chama: duas service classes, Medium::PublishedBackfill e Medium::HeroImageBackfill. Nenhuma das duas existe mais. Foram apagadas semanas atrás no mesmo PR que derrubou toda coluna medium_* do banco, como parte da remoção original do Medium. Quem escreveu essa nota de remoção da rake task (eu, aparentemente, com pressa) acertou a conclusão e errou o raciocínio. A task realmente está morta, só não pelo motivo declarado. Cada uma das três tasks levantaria um NameError no momento em que fosse rodada.
Essa distinção importa mais do que parece à primeira vista. Se eu tivesse aceitado o motivo declarado sem questionar e seguido em frente, teria apagado o arquivo sem perceber que uma segunda funcionalidade, sem relação nenhuma (preencher retroativamente estado de sindicação a partir de um snapshot de produção), já tinha apodrecido silenciosamente. Aconteceu de estar morta também, então não fez mal dessa vez. Mas “o motivo declarado está errado” e “a conclusão também está errada” são falhas diferentes, e checar só a segunda não custa nada a mais quando você já está lendo o arquivo mesmo.
A issue também pedia para eu limpar referências obsoletas ao Medium no README, no CLAUDE.md e na documentação. Dei grep antes. Não tinha nenhuma, toda menção que sobrou nesses arquivos descreve corretamente o fluxo baseado em Postiz que ainda está no ar. Mais um lugar onde a lista de tarefas e a realidade tinham divergido silenciosamente desde que escrevi ela.
Aí a revisão de código no PR pegou mais uma coisa que eu tinha passado batido inteiramente: uma credencial órfã. A extensão se autenticava no webhook dela com um segredo compartilhado, guardado no arquivo de credenciais criptografado. Nada mais referenciava ele, mas eu não tinha pensado em checar credenciais enquanto pensava em código e gems. Removi essa também, usando um scriptzinho não interativo em vez do fluxo normal de credentials:edit, especificamente para o valor descriptografado nunca tocar num terminal ou num log.
O que vem a seguir
Nada dramático, o backlog tem mais alguns itens pequenos de reforço no mesmo espírito. Mas estou anotando para mim mesmo: quando uma issue declara um motivo para uma ação, ler código o suficiente para verificar o motivo, não só o suficiente para confirmar a ação. Normalmente eles batem. Quando não batem, vale a pena saber por quê antes de confiar no próximo item “obviamente correto” da lista.
Leitura relacionada
Uma correção de desvio de documentação que não foi tão chata quanto parecia
Três itens da auditoria que cada um virou outra coisa: uma alegação meio corrigida, uma recuperação de senha silenciosamente morta, e um e-mail de staging que apontaria para produção.
Um 500 escondido dentro das rotas isoladas de uma engine montada
O painel de jobs retornava um 500 em vez de uma página de login: helpers de rota sem qualificação resolvem contra a engine, não contra a aplicação. Uma linha, mais o gêmeo dormente dela.
Adicionando links dos posts ao vivo no painel
Fazendo os títulos do painel linkarem para os posts ao vivo: um prefixo de caminho configurável, uma trava por pub_date contra links quebrados, e uma coluna do spec que descartei.
Você também pode achar útil
RackNerd VPS
Hospedagem VPS econômica para serviços leves que funcionam continuamente.
Como afiliado da RackNerd, ganho com compras qualificadas.
Saiba maisNordPass
Gerenciador de senhas da equipe por trás da NordVPN, com um plano gratuito.
Como afiliado da NordPass, ganho com compras qualificadas.
Saiba maisProton VPN
VPN comercial com filtragem NetShield e interruptor de desligamento automático.
Como parceiro da Proton, ganho com compras qualificadas dos serviços de privacidade e segurança da Proton (Pass, Mail, VPN, Drive).
Saiba mais