Fase VERIFY (GOAL-DRIVEN) do ciclo Karpathy (kata). Use quando o kata estiver na fase 4 — executar lint, teste e coverage do projeto (declarados em .kata/config.yaml ou os defaults Python), interpretar resultados e verificar o critério de sucesso. Triggers: VERIFY, GOAL-DRIVEN, ruff, pytest, coverage, eslint, vitest, go test, gate, CI, verificação de qualidade.
Install
npx skillscat add walternagai/kata/kata-verify Install via the SkillsCat registry.
Skill: kata-verify
Fase 4 do Karpathy Development Cycle — GOAL-DRIVEN.
Objetivo
Verificar a qualidade do código com critérios objetivos:
- Lint — limpo
- Teste — todos passam
- Coverage — ≥ gate (default 70%)
- Critério de sucesso — a tarefa resolve o problema declarado na fase THINK
Antes de tudo: que comandos verificam ESTE projeto?
Leia .kata/config.yaml antes de rodar qualquer coisa. Se existir, os
comandos declarados ali são os do projeto e devem ser usados verbatim:
verify:
lint: npx eslint src tests
test: npx vitest run
coverage: npx vitest run --coverage
coverage_pattern: 'All files\s+\|\s+([\d.]+)'
gate: 80Cada papel aceita string ou lista. Papel omitido cai no default Python
(ruff/pytest/pytest-cov). python -m kata --check-only já lê esse arquivo
sozinho — prefira-o a montar os comandos à mão.
Sem .kata/config.yaml, valem os defaults Python descritos abaixo. Se o
projeto não for Python e não houver config, não invente um comando nem
declare sucesso: proponha ao usuário criar o .kata/config.yaml e registre
o bloqueio como caveat. Verificação que não rodou não é verificação que
passou.
Ferramentas
Para esta fase, use:
Bash: executeruff,pytestecoverage(oupython -m kata --check-only; no Windows, usepy -m katase necessário).AskUserQuestion(viakata-question): pergunte ao usuário se o critério de sucesso foi satisfeito.Write/Edit: registre o resultado em.kata/<task>.yamle atualizestatusparaapprovedourejected.
Comandos
Ruff
python -m ruff check src/ tests/Para projetos com estrutura diferente:
python -m ruff check app/ services/ tests/Interpretando resultado:
returncode == 0→ ✅ limporeturncode != 0→ ❌ falhou — mostrar output completo
Problemas comuns:
F401— import não utilizado → remover ou adicionar# noqa: F401E501— linha longa → quebrar ou aumentarline-lengthno ruff configI001— import desordenado →ruff formatouruff check --fix
Pytest
python -m pytest tests/ --tb=short -qPara projetos com testes que precisam de ignore (ex: um que exija GPU):
python -m pytest tests/unit/ --ignore=tests/unit/test_memory_service.py --tb=short -qInterpretando resultado:
returncode == 0→ ✅ passoureturncode != 0→ ❌ falhou — mostrar output completo
Problemas comuns:
ModuleNotFoundError: faiss→ usar--ignoreou instalar a dependência no
ambiente do projeto (python -m pip install faiss-cpu; no Windows,py -m pip).ImportErrorcircular → checar ordem de importsAssertionErrorem teste → investigar se a mudança quebrou comportamento
Coverage
python -m pytest tests/ --cov=src --cov-report=term-missing --cov-fail-under=70 -qExemplo:
python -m pytest tests/unit/ --ignore=tests/unit/test_pesado.py --cov=app --cov-report=term-missing --cov-fail-under=70 -qO --cov-fail-under faz o pytest-cov verificar o gate automaticamente:
returncode com erro se coverage < gate.
Extraindo percentual (para exibição):
TOTAL 850 42 95%Extraia do output com regex: TOTAL\s+\d+\s+\d+\s+(\d+)%. Não infira o valor
visualmente; se o regex não encontrar, trate como falha.
Interpretando resultado:
returncode == 0→ ✅ passou (gate verificado pelo próprio--cov-fail-under)returncode != 0→ ❌ falhou
Gate padrão: 70%
Se coverage < gate:
- Identificar linhas não cobertas (coluna
Missingno output) - Adicionar testes para essas linhas
- Ou marcar com
# pragma: no coverse for código não-testável
Critério de sucesso
Confronte o critério declarado no THINK (chave done) com o resultado final
e pergunte ao usuário via AskUserQuestion:
"O critério de sucesso da tarefa está satisfeito?"
O critério volta à fase THINK — o problema declarado foi resolvido?
Exemplo:
- THINK
done: "warn no startup + /health retorna degraded quando misconfig (via curl)" - Sucesso: o teste/manual confirma exatamente isso
Se o done declarado não foi alcançado, o ciclo é rejeitado — o critério
não pode ser reescrito depois do fato.
Hard bound (Fable Step 5)
Registre verify.attempts (contador de execuções do VERIFY). Após 3
tentativas falhas, grave verify.hand_back: true e devolva a tarefa ao
usuário com o que foi tentado, o output real e a hipótese atual — não fique
repetindo o mesmo fix-verify indefinidamente.
Resumo final
Após as 4 verificações, reporte ao usuário no formato:
✅ ruff limpo
✅ pytest 850 passaram
✅ coverage 87.0% (gate: 70%)
✅ critério de sucesso satisfeito
┌──────────────────────────────────────────────────────────┐
│ ✅ KATA CYCLE — APROVADO │
└──────────────────────────────────────────────────────────┘Ou:
❌ ruff: 3 erros (F401 x2, E501 x1)
✅ pytest: 850 passaram
❌ coverage: 65.0% (gate: 70%)
✅ critério de sucesso satisfeito
┌──────────────────────────────────────────────────────────┐
│ ❌ KATA CYCLE — REJEITADO │
│ Corrija os problemas e rode novamente. │
└──────────────────────────────────────────────────────────┘Output no YAML
status: approved
done: "warn no startup + /health degraded quando misconfig (verificado via curl)"
verify:
ruff_clean: true
tests_pass: true
coverage_pct: 87.0
coverage_pass: true
success_criteria_met: true
attempts: 1 # contador de execuções do VERIFY (hard bound)
hand_back: false # true após 3 tentativas falhas — tarefa devolvidaModo --check-only (CI)
Quando invocado com --check-only, pula THINK/SIMPLIFY/SURGICAL e executa
só as 3 verificações objetivas (ruff + pytest + coverage). O critério de
sucesso é assumido satisfeito. Útil para CI/CD pipelines — nesse modo, a
skill nem precisa ser carregada: chame o CLI diretamente via Bash.
Para executar via CLI:
python -m kata --check-onlyPrincípios
- Gate é inegociável: coverage < 70% = rejeitado, sem exceção
- Falso verde é pior que vermelho: se os testes passam mas não testam nada, é pior que falhar
- Critério de sucesso é subjetivo mas obrigatório: o humano precisa confirmar que resolveu
- Exit code: 0 = aprovado, 1 = rejeitado — para integração com CI (via o CLI
python -m kata)