top of page

A Automação de Provas em Lean Acabou de Sair da Pesquisa para o Software Real

A automação de provas em Lean cruzou uma linha prática em 26 de julho, quando o engenheiro de segurança Adam Langley descreveu um decodificador Zstandard formalmente verificado e assistido por IA. Vários modelos de linguagem de grande escala geraram provas substanciais em cerca de 20 minutos, segundo Langley. Em seguida, Lean verificou essas provas sem aceitar marcadores de preenchimento inacabados. O experimento foi pequeno, mas desafia uma suposição persistente sobre software verificado: a prova talvez já não custe muito mais do que o programa.

Isso não significa que um modelo de IA tenha provado que o decodificador está correto em algum sentido amplo e filosófico. Langley selecionou as propriedades, escreveu boa parte da implementação e confirmou que Lean aceitou os termos de prova resultantes. Seu decodificador também era cerca de dez vezes mais lento que o comando zstd padrão. O avanço real é mais limitado e mais útil. A IA agora pode realizar trabalho suficiente de prova formal para mudar quais projetos de engenharia parecem economicamente viáveis.

Isso coloca os testes convencionais e a verificação formal em uma nova disputa. Testes amostram execuções selecionadas, enquanto uma prova formal pode abranger todas as entradas representadas por um teorema. Historicamente, essa garantia mais forte trouxe custos excepcionais de mão de obra. O famoso projeto de sistema operacional seL4 relatou esforços de prova muito além do trabalho de implementação. Se a IA comprimir esse trabalho sem entrar no caminho confiável de verificação, o software apoiado por provas deixa de parecer uma especialidade reservada a kernels e criptografia.

O que o Experimento com Zstandard em Lean Realmente Mudou

O resultado importante não foi que uma IA escreveu código. Foi que o trabalho de prova gerado por IA sobreviveu a um verificador mecânico independente.

Langley construiu um descompressor Zstandard em Lean, uma linguagem de programação funcional e um provador interativo de teoremas. Zstandard, geralmente abreviado como Zstd, é um formato de compressão criado para compressão rápida sem perdas. Seu decodificador precisa interpretar corretamente cabeçalhos compactos, símbolos codificados por entropia, comprimentos, deslocamentos e sequências repetidas.

Esses detalhes criam exatamente os bugs que sistemas de tipos convencionais têm dificuldade de excluir. Um comprimento decodificado pode divergir da entrada disponível. Um índice de array pode ultrapassar um limite. Uma tabela malformada pode produzir um estado que não deveria existir. Desenvolvedores normalmente gerenciam essas possibilidades por meio de validação, verificações em tempo de execução, testes, fuzzing e revisão cuidadosa.

Lean acrescenta outra opção. Seu sistema de tipos dependentes permite que um tipo incorpore fatos sobre um valor. Uma função pode retornar tanto um array de bytes quanto uma garantia verificada pela máquina de que o array possui o comprimento solicitado. O código posterior pode usar essa garantia ao acessar um elemento.

Langley mostrou esse padrão em um ramo do decodificador para codificação por comprimento de execução. O ramo precisava ler um byte de um bloco. Lean exigia uma prova de que o bloco continha esse byte. A implementação conectou o comprimento de leitura solicitado a um teorema que mostra que esse tipo de bloco sempre possui tamanho de conteúdo igual a um.

Essa prova local era curta. O exemplo mais consequente tratava da entropia de estado finito, ou FSE, que Zstandard usa para representar símbolos de forma eficiente. Langley implementou o algoritmo de construção de tabelas descrito pelo formato e então pediu a sistemas de IA que provassem propriedades universais sobre sua saída.

As propriedades solicitadas foram além de testes baseados em exemplos. Elas cobriam o tamanho da tabela, o número de entradas atribuídas a cada símbolo e transições válidas dentro da tabela. Em outras palavras, a prova descrevia regras estruturais que deveriam valer para todas as distribuições aceitas, não apenas para os três vetores de teste fornecidos pela especificação.

Langley relata que vários LLMs concluíram essas provas em aproximadamente 20 minutos. Ele também afirma que o trabalho consumiu apenas uma fração da cota de uma assinatura mensal padrão. Os modelos modificaram parte de sua implementação porque sua estrutura imperativa dificultava os mecanismos de prova de Lean. Em seguida, ele confirmou que as provas finais passaram pela checagem de tipos e não continham sorry, o marcador explícito de Lean para uma prova inacabada.

Seu relato completo, incluindo os trechos de código e as limitações, aparece no post original sobre automação de provas. Ele não publicou o repositório do decodificador, portanto desenvolvedores externos ainda não conseguem reproduzir todas as alegações. Isso continua sendo um relato de experiência, e não um resultado avaliado de forma independente.

Ainda assim, o experimento estabelece um fluxo de trabalho crível. Um humano declara o invariante. Uma IA busca uma prova e reformula o código quando necessário. Lean verifica o termo de prova produzido. O modelo fornece trabalho, mas o verificador decide a aceitação.

Essa divisão é o que separa esse resultado de uma demonstração rotineira de programação com IA.

Por que a Automação de Provas em Lean Importa para Trabalhadores do Conhecimento

A automação de provas importa porque pode transformar premissas importantes de prosa em produtos de trabalho verificados e reutilizáveis.

A maioria dos trabalhadores do conhecimento não escreve decodificadores de compressão. Ainda assim, vive dentro de sistemas construídos sobre premissas não documentadas. Um modelo financeiro espera que uma coluna contenha identificadores únicos. Um fluxo de trabalho de políticas pressupõe que toda aprovação tenha um responsável. Um pipeline de pesquisa espera que toda citação preserve sua fonte.

As equipes costumam expressar essas regras em documentação, comentários, materiais de integração ou notas de reunião. As regras se enfraquecem à medida que o trabalho atravessa ferramentas e departamentos. Um campo renomeado, um registro incomum ou um processo alterado pode invalidá-las sem produzir um alerta imediato.

Métodos formais abordam um problema semelhante no software. Eles transformam premissas selecionadas em declarações suficientemente precisas para que uma máquina possa verificá-las. Lean usa tipos dependentes, o que significa que os tipos podem depender de valores e, portanto, codificar relações detalhadas entre entradas e saídas.

A linguagem não apenas executa um script de prova gerado por IA e confia em sua conclusão. As táticas de Lean constroem termos de prova, que são representações verificáveis de forma independente do argumento. Um pequeno kernel então verifica que cada termo segue as regras lógicas do sistema. A documentação oficial do kernel do Lean descreve essa separação entre automação conveniente e verificação confiável.

Essa arquitetura muda o cálculo de risco em torno da IA. Um modelo de linguagem pode alucinar táticas, interpretar mal uma definição ou perseguir um objetivo falso. A maioria dessas falhas produz código rejeitado, em vez de um teorema aceito silenciosamente. O modelo pode ser pouco confiável enquanto o portão final de aceitação permanece rigoroso.

Isso não torna todo o fluxo de trabalho livre de erros. Uma prova válida pode estabelecer a afirmação errada. Definições podem omitir comportamento do mundo real. Bibliotecas importadas podem introduzir premissas. Uma função verificada no nível do código-fonte ainda pode depender de um compilador, sistema operacional ou processador não verificado.

As orientações do próprio Lean sobre validação de provas enfatizam esses limites. A aceitação pelo kernel mostra que um teorema decorre de suas definições e dependências. Ela não mostra que o teorema captura o que uma pessoa pretendia.

Para trabalhadores do conhecimento, essa distinção se parece com uma planilha de fórmulas impecáveis, mas com a definição de negócio errada. Os cálculos podem ser internamente consistentes enquanto respondem à pergunta errada. A formalização desloca a revisão mais difícil para a especificação.

Essa mudança é valiosa. Humanos tendem a revisar intenção e contexto melhor do que milhares de etapas mecânicas de prova. A IA pode absorver mais da busca repetitiva enquanto as pessoas examinam o que realmente precisa ser verdadeiro.

O mesmo padrão já aparece no trabalho prático com informações. A IA redige resumos, classificações, consultas e transformações. Um fluxo de trabalho responsável então verifica a saída em relação a material primário, esquemas, restrições ou cálculos determinísticos. A automação de provas aplica esse padrão em um nível muito mais rigoroso.

Também esclarece por que o contexto pessoal continua importante. Um modelo não pode proteger um invariante que nunca vê. As equipes precisam de acesso aos registros de decisão, especificações, exemplos e exceções que definem o comportamento correto. Uma base de conhecimento pessoal bem mantida torna-se parte da disciplina de entrada, mesmo quando a prova formal continua sendo uma atividade especializada.

A oportunidade imediata não é formalizar cada memorando. É identificar premissas custosas que já se comportam como especificações ocultas. Essas premissas frequentemente ficam na fronteira entre sistemas, equipes ou obrigações regulatórias.

A Nova Disputa É Custo de Prova Versus Valor de Verificação

A IA só muda a verificação formal se reduzir o trabalho de prova mais rapidamente do que amplia o trabalho de especificação e manutenção.

A verificação formal nunca careceu de resultados convincentes. O microkernel seL4 oferece um exemplo proeminente. Suas provas verificadas por máquina conectam implementações a especificações formais e abrangem propriedades que os testes por si só não conseguem estabelecer.

O material oficial sobre verificação do seL4 explica que configurações suportadas têm provas de correção funcional no nível do código. Algumas configurações estendem essas garantias ao código binário. O projeto mostra o que métodos formais podem oferecer quando os riscos justificam esforço especializado contínuo.

Ele também ilustra por que a adoção permaneceu restrita. Langley cita uma retrospectiva do seL4 que estimou que os engenheiros gastaram cerca de dez vezes mais esforço provando do que projetando e implementando. Ele também observa que o código de prova ultrapassou a implementação em C em mais de vinte vezes.

Essas proporções não devem ser tratadas como um custo universal. O seL4 buscou garantias excepcionalmente fortes em um kernel complexo de sistema operacional. Propriedades, linguagens e cadeias de ferramentas diferentes produzem custos diferentes. Ainda assim, os números capturam o problema histórico: o esforço de prova pode dominar a entrega.

A automação tradicional de provas reduz parte desse peso. Simplificadores, procedimentos de decisão, solucionadores SAT e solucionadores SMT podem resolver muitos objetivos. Ainda assim, desenvolvedores frequentemente precisam estruturar código e lemas em torno do que cada solucionador trata bem.

Langley descreve isso como desenvolver um sexto sentido para manter o solucionador satisfeito. Um objetivo fora de um fragmento favorável pode enviar uma busca automatizada para um caminho improdutivo. Os engenheiros então gastam tempo traduzindo o problema para uma forma que a ferramenta consiga resolver.

Os LLMs trazem uma capacidade diferente. Eles podem ler definições ao redor, inspecionar mensagens de erro, tentar táticas, introduzir lemas intermediários e revisar a implementação. Eles não exigem que todo problema se encaixe em um procedimento de decisão fixo.

Essa flexibilidade torna a IA útil como uma camada de orquestração sobre ferramentas de prova existentes. Um modelo pode chamar táticas determinísticas quando elas se encaixam, escrever um argumento explícito em outros casos e usar o feedback de Lean para corrigir falhas. O modelo busca estratégias de prova enquanto o kernel fornece um teste rígido de aceitação.

A experiência de Langley também expõe um custo importante. Seus assistentes de IA alteraram o código de construção da tabela porque ele havia usado Id.run em excesso, uma forma de expressar computação imperativa dentro de Lean. O código original talvez fosse legível e executável, mas era menos favorável à prova.

Isso é engenharia de provas: o trabalho de estruturar programas e lemas para que as provas permaneçam possíveis e fáceis de manter. A IA pode reduzir o custo, mas não elimina a tensão subjacente. Código otimizado para familiaridade humana, desempenho em tempo de execução e simplicidade de prova nem sempre terá a mesma forma.

A questão econômica, portanto, muda. As equipes já não perguntam apenas: “Conseguimos provar isso?” Elas perguntam: “Uma IA consegue manter a prova e sua estrutura de apoio tão rapidamente quanto os desenvolvedores mudam o produto?”

Isso favorece software com limites estáveis e explícitos. Parsers, políticas de autorização, máquinas de estado de protocolo, cálculos financeiros e transformações de dados frequentemente expõem propriedades claras. Seus modos de falha também justificam maior nível de garantia.

A AWS oferece uma comparação útil de produção por meio do Cedar, sua linguagem de políticas de autorização. A AWS mantém modelos Lean executáveis ao lado de sua implementação em Rust e usa provas com testes diferenciais. O relato publicado sobre desenvolvimento verificado afirma que as versões do Cedar exigem modelos, provas e testes atualizados.

O Cedar não prova que toda aplicação deva migrar para Lean. Ele mostra, porém, que artefatos formais podem fazer parte de um processo real de lançamento. A busca de provas assistida por IA poderia ampliar o conjunto de equipes capazes de sustentar esse processo.

O modelo mais forte no curto prazo provavelmente continuará sendo híbrido. Engenheiros implementam código de produção em uma linguagem mainstream. Eles formalizam comportamentos de alto valor em Lean. Testes comparam as duas implementações, enquanto as provas estabelecem propriedades do modelo.

Langley seguiu uma rota mais direta ao implementar o decodificador no próprio Lean. Isso criou conexões fortes entre código e teorema, mas trouxe uma grande penalidade de desempenho. A escolha entre modelos verificados e código de produção verificado continua central.

O Que a Prova Não Demonstra

Uma prova verificada pelo kernel pode eliminar uma classe de incerteza, deixando em aberto a especificação, a fronteira de implementação e o ambiente operacional.

O título “Agora temos automação de provas” é deliberadamente provocativo. O experimento sustenta essa ideia em um sentido prático, mas apenas dentro dos limites declarados. Ele não estabelece que um LLM possa verificar de forma independente qualquer software de produção.

Primeiro, o código-fonte não está disponível. Langley afirma ter verificado que as provas passam na checagem de tipos e não contêm marcadores inacabados. Leitores podem avaliar seu raciocínio e seus exemplos, mas não conseguem reproduzir toda a compilação.

Segundo, o trabalho envolveu um decodificador de brinquedo. Zstandard é um formato sério, e a construção de tabelas FSE não é trivial. Ainda assim, o projeto não enfrentou anos de mudanças de recursos, várias equipes, compatibilidade retroativa, ambientes de integração hostis ou pressão de incidentes em produção.

Terceiro, o decodificador era cerca de dez vezes mais lento que a implementação padrão de linha de comando. Essa diferença importa. O software não pode abrir mão de seus requisitos operacionais centrais apenas porque suas provas são elegantes.

Langley explorou se assembly verificado poderia resolver o problema de desempenho. Ele considerou usar o framework LNSym da AWS para provar que assembly AArch64 otimizado correspondia a funções Lean. Exemplos pequenos funcionaram, mas a abordagem não escalou em seus testes. Um pequeno exemplo com bv_decide, uma tática para proposições finitas de vetores de bits, exigiu mais memória do que sua máquina possuía.

Isso lembra que verificar não é gratuito. Um termo de prova pode se tornar caro para o kernel processar. Buscas automatizadas podem esgotar memória ou tempo. Um fluxo de trabalho teoricamente válido ainda pode exceder seu orçamento de compilação.

Quarto, os modelos precisaram alterar a implementação. Isso não é inerentemente ruim. Uma prova pode revelar que a estrutura de um programa oculta as relações das quais ele depende. Refatorar em direção a invariantes explícitos pode melhorar a manutenibilidade.

No entanto, uma refatoração gerada por IA também pode mudar o comportamento ou degradar o desempenho. O teorema final protege apenas as propriedades que ele declara. Engenheiros ainda precisam de testes, benchmarks, revisão de código e modelagem de ameaças para tudo que estiver fora dessas propriedades.

Quinto, a especificação humana continua sendo o ponto mais sensível. Se um teorema sobre um decodificador provar que uma tabela está bem formada, mas omitir um overflow de inteiro em outro ponto, a propriedade verificada continuará verdadeira e incompleta. Se o comportamento formalizado do Zstandard diferir do formato real, Lean poderá verificar fielmente o modelo errado.

O formato de compressão relevante está documentado na RFC 8878, mas transformar um padrão em prosa em definições envolve interpretação. A ambiguidade não desaparece ao entrar em um provador de teoremas. Ela se torna uma decisão de modelagem.

Esse risco cresce quando não especialistas dependem de IA para gerar tanto a afirmação quanto a prova. Um modelo pode tornar uma alegação fácil de provar ao enfraquecê-la. Pode selecionar uma definição conveniente que exclui entradas problemáticas. Pode satisfazer o verificador e ainda assim não atender à intenção do revisor.

Isso significa que a revisão de provas precisará de uma interface diferente. Revisores devem ver explicações em linguagem simples sobre cada teorema, suas premissas, axiomas importados, caminhos de código cobertos e comportamentos excluídos. Um simples sinal verde não basta.

As organizações também precisarão de rastreabilidade entre decisões de negócio e definições formais. Quando uma política mudar, alguém deverá saber qual teorema a codifica. Quando uma implementação mudar, o sistema deverá identificar quais garantias precisam ser reconsideradas.

É aqui que a assistência de IA pode ajudar além de escrever táticas. Um agente pode recuperar a especificação relevante, mapear uma mudança de código para os invariantes afetados e resumir obrigações que falharam. Uma base de conhecimento pesquisável pode conectar o contexto de design aos artefatos formais.

Nenhuma dessas limitações invalida o resultado. Elas definem o trabalho necessário para levá-lo de um experimento intrigante a uma prática de engenharia confiável.

A Automação de Provas em Lean Pressiona as Ferramentas de Codificação com IA

Quando um modelo consegue gerar código e uma prova verificável, “os testes passaram” começa a parecer uma alegação de qualidade incompleta.

Os produtos de codificação com IA atualmente competem em conclusão de tarefas, compreensão de repositórios, uso de ferramentas, pontuações em benchmarks e experiência do desenvolvedor. Seus controles de qualidade ainda se assemelham ao desenvolvimento convencional. Agentes executam testes, linters, verificadores de tipos, scanners de segurança e fluxos de revisão humana.

Essas verificações importam, mas a maioria não estabelece comportamento universal. Um teste unitário prova que uma entrada selecionada produziu um resultado esperado em uma execução. Fuzzing amplia a cobertura por meio de entradas geradas, mas ainda assim amostra execuções. A análise estática pode abranger classes mais amplas, mas cada analisador opera dentro de aproximações definidas.

Um teorema pode afirmar que toda entrada aceita satisfaz uma propriedade selecionada. Se Lean verifica a prova, a garantia não depende de confiar no modelo que a gerou. Essa é uma distinção de produto atraente para sistemas de codificação agêntica.

A pressão aparecerá primeiro em tarefas restritas. Um agente de IA poderia gerar um parser junto de uma prova de que análises bem-sucedidas nunca excedem um limite de entrada. Poderia implementar uma regra de controle de acesso com um teorema que exclui transições não autorizadas. Poderia criar uma migração de banco de dados e provar a preservação de um invariante de esquema em um modelo formal.

Ferramentas mainstream não precisam expor sintaxe Lean a todos os usuários. Elas podem oferecer verificação formal como um modo adicional de validação. A interface poderia pedir aos desenvolvedores que aprovassem propriedades em linguagem simples, mostrar suas traduções formais e retornar provas verificadas ou contraexemplos concretos.

O recurso decisivo não será a pontuação bruta em demonstração de teoremas. Será a integração. A automação de provas precisa funcionar com o contexto do repositório, sistemas de compilação, especificações, testes de desempenho e revisão de código.

O experimento de Langley oferece uma lição útil de produto. Os modelos trabalharam interativamente. Encontraram código que resistia à prova, modificaram sua estrutura e continuaram até que o verificador aceitasse o resultado. Isso se parece mais com um agente de engenharia do que com um sistema de autocompletar.

Ele também sugere uma nova forma de responsabilização. A geração de código por IA frequentemente cria uma assimetria: o modelo pode criar código mais rápido do que um humano consegue revisá-lo. Agentes que produzem provas podem anexar evidências verificáveis por máquina a alegações selecionadas.

Essa evidência não torna a revisão opcional. Ela permite que revisores gastem menos tempo simulando comportamentos mecânicos e mais tempo examinando a alegação. A pergunta central passa a ser: “Esta é a propriedade de que precisamos?”, e não: “O modelo deixou passar algum caso de índice?”

Concorrentes podem responder por várias rotas. Podem integrar Lean diretamente, conectar modelos a outros assistentes de prova, produzir certificados para solucionadores especializados ou combinar modelos formais com código convencional. A abordagem vencedora pode variar conforme o domínio.

Lean tem uma vantagem porque oferece programação, demonstração de teoremas, metaprogramação e ampla automação em um único ambiente. Seu kernel também fornece uma fronteira clara de confiança. Ainda assim, Lean não é automaticamente a linguagem certa de implantação para software sensível ao desempenho.

A IA que produz provas, portanto, competirá com pipelines de desenvolvimento que verificam provas, e não apenas com outros LLMs. A unidade confiável é o sistema inteiro: modelo, enunciado formal, ferramentas de prova, kernel, premissas do compilador, testes e revisores.

Para trabalhadores do conhecimento que compram produtos de IA, isso cria uma pergunta melhor do que indagar se o modelo de um fornecedor é preciso. Pergunte quais saídas recebem validação determinística, quais alegações têm evidências verificáveis e quais ainda dependem de julgamento probabilístico.

A automação de provas oferece a versão mais forte desse padrão. Ela não se aplicará a todas as tarefas, mas eleva as expectativas para qualquer resultado que possa ser formalmente especificado.

Três Sinais Mostrarão se Isso se Tornará Engenharia Normal

A próxima etapa depende de reprodutibilidade, manutenção diante de mudanças e recursos sustentados por provas dentro das ferramentas cotidianas de desenvolvimento.

O primeiro sinal é um repositório público e reproduzível de software comparável ao experimento de Langley. Desenvolvedores precisam inspecionar as definições, prompts ou rastros de agentes, termos de prova, axiomas, tempos de compilação e requisitos de hardware. Equipes independentes devem conseguir reexecutar o processo e testar modelos alternativos.

A reprodutibilidade reforçaria a alegação de que LLMs atuais conseguem lidar com trabalho substancial de provas. A incapacidade de reproduzi-lo restringiria o resultado à configuração e ao julgamento de um único engenheiro habilidoso. Ambos os desfechos melhorariam as evidências disponíveis.

O segundo sinal é o desempenho diante de código em mudança. Uma prova única pode esconder orientação humana substancial. O teste mais exigente é saber se um agente consegue reparar provas após mudanças realistas na implementação sem enfraquecer o teorema ou distorcer o programa.

As equipes devem medir tempo de reparo de provas, intervenções humanas, custo computacional, mudanças nos teoremas e regressões de desempenho. Também devem acompanhar com que frequência uma prova que falha revela um bug real, em vez de uma mudança estrutural inofensiva.

Se o reparo continuar rápido ao longo de vários meses de desenvolvimento, a IA terá reduzido a carga de manutenção da engenharia de provas. Se cada mudança provocar uma reestruturação extensa, a verificação formal continuará limitada a componentes estáveis e de alto valor.

O terceiro sinal é a integração ao produto. Observe agentes de codificação que ofereçam propriedades verificadas pelo kernel como saída padrão, especialmente para parsers, mecanismos de políticas, implementações de protocolos e código de processamento de dados.

Um produto crível deve separar a geração de teoremas da verificação de teoremas. Deve exibir premissas, rejeitar provas inacabadas, preservar logs de verificação e avisar quando uma alteração de código invalidar uma garantia. Também deve manter testes e benchmarking no fluxo de trabalho.

Se esses recursos aparecerem em ferramentas mainstream, a automação de provas em Lean terá avançado além de demonstrações de prova de teoremas. Se permanecerem confinados a repositórios de pesquisa, o ganho de produtividade ainda não terá superado os custos de integração.

Para os trabalhadores do conhecimento, a resposta prática é preparar especificações melhores. Registre as decisões que definem o comportamento correto. Preserve o material de origem. Identifique invariantes que causam falhas dispendiosas quando são mal compreendidas. Torne as exceções explícitas.

Em seguida, faça uma pergunta mais precisa a cada fluxo de trabalho com IA: quais resultados podem receber uma verificação independente e confiável?

O decodificador de Langley não prova que todo software pode se tornar formalmente verificado. Ele mostra que a IA começou a atacar a barreira de custo, enquanto Lean preserva uma rígida etapa final de validação. Isso basta para alterar o roteiro.

O futuro próximo não é de software escrito por modelos infalíveis. É de software proposto por modelos falíveis, limitado por especificações melhores e verificado por sistemas que não se importam com o quão confiante o modelo parece.

 
 

Comece grátis

Um assistente de IA local-first com gestão de conhecimento pessoal

Para oferecer uma experiência de IA melhor,

atualmente, o remio é compatível apenas com Windows 10+ (x64) e M-Chip Macs.

​Adicione uma barra de pesquisa ao seu cérebro

É só perguntar ao remio

Lembre-se de tudo

Não organize nada

bottom of page