invariant-guard
Ajuda seu agente a pensar em todos os detalhes antes de escrever o código. Garante que o código seja correto e lide com casos especiais.
O que ela faz
Esta ferramenta ajuda a escrever código mais confiável. Ela exige que você descreva as regras (invariantes), como o código vai terminar e os casos especiais antes de escrever o código em si.
Quando usar
- ✓Ao escrever algoritmos que podem ter erros sutis.
- ✓Ao lidar com repetições (loops) ou chamadas recursivas.
- ✓Ao revisar código para garantir que ele funcione em todas as situações.
Exemplo do que pedir para a IA
“Escreva uma função que encontra o maior elemento em uma lista, mas primeiro defina a invariante do loop, o argumento de terminação e os casos especiais.”
Quer saber mais? Abra as seções abaixo.
Como usar
O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.
Link da skill
Mensagem pronta para colar
Como funciona
A ferramenta força você a declarar formalmente as condições que devem ser verdadeiras antes, durante e depois de cada passo do seu código (como loops ou recursão). Isso ajuda a evitar erros comuns que passam despercebidos.
Instalação
Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.
No terminal (Claude Code, Codex, Cursor), na pasta do projeto:
npx skills add sickn33/agentic-awesome-skills --skill invariant-guardOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/sickn33/agentic-awesome-skills/main/plugins/agentic-awesome-skills-claude/skills/invariant-guard/SKILL.md -o SKILL.mdConteúdo técnico (SKILL.md)
Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.
invariant-guard — Codificação com Foco na Correção
O modelo sabe o que é um invariante de loop. Sabe que recursão precisa de um caso base. Sabe sobre listas vazias, estouro de inteiros e a diferença entre < e ≤. Ele apenas não anota isso antes de produzir o código, então entrega bugs sutis de correção que os testes não pegam.
invariant-guard corrige o comportamento. Declare os invariantes. Declare o caso base. Declare o argumento de terminação. Declare os casos extremos. Em seguida, escreva o código — e verifique se o código mantém o que você declarou.
Violar a letra destas regras é violar o espírito da habilidade. "Eu conheço este algoritmo" é a exata racionalização que entrega bugs de "off-by-one" (um a mais ou um a menos) e de pós-condição ausente.
Quando Usar Esta Habilidade
Use invariant-guard ao escrever ou revisar algoritmos onde a implementação óbvia está sutilmente errada:
- Pós-condição mais forte que o invariante natural do loop: maioria de Boyer–Moore, detecção de ciclo de Floyd, busca binária à esquerda vs. qualquer busca, partição QuickSelect.
- Mutação in-place com ponteiros de leitura+escrita: dedup-in-place, partição, rotação.
- Recursão com múltiplos parâmetros ou estado acumulador.
- Suspeitas de "off-by-one" com duplicatas, entradas vazias, valores de limite.
- Refinamentos iterativos que devem terminar: ponto fixo, Newton, EM.
- Qualquer função onde você se pega pensando "Eu conheço este algoritmo" — a armadilha geralmente está no contrato, não no corpo do loop.
Combina com lemmaly (escolhe o algoritmo) e mathguard (escolhe a matemática). Carregue invariant-guard depois que o algoritmo foi escolhido e antes que o corpo do loop seja escrito.
A Lei de Ferro
NO LOOP OR RECURSION WITHOUT A WRITTEN INVARIANT AND TERMINATION ARGUMENT
Se você não consegue escrever o invariante em uma frase, você não projetou o loop. Escreva código de qualquer maneira e você está codificando por palpite — e o bug estará no caso que você não enumerou.
Regras Inegociáveis
Todo loop recebe um invariante de uma linha. Antes de escrever qualquer loop, declare em uma frase o que é verdadeiro no topo de cada iteração. Exemplos:
- "No topo do loop:
resultcontém a soma dea[0..i)." - "No topo do loop:
lo ≤ target_position ≤ hi." - "No topo do loop:
seencontém todos os elementos processados até agora;dupscontém todos os elementos que apareceram pelo menos duas vezes."
Se você não consegue escrever o invariante em uma frase, você ainda não projetou o loop.
- "No topo do loop:
Todo loop recebe um argumento de terminação de uma linha. Nomeie a quantidade que estritamente diminui (ou estritamente aumenta em direção a um limite) a cada iteração. Exemplos:
- "
hi − loestritamente diminui a cada iteração." - "
iaumenta em 1 e é limitado superiormente porn." - "
stack.lengthestritamente diminui a cada pop; nada é empurrado dentro deste ramo."
Sem argumento de terminação, sem loop.
- "
Toda recursão recebe um caso base explícito e uma medida. Antes de escrever uma função recursiva, declare:
- O(s) caso(s) base — as menores entradas que retornam sem recursão.
- A medida — um inteiro não negativo que estritamente diminui a cada chamada recursiva (por exemplo,
len(xs),hi − lo,depth,n). - A combinação — como os resultados recursivos se combinam na resposta.
Sem caso base + medida, sem recursão. (Recursão mútua: declare a medida através do ciclo.)
Liste os casos extremos antes de escrever, não depois. Para cada função que opera em uma coleção ou número, liste quais destes se aplicam e como eles se comportam:
- Entrada vazia (
[],"",null,undefined,None). - Singleton (
[x]). - Elementos todos iguais.
- Entrada já ordenada / ordenada reversamente.
- Duplicatas (quando a unicidade é assumida).
- Números negativos, zero, exatamente o valor de limite.
- Estouro / subfluxo de inteiros no máximo/mínimo do tipo.
- NaN, ±Infinito,
-0, denormais (para floats). - Limites de "off-by-one": índice 0, índice n−1, índice n, comprimento 0, comprimento 1.
- Modificação concorrente durante a iteração.
Os casos que se aplicam devem ter cada um um comportamento esperado de uma frase escrito.
- Entrada vazia (
Torne estados ilegais inalcançáveis, não apenas não tratados. Prefira codificar restrições em tipos e estrutura para que o estado errado não possa ser construído:
- Tipo soma sobre um monte de flags booleanas (
Loading | Loaded(data) | Error(msg)em vez de{loading, data, error}). - Newtype para IDs que não devem ser trocados (
UserIdvsOrderId). - Tipo de lista não vazia quando a função requer pelo menos um elemento.
- Tipo soma sobre um monte de flags booleanas (
…
Perguntas frequentes
O que é uma 'invariante de loop'?
É uma afirmação que é sempre verdadeira no início de cada repetição de um loop. Por exemplo, 'a variável X sempre contém a soma dos elementos já processados'.
O que é um 'argumento de terminação'?
É a explicação de como um loop ou uma função recursiva vai acabar. Geralmente, mostra que uma quantidade específica está sempre diminuindo ou aumentando em direção a um limite a cada passo.
Por que listar 'casos especiais' antes?
Porque muitos erros acontecem em situações incomuns, como listas vazias, listas com um único item, ou valores repetidos. Pensar nisso antes evita bugs.
Detalhes
Descrição original do autor
Correctness-first: forces writing the function contract, loop invariant, termination argument, and edge cases BEFORE code. Catches Boyer-Moore, leftmost binary search, QuickSelect traps.
Popularidade
- Estrelas no GitHub
- 48 mil
- Posição no ranking
- #3351
- Licença
- MIT
- Atualizada em
- 15/10/2026
Comentários
- …
Mais skills deste repositório
00-andruia-consultant
Ajuda seu agente a iniciar ou melhorar projetos de IA. Ele analisa código, sugere ferramentas e cria planos de ação em espanhol.
sickn33/agentic-awesome-skills
007
Faz seu agente realizar auditorias de segurança e modelagem de ameaças. É útil para proteger projetos contra ataques e vulnerabilidades.
sickn33/agentic-awesome-skills
10-andruia-skill-smith
Ajuda seu agente a criar ou melhorar ferramentas de IA. Ele define como as ferramentas funcionam, escreve a documentação e valida a estrutura.
sickn33/agentic-awesome-skills
20-andruia-niche-intelligence
Faz seu agente criar um resumo sobre um setor específico. É útil para entender o contexto, regras, padrões de uso e riscos de um projeto, usando fontes confiáveis.
sickn33/agentic-awesome-skills
Skills parecidas
benchmark-optimization-loop
Faz seu agente melhorar a velocidade de algo de forma medida. Ele testa várias versões e escolhe a mais rápida que ainda funciona corretamente.
affaan-m/ECC
change-impact
Ajuda seu agente a analisar o impacto de mudanças no código antes de fazê-las. Ele compara o planejado com o real depois, cobrindo caminhos, dados, testes e documentação. É útil para mudanças arriscadas ou que afetam várias partes do sistema.
affaan-m/ECC
click-path-audit
Faz seu agente rastrear todos os botões e interações do usuário para achar bugs. Ele encontra problemas onde funções parecem funcionar sozinhas, mas falham juntas. Útil quando bugs persistem mesmo após depuração.
affaan-m/ECC