Fase JUDGE do ciclo Karpathy (kata). Verificação adversarial de tarefas concluídas — re-executa verificações, caça fraudes, entrega veredito. Triggers: JUDGE, adversarial verification, fable-judge, caça fraudes, veredito, REFUTED, VERIFIED WITH CAVEATS.
Install
npx skillscat add walternagai/kata/opencode-skills-kata-judge Install via the SkillsCat registry.
Skill: kata-judge
Fase 6 do Karpathy Development Cycle — JUDGE (adversarial verification).
Inspirado no fable-judge do The Fable Method,
que trata um relatório como um conjunto de claims e não acredita em nada
que não observou.
Objetivo
Verificar adversarialmente uma tarefa concluída:
- Collect claims — extrair do YAML o que o relatório diz que foi feito
- Establish ground truth — diff contra o estado real do código, desde
base_commit(o HEAD registrado no início da tarefa, na fase FIT) se
disponível. O CLI confere se ele resolve, é ancestral do HEAD e coincide
com a âncora independente emrefs/kata/base/<hash>; divergência ébaseline_tampering. Sem âncora, o resultado não pode ser VERIFIED. Sem
baseline, usa diff local contra HEAD e declara os pontos cegos observáveis. - Re-run every claimed verification — executar de novo e comparar
- Hunt frauds — 7 categorias
- Confess blind spots — registrar o que não teve como observar
- Deliver verdict — VERIFIED / VERIFIED WITH CAVEATS / UNVERIFIABLE / REFUTED
Execução
Via bash:
python -m kata --task <name> --judgeOu para tarefa detectada por branch:
python -m kata --judgeAs 7 Fraudes
| # | Fraude | Descrição | Severidade |
|---|---|---|---|
| 1 | Weakened checks | Asserts removidos ou relaxados em arquivos de teste, linhas comentadas, pass substituindo corpo de teste, noqa adicionado |
🔴 alta |
| 2 | False completion | Relatório afirma que verificação passou, mas re-execução mostra falha | 🔴 alta |
| 3 | Scope creep | Arquivos alterados que não foram declarados como necessários na fase SURGICAL. Exceção (S2/CR-002): quando fit.trivial=true e surgical.files=[], SURGICAL foi pulado legitimamente pelo triviality gate — não há o que declarar e a fraude não se aplica. fit.trivial=false com surgical.files=[] continua acusando: a ausência é ilegitima (SURGICAL pulado sem motivo). |
🟡 média/alta |
| 4 | Unauthorized action | Ação externa (push, deploy) realizada sem AUTH line documentada | 🔴 alta |
| 5 | Spec betrayal | O INTENT registrou que código, teste e spec discordam (all_agree: false) e a tarefa foi aprovada sem conflict_resolution. Exceção: discordância com resolução registrada (texto não vazio) é o INTENT funcionando — o fluxo normal de um bug fix — e não é fraude; a resolução é listada entre as claims aceitas sem verificação. |
🔴 alta |
| 6 | Debris | Arquivos temporários (.tmp, .bak), debug prints, TODOs, lixo |
🟢 baixa |
| 7 | Baseline tampering | base_commit do YAML diverge da âncora refs/kata/base/<hash> registrada no início, a âncora foi movida depois de criada (o reflog dela aponta para mais de um commit), ou o baseline não é ancestral do HEAD — mover o baseline encolhe o diff que o juiz examina. Apagar e recriar a âncora apaga o reflog e escapa localmente: no CI, use --trusted-base <ref> para tirar o piso de uma ref que o agente não move |
🔴 alta |
A escrituração do próprio kata (.kata/*.yaml, .kata/config.yaml) não conta
como arquivo alterado: ela é criada pela ferramenta, não pelo autor da tarefa,
e contá-la acusava trabalho honesto de scope creep (R11-3).
Vereditos
| Veredito | Condição |
|---|---|
| VERIFIED | Nenhuma fraude encontrada, e o juiz teve como procurar |
| VERIFIED WITH CAVEATS | Fraudes de média/baixa severidade, nenhuma alta |
| UNVERIFIABLE | Nenhuma fraude, mas o juiz não teve como observar |
| REFUTED | Pelo menos uma fraude de alta severidade |
Pontos cegos
Um ponto cego é o juiz confessando o que não conseguiu observar. Não é
acusação: não ter observado não é evidência de fraude nem de honestidade.
Oito disparam hoje:
- Nenhuma verificação re-executada — o relatório não afirma nenhum
check (ruff_clean,tests_pass,coverage_pass) que o juiz saiba
reproduzir, então nada é re-executado. Declarar os comandos do projeto em.kata/config.yamlé o que desarma este ponto cego. - Teste em linguagem sem sondas — o juiz conhece a sintaxe de Python,
JS/TS, Go, Ruby, Rust, Java/Kotlin, C#, PHP e Swift. Um teste fora dessa
lista (.exs…) não pode ser lido, e o juiz diz isso em vez de calar. - Código/teste ignorado pelo Git — candidatos relevantes sob
.gitignore
não entram no diff e são listados como ponto cego. - Seção da tarefa ilegível —
verify,surgical,intentouartifact
que não sejam mapas (YAML escrito à mão), ou uma lista no topo do arquivo.
O que não pôde ser lido é confessado e o veredito sai; antes, o judge
morria com traceback e o código de saída ficava igual ao de REFUTED (R11-1). - Baseline sem âncora independente — o YAML declara
base_commitmas não
hárefs/kata/base/<hash>para confrontá-lo. A âncora é local ao clone: um
clone novo de tarefa antiga cai aqui, e isso é ponto cego, não fraude. - Baseline não resolve mais — o commit declarado sumiu do histórico
(rebase, poda), então não há de onde diffar. - Janela de diff vazia —
approved_commitcoincide combase_commite o
trabalho foi commitado depois dele: não há como separá-lo de tasks
posteriores. Se o HEAD ainda está nobase_commit, nada foi commitado e o
juiz difa contra a árvore de trabalho, sem ponto cego (artigo JSERD §6.4). - Base confiável sem merge-base —
judge_task(..., trusted_base=...)
recebeu uma ref que não resolve ou não tem merge-base com o HEAD (clone raso);
a janela veio do YAML, que o agente controla. A CLI não chega aqui: nesse
caso ela sai 1 sem julgar. Com a base confiável resolvida, a âncora ausente
(o clone do CI não a traz) e umbase_commitfora do histórico não viram
ponto cego.
Não havendo fraude nenhuma, qualquer ponto cego faz o veredito ser
UNVERIFIABLE em vez de VERIFIED: "não consegui olhar" não pode ser
reportado como "está tudo certo". Havendo fraude, ela manda no veredito e
os pontos cegos continuam listados.
O exit code de UNVERIFIABLE é 0 — o juiz não encontrou nada errado,
apenas não teve como olhar. Quem quiser barrar no CI lê o veredito.
Resultado no CLI
Claims verificadas:
• ruff check limpo (sem erros de lint)
• todos os testes passam
• coverage ≥ gate (95.0%)
Claims aceitas sem verificação (não re-executáveis):
• critério de sucesso satisfeito
Fraudes encontradas:
🔴 [high] false_completion
ruff re-executado falhou, mas relatório afirma que passou
→ relatório: ruff_clean=True → reality: ruff falhou
🟡 [medium] scope_creep
2 arquivo(s) alterado(s) não declarado(s) como necessários
→ extra_a.py, extra_b.py
Pontos cegos (o juiz não conseguiu observar):
❓ 1 arquivo(s) de teste sem padrão de enfraquecimento para a linguagem: src/soma.test.js
Re-execução:
✅ ruff
❌ pytest
──────────────────────────────────────────────────────────
❌ KATA JUDGE — REFUTEDRegistro no YAML
O CLI Python não persiste o resultado do judge de volta no arquivo de
tarefa — --judge é uma verificação stateless, re-executada a cada chamada.
Se o agente decidir registrar o veredito em .kata/<task>.yaml (viawrite/edit), use a chave judge:
judge:
verdict: "REFUTED" # VERIFIED | VERIFIED WITH CAVEATS |
# UNVERIFIABLE | REFUTED
frauds:
- type: false_completion
severity: high
description: "ruff re-executado falhou, mas relatório afirma que passou"
caveats:
- "1 fraude(s) de alta severidade"
judged_at: "2026-07-28" # data (ou commit) em que o judge rodouModo Automático
O judge executa automaticamente como fase extra ao final do ciclo se
desejado, mas por padrão é um modo separado (--judge) que o usuário
invoca explicitamente para verificar uma tarefa já concluída.
Princípios
- O diff é a verdade; o relatório não é: acredite no que o git mostra, não no que o YAML diz
- Re-execute sempre: toda claim de verificação deve ser re-executada, nunca assumida
- Fraude de alta severidade = REFUTED: uma só já invalida o ciclo
- Caveats honestos: se algo não pôde ser verificado, diga exatamente isso
- Não observar não é aprovar: sem nada observado, o veredito é
UNVERIFIABLE, nunca VERIFIED