Evals (feedback inferencial)

Um sensor checa estrutura com regex. Um eval julga significado, como se o plan decorre do PRP. Cada eval é uma rubric ponderada com nota de 0 a 10; a aprovação é 8.0, com até 3 retries.

Anatomia de uma rubric

As rubrics ficam em .claude/agents/{agent}/evals/*.md. Cada dimensão ### Name (weight N%) traz checks atômicos de sim ou não: linhas - check: são perguntas para o judge, linhas - absent: são regexes rodadas em código (palavras banidas, em dash, diagramas de caixas em ASCII).

### Metric completeness (weight 20%)
- check: Every metric in `sections.success_metrics` has a baseline value.
- check: Every metric in `sections.success_metrics` has a target value.
- check: `sections.success_metrics` states a kill criterion with a numeric threshold.

### Voice (weight 5%)
- absent: (?i)\b(delve|leverage|utilize|unlock|streamline|robust|cutting-edge|seamless|best-in-class)\b
- absent: (?m)^\s*\+[-=]{3,}\+

Uma dimensão vale 10 vezes a fração dos seus checks atendidos; as âncoras 0/5/10 só servem para desempate.

Aritmética verificada

eval-score.py recalcula o total ponderado a partir dos pesos da rubric e recusa um judge cuja aritmética ou cujas chaves não batem.

python3 .claude/scripts/eval-score.py --rubric evals/prd-quality.md --scores judge.json
Saída Significado
0 consistente e igual ou acima de 8.0; imprime a nota para o approval marker
1 abaixo do threshold, retry
2 saída malformada, total errado, ou dimensões faltando ou sobrando

O loop de retry

Os sensors rodam primeiro, então nenhuma chamada ao judge vai para um artefato malformado. Um eval reprovado regenera só os checks que falharam, que são o feedback literal. Depois de 3 tentativas reprovadas o stage devolve um blocker.

flowchart LR
  G[generate] --> S[sensors]
  S -->|fail| G
  S -->|pass| E[eval]
  E -->|below 8.0, max 3| R[regenerate failed checks]
  R --> S
  E -->|8.0 or more| A[approve]

Dois judges

/hk:eval jev | local escolhe o judge por projeto. A escolha fica em .claude/hk-config.json, perguntada uma vez na instalação, com default local.

local é um avaliador Claude novo que vê só o artefato e a rubric. jev é o Jev da TypeSafe AI, um modelo System One que devolve probabilidades calibradas em vez de texto, chamado por .claude/scripts/jev-judge.py. Cada check é uma pergunta Noul (sim ou não). O artefato vai dividido por seção ## (sections.success_metrics), então um check lê só a parte que nomeia; um check sobre uma seção ausente reprova sem chamada. Cada execução acrescenta uma linha em .claude/runtime/outputs/evals/jev-judge.jsonl.

Escalada para o Claude

A execução escala para o avaliador Claude quando o Jev fica em dúvida em checks que decidem o resultado: o total recalculado com as respostas incertas forçadas para não e para sim cai dos dois lados de 8.0. Ela também escala quando não há chave, quando o artefato passa de 32k tokens ou quando a API dá erro.

A chave fica numa variável de ambiente (default TYPESAFE_API_KEY) ou no bloco env de .claude/settings.local.json, nunca num arquivo commitado. O Jev é uma API paga, cerca de $0.042 por milhão de tokens de entrada, então roda localmente e nunca no CI. spec-satisfied e os gates de readiness sempre usam Claude.

Evals por stage

Stage Evals
prd prd-quality, prd-readiness
prp prp-quality, prp-context-readiness
plan plan-quality
dev dev-quality
test test-quality
pr pr-quality
loop sdd spec-satisfied
system design design-quality, design-review-depth

Os pesos dizem com o que cada gate se importa; a qualidade do PRD põe 20% em clareza e 20% em completude das métricas. Você ajusta um peso uma vez e ele vale para todo artefato futuro. design-review-depth reprova uma review que só carimba: nenhuma lacuna nomeada, severidade plana, conselho genérico.

spec-satisfied

/sse:sdd usa o spec-satisfied, que devolve PASS ou FAIL contra Success criteria (verifiable) e Validation gates do PRP. Um FAIL volta ao loop de dev e test com uma dica next_iter_focus, até 3 iterações. Ele roda numa sessão nova, sem o contexto do worker.

Por que esta forma

Um judge Claude avaliando saída do Claude infla as notas (Wataoka et al.; Panickssery et al.); uma família diferente reduz isso, não elimina. Checklists atômicos aumentam a concordância entre judges (CheckEval, TICK). A escalada segue Trust or Escalate. Os checks do Jev seguem a orientação dele: um julgamento por pergunta, sem contagem, estado filtrado.

O que a nota não é

Nenhum dos judges foi validado contra rótulos humanos ainda, e 8.0 é uma convenção, não uma fronteira calibrada. Hamel Husain recomenda cerca de 100 exemplos rotulados por modo de falha; o log jsonl é o começo desse conjunto. Leia os checks que falharam, não só o número.

Veja também

Sensores, Guides, Pipeline e stages, Referências.

Tradução manual de Evals (feedback inferencial), a página original em inglês na wiki.