Pular para o conteúdo
Skillpedia
Código em geral48 mil · #3351

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

https://github.com/sickn33/agentic-awesome-skills/blob/main/plugins/agentic-awesome-skills-claude/skills/invariant-guard/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/sickn33/agentic-awesome-skills/blob/main/plugins/agentic-awesome-skills-claude/skills/invariant-guard/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
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-guard

Ou 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.md
Conteú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

  1. 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: result contém a soma de a[0..i)."
    • "No topo do loop: lo ≤ target_position ≤ hi."
    • "No topo do loop: seen contém todos os elementos processados até agora; dups conté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.

  2. 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 − lo estritamente diminui a cada iteração."
    • "i aumenta em 1 e é limitado superiormente por n."
    • "stack.length estritamente diminui a cada pop; nada é empurrado dentro deste ramo."

    Sem argumento de terminação, sem loop.

  3. 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.)

  4. 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.

  5. 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 (UserId vs OrderId).
    • Tipo de lista não vazia quando a função requer pelo menos um elemento.

…

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.

repo: sickn33/agentic-awesome-skills

Popularidade

Estrelas no GitHub
48 mil
Posição no ranking
#3351
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas