Clean Code Gauntlet
Effort: heavy — computação de verdade: rodadas de cobertura e complexidade mais uma passada limitada de mutação, depois um modelo de gosto; gaste em mudanças que vão para produção. Remove: review humano linha a linha de diffs inteiros, e os testes verde-falso atrás dos quais uma regressão se esconde.
Por que isto existe
Código bagunçado faz agente patinar, e regra enterrada num prompt longo some no
meio do contexto — cheque determinístico nunca some. Então rode Clean Code como um
gauntlet que o código tem que passar, não prosa que o modelo tem que lembrar.
Meça, não revise. Feche o portão com números que uma ferramenta computa:
cobertura, complexidade ciclomática (uma contagem de caminhos independentes por
função), tamanho de módulo, mutantes mortos. Humanos e modelos auditam amostras —
nunca diffs inteiros.
A corrente (rode em ordem; cada estágio para alto na falha)
- Sniper tests verdes. Rode só os arquivos de teste que cobrem o que o diff
tocou — veja sniper-testing. Baseline vermelha
significa parar e consertar; nunca mute ou avalie em cima de vermelho.
- CRAP abaixo do limiar sobre dados reais de cobertura (veja o portão abaixo).
Estourou → refatore a função para baixo, ou cubra por completo. Nunca abaixe a barra.
- Mutation testing: zero sobreviventes no escopo. Um sobrevivente condena os
TESTES, não o código — fortaleça o teste que deveria tê-lo pego.
- Review leve de gosto — um modelo julga só o que números não alcançam.
Ferramentas que computam isso
| Stack |
Ferramentas |
| Python |
coverage.py + radon + mutmut |
| JS/TS |
c8 (ou istanbul) + Stryker |
| Go |
go test -cover + gocyclo + go-mutesting |
| Rust |
cargo-tarpaulin + cargo-mutants |
| Java |
JaCoCo + PIT |
| Outra |
qualquer % de cobertura + qualquer contador de complexidade ciclomática |
Um formato de comando por estágio:
- Cobertura:
coverage run -m pytest <sniper files> && coverage report (JS/TS: npx c8 vitest run <files>)
- Complexidade:
radon cc -s <changed files>
- Mutação:
mutmut run --paths-to-mutate <changed files> (JS/TS: npx stryker run --mutate "<glob>")
O portão CRAP
CRAP(m) = comp(m)^2 * (1 - cov(m)/100)^3 + comp(m)
- Com 100% de cobertura o score colapsa para a própria complexidade.
- 30 é a linha clássica do "crappy" (complexidade 5 com cobertura zero já bate nela).
- Humanos seguram por volta de 4–5 de complexidade por função. Um agente pode
carregar 6–8 SOMENTE com cobertura perto de 100% — a cobertura paga pela folga.
- Uma função com CRAP alto tem exatamente duas saídas: refatorar para baixo, ou
cobrir por completo. Nunca abaixe o limiar para passar.
De quem é a dívida — AUTHORED / WORSENED / UNCHANGED
Um score absoluto esconde de quem é a dívida. Divida todo delta de complexidade e
CRAP contra a baseline pré-mudança:
- AUTHORED — funções que esta mudança criou. A barra inteira se aplica.
- WORSENED — funções pré-existentes que esta mudança piorou. O delta é cobrado
desta mudança; tem que voltar à baseline ou melhor.
- UNCHANGED — dívida pré-existente que a mudança nunca tocou. Reporte, arquive,
nunca cobre desta mudança — e nunca use como desculpa para pular o gauntlet.
Regras de mutação (limitadas, nunca imprudentes)
- Nunca a árvore de trabalho compartilhada. Mute num checkout de rascunho
cortado do HEAD commitado. Arquivos alvo ou de teste sujos = recuse; commite primeiro.
- Custo é medido, nunca presumido. Cronometre a suite com escopo uma vez,
reporte ETA = baseline x número de mutantes ANTES de gastar qualquer coisa.
Ofereça um dry run.
- Limitado e retomável. Limite mutantes e minutos. Parada por orçamento é uma
pausa com checkpoint, não uma falha — retome para terminar.
- Cobertura primeiro. Mute só linhas cobertas; linha descoberta é lacuna de
cobertura que o portão CRAP já pegou.
- Só no escopo. Mute o que o diff tocou, nunca o repo inteiro.
- Um mutante genuinamente equivalente pode ser refutado em vez de morto — com a
refutação por escrito, nunca pulado em silêncio.
- Não existe ferramenta de mutação para o seu stack? Registre isso no relatório
de aterrissagem e apoie-se no portão CRAP — nunca pule em silêncio.
O review de gosto (por último, e leve)
Portões determinísticos vêm primeiro; gaste um modelo só onde raciocínio é a única
ferramenta. O revisor é um modelo de família diferente da do builder — o builder
nunca avalia o próprio trabalho. Ele julga só design e gosto: nomes, preocupações
misturadas, largura de interface, e os seis cheiros — rigidez, fragilidade,
imobilidade, complexidade desnecessária, repetição desnecessária, opacidade. A
aritmética os portões já resolveram.
Piso de ofício que o review segura: funções pequenas, fazendo uma coisa, poucos
argumentos, sem argumentos de flag, nomes honestos; módulos profundos — uma
interface pequena escondendo lógica de verdade; testes rápidos, independentes,
repetíveis, um comportamento afirmado em cada.
Regras duras (qualquer uma quebrada reprova a skill)
- Nunca abaixe um limiar nem enfraqueça o conjunto de mutação para forçar um pass.
- Nunca mute a árvore de trabalho compartilhada; nunca rode sem limite.
- Nunca cobre dívida UNCHANGED da mudança atual.
- Um teste que não consegue falhar é teatro — mutation testing é como você prova
quais testes são reais.
- Diga o custo real — tempo de máquina é barato, regressão não é. Nunca finja verde
para economizar a hora.
Combina bem com
- sniper-testing — escolhe o escopo de teste do estágio 1
- red-first — o contrato falhando que precede qualquer build
- blind-eval — manter-ou-reverter quando a questão é gosto
- blind-tribunal — um veredito avaliado mais completo antes de aterrissar
Crédito de scaffold: Robert C. Martin, Clean Code (2008); Alberto Savoia &
Bob Evans, a métrica CRAP (2007); John Ousterhout, módulos profundos
(A Philosophy of Software Design, 2018); Pocock, M., & Martin, R. C.
(2026, Aug 19). LIVE: Uncle Bob on Software Fundamentals in the Age of AI
[Video]. YouTube. https://www.youtube.com/watch?v=zcLPGC-tvgk — fonte da
banda CRAP para agentes e da mutação cobertura-primeiro. A composição e as
regras duras daqui são do BACKS AIOS.
1---2name: clean-code-gauntlet-63description: Use ao endurecer ou aterrissar qualquer build — um agente, um serviço, uma biblioteca — quando você quer uma barra de qualidade determinística em vez de review linha a linha. Roda sniper tests, o score CRAP (complexidade x cobertura) e mutation testing limitado, depois um review leve de gosto. Trigger words: clean code, gauntlet, unc, uncle bob, crap score, crap, mutation testing, harden, complexity, coverage, quality bar, código limpo, teste de mutação, endurecer, complexidade, cobertura, barra de qualidade.4license: MIT5---67# Clean Code Gauntlet8**Effort:** heavy — computação de verdade: rodadas de cobertura e complexidade mais uma passada limitada de mutação, depois um modelo de gosto; gaste em mudanças que vão para produção. Remove: review humano linha a linha de diffs inteiros, e os testes verde-falso atrás dos quais uma regressão se esconde.910## Por que isto existe1112Código bagunçado faz agente patinar, e regra enterrada num prompt longo some no13meio do contexto — cheque determinístico nunca some. Então rode Clean Code como um14**gauntlet que o código tem que passar**, não prosa que o modelo tem que lembrar.1516**Meça, não revise.** Feche o portão com números que uma ferramenta computa:17cobertura, complexidade ciclomática (uma contagem de caminhos independentes por18função), tamanho de módulo, mutantes mortos. Humanos e modelos auditam amostras —19nunca diffs inteiros.2021## A corrente (rode em ordem; cada estágio para alto na falha)22231. **Sniper tests verdes.** Rode só os arquivos de teste que cobrem o que o diff24 tocou — veja [sniper-testing](../sniper-testing/SKILL.md). Baseline vermelha25 significa parar e consertar; nunca mute ou avalie em cima de vermelho.262. **CRAP abaixo do limiar** sobre dados reais de cobertura (veja o portão abaixo).27 Estourou → refatore a função para baixo, ou cubra por completo. Nunca abaixe a barra.283. **Mutation testing: zero sobreviventes no escopo.** Um sobrevivente condena os29 TESTES, não o código — fortaleça o teste que deveria tê-lo pego.304. **Review leve de gosto** — um modelo julga só o que números não alcançam.3132## Ferramentas que computam isso3334| Stack | Ferramentas |35| --- | --- |36| Python | coverage.py + radon + mutmut |37| JS/TS | c8 (ou istanbul) + Stryker |38| Go | go test -cover + gocyclo + go-mutesting |39| Rust | cargo-tarpaulin + cargo-mutants |40| Java | JaCoCo + PIT |41| Outra | qualquer % de cobertura + qualquer contador de complexidade ciclomática |4243Um formato de comando por estágio:44- Cobertura: `coverage run -m pytest <sniper files> && coverage report` (JS/TS: `npx c8 vitest run <files>`)45- Complexidade: `radon cc -s <changed files>`46- Mutação: `mutmut run --paths-to-mutate <changed files>` (JS/TS: `npx stryker run --mutate "<glob>"`)4748## O portão CRAP4950```51CRAP(m) = comp(m)^2 * (1 - cov(m)/100)^3 + comp(m)52```5354- Com 100% de cobertura o score colapsa para a própria complexidade.55- 30 é a linha clássica do "crappy" (complexidade 5 com cobertura zero já bate nela).56- Humanos seguram por volta de 4–5 de complexidade por função. Um agente pode57 carregar 6–8 SOMENTE com cobertura perto de 100% — a cobertura paga pela folga.58- Uma função com CRAP alto tem exatamente duas saídas: refatorar para baixo, ou59 cobrir por completo. **Nunca abaixe o limiar para passar.**6061## De quem é a dívida — AUTHORED / WORSENED / UNCHANGED6263Um score absoluto esconde de quem é a dívida. Divida todo delta de complexidade e64CRAP contra a baseline pré-mudança:6566- **AUTHORED** — funções que esta mudança criou. A barra inteira se aplica.67- **WORSENED** — funções pré-existentes que esta mudança piorou. O delta é cobrado68 desta mudança; tem que voltar à baseline ou melhor.69- **UNCHANGED** — dívida pré-existente que a mudança nunca tocou. Reporte, arquive,70 nunca cobre desta mudança — e nunca use como desculpa para pular o gauntlet.7172## Regras de mutação (limitadas, nunca imprudentes)7374- **Nunca a árvore de trabalho compartilhada.** Mute num checkout de rascunho75 cortado do HEAD commitado. Arquivos alvo ou de teste sujos = recuse; commite primeiro.76- **Custo é medido, nunca presumido.** Cronometre a suite com escopo uma vez,77 reporte ETA = baseline x número de mutantes ANTES de gastar qualquer coisa.78 Ofereça um dry run.79- **Limitado e retomável.** Limite mutantes e minutos. Parada por orçamento é uma80 pausa com checkpoint, não uma falha — retome para terminar.81- **Cobertura primeiro.** Mute só linhas cobertas; linha descoberta é lacuna de82 cobertura que o portão CRAP já pegou.83- **Só no escopo.** Mute o que o diff tocou, nunca o repo inteiro.84- Um mutante genuinamente equivalente pode ser refutado em vez de morto — com a85 refutação por escrito, nunca pulado em silêncio.86- **Não existe ferramenta de mutação para o seu stack?** Registre isso no relatório87 de aterrissagem e apoie-se no portão CRAP — nunca pule em silêncio.8889## O review de gosto (por último, e leve)9091Portões determinísticos vêm primeiro; gaste um modelo só onde raciocínio é a única92ferramenta. O revisor é um modelo de família diferente da do builder — o builder93nunca avalia o próprio trabalho. Ele julga só design e gosto: nomes, preocupações94misturadas, largura de interface, e os seis cheiros — rigidez, fragilidade,95imobilidade, complexidade desnecessária, repetição desnecessária, opacidade. A96aritmética os portões já resolveram.9798Piso de ofício que o review segura: funções pequenas, fazendo uma coisa, poucos99argumentos, sem argumentos de flag, nomes honestos; módulos profundos — uma100interface pequena escondendo lógica de verdade; testes rápidos, independentes,101repetíveis, um comportamento afirmado em cada.102103## Regras duras (qualquer uma quebrada reprova a skill)104105- Nunca abaixe um limiar nem enfraqueça o conjunto de mutação para forçar um pass.106- Nunca mute a árvore de trabalho compartilhada; nunca rode sem limite.107- Nunca cobre dívida UNCHANGED da mudança atual.108- Um teste que não consegue falhar é teatro — mutation testing é como você prova109 quais testes são reais.110- Diga o custo real — tempo de máquina é barato, regressão não é. Nunca finja verde111 para economizar a hora.112113## Combina bem com114115- [sniper-testing](../sniper-testing/SKILL.md) — escolhe o escopo de teste do estágio 1116- [red-first](../red-first/SKILL.md) — o contrato falhando que precede qualquer build117- [blind-eval](../blind-eval/SKILL.md) — manter-ou-reverter quando a questão é gosto118- [blind-tribunal](../blind-tribunal/SKILL.md) — um veredito avaliado mais completo antes de aterrissar119120> Crédito de scaffold: Robert C. Martin, *Clean Code* (2008); Alberto Savoia &121> Bob Evans, a métrica CRAP (2007); John Ousterhout, módulos profundos122> (*A Philosophy of Software Design*, 2018); Pocock, M., & Martin, R. C.123> (2026, Aug 19). LIVE: Uncle Bob on Software Fundamentals in the Age of AI124> [Video]. YouTube. https://www.youtube.com/watch?v=zcLPGC-tvgk — fonte da125> banda CRAP para agentes e da mutação cobertura-primeiro. A composição e as126> regras duras daqui são do BACKS AIOS.