Cinco casos, uma função pura.
O revisor automatizado pediu cobertura para algumaFuncao: dentro da janela, fora da janela, paidAt presente, createdAt ausente, order null. Função pura, oito linhas executáveis, quatro branches lineares com early return. O pedido era razoável em abstrato; o problema estava em como atendê-lo sem violar a política do repositório.
O repositório fechou a porta — de propósito.
O CLAUDE.md do repo cliente declara textualmente: "No test framework configured. Verification after changes: npm run lint + npm run build". Não é omissão. É decisão arquitetural deliberada. Adicionar Jest ou Vitest pra cobrir uma função isolada significava forjar uma armadura completa — runner, lock file, integração CI, decisão de ambiente, padrão de pasta — pra matar uma mosca de oito linhas. Armadura inteira pra mosca. A Primeira Forma proíbe.
A força veio do núcleo, não da forja.
O runtime do Node já oferecia, em sua engine 24, um test runner nativo (node:test) e type strippingexperimental para TypeScript (--experimental-strip-types). Nada novo precisava ser instalado. O caminho foi:
- Mover
algumaFuncao+JANELA_HORASpara módulo própriojanela.ts, isolando-os de qualquer dependência de path alias que o runner nativo não resolveria. - Adicionar
allowImportingTsExtensions: truenotsconfig.json— permite o import com extensão.tsexigido pelo strip-types. - Criar
janela.test.tsusandodescribe,it,mock.timerseassert— todos importados denode:testenode:assert/strict. - Adicionar o script
npm run test:node --test --experimental-strip-types 'src/**/*.test.ts'.
Resultado: cobertura entregue. Zero dependência nova. Zero lock file alterado. CLAUDE.md permanece literalmente válido — não há framework instalado.
Cinco testes, cinco verdes.
Cada golpe cobre uma das ramificações da função. Juntos esgotam o espaço de estados — não há branch combinatório, race ou caminho indireto que escape da leitura sequencial.
- 01
Dentro da janela
`createdAt` 23h atrás → retorna `true`. Confirma que a comparação `Date.now() - start < windowMs` aceita o limite inferior.
- 02
Fora da janela
`createdAt` 25h atrás → retorna `false`. Confirma que a janela é fechada exatamente em 24h.
- 03
paidAt vence createdAt
`paidAt` 5h atrás + `createdAt` 26h atrás → retorna `true`. Confirma a precedência do timestamp de pagamento confirmado quando ele existe.
- 04
Ambos ausentes
`{}` → retorna `false`. Cobre o early return quando nenhum timestamp chega no payload.
- 05
Order null ou undefined
`algumaFuncao(null)` e `algumaFuncao(undefined)` → `false`. Encerra a árvore — sem inputs, sem janela.
O mapa do golpe.
Tudo cabe em quatro arquivos. A força é a ausência: nenhuma pasta nova de testes, nenhum binário novo no node_modules.
# Sétima Forma — Trovão do Núcleo
repo-cliente/
├── src/utils/
│ ├── janela.ts # algumaFuncao + JANELA_HORAS
│ └── janela.test.ts # 5 unit tests (node:test)
├── tsconfig.json # allowImportingTsExtensions: true
└── package.json
└── "test": "node --test --experimental-strip-types 'src/**/*.test.ts'"
# Zero dependências novas. Zero lock file alterado. Runner: o próprio Node.A Sétima é a Primeira levada ao limite.
Zenitsu não aprendeu as seis formas que não conseguiu dominar. Poliu a Primeira até criar a Sétima. Aqui o paralelo é literal: a Primeira Forma já havia produzido o argumento técnico denso contra adicionar framework. Quando o adversário insistiu — pattern match em loop fechado — a saída não foi cair pra outra técnica. Foi aprofundar a mesma. O mesmo princípio que recusa armadura desnecessária revelou o caminho autoral: usar o que já estava dentro do runtime.
Não vence quem domina mais formas. Vence quem leva uma só ao núcleo.
O movimento que ninguém viu.
Zenitsu desfere a Sétima Forma diante de Kaigaku — o outro discípulo, que dominou as seis e perdeu a primeira. Os espectadores não veem o golpe: percebem só o silêncio depois. É o mesmo que aconteceu aqui — o bot pediu armadura, recebeu silêncio técnico, registrou APPROVED sem entender por onde passou.