Bastidores

Desenvolvimento· Arrumando a casa · parte 12

O antispam esperou tanto que parou o formulário.

Como defini o que bloquear quando o Turnstile falha, o que deixar passar e o que registrar para manter a captura disponível.

Um formulário com o desafio antispam carregando e um relógio marcando o limite de 5 segundos.

O desafio também pode impedir a captura

Quando o Turnstile demorava para responder, o formulário parava de receber e-mails. Em um produto que ainda não apresentei aqui, a captura esperava até 10 s pelo token, mas não havia prazo para o carregamento do próprio script. Se esse carregamento falhasse, a falha ficava guardada pela sessão inteira.

A API tratava o token vazio como uma checagem reprovada. Com challenges.cloudflare.com lento ou bloqueado, a captura parava, embora o requisito do produto determinasse que ela deveria deixar passar nessa situação.

Isso criou uma diferença entre o comportamento desejado e o que o visitante encontrava. A proteção estava na frente do formulário, mas a indisponibilidade do serviço recebia o mesmo tratamento de uma rejeição.

Um prazo cobre o script e o token

A correção colocou um prazo único de 5 s para o carregamento do script e a obtenção do token. Uma falha deixa de ficar presa pela sessão: na chamada seguinte, o processo pode tentar novamente. O widget só aparece quando a Cloudflare pede interação.

No servidor, token vazio passa a significar serviço indisponível. Nesse caso, a API não chama o siteverify e registra no_token no log. A passagem consome uma unidade extra do limite por IP como compensação.

Token presente e rejeitado segue bloqueado, com mensagem própria. Essa distinção deixa explícito o que eu permito quando a proteção não responde e o que continuo recusando quando ela responde com uma rejeição.

Os testes precisam de uma resposta prevista

Em outro produto, a suíte de navegador no CI não tinha chave do site. O fluxo de visitante esperava pelo Turnstile, três fluxos chegaram ao timeout e a suíte bateu em 30 minutos. A solução foi usar as chaves de teste do Turnstile.

O caso mostra que o ambiente de teste precisa contemplar o serviço do qual o fluxo depende. Sem uma resposta prevista para ele, a espera de um componente pode transformar três fluxos em uma suíte parada.

Nesse mesmo produto, o limite por IP também deixa passar se o serviço de contagem falha ou demora 2 s. O erro é registrado, porque login e análise precisam continuar disponíveis.

Cada produto escolhe a proteção que precisa

No Pagenello, o formulário combina Turnstile, limite por IP e proteção contra duplicados. Nos dois sites que são apenas estáticos, não há Turnstile porque não há formulário. A escolha acompanha o fluxo que precisa de proteção.

O token é a resposta que o formulário recebe para levar a verificação ao servidor. Se ele não chega, o servidor precisa saber distinguir essa ausência de uma resposta que chegou e foi recusada. Essa separação define o comportamento do formulário quando a dependência está indisponível.

O prazo único cobre o caminho inteiro até a resposta. Limitar apenas a espera pelo token deixava uma etapa anterior sem limite, de modo que o visitante ainda podia ficar preso antes de chegar à verificação. Ao reunir as duas esperas, a decisão de seguir não depende de descobrir em qual parte o carregamento parou.

A nova tentativa na chamada seguinte também evita transformar uma falha temporária em uma condição permanente da sessão. Se o serviço voltar a responder, o próximo envio pode usar a proteção novamente. Enquanto isso, o registro de no_token deixa uma pista sobre a passagem sem token.

Eu copiaria a decisão como uma pequena tabela de comportamentos: ausência de resposta, resposta rejeitada e resposta aceita. Para cada situação, escreveria o que o visitante vê, se a API continua e qual registro fica disponível. Depois conferiria o fluxo com o serviço lento ou indisponível, além do caminho em que ele responde.

A compensação no limite por IP faz parte da escolha de deixar passar. Ela não transforma a ausência do token em uma verificação bem-sucedida; acrescenta uma restrição ao fluxo que continua. A mensagem própria para uma rejeição mantém esse caso separado para quem usa o formulário. O registro de no_token permite separar depois as passagens sem token das respostas rejeitadas.

Essa lição apareceu em cada produto e ainda não é um padrão escrito entre eles. O critério que uso ao examinar uma falha é definir o que fica barrado, o que pode passar e o que compensa essa passagem. Em publicar da minha máquina, conto outra decisão em que explicitei os riscos aceitos.

Teste local verde até no S23, e o staging ainda achou um defeito.08 nov · DesenvolvimentoOutra IA revisou 4.170 traduções da IA em inglês e corrigiu 307.08 nov · Inteligência artificialA conta live do Stripe estava ativa, mas falhou na minha conferência.08 nov · LançamentoTrês regras de HSTS num só domínio: por que deixei o preload de fora.08 nov · DesenvolvimentoUma palavra a menos derrubou 13 páginas que já estavam no ar.08 nov · DesenvolvimentoOutro agente de IA revisou meu código 71 vezes e criou dois defeitos.08 nov · Inteligência artificialDepois de 20 anos de carreira, publiquei meu primeiro pacote no npm.08 nov · LançamentoSozinho com IA: iPhone, Android, SaaS com MCP e CLI, e já faturando.07 nov · BastidoresCopiei a mecânica dos líderes e recusei a mentira deles.07 nov · BastidoresA pergunta de LGPD que trava a venda: e o backup?07 nov · ProdutoA IA calibrou minha câmera pelos números. Ficou cara de lanterna.07 nov · BastidoresUm usuário não via o dia de ontem. Abri todo o passado do Garfim.07 nov · Produto62% baixavam o Garfim. O problema estava antes da página.07 nov · LançamentoO idioma certo na tela pode virar o errado no servidor.07 nov · DesenvolvimentoO limite de 10 por minuto que deixou passar muito mais.07 nov · DesenvolvimentoUm PR do Dependabot travou meu banco e as rotas voltaram 500.07 nov · DesenvolvimentoMeus produtos novos não começam do zero. Começam de um clone.07 nov · DesenvolvimentoTirei uma trava da minha IA e a resposta caiu de 5,5 s para 3,7 s.07 nov · DesenvolvimentoTroquei velocidade por uma auditora que confere cada frase.07 nov · Inteligência artificialEscrevi o método CERNE lendo seis especificações reais.07 nov · Inteligência artificialComo anunciar na Meta e vender online no CPF sem abrir empresa.05 nov · BastidoresPausei anúncios depois de ignorar o resultado anterior.05 nov · BastidoresComo depurei um erro de API sem log no registro do Garfim.05 nov · DesenvolvimentoComo forçar atualização no React Native antes de um defeito grave.05 nov · DesenvolvimentoComo levei o LCP do ClipLeve de 9,9 s para menos de 1,5 s.05 nov · DesenvolvimentoPubliquei 650 páginas contra a regra do meu método.05 nov · Inteligência artificialUma conta para organizar erros, métricas e IA dos meus produtos.05 nov · BastidoresSeparei o painel do site e pus o Access na porta.05 nov · DesenvolvimentoUma lista de 69 itens encontrou requisitos só no papel.05 nov · BastidoresO antispam esperou tanto que parou o formulário.05 nov · DesenvolvimentoCortei a publicação de 17 minutos para 4 na minha máquina.05 nov · DesenvolvimentoEu gravo. A IA corta, legenda e entrega o vídeo curto.05 nov · Inteligência artificialComo criar anúncios UGC com IA usando o método PROVA.05 nov · Inteligência artificialA IA disse que usou as skills. A página provou o contrário.05 nov · Inteligência artificialNove páginas reprovadas antes de encontrar uma identidade.05 nov · Inteligência artificialEm 48 horas, juntei domínios, e‑mail, sites e medição num padrão só.30 out · BastidoresPor que tirei os três sites do GPT Sites.30 out · DesenvolvimentoComo troquei o luisjunior.ai com cerca de 10 segundos fora do ar.30 out · DesenvolvimentoRefiz o luisjunior.ai do zero: cada afirmação com prova.30 out · LançamentoUm padrão para todos os domínios, inclusive os de produtos futuros.30 out · BastidoresTodo o e‑mail dos meus domínios saiu do VPS num só dia.30 out · DesenvolvimentoDecidi mover o envio do Garfim do Resend para a Cloudflare.30 out · DesenvolvimentoO método FONTE para aparecer no Google e nas respostas de IA.30 out · Inteligência artificialTrês sites, três decisões de busca, e uma delas é não gerar páginas.30 out · Inteligência artificialMedição de vários sites num painel só, com consentimento.30 out · BastidoresComo a IA me apresenta mídias para aprovação29 out · Inteligência artificialO Garfim chegou ao Google Play. Agora tem Android e iPhone.22 out · LançamentoConseguir testadores e esperar 14 dias: a reta final do Garfim no Android.22 out · BastidoresO ClipLeve chegou à App Store. O que aprendi até aqui.20 out · LançamentoO ClipLeve foi rejeitado de novo. Dessa vez, por uma palavra.20 out · ProdutoO Garfim foi aprovado. E já está na App Store.16 out · LançamentoA última negativa do Garfim: câmera, assinatura e o caminho inteiro.16 out · LançamentoClipLeve: o cuidado por trás de um vídeo mais leve.12 out · ProdutoPor que restaurar uma assinatura pode falhar em outra conta.12 out · ProdutoQuando um aplicativo pode dizer que sua conta foi excluída?12 out · ProdutoO que a primeira negativa da App Store me fez explicar.08 out · LançamentoO que quero aprender com o teste fechado do Garfim.08 out · ProdutoO trabalho de uma assinatura continua depois da compra.03 out · DesenvolvimentoPor que o Garfim ganhou um plano gratuito.03 out · ProdutoO login funcionou. Por que a tela do Garfim não saiu do lugar?03 out · LançamentoPagenello: um site começa pelo que o visitante veio fazer.03 out · LançamentoComo uma foto do almoço vira um produto.27 set · ConcepçãoAs decisões que continuo tomando ao desenvolver com IA.27 set · DesenvolvimentoApresentar o Garfim ao público também é um teste do produto.27 set · Lançamento

GET luisjunior.ai/llms.txt

Esta é a versão do site escrita para modelos de linguagem: os mesmos fatos, sem layout, prontos para um assistente de IA ler e citar. Agentes no Chrome também encontram aqui ferramentas WebMCP para consultar produtos, textos e contato.

conectando…0 tokens · 0 tok/s